Jump to content
  • 0

What Chronicle L2Off Is This?


Question

Posted

Surfing various L2 related sites, I managed to harvest this screenshot:

o4erOsn.jpg

 

Despite the different Korean font, I could not identify the chronicle - does this mean that someone leaked Epeisodion++ L2OFF?

Recommended Posts

  • 0
Posted

Why ? So more people that will use your project will claim to have L2Off server ? Well it doesn't matter, you cannot emulate the essential systems that L2J been lacking years.

1. read my previous comment

2. if I make something, I want it properly, isn't so simple? ~~

  • 0
Posted

nah, it's not imitating.. if you follow L2Emu history, //hide on/off and //gmspeed 0...5 exists since Gracia Final. It has an old story. I had a friend so LONG ago. He came from L2OFF and requested me to do it, and I used to use these stuffs. :)

 

PS: mcbigmac, you're so always rude with me! it hurts my fragile soul..

 

I don't see where i was rude.

 

Someone posted something that is made to "look" like l2off.

You claimed it was yours.

 

L2Off (Atleast somewhat still) has a reputation for certain "retailness correctnessessseses".

 

If you want to emulate that - there's plenty of core things to change in every single l2j fork that hasnt' been changed since Chef wrote it more or less.

 

 

..... i imagine doing that and providing proof would make for a "great selling pack".

  • 0
Posted (edited)

I don't see where i was rude.

 

Someone posted something that is made to "look" like l2off.

You claimed it was yours.

 

L2Off (Atleast somewhat still) has a reputation for certain "retailness correctnessessseses".

 

If you want to emulate that - there's plenty of core things to change in every single l2j fork that hasnt' been changed since Chef wrote it more or less.

 

 

..... i imagine doing that and providing proof would make for a "great selling pack".

well, actually all I said about pack is "not now", and well just a note... we do not even have any single just similar class of L2Chef.. ~~

but do you see? you again offending.. and I still not understand on that forum everyone who has a "bit colored" name offending always... I just simply made an admin command (about 4 years ago) and exported to my new project at 2012

 

I still do not get what wrong I did with that simple pure retail-like admin command, to deserve that attitude from you guys... why don't you rather offend L2J? they do retail-like things monthly or weekly

 

... and yes, if your next sentences would be "why don't you do any more important stuffs that is really retail-like", than my answer is: yes, I do. But next time if you be more friendly/polite, I may consider that I tell to you.

 

PS: and if that admin-command is the main thing, that you see on the picture, it's really SAD. it's the most minor thing ever... ~~

Edited by lord_rex
  • 0
Posted

Why ? So more people that will use your project will claim to have L2Off server ? Well it doesn't matter, you cannot emulate the essential systems that L2J been lacking years.

Same can be said about L2OFFs with extenders:

 

Why ? So more people that will use your L2OFF extender will claim to have 100% retail server ? Well it doesn't matter, you cannot emulate the unpublished changes to essential systems done since L2OFF X was leaked, which makes your server as bad as L2J.

  • 0
Posted

well, actually all I said about pack is "not now", and well just a note... we do not even have any single just similar class of L2Chef.. ~~

but do you see? you again offending.. and I still not understand on that forum everyone who has a "bit colored" name offending always... I just simply made an admin command (about 4 years ago) and exported to my new project at 2012

 

I still do not get what wrong I did with that simple pure retail-like admin command, to deserve that attitude from you guys... why don't you rather offend L2J? they do retail-like things monthly or weekly

 

... and yes, if your next sentences would be "why don't you do any more important stuffs that is really retail-like", than my answer is: yes, I do. But next time if you be more friendly/polite, I may consider that I tell to you.

 

PS: and if that admin-command is the main thing, that you see on the picture, it's really SAD. it's the most minor thing ever... ~~

 

 

Don't flatter yourself.

The picture shows a client and -  at best - a few packets for login fixed on a new client.

This has and will always be the LEAST work when upgrading to a new chronicle.

It shows nothing of severe thought and work - wether or not it has that and will continue to have more work.

 

 

