Jump to content

Recommended Posts

Posted (edited)

lirael5.gif

 

www.L2Equanimity.com

 


Rates

-We are a High Five Server! (aka High Five CT2.6)
-XP Rate: x120
-SP Rate: x120
-Party XP Rate: x2
-Adena Rate: x250
-Enchant Rate: 70%
-Blessed Rate: 75%
-Safe Enchant: +7
-Max Enchant: +20
-Buffs: 3 hours

Information

- Even though our server is highly modified, our server is based off L2J, so we thank them for their hard work!



cloaks.jpg


- Unique!
Stuff you may have never seen before. Custom Cloaks, Custom Boss Jewels, Custom Talismans, PvP Assists (Healers and support classes get prizes in PvP too). Give us 30 minutes of your time, and your likely to say we have one of the best servers you have ever seen, if not the best. We have also been told we have the most organized server they have ever seen as well.


sieges.jpg


- PvP Assists!
PvP on our server is better! Its fair to all classes. All classes can get recognition in PvP, even Healers. Anytime a player contributes to PvP they can qualify for a PvP Assist. This means healing/buffing allies can get you Assists, or debuffing or damaging targets can give you assists too. Other servers only care about DDs (Damage Dealers), we care about everyone. PvP rewards are split between the person who gets the PvP , and the person who gets the PvP Assist.


pvpstreak.jpg

 

- Dimensional Portals!
We have developed a fun Portal system for players. Various regular activites such as killing monsters, fishing, and spoiling can help gain access to these randomized portals that give cool prizes including access to R Grade Armors for the Goddess Of Destruction Client for .dressme


eternalarmor.jpg


- PvP Streaks
We have PvP Streaks on our server, but again, this is not just for DDs (Damage Dealers). An Assist counts the same as a PvP. This means support classes, even healers can get in on PvP Streaks as well. PvP Streaks grant prizes such as Custom PvP Cloaks you have never seen on any other server, non tradable versions of GCM, Top 84 LS, and more!


newplayershit.jpg


- New Player Benefits!
-- New players receive bonuses at these levels, 20, 40, 52, 61, 76, 80, 81, 82, 84, and 85.
-- You have special benefits for 30 Days!
-- You get additional prizes stacked on normal ones for activities such as events, voting, and instances. Normal players do not get these extra prizes that you do!
-- Newbie Scrolls grant you instant access to to S84 Gear and much more!
-- Gear that Newbies get are easier to ++ and easier to add elements to as well!
-- Newbie Character start out with special items like Bound GCM, Bound GC, Bound Top 84 LS. These are just like the normal versions of these items, simply they can not be traded
- You will always have enough Adena to get the next grade of gear, as long as your not blowing stuff up wasting it.


achievements.jpg


- Achievement System
Thats right, we have an Achievement system, players can complete special tasks such as completing a quest in a certain amount of time, doing exceptionally well in our custom instances, and more. They will be rewarded with items, and achievement points for completing those tasks, to see the full achievement list come check it out in game! Achievements also unlock new weapon glows, new title/name colors, fun weapons, and cloaks! We have 36 Acheivements and we continue to add more.


tvt.jpg

scoreboard.png


-Custom Event Engine, that we made!
- Team Vs Team (TvT)
- Capture the Flag (CTF)
- King of the Hill (KOTH)
- Capture the Point (CTP)
- Raid Battle (RB)
- Death Match (DM)
- Death Match Survival (DMS)
- All our events have alternating maps to vary the scenary and strategy!
- Set-up time for events (kinda like in olympaid) where you get to prepare yourself.
- You choose your location on the battlefield (From a preslected assortement of course)
- Party building features, we make it easy to know who needs a party, whos the party leaders and whos a support class
- Team Chat
- Assists (Not just damage dealers get recognition for killing people, support classes do too!)
- Statistics, your event stats such as kills, deaths, assists, captures, damage done, and damage taken are recorded, and everyone can view the results at the end of the match.
- Anti afk features.
- Even if you lose you still get a prize!
- Plenty more!


options.png


- Lots of settings in .options.
Our .options command lets you modify a lot of your personal settings such as On Screen Damage displayer, Your choosable weapon glow settings, .dressme, Exp Mode, Buff mode, PvP Messages, All Block, Soul Shot Color, WH Sorting patterns, Pop Up Critical Hit messages, Pop Up debuff messages telling you when your skills landed and your Anonymouse PvP settings (For PvP Zones). All of which will be saved to your character, you will not have to adjust them next time you log in.

