Jump to content

Recommended Posts

Posted

logo.png

 

 

 

 Website: https://l2dark.net/index

Discord: https://discord.gg/Kz6d9vhfc3

 

 

Hello Friends, 

finally, the moment has arrived: I'm launching my own server, L2Dark!

It's been a journey of faith and determination, but seeing it come to life is beyond rewarding.

Together with my Team we've decided to put our years worth of experience and resources into practical use and start the best premium Lineage 2 server complex this community has ever seen.

Chapter 1 of L2Dark will be held on the High Five client. On this popular and flexible chronicle we're able to apply many of the concepts we're excited about.

Future Chapters will be branched out to different categories. So even if you're not a lover of High Five yourself stay tuned for project because we very might well expand our complex to your favourite chronicle. 

I would love to chat personally with all of you over on our Discord and discuss any suggestions or feedback you might have. 

After dedicating years to this community I'm more than excited to share this journey with all of you.

I appreciate your support and hope to see you on L2Dark soon.

 

 

 

L2 Dark x25 Closed Beta Test - Start: 10.05.2024

Welcome to our closed beta registration form for our server L2Dark.

We kindly ask you to provide us with the following information if you want to join our closed beta environment.

Please only fill out the form once.

 

Application Form BETA!

If your application is succesful our Team will contact you and provide you with a "Closed Beta" role for our Discord server for access to a private Channel where you can give suggestions.

Please try to answer as honest as possible. Your answers will be handled completely anonymous.

We reserve our rights to permanently ban "troll" replies from our beta tests, in severe cases we might extend this to live servers. Please treat our project with respect.

Thank you for choosing L2Dark,
we look forward to seeing you ingame.

 

 

 

 

 

 

 

7RRjouC.png

 

 

 


Explore L2 Dark's Features

Discover the Enhancements that set us apart!

 

  • autoskill.jpg Auto Learn Skills including divine Inspiration and Forgotten Scrolls
  • autoloot.jpg Auto Loot
  • enchant.jpg Safe Enchant +3 | Max Enchant +16
  • tickets.jpg Newbie Tickets up to C grade for a comfortable start
  • boxlimit.jpg Box Limit 3 Windows
  • offlinebuff.jpg Offline Buffstore function
  • offlinestore.jpg Offline Sell/Buy shop function
  • gmshop.jpg GM Shop up until S grade
  • buffslot.jpg Buff Slots: 26+4 Buffs / 12 Songs & Dances
  • buffduration.jpg Buff Duration: 2h
  • class.jpg Free class Change
  • subclass.jpg Subclass / Certification quest: Not required
  • noblesse.jpg Noblesse Quest: Retail

 

cXbJaLx.png

 

 

 

 

 

  • rewards.jpgCalender Rewards
  • olympiad.jpg Improved Olympiad Shop
  • cb.jpg Community Board with all neccessary functions
  • boxlimit.jpg L2 OFF Geodata (Latest PTS Sources)
  • MDJtKhk.png Remastered Olympiad
  • glnU1ZR.png Advanced User Interface
  • QSfd99n.png Landrate on debuffs visible on system chat
  • 1DPXrBf.png Macro bug disabled
  • a13jgN5.png 45lvl XP range in Party
  • BxEx09O.png Drop Database
  • z2s99Lm.png Detailed map zones
  • Z4WjvlW.png Shift click to see players inventories
  • Y4cztnH.png Unique Dressme system
  • iA9FVW2.png Unique Emote system

 

 

pZP7A0x.png

 

 

 

  • autoaugment.jpg Automatic Augmentation System
  • autoskillenchant.jpg Automatic Skill Enchant System
  • attribute.jpg Automatic Attribute System
  • autofarm.jpg Modern Autofarm system

 

 

 

vwRcWuM.png

 

 

 

 

  • 9u4luai.png AQ lvl 40
  • zUxyj7X.png Core  lvl 80
  • zXTZ6uK.png Orfen lvl 80
  • T49aX58.png Set Schedule of Epic RBs
  • bhwQlwn.png Three days per week designated for Olympiad, Sieges, and Farming, with scheduled rotations for Epic Raid Bosses.
  • MyrhxcJ.png Modern Looting Rights System
     Implemented with on-screen visibility of DPS leading crowd control efforts

 

 