I can make that aswell in extremely short time - and show the same for promotion and go "OMFG LOOK VALIANCE L2OFF EXTENDER - IN TIME!!".

It doesn't however make it complete in anyway or useful for anything except my e-penis size.

 

The entire purpose of this thread was to "OMFG LOOK MAYBE NEW L2OFF LEAK?!".

Since you came forth as creator - i asked why one would put that in the first place.

The ONLY reason (I can think of) to put it there is to imitate retail\l2off - and if that is THE goal -  there's alot of other stuff to do except making sure rather pointless sysmsg's are sent to client.

 

 

HENCE - the comment.

If you took offence to it - then that's your issue buddy.

  • 0
Posted (edited)

Don't flatter yourself.

The picture shows a client and -  at best - a few packets for login fixed on a new client.

This has and will always be the LEAST work when upgrading to a new chronicle.

It shows nothing of severe thought and work - wether or not it has that and will continue to have more work.

 

 

I can make that aswell in extremely short time - and show the same for promotion and go "OMFG LOOK VALIANCE L2OFF EXTENDER - IN TIME!!".

It doesn't however make it complete in anyway or useful for anything except my e-penis size.

 

The entire purpose of this thread was to "OMFG LOOK MAYBE NEW L2OFF LEAK?!".

Since you came forth as creator - i asked why one would put that in the first place.

The ONLY reason (I can think of) to put it there is to imitate retail\l2off - and if that is THE goal -  there's alot of other stuff to do except making sure rather pointless sysmsg's are sent to client.

 

 

HENCE - the comment.

If you took offence to it - then that's your issue buddy.

 

 

1. someone shared a screenshot, and to avoid further gossips/missunderstandings I told it's mine project. Than you started to obfuscate the discussion about minor things.

2. There was XMAS, and I shared a screenshot also, all I wanted is a "GJ" or a "GL", nothing more. I did not even started to advertise, when the time came for it I just said "not now"...

3. Than you started a flame war like a 13 years old KID, and OFC as usually, you again pretending yourself as "so much clever", because you think everyone is "noob & just copy-paste L2Chef's work and only YOU is clever", I really don't know why you think you're "someone", you're "noone". You just think you're someone with your orange[nsaft] name. Please a bit LOWER your attitude, this way you gonna be FOREVER ALONE.

