Jump to content

Recommended Posts

Posted

hlapexyi1.jpg

hLaPex Its a Explorer that you use to decode the pack

From server And CLinet that they send each other

ok lets get start it..

 

1.You need to put the hLaPex in ur System folder

2.Start hLaPex Before Statin Your client

 

so When u join the Game it Should said this

 

hlapex2vr1.jpg

 

Well ok i see that You Guys Are Havin Problem

Whit the "Gettin Items" & "Multiple Class skill Mixin"

 

*Getting Items

 

Well ok First u need to know Two Importan Things To make This Action

1. Its the ListID from the Item You wanna Get!

2. Its The ItemID

 

The code to make this action its make in 4 Part

 

1. 1F = Request To Buy

2. ListID = The place that the ID is in the Server Files or Shop

3. ItemID = The ID off item U want

4. 01 00 00 = the mount u wanna to get of the Item

 

*IMPORTAM*

Always remmeber that the ListID have to be the one where is You item in the Shop

 

Lets have Fun Now

*Makin the Code

 

First u need to do the Request to the server "1F" Put the rest of ur Code

 

Examplo:

 

1F "ListID" 01 00 00 00 "ItemID" "Mount Of THe Item"

 

Lets use This Code For test

ListID: 9036 ItemID: 5643 Sword of Miracles [A] Sword Of Miracles + Acumen

 

OK we got this

 

9036 For ListID

5643 For ItemID

 

this code its the same One u have in the files

But you cant use them in hLaPex u need to conver them

to be avilable to use them

 

Here is what You need to do

In The version that im use Is in the Explorer Tab

 

There You will see this

 

hexlh7.jpg

 

You need to use This part to Conver the Code

 

intzi8.jpg

 

First lets do the ListID

 

You Need to Put the ListID number in the

 

Intenger

9036

Hex

4C230000

 

The code that we need is in the Hex Part

 

here is a Pic

 

listidtutorialwr4.jpg

 

OK Lest Save the New Code "4C230000"

 

Now Lets Do the Same Think for the ItemID "5643"

 

itemidtutorialpu5.jpg

 

Now we have the ItemID 0B160000

 

Lets Make the Code

 

1F 4C230000 01 00 00 00 0B160000 01 00 00 00

 

Ok Now We Have the Code for The Sword of Miracles [A]) Sword Of Miracles + Acumen

 

To Use this Code u need to target an NCP some people Use The GMShop

Always Go to a Started Town and Target A weapon Trader

 

 

Enjoi and Have Fun!

 

Credits goes to pwNy00all

Posted

Well here are some ListID A Grade.

Whit this u ony will need the ItemID

For those who dont know how to use this u just need to Hex the number in hlapex

hextooltt9.jpg

 

Weapom ListID's (S)

S/Hands Swords:9045

D/Hands Swords:9046

Dual Swords:9047

Daggers:9048

Bows:9049

Fists:9050

Poleams:9051

S/H Blunts:9052

D/H Blunts:9053

 

Armos ListID's (S)

Helmets:9054

Chest:9055

Fullarmors9056

Legs:9057

Gloves:9058

Boots:9059

Shields:9060

Underwears:9061

 

Weapom ListID's [A]

Bow [A]:9040

Fist [A]:9041

D/Hands Sword [A]:9037

Duals Sword [A]:9038

Dagger [A]:9039

Polearms [A]:9042

Single Hands Bluns [A]:9043

D/Hands Bluns [A]:9044

 

Armor ListID's [A]

Helmets [A]:9063

Chest [A]:9064

Fullarmors [A]:9065

Legs [A]:9066

Gloves [A]:9067

Boots [A]:9068

Shields [A]:9069

Cloaks [A]:9070

UnderWears [A]:9071

 

Weapoms ListID's

S/H Swords:9027

D/H Swords:9028

Dual Swords:9029

Daggers:9030

Bows:9031

Fists:9032

Polearms:9033

S/H Blunts:9034

D/H Blunts:9035

 

Armos ListID's

Helmets:9072

Chest:9073

FullArmors9074

Legs:9075

Gloves:9076

Boots:9077

Shields:9078

Cloaks:9079

Underwears:9080

 

Weapom ListID's [C]

