Jump to content

Recommended Posts

Posted

i want to know, one friend tell me that with a lvl 67 u can get a WM lvl 10, its true? som one got it? thx

 

Whit a lvl 67 ls u can get lvl 10 skill? no, u cant

 

PD: finally i get a refresh skill, with TOp 76 :D

 

What is refresh skill? LoL

Posted

Children  person  server Crasia www.l2dragon.org PVP it deserves him you see...

 

 

Παιδιά νέος  server Crasia www.l2dragon.org PVP αξίζει να τον δείτε...

Posted

its not ur work!! i had saw this guide 1 week ago in another forum and i was searching for it again at this time !! ty for making my search easier

Posted

ACTIVE SKILLS (Max Level Effect)

Acrobatics Increases the height from which you can jump without sustaining damage temporarily.

Aggression Increases the target's urge to attack. Power 659.

Agility Increases Dodge temporarily.

Aura Flare Unleashes an elemental attack against nearby enemies. Power 55.

Aura Flare Unleashes an elemental attack against the enemies near a target. Power 55.

Aura Flare Unleashes an elemental attack. Power 110.

Battle Roar Increases the maximum HP temporarily and restores HP by the increased amount.

Bleed Temporarily causes a target to bleed heavily. Effect 8.

Blessed Body Increases the maximum HP by 300 temporarily.

Blessed Soul Increases the maximum MP by 200 temporarily.

Charm Decreases a target's urge to attack. Power 330.

Cheer Increases the maximum CP by 300 temporarily.

Clarity Temporarily decreases the MP consumption rates for all skills.

Doom Temporarily blocks all of the target's physical/magic skills.

Duel Might Increases PVP P. Atk. temporarily.

Duel Weakness Decreases the opponent's PVP P. Atk. temporarily.

Empower Increases M. Atk. temporarily.

Fear Momentarily throws the target into a state of fear and causes him to flee.

Firework Ignites a Firework.

Focus Increases the chance of a critical attack temporarily.

Guidance Increases Accuracy temporarily.

Heal Empower Increases the power of HP recovery magic temporarily.

Heal Immediately recovers your HP. Power 552.

Hold Temporarily throws the target into a state of hold. The target cannot be affected by any additional hold attacks while the effect lasts.

Hurricane Creates a whirlwind of destruction. Power 110.

Hurricane Unleashes a powerful gusting attack against nearby enemies. Power 55.

Hurricane Unleashes a powerful gusting attack against the enemies near a target. Power 55.

Hydro Blast Unleashes a powerful liquidy attack against nearby enemies. Power 55.

Hydro Blast Unleashes a powerful liquidy attack against the enemies near a target. Power 55.

Hydro Blast Unleashes a spray of highly pressurized water. Power 110.

Iron Body Raises resistance to damage from falling.

Kiss of Eva Increases Lung Capacity temporarily.

Large Firework Ignites a Large Firework.

Lesser Celestial Shield Bestows temporary invincibility.

Magic Barrier Increases M. Def. temporarily.

Mana Burn Burns up the enemy's MP. Power 120.

Mana Gain Increases the recharge recover rate of MP.

Medusa Temporarily throws the target into a petrified state.

Might Increases P. Atk. temporarily.

Music Clarity Temporarily decreases the MP consumption rate for song/dance skills.

Music Refresh Temporarily decreases the re-use time for song/dance skills.

Music Plays music.

Mystery Skill Increases your head size.

Paralyze Temporarily throws the target into a state of paralysis.

Party Recall Teleports party members to a village. Cannot be used in a specially designated place such as the GM Consultation Service.

Peace Puts the opponent's mind at peace and erases the desire to attack.

Poison Temporarily poisons a target. Effect 8.

Prayer Increases the effectiveness of HP recovery magic temporarily.

Prominence Detonates a fireball by compressing the air around the caster. Power 110.

Prominence Unleashes a flaming attack against nearby enemies. Power 55.

Prominence Unleashes a flaming attack against the enemies near a target. Power 55.

Recall Teleports the caster to a village. Cannot be used in special areas, such as the GM Consultation Room.

Recall Teleports the caster to a village. Cannot be used in special areas, such as the GM Consultation Room.

Recharge Regenerates MP. Power 69.

Reflect Damage Allows you to reflect some of the damage you incurred back to the enemy for a certain amount of time. Excludes damage from skill or remote attacks.

Refresh Temporarily decreases the re-use times for all skills.