erwbpJh.png

 

 

 

  • GDVD4Wx.png Experience Rates: x25 base
  • mIJEOsv.png Drop Rates: x12 base
  • S5uKOs6.png Spoil Rates: x8 base
  • sy2iAGj.png Quest Rate: x3 (Certain quests are excluded)
  • suQkI8o.png Subclass Quest: Not required
  • YNXKa6U.png Certification Skills Quest: Not required
  • noblesse.jpg Noblesse Access: Obtainable through retail quest or for an affordable price from the community board (Subclass level 75 required)

 

vLqGCU5.png


 

 

 

 

  • qIyh9NX.png Geodata Improvement: Enhanced geodata for all castles, ensuring smoother movement and interactions.
  • 587mYkV.png Castle Defenses: Strengthened castle walls and gates with increased health for more challenging sieges.
  • 2Z8Ybv4.png Territory War Rework: Top castles start with multiple flags, while certain castles will have no flag as default, introducing strategic variety.
  • KUgL9d9.png Fame on Kill: Earn fame for kills in the combat zone during sieges.
  • RrOVbgk.png Strategic Enhancements: Various improvements to strategic factors, enhancing the depth of castle siege gameplay.
  • t9tXHp9.png Gameplay: Experience a dynamic and immersive gameplay environment, enhanced by the aforementioned improvements and custom features.

 

 

gON4E0F.png

 

 

 

  • GDVD4Wx.png Premium Experience Rate: Increased to x37.5.
  • mIJEOsv.png Premium Drop Rate: Boosted to x18.
  • S5uKOs6.png Premium Spoil Rate: Enhanced to x12.

Unlock the full potential of your adventure with these exclusive premium benefits!

 

 

  • Like 6
Posted
Just now, L2Dark said:

The Hype is real. It's time for L2Dark!

It's rare to find a decent project these days, and even rarer to find one with competent developers and administrators who aren't just hungry for money. I highly recommend what's about to come from this server! Hopefully, H5 will be revived after having such a low bar for so many years. Glad to be working with you guys, and good luck! 👍

Posted
On 4/17/2024 at 3:28 PM, Celestine said:

logo.png

 

 

 

 Website: https://l2dark.net/index

Discord: https://discord.gg/l2dark

 

 

Hello Friends, 

finally, the moment has arrived: I'm launching my own server, L2Dark!

It's been a journey of faith and determination, but seeing it come to life is beyond rewarding.

Together with my Team we've decided to put our years worth of experience and resources into practical use and start the best premium Lineage 2 server complex this community has ever seen.

Chapter 1 of L2Dark will be held on the High Five client. On this popular and flexible chronicle we're able to apply many of the concepts we're excited about.

Future Chapters will be branched out to different categories. So even if you're not a lover of High Five yourself stay tuned for project because we very might well expand our complex to your favourite chronicle. 

I would love to chat personally with all of you over on our Discord and discuss any suggestions or feedback you might have. 

After dedicating years to this community I'm more than excited to share this journey with all of you.

I appreciate your support and hope to see you on L2Dark soon.

 

 

 

L2 Dark x25 Closed Beta Test - Start: 10.05.2024

Welcome to our closed beta registration form for our server L2Dark.

We kindly ask you to provide us with the following information if you want to join our closed beta environment.

Please only fill out the form once.

 

Application Form BETA!

If your application is succesful our Team will contact you and provide you with a "Closed Beta" role for our Discord server for access to a private Channel where you can give suggestions.

Please try to answer as honest as possible. Your answers will be handled completely anonymous.

We reserve our rights to permanently ban "troll" replies from our beta tests, in severe cases we might extend this to live servers. Please treat our project with respect.

Thank you for choosing L2Dark,
we look forward to seeing you ingame.

 

 

 

 

 

 

 

7RRjouC.png

 

 

features.png?ex=66329b58&is=66202658&hm=


Explore L2 Dark's Features

Discover the Enhancements that set us apart!

 

  • autoskill.jpg Auto Learn Skills including divine Inspiration and Forgotten Scrolls
  • autoloot.jpg Auto Loot
  • enchant.jpg Safe Enchant +3 | Max Enchant +16
  • tickets.jpg Newbie Tickets up to C grade for a comfortable start
  • boxlimit.jpg Box Limit 3 Windows
  • offlinebuff.jpg Offline Buffstore function
  • offlinestore.jpg Offline Sell/Buy shop function
  • gmshop.jpg GM Shop up until S grade
  • buffslot.jpg Buff Slots: 26+4 Buffs / 12 Songs & Dances
  • buffduration.jpg Buff Duration: 2h
  • class.jpg Free class Change
  • subclass.jpg Subclass / Certification quest: Not required
  • noblesse.jpg Noblesse Quest: Retail

 