4. Not only the EnterWorld is done... But if you think "it's easy", than DO IT! Prove you can upgrade your beloved L2OFF to Ertheia, but now I tell you, that you gonna bleed out on ExUserInfo & ExNpcInfo, anyway, now I tell you what a polite man should tell (that you will never tell to everyone, because you're too uppity to do it with your orangensaft name): GOOD LUCK, I WISH YOUR SUCCESS!

 

PS: I think I gonna stop replying from now. Anything I say is completly useless. You just "jelous" and feel your "L2OFF band" beeing attacked, even if the only one is attacking is you. I won't waste my time anymore to assist increasing your uppity.

 

But just to clear the things. My problem was that I was working on something, there was XMAS, I shared a picture, and you started to spreat your shits about "if a team has an admin command it's just an l2off imitation and other all the stuffs are not working... blablabalba and flame and flame..", no idea why you think "other stuffs" are not working, even if there was no informations shared about "what is done/what is not"....

Edited by lord_rex
  • 0
Posted (edited)

1. someone shared a screenshot, and to avoid further gossips/missunderstandings I told it's mine project. Than you started to obfuscate the discussion about minor things.

2. There was XMAS, and I shared a screenshot also, all I wanted is a "GJ" or a "GL", nothing more. I did not even started to advertise, when the time came for it I just said "not now"...

3. Than you started a flame war like a 13 years old KID, and OFC as usually, you again pretending yourself as "so much clever", because you think everyone is "noob & just copy-paste L2Chef's work and only YOU is clever", I really don't know why you think you're "someone", you're "noone". You just think you're someone with your orange[nsaft] name. Please a bit LOWER your attitude, this way you gonna be FOREVER ALONE.

4. Not only the EnterWorld is done... But if you think "it's easy", than DO IT! Prove you can upgrade your beloved L2OFF to Ertheia, but now I tell you, that you gonna bleed out on ExUserInfo & ExNpcInfo, anyway, now I tell you what a polite man should tell (that you will never tell to everyone, because you're too uppity to do it with your orangensaft name): GOOD LUCK, I WISH YOUR SUCCESS!

 

PS: I think I gonna stop replying from now. Anything I say is completly useless. You just "jelous" and feel your "L2OFF band" beeing attacked, even if the only one is attacking is you. I won't waste my time anymore to assist increasing your uppity.

 

But just to clear the things. My problem was that I was working on something, there was XMAS, I shared a picture, and you started to spreat your shits about "if a team has an admin command it's just an l2off imitation and other all the stuffs are not working... blablabalba and flame and flame..", no idea why you think "other stuffs" are not working, even if there was no informations shared about "what is done/what is not"....

 

I'm never going to bleed out on packets.

Why would i bleed out on something i can send static data to?

 

You are again spending all your time feeling buttuhurt like the typical MXC kid.

Wether l2j or l2off.

 

If you were proud of you work - you wouldn't bother because you've done tons of feature analysis.

Creating whatever new systems exists in Etheria - and making sure their calculations are as retail as possible.

 

Making a Server respond in the way a Client accepts on  a base level - is not hard.

And why L2 could have "c2\c3\c4" servers in the old days with 20% of the feature set working.

 

I don't know what else you've done - which i also mention btw.

You may have done a ton of work researching how X works with Y.

I never once mention that your work is shit - you mention you somehow feel inferrior.

 

 

....but that wasn't what the original poster of this thread tried to sensationalize , was it.

Doesn't really matter - however.

If you want goodjob on your fixing correct packets go to l2j subsections.

I'm sure they'll praise you.

 

But while L2Off has been elitest - it's also been required to have greater standards.

People play on "Interlude L2Off" - because the basis for retail calculations have not changed(And general marketing hype).

It's the same as C4  - with a few new things and bigger new  systems that don't touch the base calculation gameplay.

 

 

As said before - if you feel offense that's your issue.

I don't have L2J vs L2Off beef  - you do.

 

Get over it - i don't in ANYWAY in all of my posts in this thread seem negative towards your personal work.

Infact i encourage it - because l2j seems to have died as public open source effort.

Personally i think it's awesome - but it also requires more than just "AYEE - client connects without issues! woohoo" - to be able to be used.

 

 

PS:

....oh and PS: If you want cumshots on your work - show something that determines your ability to do more than just "fix packets".

No matter how much you want to sound elite - EVERY SINGLE PACKET FORMAT - is stored in client and in 99% of the cases can be "NULLED" until further research shows their purpose.

Edited by mcbigmac
  • 0
Posted (edited)

If you were proud of you work - you wouldn't bother because you've done tons of feature analysis.

Creating whatever new systems exists in Etheria - and making sure their calculations are as retail as possible.

You know what one good thing started with GoD, and is now done on every single update?

 

Removing obsolete, useless systems: SSQ, Castle Sieges, TW (goodbye easy nobility), all quests*, crafting & materials, etc etc.

* some starter NPCs remain, but quests are broken, like Hidden Truth series. Replaced by few short high reward quests which do not take time nor effort to implement.

 

So yeah, if YOU would jump to Dimensional Strangers straight ahead, you'd be much more correct if you claim you have it more retail-like than if you stick with HF (terribly outdated) and below. It works BOTH ways here.

Too bad nobody actually did this, as I see..

 

 

Now before you write another 50 pages of comments, I'd like to point out that we went far offtopic. First of all, this thread does not belong in L2OFF section, after all. Secondly, this whole discussion should be moved to... L2 general discussion? I think it would be best if someone closed this thread and moved it to archive, after all.

 

BECAUSE: I have my answer, and these 1,5 additional pages of butthurt comments between two kids is making my eyes hurt.

 

until further research shows their purpose.

I love this quote. It shows the stereotypical L2 developers attitude towards the server side.

Behold, after 7-8 years (first reference found in ru C3 network protocol description), l2jserver manages to implement 0xB5 AllianceInfoPacket, only when some unknown contributor gives the full format to them.

 

 

No matter how much YOU want to sound elite - EVERY SINGLE PACKET HANDLING CODE IS DONE CLIENT SIDE and all values can be inferred from UE code, without the need of sending some "omg I don't know what is this" "NULLED" values, which somewhy is the fetish of L2 developers since the beginning (C1 leak repurposed for C2/C3/C4, l2jserver 0.x.y).

 

HOWEVER, your point is 100% true - if you look at l2j or at l2off extenders, you are guaranteed to win any claim that aside from few (< 10) exceptions, ALL new packets will be done WRONG (with your so-called "NULLED" values). Take a look at Castle Siege** related packets - Att/Def registration, siege time selection list - these were NEVER completed, and now CS is gone altogether, so they WILL NEVER BE. They are fucking wrong, because

until further research shows their purpose.

There are no devs who care. All they want when they do not get a L2OFF episode X RC leak is to get packets working only to the point where they can play on their "OH YEAH MAKE ME COME" C1 server (I hear C1 was later replaced by IL, and supposedly with GF nowadays). No idea why they love those obsolete chronicles so much.

 

** - this feature has already been removed from L2 gameplay.

Edited by Zeeyo
  • 0
Posted

You know what one good thing started with GoD, and is now done on every single update?

 

Removing obsolete, useless systems: SSQ, Castle Sieges, TW (goodbye easy nobility), all quests*, crafting & materials, etc etc.

* some starter NPCs remain, but quests are broken, like Hidden Truth series. Replaced by few short high reward quests which do not take time nor effort to implement.

 

So yeah, if YOU would jump to Dimensional Strangers straight ahead, you'd be much more correct if you claim you have it more retail-like than if you stick with HF (terribly outdated) and below. It works BOTH ways here.

Too bad nobody actually did this, as I see..

 

 

Now before you write another 50 pages of comments, I'd like to point out that we went far offtopic. First of all, this thread does not belong in L2OFF section, after all. Secondly, this whole discussion should be moved to... L2 general discussion? I think it would be best if someone closed this thread and moved it to archive, after all.

 

BECAUSE: I have my answer, and these 1,5 additional pages of butthurt comments between two kids is making my eyes hurt.

 

 

I love this quote. It shows the stereotypical L2 developers attitude towards the server side.

Behold, after 7-8 years (first reference found in ru C3 network protocol description), l2jserver manages to implement 0xB5 AllianceInfoPacket, only when some unknown contributor gives the full format to them.

 

 

No matter how much YOU want to sound elite - EVERY SINGLE PACKET HANDLING CODE IS DONE CLIENT SIDE and all values can be inferred from UE code, without the need of sending some "omg I don't know what is this" "NULLED" values, which somewhy is the fetish of L2 developers since the beginning (C1 leak repurposed for C2/C3/C4, l2jserver 0.x.y).

 

HOWEVER, your point is 100% true - if you look at l2j or at l2off extenders, you are guaranteed to win any claim that aside from few (< 10) exceptions, ALL new packets will be done WRONG (with your so-called "NULLED" values). Take a look at Castle Siege** related packets - Att/Def registration, siege time selection list - these were NEVER completed, and now CS is gone altogether, so they WILL NEVER BE. They are fucking wrong, because

There are no devs who care. All they want when they do not get a L2OFF episode X RC leak is to get packets working only to the point where they can play on their "OH YEAH MAKE ME COME" C1 server (I hear C1 was later replaced by IL, and supposedly with GF nowadays). No idea why they love those obsolete chronicles so much.

 

** - this feature has already been removed from L2 gameplay.

I really don't want to get in the middle here. But you said something about them removing castle sieges? I've never heard of this, and if you have any more information on it I would love to see it.

  • 0
Posted

Just to avoid any further gossips.. & also there is XMAS.. :)

 

ertheia.png

 

Mother of goodness, new race... It's time to hurry up with Lineage 3, or at least finish Lineage Eternal already :c

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
Answer this question...

×   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

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