Resurrection Resurrects a corpse. Restores about 70% of additional Exp.

Ritual Regenerates CP. Power 473.

Shadow Flare Unleashes a dark attack against nearby enemies. Power 55.

Shadow Flare Unleashes a dark attack against the enemies near a target. Power 55.

Shadow Flare Unleashes a dark attack. Power 110.

Shield Increases P. Def. temporarily.

Silence Temporarily blocks the target's magic skills.

Skill Clarity Temporarily decreases the MP consumption rate for physical skills.

Skill Refresh Temporarily decreases the re-use time for physical skills.

Sleep Momentarily throws the target into a state of sleep when you are under attack. Additional chance to be put into sleep greatly decreases while the effect lasts.

Slow Temporarily decreases a target's speed.

Solar Flare Unleashes a sacred attack against nearby enemies. Power 55.

Solar Flare Unleashes a sacred attack against the enemies near a target. Power 55.

Solar Flare Unleashes a sacred attack. Power 110.

Spell Clarity Temporarily decreases the MP consumption rate for magical skills.

Spell Refresh Temporarily decreases the re-use time for magic skills.

Stealth Temporarily blocks a monster's pre-emptive attack. Fighting ability significantly decreases while in effect.

Stone Attacks the enemies near a target with a stone boulder. Power 55.

Stone Attacks the target with a stone boulder. Power 110.

Stone Unleashes an earthen attack against nearby enemies. Power 55.

Stun Temporarily throws the target into a state of shock.

Trick Cancels the target's status.

Unlock Opens level 3 doors with 100% probability and chests below level 72 with 90% probability. Requires 17 Keys of a Thief.

Vampiric Rage Increases the ability to restore some HP from the damage inflicted on an enemy temporarily. Excludes damage by skill or long-range attacks.

Vampiric Touch Absorbs HP. Power 88.

Wild Magic Increases the critical attack rate of magic attacks temporarily.

Winter Temporarily decreases a target's Atk. Spd.

 

Posted

Chance Skills (Max Level Effect)

Aggression Down Decreases a target's urge to attack during a critical attack. Power 330.

Aggression Up Increases a target's urge to attack during a critical attack. Power 659.

Aggression Provokes a target to attack during an ordinary physical attack. Power 659.

Agility Increases Evasion when under attack temporarily.

Bleed Momentarily throws the target into a bleeding state during a critical attack. Effect 8.

Bleed Momentarily throws the target into a bleeding state during a general physical attack. Effect 8.

Bleed Momentarily throws the target into a bleeding state during magic use. Effect 8.

Bleed Momentarily throws the target into a bleeding state when you are under attack. Effect 8.

Blessed Body Increases maximum HP by using attack rate for a certain amount of time.

Blessed Soul Increases maximum MP when under attack for a certain amount of time.

Charm Decreases a target's urge to attack during a general physical attack. Power 330.

Charm Decreases the enemy's urge to attack when you are under attack.

Cheer Increases maximum CP when under attack for a certain amount of time.

Doom Momentarily blocks all of the target's physical and magic skills during a critical attack.

Doom Momentarily blocks all of the target's physical and magic skills during a general physical attack.

Doom Momentarily blocks all of the target's physical and magic skills during magic use.

Doom Momentarily blocks all of the target's physical and magic skills when you are under attack.

Duel Might Increases PVP P. Atk. when under attack temporarily.

Duel Weakness Decreases the opponent's PVP P. Atk. when you are under attack temporarily.

Empower Increases M. Atk. when under attack temporarily.

Fear Momentarily throws the target into a state of fear and causes him to flee during a critical attack.

Fear Momentarily throws the target into a state of fear and causes him to flee during a general physical attack.

Fear Momentarily throws the target into a state of fear and causes him to flee during magic use.

Fear Momentarily throws the target into a state of fear and causes him to flee when you are under attack.

Focus Increases the critical attack rate when under attack temporarily.

Guidance Increases Accuracy when under attack temporarily.

Heal Restores your HP by using attack rate.

Hold Momentarily throws the target into a state of hold during a critical attack. The target cannot be affected by any additional hold attacks while the effect lasts.

Hold Momentarily throws the target into a state of hold during an ordinary physical attack. The target cannot be affected by any additional hold attacks while the effect lasts.

Hold Momentarily throws the target into a state of hold during magic use. The target cannot be affected by any additional hold attacks while the effect lasts.

Magic Barrier Increases M. Def. when under attack temporarily.