cXbJaLx.png

 

 

features.png?ex=66329b58&is=66202658&hm=

 

 

  • rewards.jpgCalender Rewards
  • olympiad.jpg Improved Olympiad Shop
  • cb.jpg Community Board with all neccessary functions
  • boxlimit.jpg L2 OFF Geodata (Latest PTS Sources)
  • MDJtKhk.png Remastered Olympiad
  • glnU1ZR.png Advanced User Interface
  • QSfd99n.png Landrate on debuffs visible on system chat
  • 1DPXrBf.png Macro bug disabled
  • a13jgN5.png 45lvl XP range in Party
  • BxEx09O.png Drop Database
  • z2s99Lm.png Detailed map zones
  • Z4WjvlW.png Shift click to see players inventories
  • Y4cztnH.png Unique Dressme system
  • iA9FVW2.png Unique Emote system

 

 

pZP7A0x.png

 

 

features.png?ex=66329b58&is=66202658&hm=

  • autoaugment.jpg Automatic Augmentation System
  • autoskillenchant.jpg Automatic Skill Enchant System
  • attribute.jpg Automatic Attribute System
  • autofarm.jpg Modern Autofarm system

 

 

 

vwRcWuM.png

 

 

features.png?ex=66329b58&is=66202658&hm=

 

  • 9u4luai.png AQ lvl 40
  • zUxyj7X.png Core  lvl 80
  • zXTZ6uK.png Orfen lvl 80
  • T49aX58.png Set Schedule of Epic RBs
  • bhwQlwn.png Three days per week designated for Olympiad, Sieges, and Farming, with scheduled rotations for Epic Raid Bosses.
  • MyrhxcJ.png Modern Looting Rights System
     Implemented with on-screen visibility of DPS leading crowd control efforts

 

 

erwbpJh.png

 

 

features.png?ex=66329b58&is=66202658&hm=

  • GDVD4Wx.png Experience Rates: x25 base
  • mIJEOsv.png Drop Rates: x12 base
  • S5uKOs6.png Spoil Rates: x8 base
  • sy2iAGj.png Quest Rate: x3 (Certain quests are excluded)
  • suQkI8o.png Subclass Quest: Not required
  • YNXKa6U.png Certification Skills Quest: Not required
  • noblesse.jpg Noblesse Access: Obtainable through retail quest or for an affordable price from the community board (Subclass level 75 required)

 

vLqGCU5.png


 

 

features.png?ex=66329b58&is=66202658&hm=

 

  • qIyh9NX.png Geodata Improvement: Enhanced geodata for all castles, ensuring smoother movement and interactions.
  • 587mYkV.png Castle Defenses: Strengthened castle walls and gates with increased health for more challenging sieges.
  • 2Z8Ybv4.png Territory War Rework: Top castles start with multiple flags, while certain castles will have no flag as default, introducing strategic variety.
  • KUgL9d9.png Fame on Kill: Earn fame for kills in the combat zone during sieges.
  • RrOVbgk.png Strategic Enhancements: Various improvements to strategic factors, enhancing the depth of castle siege gameplay.
  • t9tXHp9.png Gameplay: Experience a dynamic and immersive gameplay environment, enhanced by the aforementioned improvements and custom features.

 

 

gON4E0F.png

 

features.png?ex=66329b58&is=66202658&hm=

 

  • GDVD4Wx.png Premium Experience Rate: Increased to x37.5.
  • mIJEOsv.png Premium Drop Rate: Boosted to x18.
  • S5uKOs6.png Premium Spoil Rate: Enhanced to x12.

Unlock the full potential of your adventure with these exclusive premium benefits!

 

 

This is gonna be the best highfive project around! We hope to see everyone there! ❤️

ezgif-com-animated-gif-maker-3.gif

Posted

Good luck with your project guys & I really wish you a great success. I have to agree with @911reg that the whole team is not hungry for anything and that you are doing this truly by heart and love for the game. I see you working on this project for a long time and it's truly admirable. I'm glad I was able to be a part of your journey. ❤️

Posted

Finally a solid looking EU project. Features looking fresh, especially I like the idea of "Chapters", gives the vibe that this is the start of something big. Can't wait to see how this turns out in the future.
Team composed by very cool and hard working people so skys the limit ig.💜
 

  • Like 1
  • 3 months later...