S/H swords:9018

D/H Swords:9019

Dual Swords:9020

Dagger:9021

Bows:9022

Fists:9023

Poleams:9024

S/H Blunts:9025

D/H Blunts:9026

 

Armor ListID [C]

Helmets:9081

Chest:9082

Fullarmos:9083

Legs:9084

Gloves:9085

Boots:9086

Shields:9087

Cloak:9088

Underwears:9089

 

ItemID's List

 

Full Set Dark Crystal Robe + Weapom & Shield & Sword Of Miracles + Acumen

ListID: 9065 ItemID: 2407 (Dark Crystal Robe [A]) Armor

ListID: 9068 ItemID: 5779 (Dark Crystal Boots [A]) Boots

ListID: 9067 ItemID: 5767 (Dark Crystal Gloves [A]) Gloves

ListID: 9063 ItemID: 512 (Dark Crystal Helmet [A]) Helmet

ListID: 9036 ItemID: 5643 (Sword of Miracles [A]) Sword Of Miracles + Acumen

ListID: 9069 ItemID: 641 (Dark Crystal Shield [A]) Dark Crystal Shield

 

Majesti Light Armor [A] + SoulBow Cheap SHot

ListID: 9065 ItemID: 2395 (Majestic Leather Armor [A])

ListID: 9063 ItemID: 2419 (Majestic Circlet [A])

ListID: 9068 ItemID: 5787 (Majestic Boots [A])

ListID: 9067 ItemID: 5775 (Majestic Gloves [A])

ListID: 9040 ItemID: 5611 (Soul Bow [A]) + Cheap Shot

 

OthersID's List

 

1.Jewels

NoGrade: 9108

Grade D:9109

Grade C:9110

Grade B:9125

Grade A:9126

Grade S:9127

 

2.Pet Collars And Consumables

3003

 

3.Dyes

9128

 

ItemID: 4624 (Dye Wit+4 Men-4) - 1F A8230000 01 00 00 00 10120000 01 00 00 00

ItemID: 4613 (Dye Str+4 Con-4) - 1F A8230000 01 00 00 00 05120000 01 00 00 00

ItemID: 4618 (Dye Dex+4 Con-4) - 1F A8230000 01 00 00 00 0A120000 01 00 00 00

ItemID: 4619 (Dye Int+4 Men-4) - 1F A8230000 01 00 00 00 0B120000 01 00 00 00

ItemID: 4615 (Dye Con+4 Str-4) - 1F A8230000 01 00 00 00 07120000 01 00 00 00

 

QuestItemsID's List

1.Job Change:9148

2.Quest Items [1]:9149

                    [2]:300539

                    [3]:300530

                    [4]:300540

                    [5]:300541

                    [6]:300542

 

 

L2Day - Blessed Ressurrruction scroll pets 6387

L2Day - Blessed Ressurrruction scroll 3936

L2Day - Blessed scroll escape 3958

 

 

 

 

1F 59230000 01000000 DB190000 01000000 Infinity Bow

1F 56230000 01000000 D4190000 01000000 Infinity cleaver

1F 5D230000 01000000 D7190000 01000000 Infinity Crusher

1F 5D230000 01000000 D8190000 01000000 Infinity Scepter

1F 55230000 01000000 D3190000 01000000 Infinity Blade

1F 5C230000 01000000 D6190000 01000000 Infinity Rod

1F 5C230000 01000000 D5190000 01000000 Infinity Axe

1F 5B230000 01000000 DD190000 01000000 Infinity Spear

1F 57230000 01000000 DC190000 01000000 Infinity wing

1F 58230000 01000000 D9190000 01000000 Infinity Stinger

1F 5A230000 01000000 DA190000 01000000 Infinity Fang

 

1F 3E230000 01000000 D6120000 01000000 eminence_bow_guidance

1F 4F230000 01000000 F2150000 01000000 soul_separator_critical_damage

 

 

L2Day - Blessed Ressurrruction scroll pets 6387

L2Day - Blessed Ressurrruction scroll 3936

L2Day - Blessed scroll escape 3958

 

ItemID: 4422 (Dragon Bugle of Wind)