- Anonymous PvP Mode
Our .options command gives you access to our Anonymous PvP Mode. Which is only usable in special PvP Zones. It allows you to be completely anonymouse, other players wont know your clan, your name, pretty much everything that tells you who you are is changed, even heros no longer have a hero glow in this mode. What is this good for? Well lots of thing, practicing PvP and/or new set ups knowing you wont be humiliated, because no one will now it was you. It can also be used for fun, you can even attack and kill your own clan members in this mode, they won't know its you. Its simply another way to have a good time or expirement.


dressme.jpg


- Dress Me for Armors, Weapon Glows and for Cloaks!
We have a .dressme command that enables you to change your armors texture to look like a different armor set, and cloak. also we allow players to choose their weapon glows, these features and more are saved to your character and restored when you log back in.

- Vote Reward System
You will be rewarded everyday that you vote. 10% more adena per drop for 24 hours when you vote, you also get full Vitality. 10 Gold Einhasad to use in the Voting Area of the GM Shop, and you get a randomized reward stacked on top of that.


rebirth.jpg


- Rebirth System
At Level 85 players may rebirth, to obtain new skills or to get special items. You can rebirth as many times as you want, and you keep all your skills, and subs!

- Development
Our server is always getting updates, we strive to make our server the best so you will see a constant flow of updates that can be viewed in the server news window in-game, or on our websites homepage that shows our complete list of updates for each month.

- Crystal Scrolls Support
Crystal Scrolls are 100% enchant rate, but only drop from Valakas and Antharas so they are extremely RARE!

- Custom Instance Zones
Our Solo Instance Zone, is a solo mini adventure that you wont see anywhere else except right here on L2 Equanimity! Expect fun and prizes and wanting to come back to do it all over again. Our Group Instance Zone Event, is for 3 to 9 people in a party,, which is also a unique L2 Equanimity feature you wont see anywhere else, and you can bring you friends along for the ride!


modified.jpg


- Modified Classes
Some people may be skeptical of this idea, but aren't you tired of seeing all the same classes being played, for example TH, HE, SH, Tanks, and Bishop? Well here there is a reason to play just about every class. Commonly not played classes such as Summoners, Dwarfs, BD, SwS, EE, SE have been modified with extra skills and even servitors have added stat bonuses to make them better! A complete list of modified classes and exactly what was changed for them is available in game when typing our custom command (.info). Do not worry though, but normal and modified classes are subject to nerfing if they become too strong.

- Custom Spoil System
Why not utilize a great game mechanic! All of our custom Farmzones monsters have special spoils that are used as a new currency for unique items not available anyway else other then spoiling.

- Custom Talismans
Talismans DO NOT disappear on our server, also we have custom made Talismans that give effects like extra HP, CP, or M def.

- Offline Shops are enabled
If you create a shop in a peace zone, then log out, your shop will stay online.

- A special command (.info) that lets you perform actions from anywhere
Players may augment from anywhere with (.info) command. Players may Add/Remove Dyes from anywhere with (.info) command. Players may see if Epic Raids & Custom Raids are Alive from anywhere with (.info) command. You may see top PvP/PK of everyone on the server from anywhere with (.info) command. You may also check many other things with this command in game like, rules, rates, server news, Farming area info, Staff info, Donations, and Modified Class Information!

- Completely Custom and unique Farmzones
All Custom Farmzones contain Custom Raid Bosses. Custom Mobs have Custom skills and even player skills (mobs can even do things like lethal you or disarm you). We have a total of 5 Custom Farmzones, one for level 50-70, one for 70-80, two for 80-85 and one group Farmzone for multiple people over 80. Each of our 5 Farmzons have a Variety of completely different mobs! For more in depth info about our Farmzones check them out in game!


npccollage.jpg
-NPC Information
All our custom NPCs layouts are very organized unlike most servers! Our NPC Buffer can buff you and also buff your pets! You may create custom buff schemes! We have a extremely organized GM Shop with a wide variety of contents. Our Gm Shop is also influenced by castle owners tax rates, so that players can make money by owning an castle, and have some power over the prices. We have a Global Gatekeeper with a clean organized layout that allows you to go almost anywhere easily. Also NPC functions that allow you to De-Level, change your name and title color, give reputation points for farmed items, and even have a NPC Function that allows you to directly enchant your items from +0 to +7 (our safe enchant), but 7 enchant scrolls are still required, this is a custom feature to save you time!