Mana Burn Burns up a target's MP during a critical attack. Power 88.

Mana Burn Burns up a target's MP during an ordinary physical attack. Power 88.

Mana Burn Burns up a target's MP during magic use. Power 88.

Mana Gain Increases the recharge recovery rate of MP when under attack.

Medusa Momentarily throws the target into a petrified state during a critical attack.

Medusa Momentarily throws the target into a petrified state during a general physical attack.

Medusa Momentarily throws the target into a petrified state during magic use.

Medusa Momentarily throws the target into a petrified state when you are under attack.

Might Increases P. Atk. when under attack temporarily.

Paralyze Momentarily throws the target into a state of paralysis during a critical attack.

Paralyze Momentarily throws the target into a state of paralysis during an ordinary physical attack.

Paralyze Momentarily throws the target into a state of paralysis during magic use.

Paralyze Momentarily throws the target into a state of paralysis when you are under attack.

Poison Momentarily throws the target into a poisoned state during a critical attack. Effect 8.

Poison Momentarily throws the target into a poisoned state during a general physical attack. Effect 8.

Poison Momentarily throws the target into a poisoned state during magic use. Effect 8.

Poison Momentarily throws the target into a poisoned state when you are under attack. Effect 8.

Prayer Increases the effect of HP recovery magic by using attack rate for a certain amount of time.

Recharge Restores your MP by using attack rate.

Ritual Restores CP when under attack.

Shield Increases P. Def. when under attack temporarily.

Silence Momentarily blocks the target's magic skill during a critical attack.

Silence Momentarily blocks the target's magic skill during a general physical attack.

Silence Momentarily blocks the target's magic skill during magic use.

Silence Momentarily blocks the target's magic skill when you are under attack.

Slow Momentarily decreases a target's speed during an ordinary physical attack. Effect 3.

Slow Momentarily decreases a target's speed when you are under attack.

Slow Momentarily decreases the target's speed during a critical attack. Effect 3.

Slow Momentarily decreases the target's speed during magic use. Effect 3.

Stun Momentarily throws the target into a state of shock during a critical attack.

Stun Momentarily throws the target into a state of shock during an ordinary physical attack.

Stun Momentarily throws the target into a state of shock during magic use.

Stun Momentarily throws the target into a state of shock when you are under attack.

Wild Magic Increases the critical attack rate of magic attacks when under attack temporarily.

Winter Momentarily decreases a target's Atk. Spd. during an ordinary physical attack. Effect 3.

Winter Momentarily decreases a target's Atk. Spd. when you are under attack.

Winter Momentarily decreases the target's Atk. Spd. during a critical attack. Effect 3.

Winter Momentarily decreases the target's Atk. Spd. during magic use. Effect 3.

 

Posted

Passive Skills

Acrobatics Increases the height from which you can jump without sustaining damage when equipped.

Agility Increases evasion when equipped.

Clarity Decreases the MP consumption rate for all skills when equipped.

Duel Might Increases PVP P. Atk. when equipped.

Empower Increases M. Atk. when equipped.

Focus Increases critical attack rate when equipped.

Guidance Increases accuracy when equipped.

Heal Empower Increases the power of HP recovery magic when equipped.

Iron Body Raises resistance to damage from falling when equipped.

Kiss of Eva Increases lung capacity when equipped.

Magic Barrier Increases M. Def. when equipped.

Mana Gain Increases the recharge recovery rate of MP when equipped.

Might Increases P. Atk. when equipped.

Music Clarity Decreases the MP consumption rate for song/dance skills when equipped.

Prayer Increases the effect of HP recovery magic when equipped.

Reflect Damage Increases the ability to reflect some of the damage you incur back to the enemy when equipped. Excludes damage by skill or long-range attacks.

Shield Increases P. Def. when equipped.

Skill Clarity Decreases the MP consumption rate for physical skills when equipped.

Spell Clarity Decreases the MP consumption rate for magic skills when equipped.

Weight Limit Increases the weapon weight limit by 2 times when equipped.

Wild Magic Increases the critical attack rate of magic attacks when equipped.

 

Posted

@fallout3 i would love to add more things to my main post but there is a limmit of 20.000 letters per post (and the 1 post is full, i will ask a mod to give me the second post so i can add more things)

 

 

@david150 u can get any skill whit any stone lvl for example once i got wild magic lvl 5 in a homonkulus

and Magic barrier lvl 8 in a sword of miracles  ^^

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...