ItemID: 6313 (Homunkulus's Sword [C])

ItemID: 2511 (Spiritshot: C-grade)

ItemID: 2512 (Spiritshot: B-grade)

 

Dragonic Set

Helmet

1f 5E230000 01 00 00 00 EE180000 01 00 00 00

Gloves

1f 62230000 01 00 00 00 EC180000 01 00 00 00

Boots

1f 63230000 01 00 00 00 ED180000 01 00 00 00

Fullarmor

1f 60230000 01 00 00 00 EB180000 01 00 00 00

Bow Focus

1f 59230000 01 00 00 00 991D0000 01 00 00 00

 

Jewels

1f A7230000 01 00 00 00 021A0000 01 00 00 00 - Ring OF Baium

1f A7230000 01 00 00 00 001A0000 01 00 00 00 - Earring of Antharas

1f A7230000 01 00 00 00 011A0000 01 00 00 00 - Necklace Of Valakas

1f A7230000 01000000 031A0000 01000000 - Zaken earring

1F A5230000 01000000 041A0000 01000000 - Ring of Ant Queen

 

SS craft

AF45010000 - bssb

AF44010000 - bssc

AF17000000 - ssa

AF16000000 - ssb

AF15000000 - ssc

 

blessed enchant armor:

 

d: 6576

c: 6574

b: 6572 - 1F BA0B0000 01 00 00 00 AC190000 01 00 00 00

a: 6570 - 1F BA0B0000 01 00 00 00 AA190000 01 00 00 00

s: 6578 - 1F BA0B0000 01 00 00 00 B2190000 01 00 00 00

 

blessed enchant weapon:

 

d: 6575

c: 6573 - 1F BA0B0000 01 00 00 00 AD190000 01 00 00 00

b: 6571 - 1F BA0B0000 01 00 00 00 AB190000 01 00 00 00

a: 6569 - 1F BA0B0000 01 00 00 00 A9190000 01 00 00 00

s: 6577 - 1F BA0B0000 01 00 00 00 B1190000 01 00 00 00

 

 

.

 

Enjoi And Have Fun!

 

Thx cepheid For the Help xD

Posted

hey when i try to buy at the npc, i selected the npc then send the packet but when i return at the game to buy iy im in jail and told me that the gm are informed about my ilegal action, so what can i do to can buy the item to i want????

Posted

Guys so lets start from the beginning. i run hlapex before i run l2 exe after that injected says true. when i log into game i dont get any private message from hlapex and the  message on hlapex programm says false. I cant understand i do everything right plz help me :(:(:( ty

Posted

Guys can plz someone tell me link to download hlapex or upload it for me? would be nice cuz i cant find the prog. and dont wanna download from any obvisious site.

 

ty

 

EDIT: Found an Link, got it now, ty anyways x)

   

 

 

Posted

I type login and password in login screen, later on server choose screen i choose server, but nothing happend :/

 

what's the problem here ?

 

EDIT:// now i see that Client: DISCONNECTED :( but Server: ACTIVE

 

How to fix it ?

Posted

well, as i said b4 in other topic the biggest problem is not hlapex, its just finding server where it works :/

anyone can write any server where it still works? it recently worked on rebirth but from last update no more... :/

Posted

ive been on a server that works the ip is

 

71.202.66.125 l2authd.lineage2.com

71.202.66.125 L2testauthd.lineage2.com

 

;) good packethacking =)

Guest
This topic is now closed to further replies.



  • Posts

    • [Release] Solo PvP Zone System 🔹 Compatible with: aCis 401+ 📜 Features: ✅ Automatic Exit on Restart: Players are removed from the zone if a restart occurs or logout. ✅ Custom Exit Command: Players can exit the Solo Zone with the voice command .exit. ✅ Teleport NPC Command: new bypass solopvp for gatekeeper. ✅ Random Name Generator: Generates random names. ✅ PvP Flag: The players are flagged within this zone.   xml preview & java code backup code -> https://pastebin.com/974V2p2p   SoloZone.xml <?xml version="1.0" encoding="UTF-8"?> <list> <zone shape="NPoly" minZ="-5200" maxZ="-4680"><!-- Frintezza Solo Zone --> <stat name="name" val="Solo PvP Zone" /> <stat name="locs" val="174244,-89089,-5112;174260,-86881,-5112;173184,-88090,-5112;175309,-88018,-5112;174231,-88019,-5112;175136,-88828,-5104;174962,-87025,-5104;173149,-87142,-5104;173470,-88908,-5112" /> <stat name="restrictedClasses" val="15,16,97" /> <node x="172031" y="-90127"/> <node x="176428" y="-90089"/> <node x="176428" y="-74051"/> <node x="172057" y="-74108"/> </zone> </list> SoloZone Code: diff --git a/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java b/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/taskmanager/SoloZoneTaskManager.java @@ -0,0 +1,98 @@ +package net.sf.l2j.gameserver.taskmanager; + +import java.security.SecureRandom; +import java.util.ArrayList; +import java.util.logging.Logger; + +import net.sf.l2j.commons.random.Rnd; + +import net.sf.l2j.gameserver.data.manager.ZoneManager; +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.voicecommandhandlers.VoiceExitSoloZone; +import net.sf.l2j.gameserver.model.World; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.model.zone.type.SoloZone; + + +/** + * @author MarGaZeaS + */ +public class SoloZoneTaskManager implements Runnable { + + private static final Location EXIT_LOCATION = VoiceExitSoloZone.getExitLocation(); // Λαμβάνουμε την έξοδο από το VoiceExitSoloZone + + @Override + public void run() + { + // Διασχίζουμε όλους τους παίκτες του κόσμου + for (Player player : World.getInstance().getPlayers()) + { + // Ελέγχουμε αν ο παίκτης είναι στο SoloZone + if (player.isInsideZone(ZoneId.SOLO)) + { + // Μεταφέρουμε τον παίκτη στην έξοδο + player.teleportTo(EXIT_LOCATION.getX(), EXIT_LOCATION.getY(), EXIT_LOCATION.getZ(), 0); + player.sendMessage("The server is restarting, you have been moved out of the Solo Zone."); + } + } + } + + private int _id; + + private static final Logger _log = Logger.getLogger(SoloZoneTaskManager.class.getName()); + private static final ArrayList<String> _rndNames = new ArrayList<>(); + private static final int RANDOM_NAMES = 500; + private static final String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + private int _playersInSoloZone = 0; + + public int getPlayersInside() { + return _playersInSoloZone; + } + + public void setPlayersInside(int val) { + _playersInSoloZone = val; + } + + public SoloZoneTaskManager() { + _log.info("Solo Zone System: Loading..."); + for (int i = 0; i < RANDOM_NAMES; i++) { + String name = generateName(); + _rndNames.add(name); + _log.info("Generated name: " + name); + } + _log.info("Solo Zone System: Loaded " + _rndNames.size() + " names."); + } + + public String getAName() { + if (_rndNames.isEmpty()) { + _log.warning("SoloZoneManager: No random names available."); + return "Unknown"; + } + return _rndNames.get(Rnd.get(5, RANDOM_NAMES - 5)); + } + + private static String generateName() { + SecureRandom rnd = new SecureRandom(); + StringBuilder sb = new StringBuilder(15); + for (int i = 0; i < 15; i++) { + sb.append(CHARS.charAt(rnd.nextInt(CHARS.length()))); + } + return sb.toString(); + } + + public int getZoneId() + { + return _id; + } + + public final static SoloZone getCurrentZone() { + return ZoneManager.getInstance().getAllZones(SoloZone.class) + .stream() + .findFirst() // Επιστρέφει την πρώτη SoloZone (αν υπάρχει μόνο μία) + .orElse(null); + } + + public static SoloZoneTaskManager getInstance() { + return SingletonHolder._instance; + } + + private static class SingletonHolder { + private static final SoloZoneTaskManager _instance = new SoloZoneTaskManager(); + } +} diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java b/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java index a707ce5..d247e2e 100644 --- a/aCis_gameserver/java/net/sf/l2j/gameserver/taskmanager/PvpFlagTaskManager.java final Player player = entry.getKey(); final long timeLeft = entry.getValue(); + if(player.isInsideZone(ZoneId.SOLO)) + continue; if(player.isInsideZone(ZoneId.BOSS)) continue; // Time is running out, clear PvP flag and remove from list. if (currentTime > timeLeft) diff --git a/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java index a707ce5..d247e2e 100644 +++ b/aCis_gameserver/java/net/sf/l2j/gameserver/network/clientpackets/RequestCharacterCreate.java if (Config.ALLOW_FISH_CHAMPIONSHIP) FishingChampionshipManager.getInstance(); + if (Config.ENABLE_STARTUP) + StartupManager.getInstance(); diff --git a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java b/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminMaintenance.java if (!st.hasMoreTokens()) { sendHtmlForm(player); return; } try { switch (st.nextToken()) { case "shutdown": + SoloZoneTaskManager exitTask = new SoloZoneTaskManager(); + ThreadPool.schedule(exitTask, 0); Shutdown.getInstance().startShutdown(player, null, Integer.parseInt(st.nextToken()), false); break; case "restart": + exitTask = new SoloZoneTaskManager(); + ThreadPool.schedule(exitTask, 0); Shutdown.getInstance().startShutdown(player, null, Integer.parseInt(st.nextToken()), true); break; case "abort": Shutdown.getInstance().abort(player); break; diff --git a/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java b/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/voicecommandhandlers/VoiceExitSoloZone.java +package net.sf.l2j.gameserver.handler.voicecommandhandlers; + +import net.sf.l2j.commons.pool.ThreadPool; + +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.IVoiceCommandHandler; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.network.serverpackets.MagicSkillUse; + +/** + * Handles the voice command for exiting the Solo Zone with delay and effects. + * + * @author MarGaZeaS + */ +public class VoiceExitSoloZone implements IVoiceCommandHandler +{ + private static final String[] VOICE_COMMANDS = + { + "exit" + }; + + // Default location to teleport players when exiting the Solo Zone + private static final Location EXIT_LOCATION = new Location(81318, 148064, -3464); // Replace with your desired coordinates + + // Προσθήκη της μεθόδου για να πάρουμε την τοποθεσία εξόδου + public static Location getExitLocation() { + return EXIT_LOCATION; + } + + @Override + public void useVoiceCommand(Player player, String command) + { + if (command.equalsIgnoreCase("exit")) + { + if (!player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You are not inside the Solo Zone."); + return; + } + + // Notify the player about the delay + player.sendMessage("You will be teleported out of the Solo Zone in 2 seconds."); + + // Cast skill effect (Skill ID: 2100, Level: 1) + player.broadcastPacket(new MagicSkillUse(player, player, 2100, 1, 2000, 0)); + + // Schedule the teleportation after a 2-second delay + ThreadPool.schedule(() -> { + // Teleport the player to the designated exit location + player.teleportTo(EXIT_LOCATION.getX(), EXIT_LOCATION.getY(), EXIT_LOCATION.getZ(), 0); + + // Inform the player + player.sendMessage("You have exited the Solo Zone."); + }, 2000); // Delay in milliseconds (2000ms = 2 seconds) + } + } + + @Override + public String[] getVoiceCommandList() + { + return VOICE_COMMANDS; + } +} diff --git a/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java b/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/handler/VoiceCommandHandler.java public class VoiceCommandHandler { private final Map<String, IVoiceCommandHandler> _entries = new HashMap<>(); protected VoiceCommandHandler() { ............ ............ + registerHandler(new VoiceExitSoloZone()); } public void registerHandler(IVoiceCommandHandler handler) { for (String command : handler.getVoiceCommandList()) _entries.put(command, handler); } diff --git a/java/net/sf/l2j/gameserver/model/actor/Npc.java b/java/net/sf/l2j/gameserver/model/actor/Npc.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/actor/Npc.java else if (command.startsWith("Chat")) { int val = 0; try { val = Integer.parseInt(command.substring(5)); } catch (final IndexOutOfBoundsException ioobe) { } catch (final NumberFormatException nfe) { } showChatWindow(player, val); + ) + else if (command.startsWith("solopvp")) + { + SoloZoneTaskManager.getInstance(); + player.teleportTo(SoloZoneTaskManager.getCurrentZone().getLoc(), 25); + } else if (command.startsWith("Link")) { final String path = command.substring(5).trim(); if (path.indexOf("..") != -1) return; final NpcHtmlMessage html = new NpcHtmlMessage(getObjectId()); html.setFile("data/html/" + path); html.replace("%objectId%", getObjectId()); player.sendPacket(html); } diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestartPoint.java // Fixed. - else if (_requestType == 4) - { - if (!player.isGM() && !player.isFestivalParticipant()) - return; - - loc = player.getPosition(); - } + if (_requestType == 4) + { + // Έλεγχος αν ο παίκτης δεν είναι GM, δεν είναι μέρος του φεστιβάλ και δεν είναι στην Solo Zone + if (!player.isGM() && !player.isFestivalParticipant() && !player.isInsideZone(ZoneId.SOLO)) + { + return; + } + + SoloZoneTaskManager.getInstance(); + SoloZone currentZone = SoloZoneTaskManager.getCurrentZone(); + if (currentZone != null && currentZone.getLoc() != null) + { + // Αν υπάρχει ζώνη και οι τοποθεσίες δεν είναι κενές, χρησιμοποιούμε τυχαία τοποθεσία από την ζώνη + loc = currentZone.getLoc(); + } else + { + // Διαφορετικά, κάνουμε respawn στην τρέχουσα θέση του παίκτη + loc = player.getPosition(); + } + } diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java b/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/RequestRestart.java if (player.isFestivalParticipant() && FestivalOfDarknessManager.getInstance().isFestivalInitialized()) { player.sendPacket(SystemMessageId.NO_RESTART_HERE); sendPacket(RestartResponse.valueOf(false)); return; } + if (player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You cannot restart your character while in Solo Zone. Use .exit to leave"); + player.setFakeName(null); + sendPacket(RestartResponse.valueOf(false)); + return; + } player.removeFromBossZone(); diff --git a/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java b/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/Logout.java player.removeFromBossZone(); player.logout(true); } } + + if (player.isInsideZone(ZoneId.SOLO)) + { + player.sendMessage("You cannot logout or restart your character while in Solo Zone. Use .exit to leave"); + player.setFakeName(null); + player.sendPacket(ActionFailed.STATIC_PACKET); + return; + } + player.removeFromBossZone(); player.logout(true); } } diff --git a/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java b/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/zone/type/SoloZone.java +package net.sf.l2j.gameserver.model.zone.type; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import net.sf.l2j.commons.random.Rnd; + +import net.sf.l2j.Config; +import net.sf.l2j.gameserver.enums.MessageType; +import net.sf.l2j.gameserver.enums.ZoneId; +import net.sf.l2j.gameserver.handler.voicecommandhandlers.VoiceExitSoloZone; +import net.sf.l2j.gameserver.model.World; +import net.sf.l2j.gameserver.model.actor.Creature; +import net.sf.l2j.gameserver.model.actor.Player; +import net.sf.l2j.gameserver.model.location.Location; +import net.sf.l2j.gameserver.model.zone.type.subtype.ZoneType; +import net.sf.l2j.gameserver.network.SystemMessageId; +import net.sf.l2j.gameserver.network.serverpackets.EtcStatusUpdate; +import net.sf.l2j.gameserver.taskmanager.PvpFlagTaskManager; +import net.sf.l2j.gameserver.taskmanager.SoloZoneTaskManager; + +/** + * @author MarGaZeaS + * + */ +public class SoloZone extends ZoneType +{ + private String _name; + private List<Location> _locations = new ArrayList<>(); + + public SoloZone(int id) + { + super(id); + } + + @Override + public void setParameter(String name, String value) + { + if (name.equals("name")) + _name = value; + else if (name.equals("locs")) + { + for (String locs : value.split(";")) + { + String[] coordinates = locs.split(","); + if (coordinates.length == 3) + { + int x = Integer.parseInt(coordinates[0]); + int y = Integer.parseInt(coordinates[1]); + int z = Integer.parseInt(coordinates[2]); + _locations.add(new Location(x, y, z)); + } + else + { + LOGGER.warn("Invalid location format: " + locs); + } + } + } + } + + + @Override + protected void onEnter(Creature character) + { + if (character instanceof Player) + { + final Player player = (Player) character; + + if ((player.getClassId().getId() == 15 || player.getClassId().getId() == 16 || player.getClassId().getId() == 97)) + { + Location respawnLocation = VoiceExitSoloZone.getExitLocation(); + player.instantTeleportTo(respawnLocation, 20); + player.sendMessage("Your class is not allowed in this zone."); + return; + } + + String randomName = SoloZoneTaskManager.getInstance().getAName(); + if (randomName == null || randomName.isEmpty() || !isValidName(randomName)) + { + randomName = generateRandomName(); + } + if (isNameAlreadyTaken(randomName)) + { + randomName = generateRandomName(); + } + player.setFakeName(randomName); + player.sendMessage("Welcome to the Solo Zone, your random name is: " + randomName); + player.sendPacket(SystemMessageId.ENTERED_COMBAT_ZONE); + character.setInsideZone(ZoneId.SOLO, true); + character.setInsideZone(ZoneId.NO_STORE, true); + character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, true); + + if (player.getParty() != null) + { + player.getParty().removePartyMember(player, MessageType.DISCONNECTED); + } + + if (player.getPvpFlag() > 0) + PvpFlagTaskManager.getInstance().remove(player, true); + + player.updatePvPStatus(); + player.broadcastUserInfo(); + } + } + + private static boolean isValidName(String name) { + return name.matches("[a-zA-Z0-9_]+"); + } + + private static String generateRandomName() { + Random rand = new Random(); + int nameLength = rand.nextInt(12) + 4; + StringBuilder nameBuilder = new StringBuilder(); + + for (int i = 0; i < nameLength; i++) { + char randomChar = (char) (rand.nextInt(26) + 'a'); + nameBuilder.append(randomChar); + } + + return nameBuilder.toString(); + } + + private static boolean isNameAlreadyTaken(String name) { + return World.getInstance().getPlayers().stream().anyMatch(player -> player.getFakeName().equals(name)); + } + + @Override + protected void onExit(Creature character) + { + character.setInsideZone(ZoneId.SOLO, false); // Solo zone + character.setInsideZone(ZoneId.NO_STORE, false); // Allow making a store + character.setInsideZone(ZoneId.NO_SUMMON_FRIEND, false); // Allow summon + + if (character instanceof Player) + { + final Player player = (Player) character; + + if (player.getFakeName() != null) + { + player.setFakeName(null); + } + + player.sendPacket(SystemMessageId.LEFT_COMBAT_ZONE); + { + if(!player.isInObserverMode() && player.getPvpFlag() > 0) + PvpFlagTaskManager.getInstance().add(player, Config.PVP_NORMAL_TIME); + + player.sendPacket(new EtcStatusUpdate(player)); + player.broadcastUserInfo(); + } + } + } + + public String getName() + { + return _name; + } + + public Location getLoc() + { + if (_locations.isEmpty()) + { + return null; // Αν η λίστα είναι κενή, επιστρέφουμε null + } + return _locations.get(Rnd.get(0, _locations.size() - 1)); // Επιλέγουμε τυχαία τοποθεσία + } +} diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/GameServer.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/GameServer.java if (Config.ALLOW_FISH_CHAMPIONSHIP) FishingChampionshipManager.getInstance(); + StringUtil.printSection("Custom Features"); + SoloZoneTaskManager.getInstance(); StringUtil.printSection("Handlers"); LOGGER.info("Loaded {} admin command handlers.", AdminCommandHandler.getInstance().size()); diff --git a/java/net/sf/l2j/gameserver/GameServer.java b/java/net/sf/l2j/gameserver/Shutdown.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/Shutdown.java // disconnect players try { disconnectAllPlayers(); LOGGER.info("All players have been disconnected."); } catch (Exception e) { // Silent catch. } + // Restore real names for players in SoloZone + restoreRealNamesInSoloZone(); // stop all threadpolls ThreadPool.shutdown(); try { LoginServerThread.getInstance().interrupt(); } catch (Exception e) { // Silent catch. } // avoids new players from logging in if (_secondsShut <= 60 && LoginServerThread.getInstance().getServerType() != ServerType.DOWN) LoginServerThread.getInstance().setServerType(ServerType.DOWN); _secondsShut--; Thread.sleep(1000); } } catch (InterruptedException e) { } } + // This method restores the real names of players in SoloZone + private static void restoreRealNamesInSoloZone() + { + for (Player player : World.getInstance().getPlayers()) + { + // Check if player is inside the SoloZone + if (player.isInsideZone(ZoneId.SOLO)) + { + // Restore the real name by removing the fake name + if (player.getFakeName() != null) + { + player.setFakeName(null); // Restore the real name + LOGGER.info("Player {}'s fake name has been removed and real name restored.", player.getName()); + } + } + } + } private static void sendServerQuit(int seconds) { World.toAllOnlinePlayers(SystemMessage.getSystemMessage(SystemMessageId.THE_SERVER_WILL_BE_COMING_DOWN_IN_S1_SECONDS).addNumber(seconds)); } diff --git a/java/net/sf/l2j/gameserver/enums/ZoneId.java b/java/net/sf/l2j/gameserver/enums/ZoneId.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/enums/ZoneId.java public enum ZoneId { PVP(0), PEACE(1), SIEGE(2), MOTHER_TREE(3), CLAN_HALL(4), NO_LANDING(5), WATER(6), JAIL(7), MONSTER_TRACK(8), CASTLE(9), SWAMP(10), NO_SUMMON_FRIEND(11), NO_STORE(12), TOWN(13), HQ(14), DANGER_AREA(15), CAST_ON_ARTIFACT(16), NO_RESTART(17), SCRIPT(18), - BOSS(19), + BOSS(19), + SOLO(20); private final int _id; private ZoneId(int id) { _id = id; } diff --git a/java/net/sf/l2j/gameserver/network/serverpackets/Die.java b/java/net/sf/l2j/gameserver/network/serverpackets/Die.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/serverpackets/Die.java if (creature instanceof Player) { Player player = (Player) creature; - _allowFixedRes = player.getAccessLevel().allowFixedRes(); + _allowFixedRes = player.getAccessLevel().allowFixedRes() || player.isInsideZone(ZoneId.SOLO); _clan = player.getClan(); } diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver//model/actor/Player.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java // Attacker or spectator logging into a siege zone will be ported at town. if (player.isInsideZone(ZoneId.SIEGE) && player.getSiegeState() < 2) player.teleportTo(TeleportType.TOWN); + if (player.isInsideZone(ZoneId.SOLO)) + { + ThreadPool.schedule(() -> { + Location exitLocation = VoiceExitSoloZone.getExitLocation(); + + if (exitLocation != null) + { + player.teleportTo(exitLocation.getX(), exitLocation.getY(), exitLocation.getZ(), 0); + player.sendMessage("You have been moved to the exit of the SoloZone."); + } + }, 5000); // 5000 milliseconds (5sec) + } diff --git a/java/net/sf/l2j/gameserver/model/actor/Player.java b/java/net/sf/l2j/gameserver/model/actor/Player.java new file mode 100644 index 0000000..6b7ef6f --- /dev/null +++ a/java/net/sf/l2j/gameserver/model/actor/Player.java @Override public void doRevive() { super.doRevive(); stopEffects(EffectType.CHARM_OF_COURAGE); sendPacket(new EtcStatusUpdate(this)); getStatus().setCpHpMp(getStatus().getMaxCp(), getStatus().getMaxHp(), getStatus().getMaxMp()); _reviveRequested = 0; _revivePower = 0; if (isMounted()) startFeed(_mountNpcId); + if (isInsideZone(ZoneId.SOLO)) + { + // Give Nobless (1323 ID) + L2Skill no = SkillTable.getInstance().getInfo(1323, 1); + no.getEffects(this, this); + sendMessage("You have received the Nobless status in the Solo Zone."); + } + }   If anyone thinks the code is wrong, please make an update and upload it here so I can update the post. A part was edited with chatgpt
    • Always remember, when you buy files, just compare with my files that I publish for free. and you will know that you are being ripped off. Greetings to all community!!! 🙂
    • Thank you for sharing. You are a capable and skilled person. Thank you again for your selfless dedication, Guytis🫡
    • he kept his promise! i think it's a good idea to unban his old account. he shares files with the community and could help both new and veteran l2off users! good job, Guytis!
  • Topics

×
×
  • Create New...