- PK protection
We have a buff that anyone can obtain at our buffer that makes it where a player cannot be attacked by another player that is 1 or more levels higher then them, and in vice versa. Additionally if you are the same level and you are PKed, if the player who got Pked is new, that person gets +2 Pks and x2 the Karma. On our server, you can not work off your karma in just 1 mob, it actually takes some effort. Also we have some safe zones for people ot farm as well if they want to do it in peace.

- Other Features
-- Bot Protection
-- DDoS Protection
-- Territory Wars
-- Fortresses
-- Subclass Certification System
-- Subs may be leveled up to 84
-- Full Geodata
-- Anonymouse Olympiad to help prevent feeding.
-- Hero Weapons are Enchantable!
-- Heroes every 2 weeks
-- Special Rewards for Fishing
-- and much more!

 

www.L2Equanimity.com

Edited by L2Equanimity
  • 1 year later...
Posted

Updated First Post with the following information :)

 

 

- Dimensional Portals!
We have developed a fun Portal system for players. Various regular activites such as killing monsters, fishing, and spoiling can help gain access to these randomized portals that give cool prizes including access to R Grade Armors for the Goddess Of Destruction Client for .dressme


eternalarmor.jpg

 

If you have any questions about our server, feel free to ask! :)

  • 4 weeks later...
Posted

Server is fine and all but noone is gonna join such an old server with such an old community like this, u should prolly think about wipe it and wait for new players to come, anyways goodluck!

Posted

Server is fine and all but noone is gonna join such an old server with such an old community like this, u should prolly think about wipe it and wait for new players to come, anyways goodluck!

 

Hello, thanks for your comment :)

 

Not sure if you noticed all our new player bonuses

 

- New Player Benefits!

-- New players receive bonuses at these levels, 20, 40, 52, 61, 76, 80, 81, 82, 84, and 85.

-- You have special benefits for 30 Days!

-- You get additional prizes stacked on normal ones for activities such as events, voting, and instances. Normal players do not get these extra prizes that you do!

-- Newbie Scrolls grant you instant access to to S84 Gear and much more!

-- Gear that Newbies get are easier to ++ and easier to add elements to as well!

-- Newbie Character start out with special items like Bound GCM, Bound GC, Bound Top 84 LS. These are just like the normal versions of these items, simply they can not be traded

- You will always have enough Adena to get the next grade of gear, as long as your not blowing stuff up wasting it.

 

We are refining our new player bonuses all the time, and always adding new ways give them an edge!

 

We also have special events specifically designed for new players called "Limited" mode events. Where the max enchant is +10 (7 is safe btw). Also clan/hero skills/items  can not be used so its much even playing field. Also you get prizes in any event even if you lose.

 

Also i would like to point out that we have customized weapon glows that players choose, so it will look like people are full even if they have +7, so part of it i assure you is a misconception. You can customize almost everything here, your glows, your armor, your soul shot, your cloaks etc.

 

Also i would like to say that wipes are in most cases for poorly designed servers that are not planned out for the long term. They are also usually used as a greedy cash grab for admin that don't respect their players work. Not everything about wipes are bad, but most of it is, and the majority of the time in the private server sector its used badly. Wipes are also used to fix problems that admins created, like horrible economies and crazy bugs they couldn't fix fast enough.

 

Our server has been open for over 5 years now, no wipes, and we are still going strong. We are experienced and know what we are doing. Wipes are simply not an option, cause they are not needed, we are successful with out them, and we actually respect our players and their work.

  • 2 weeks later...
Posted

what about opening an new fresh srv?you guys are really good,think about opening an new high rate would be awesome

 

People have asked this before, its a possibility, but people still join our server ever day even though our server is over 5 years old, and plenty do actually stay, because we offer things other servers don't, we are incredibly feature rich and that we do offer the benefits described above to new players :)

Posted

Nope, they will keep this one alive for next 20 years, until the sun explodes.

 

Correction, we will outlive the sun :)

 

I wouldn't consider devotion, and respecting players work/time a problem. I would consider servers that close/re-open/wipe all the time to be the real issue!

Posted

People have asked this before, its a possibility, but people still join our server ever day even though our server is over 5 years old, and plenty do actually stay, because we offer things other servers don't, we are incredibly feature rich and that we do offer the benefits described above to new players :)

 