Posted
3 hours ago, hmzzz said:

5 months beta? project gg?

It seems to me that you're too used to seeing servers opening without any actual work on their files; good things take time to make

  • Like 1
  • Upvote 1
Posted

Dear players 

 

A lot has happened since the last Closed Beta Test, and many of you keep asking when the Open Beta of L2Dark can be expected. 🎮

 

First of all, I'd like to thank you all on behalf of everyone on the team. 🙏 The constant engagement and many messages, either through here or DM's, keep us motivated to continue our journey and keep building L2Dark. 🛠️ Our main priority for Chapter 1 is to implement our well-thought-out ideas and deliver a place where everyone can have a stable and non pay-to-win game experience. 🌟

 

We feel confident as our progress continues, and finally, we're ready to announce concrete dates for how this project will move forward. 📅

 

I'm happy to announce that our OPEN BETA TEST will open in 3 weeks from now on:

Friday, 20th September / 20:00 GMT +1 🕗

 

From previous experiences, we've learned that most people don't tend to enjoy long Open Beta tests, and the quality of feedback steadily declines as time passes. 📉 Therefore, we've decided to keep the Open Beta running until Monday, 23rd September.

 

Three days of OBT will allow us to have as many team members online as possible to assist you in testing and exploring L2Dark. 🕹️ After the first testing weekend, we'll dedicate the entire week to fixing bugs or implementing optimizations recommended by the community. 🛠️ It's likely another Open Beta Test weekend will follow after that, but more on that later. 🔄

 

If the Open Beta Tests play out as intended, we'll announce the date for the Grand Opening at the end of the first Open Beta Test. 🥳

 

Once again, I'd like to thank everyone for their interest in partaking in this journey with us, and we hope to see you soon on the OBT of L2Dark! 👍

 

With Love,
L2Dark Team ❤️

 

 

  • Like 1
  • 3 weeks later...
Posted

L2Dark Open Beta is Now Live! 🎉

 

We're excited to announce that the L2Dark Beta is officially online!

 

To get started, please download the launcher using the following link:
🔗 L2Dark Beta Launcher

 

Once downloaded, run the launcher to update all necessary game files. ⚙️
Please note: Using an old client is not recommended, as it may cause issues.

 

If you encounter any difficulties with the launcher, don't hesitate to reach out, and we'll provide alternative solutions. 💡

 

The Open Beta channels are now live under ⁠🔹・general.
We look forward to seeing you in-game soon! ⚔️

 

Best regards,
The L2Dark Team ✨

  • Like 1
  • 2 weeks later...
Posted

🎮 Dear players,

 

We thank you for all the participation in 🧪 testing and troubleshooting over the past weeks. 🎁 Reward boxes for Closed and Open Beta participants have already been prepared and will be given out shortly after launch.

 

After roughly 7 months in the making, we're glad to finally announce a Date for our Grand Opening 🏆.

 

🔥 L2Dark will open on 25th October 2024 at 21:00 CET 🕘.

 

The Open Beta phase is currently finished, and we'll re-open the beta a few days before live servers for players to get accustomed to the server and prepare for the Grand Opening 🚀.

 

We're insanely excited 🤩 about finally sharing our work with you, and we're looking forward to answering any questions you might have. We can't wait to welcome you to our Server 🖥️.

 

Let's make this server the best it can possibly be, together ✨.

 

With ❤️,
L2Dark Team 🖤

 

 

  • 3 weeks later...
Posted

🎉 Only 4 days left until the epic Grand Opening of L2Dark this Friday! 🎉

 

Make sure to check out our Discord Event (link above) and get in on the excitement. Got questions or ideas? We’d love to hear from you! Drop them in the ⁠💬general or ⁠💡suggestions channels. Let’s make this launch unforgettable! :cute:

Posted

The wait is almost over! In just over 24 hours, the open beta for L2Dark begins, and we can’t wait to see you there! 🎉 Get ready by downloading the launcher through ⁠🔗how2connect, and gear up for some exciting testing with your friends.

 

Important Reminder:
Be sure to run the installer in a clean folder, allowing it to fully download without using a “clean client” as a base. Doing so may cause issues with the game. Our launcher has received a significant speed boost, so you can download the files quickly no matter where you are!

 

We’ll see you tomorrow on L2Dark! ❤️

 

test2.png?ex=67191f57&is=6717cdd7&hm=174

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • y girate unos archivitos del powerclass dale..... sin encrypt
    • [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...