Why dont you open a fresh server then. and keep that one alive? You will see that 99% of the "old" players will move to the new one. LINEAGE2 IS ABOUT COMPETITION... What competition is there if you have been fighting for hero with the same 3-4 enemies for the last 2 years? What's the pvp excitement? If you already have pvp'ed with every player on the server 200 times...

 

Features are amazing, but until you do something towards "fresh players" no1 will appreciate them.

You just should make a vote on your website/forum and you will see that the most of oldschool players will also vote for new server with much higher online and new adventures.

That's just my opinion.

Posted (edited)

Why dont you open a fresh server then. and keep that one alive? You will see that 99% of the "old" players will move to the new one. LINEAGE2 IS ABOUT COMPETITION... What competition is there if you have been fighting for hero with the same 3-4 enemies for the last 2 years? What's the pvp excitement? If you already have pvp'ed with every player on the server 200 times...

 

Features are amazing, but until you do something towards "fresh players" no1 will appreciate them.

You just should make a vote on your website/forum and you will see that the most of oldschool players will also vote for new server with much higher online and new adventures.

That's just my opinion.

 

- We don't have the same heroes for too years

- You won't be fighting the same people forever, new people join every single day, so new blood is added all the time!

- Our PvP is exciting :)

- Thanks for your kind words about our features! Our old and NEW players love them We will continue to add more!

- I have never said we won't create a new server, i just said i refuse to wipe our current, cause that's messed up.

 

Fresh players appreciate our features. As you can see we are not like other servers. Our approach is much different. I have developed a new player tracking system. So we know how many new players join the server everyday, and i even try to talk them. I welcome them to our server. Teach them about our new player bonuses, and how to utilize them, and the best ways to get stronger faster. This creates a relationship with these players, and i give them all my contact info, so they can contact me any time, and i will help them, and they won't be afraid to ask me for help.

 

Our new player tracking system + our extensive new player bonuses works wonders. Also, 90% of the players i contact are simply amazed in the fact the Admin is actually contacting them, and trying to help them, which says a lot. Most people never even see an admin, let alone get any help.

Edited by L2Equanimity
  • 1 month later...

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

    • 🔥 L2Gold.co x15 Interlude Server 2025 – Grand Opening! 🔥 Join us today and be part of the legendary L2Gold community! 🎉 Grand Opening: 14 March 2025 🎉 ⏰ Time: 21:00 GMT +2 🌍 Server Type: EURO PTS/L2OFF 🌟 Why Play on L2Gold.co? 🌟 ✅ No Wipes – Keep Your Progress Forever! Your characters and progress are permanent. No resets! ✅ Balanced & Fun Gameplay! Experience x15 rates for a smooth and enjoyable progression. ✅ Solo or Party Play Use MP potions and NPC buffers for a great solo experience or team up with friends. ✅ Long-Term Stability Our server is built to last with no interruptions! 📊 Server Rates & Details 📊 Category Rate EXP/SP x15 (Official rate without rune or VIP) Adena x10 (Official rate without rune or VIP) Drop x10 (Official rate without rune or VIP) Spoil x10 (Official rate without rune or VIP) Raid Boss Drop x10 (Official rate without rune or VIP) 🚀 Exciting New Features! 🚀 🎟️ 💰 Weekly Lottery System! – Win rare items, in-game currency, and exclusive rewards! 🎁 More Events & Rewards! – Special in-game activities with exclusive items! 📈 Real-Time Stats! – Track your progress, achievements, and rankings live! ⚔️ New Items Weekly! – Discover rare gear and unique items every week! 🌍 A Growing Global Community 🌍 Players from Greece 🇬🇷, Brazil 🇧🇷, Spain 🇪🇸, and beyond! 🔗 Stay Connected 🔗 Follow us on social media to stay updated! 🌎 Website: L2Gold.co 🎙️ Discord: Server 📘 Facebook: Page | Group 🎥 YouTube:   Watch Videos 🎵 TikTok: Follow Us 🔥 Prepare for Battle! 🔥 📅 The adventure begins on 14 March 2025! Join L2Gold.co and Experience an Unforgettable Adventure! 🎮✨
    • y girate unos archivitos del powerclass dale..... sin encrypt
    • Hi, im looking for cardinal pvp script for auto cleanse/rez/nobles etc etc and guide on how to setup as well as what programms do i need to run such scripts as i have never used any helper or something before,
    • [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!!! 🙂
  • Topics

×
×
  • Create New...