Jump to content

Recommended Posts

Posted

Well here's a short summary:

 

Nwatch is a Lineage2 php script that connects to your gameserver and displays all kinds of information about your community.

 

Nwatch:

*shows character information: level, xp, cp/hp/mp bar, pvp/pk, subclasses, skills, inventory, clan, equipped items...

*shows clan's information: members (ordered by online/offline), level, clanhall or castle they possess, clan skills, alliance name...

*shows clanhall information: complete list of all clanhalls. Who owns them, which are free, date of payment cycle...

*shows Castle information: Occupied castles and clan names (and their leaders), available clans, date of siege, date until you can sign for siege

*shows TOP 100 pvp/pk: All character names are linked to char lookup and clan lookup.

 

It supports chronicles from Interlude to Gracia Epilogue.  8)

 

 

You can read more about it here:

http://nwatch.me/

or do a preview here

http://preview.nwatch.me

 

 

width=300http://img59.imageshack.us/img59/4141/inventoryc.png[/img] width=300http://img828.imageshack.us/img828/9049/clank.png[/img]

This is how CHARACTER and CLAN lookup look like.

 

width=300http://img844.imageshack.us/img844/2209/clanhall.png[/img] width=300http://img810.imageshack.us/img810/8482/castleg.png[/img]

Clanhall and castle lookup.

 

width=300http://img833.imageshack.us/img833/161/topw.png[/img]

Top100 pvp/pk.

 

It's currently available ONLY for l2j servers.

L2off version is in progress.

 

 

How to register?

Registration is currently disabled until version 2.0 comes out. Stay alert!

 

Posted

Yes, It's protected against mysql injections.

 

L2off will be ready in a week or two.

Depends on how much free time we'll have (busy with other gideon customers).

Posted

You just copied L2sublimity nWatch. You took the javascript , the css/html layout and recoded the mysql queries to match l2j database tables. And you did it that way since ms-sql is a bit more "strange" for you russians who cant code a thing by yourselves.

 

This guy is a property thief, when i coded my own armory , i requested the rights from opalsnow to use his javascripts, this russian dev-wannabe actually stole them and used them as his own.

Posted

You just copied L2sublimity nWatch. You took the javascript , the css/html layout and recoded the mysql queries to match l2j database tables. And you did it that way since ms-sql is a bit more "strange" for you russians who cant code a thing by yourselves.

 

This guy is a property thief, when i coded my own armory , i requested the rights from opalsnow to use his javascripts, this russian dev-wannabe actually stole them and used them as his own.

 

lol you just owned that guy

Posted

And to continue ...

 

1)Newer skills/items icons are missing. Whats up we "ripped" the site and it was interlude ? Poor boy wont work on epilogue that perfectly eh ? Seems you gotta extract them from the client yourself.

 

2)Ha, clan crests are not working also, ill help you in that, data/crests folder contains the crest compressed , thats why you cant use them, learn how to decompress them ;)

 

How cheap can this be, YOU STOLE a site, reverse engineered it, and the product was FAR WORSE than the original created by OpalSnow. And yet ...

 

 

You try to sell that garbage ...

 

What a freaking piss of shit ...

Posted

kuba90, don't talk about shit if you don't know what you're talking about.

 

a) I'm not russian

b) There are plenty of other servers using opal's nwatch

Go compare their version and ours

c) I was constantly doing updates to it and later on introduced new members that helped out.

It's CONSTANTLY getting updated.

 

By adopting it to l2j I practically had to rewrite the code all over since l2j and l2off work differently so basically it's my own code now.

 

and d) (you'll love this one)

the "javascript" that you're referring to isn't opalsnow's property but instead publicly accessible effects library that hundreds of thousands of sites use.

I'll let you "coder who wrote your own armory" figure out which one it is. ;)

 

Oh, and last part.

What in common sense gives you any right to call me a common thief when:

- I did tons of work on it

- you're running an l2off files Or l2j emulator which are literaly ILLEGAL to use

- You most likely have shittons of pirated software on your computer

 

In short:

1276646543893.jpg

Posted

1) Im running L2J, its legal and its open source under GPL.

 

2) There is absolutelly NO big difference from L2J to L2OFF, since the forefront of the site stays the same, and the only thing that changes is the controller aka php code that queries the database, transforms the results and passes them to the view that is exactly the same as sublimity.

 

3)Sure other guys ripped sublimity too, but they used it in their server, they dont sell it as their work. And even if they do, that doesnt make you innocent. Just because people steal, your stealing is still stealing.

 

4) I have my own armory, and i know how much work it needs to be done. None at all, its a piece of cake.

 

5) Ripped from your nwatch.me site just now :

 

// --> nWatch by OpalSnow

// --> Date: 08 August 2009

// --> Version: 1.0.0

 

// --> Var Init.

 

var ItemHide = 0;

var SkillHide = 0;

var ClanSkillHide = 0;

var nClanList = 0;

var nRemember = 0;

var nSubjob = 0;

var nSubTimeout = 0;

 

...

 

Open libraries my ass, you copied it and you didnt even bother looking at it. Cause if you did, you would have changed the name ...

 

 

Dont try more, i already made you look fool enough ... :) Since you came back with your flappy mouth to backup your smelly ass and didnt even remember to remove the credits ...

 

Dumbass ...

Posted

1) Im running L2J, its legal and its open source under GPL.

 

2) There is absolutelly NO big difference from L2J to L2OFF, since the forefront of the site stays the same, and the only thing that changes is the controller aka php code that queries the database, transforms the results and passes them to the view that is exactly the same as sublimity.

 

3)Sure other guys ripped sublimity too, but they used it in their server, they dont sell it as their work. And even if they do, that doesnt make you innocent. Just because people steal, your stealing is still stealing.

 

4) I have my own armory, and i know how much work it needs to be done. None at all, its a piece of cake.

 

5) Ripped from your nwatch.me site just now :

 

Open libraries my ass, you copied it and you didnt even bother looking at it. Cause if you did, you would have changed the name ...

 

 

Dont try more, i already made you look fool enough ... :) Since you came back with your flappy mouth to backup your smelly ass and didnt even remember to remove the credits ...

 

Dumbass ...

 

xD.. fail indeed. its hard to create something on your own.

Posted

kuba90 you're so fully of shit you probably don't even realise it.

 

Let me give you few examples:

2) There is absolutelly NO big difference from L2J to L2OFF and the only thing that changes is the controller aka php code that queries the database

L2off and l2j are greatly different.

All the queries are different. Database structure at some points is different (take active class/sub listing for example), even implementation is different at some point (how crests are read is one example).

 

The code that queries the database is mysql query, not php code.

But I guess you thought correctly and just typed down the wrong thing.

 

...and passes them to the view that is exactly the same as sublimity.

Go to http://l2-survival.com

On the right side type down test and press "check"

THAT is original nwatch.

See the difference?

 

You'll most likely say no, so let me give you a hand.

 

Original:

inventory2.png

 

Mine:

inventory.png

 

See the difference now?

It's kind of hard to miss, but I'm sure you'll find a way just to fight windmills some more.  ;)

 

 

3)Sure other guys ripped sublimity too, but they used it in their server, they dont sell it as their work.

Quote, DIRECTLY from the TITLE:

Nwatch.me - free 1 month FULL site licence

You were saying?

Moreover, I'm not discrediting opalsnow as the original creator.

Ours is based of his and we worked on it. Just like his was based on l2armory and he worked on it.

 

And even if they do, that doesnt make you innocent. Just because people steal, your stealing is still stealing.

I didn't say anything about me stealing.

I said YOU have no right of calling ME a thief when you're just as bad yourself.

 

There are tons of folks selling l2off packs in "packs and files" section for money. Did they make the files? Hell no lol. Did they edit it? Most likely no. They just grabbed it somewhere as it was in most cases and just sold it as their own.

Even more, there are shittons of people selling l2j packs under same section. As you said, ALL l2j's are released under gpl version which EXPLICITLY states "you may not sell it for money", "you MUST provide source with every gpl product you launch" and loads of other points.

Did you see anyone nagging them about it?

I haven't (other than few folks which literally checked out the files from svn and compiled them as pack for sale).

I haven't even begin to grasp the mention of pirated software you have on your pc.

 

And you did it that way since ms-sql is a bit more "strange" for you russians who cant code a thing by yourselves.

My favorite part:

I'm not russian as it's already obvious by my profile tag. Heck, just look 3cm under my name and you'll my country flag.

Second, If I can't code a thing then I guess somebody else adopted the scripts to l2j and added tons of new stuff.

 

1)Newer skills/items icons are missing. Whats up we "ripped" the site and it was interlude ?

It's called updates.

There is already loads of other items and icons in it but there's always a chance some will be missing.

The whole point of giving out copies is to get feedback in return so we get help discovering such things and correct them.

 

Poor boy wont work on epilogue that perfectly eh ? Seems you gotta extract them from the client yourself.

Did you even THINK about what you just wrote?

Taking them from website, client, or the damn ncsoft's gfx artists's computer makes abso--beep-ing-lutely no difference.

They made them as they are. You take them and use them EXACTLY as they are, thus completely unchanged.

If they were to hunt your ass down, they could.

 

 

2)Ha, clan crests are not working also, ill help you in that, data/crests folder contains the crest compressed , thats why you cant use them, learn how to decompress them Wink

Crests are not working for a valid reason (which I honestly don't give a damn about you enough to tell you why and keep you up to date with our future plans).

The reason is by far not "us not knowing how to do it". Mkay "Mr. e-libido"?

 

How cheap can this be, YOU STOLE a site, reverse engineered it, and the product was FAR WORSE than the original created by OpalSnow. And yet ...

You try to sell that garbage ...

What a freaking piss of shit ...

Liking or disliking a design is one's personal opinion. Thus it makes you completely biased on this matter and your statement is... well crap and nothing but an attempt to trash me.

I'll let you know when it's working directly over snailmail signed and stamped by court for validity (which will be never).

I believe I already proved how much shit you're talking on the rest of the sentence.

 

Open libraries my ass, you copied it and you didnt even bother looking at it. Cause if you did, you would have changed the name ...

Among others, he's using jquery. So yes, open library your ass.

 

but ... whoa wait. What's that?

Since you came back with your flappy mouth to backup your smelly ass and didnt even remember to remove the credits ...

First you're nagging here that I'm stealing something and then you're telling me I FORGOT TO REMOVE CREDITS?

What kind of -beep-ing stinking pile of horse fertilizer is that -beep-ed up sentence?

Do you even THINK what you write BEFORE you write it or do you just randomly sprout down words and hit the "POST NOA ZOMG"?

Most of the things you said so far were either incorrect, missleading or contradictory but this one takes the crown.

It really does.

 

Dont try more, i already made you look fool enough ...

Dumbass ...

 

You haven't made me look anything.

You tried though, as people of your kind always do.

Flaming little arrogant people with anger management issues thinking ANYONE gives a damn what kind of trash they post somewhere on some forum.

 

 

And last but not least:

This guy is a property thief, when i coded my own armory....

When...

When...

When I...

Yet I'm the one giving out free copies and you're the one bashing me.

In the end it all comes down to who has it and who talks about it.

You're talking while others use my version of nwatch.

 

Now I'd love to.. well no. I wouldn't.

I was going to say how much I'd love to point out your future nonsense but I Infact wouldn't.

In fact, I'm not even going to reply to your crap anymore as it does NOTHING else BUT waste my time which is anything but the result I want or the reason why I made this thread.

If you're seeking for attention, go find it somewhere else.

I will gladly report you for spamming though.

 

Written in bold in case you try to interpret last part in your own way:

I am not closing this conversation because I have nothing to say but rather because I have dealt with the likes of you way too much for the past years and learned a thing or two when I'm being provoked for attention and have my effort being pissed away.

 

 

Edit:

New update with castle-details page along the way.

Won't say much what it is but I guarantee you guys will love it.  :D

 

p.s.

26 licences left.

 

Posted

Honestly,

few weeks with php, structure Sql of L2J/OFF - It's so lol simple, and i would done this also.

Nothing really special, but i like it. good job embass aka Vim, hope you ll get ton's of customers.

 

 

With love, R!CH!.

Posted

kuba90 you're so fully of shit you probably don't even realise it.

 

Let me give you few examples:L2off and l2j are greatly different.

All the queries are different. Database structure at some points is different (take active class/sub listing for example), even implementation is different at some point (how crests are read is one example).

 

The code that queries the database is mysql query, not php code.

But I guess you thought correctly and just typed down the wrong thing.

Go to http://l2-survival.com

On the right side type down test and press "check"

THAT is original nwatch.

See the difference?

 

You'll most likely say no, so let me give you a hand.

 

Original:

inventory2.png

 

Mine:

inventory.png

 

See the difference now?

It's kind of hard to miss, but I'm sure you'll find a way just to fight windmills some more.  ;)

 

Quote, DIRECTLY from the TITLE:You were saying?

Moreover, I'm not discrediting opalsnow as the original creator.

Ours is based of his and we worked on it. Just like his was based on l2armory and he worked on it.

I didn't say anything about me stealing.

I said YOU have no right of calling ME a thief when you're just as bad yourself.

 

There are tons of folks selling l2off packs in "packs and files" section for money. Did they make the files? Hell no lol. Did they edit it? Most likely no. They just grabbed it somewhere as it was in most cases and just sold it as their own.

Even more, there are shittons of people selling l2j packs under same section. As you said, ALL l2j's are released under gpl version which EXPLICITLY states "you may not sell it for money", "you MUST provide source with every gpl product you launch" and loads of other points.

Did you see anyone nagging them about it?

I haven't (other than few folks which literally checked out the files from svn and compiled them as pack for sale).

I haven't even begin to grasp the mention of pirated software you have on your pc.

My favorite part:

I'm not russian as it's already obvious by my profile tag. Heck, just look 3cm under my name and you'll my country flag.

Second, If I can't code a thing then I guess somebody else adopted the scripts to l2j and added tons of new stuff.

It's called updates.

There is already loads of other items and icons in it but there's always a chance some will be missing.

The whole point of giving out copies is to get feedback in return so we get help discovering such things and correct them.

Did you even THINK about what you just wrote?

Taking them from website, client, or the damn ncsoft's gfx artists's computer makes abso--beep-ing-lutely no difference.

They made them as they are. You take them and use them EXACTLY as they are, thus completely unchanged.

If they were to hunt your ass down, they could.

 

Crests are not working for a valid reason (which I honestly don't give a damn about you enough to tell you why and keep you up to date with our future plans).

The reason is by far not "us not knowing how to do it". Mkay "Mr. e-libido"?

Liking or disliking a design is one's personal opinion. Thus it makes you completely biased on this matter and your statement is... well crap and nothing but an attempt to trash me.

I'll let you know when it's working directly over snailmail signed and stamped by court for validity (which will be never).

I believe I already proved how much shit you're talking on the rest of the sentence.

Among others, he's using jquery. So yes, open library your ass.

 

but ... whoa wait. What's that?First you're nagging here that I'm stealing something and then you're telling me I FORGOT TO REMOVE CREDITS?

What kind of -beep-ing stinking pile of horse fertilizer is that -beep-ed up sentence?

Do you even THINK what you write BEFORE you write it or do you just randomly sprout down words and hit the "POST NOA ZOMG"?

Most of the things you said so far were either incorrect, missleading or contradictory but this one takes the crown.

It really does.

 

You haven't made me look anything.

You tried though, as people of your kind always do.

Flaming little arrogant people with anger management issues thinking ANYONE gives a damn what kind of trash they post somewhere on some forum.

 

 

And last but not least:When...

When...

When I...

Yet I'm the one giving out free copies and you're the one bashing me.

In the end it all comes down to who has it and who talks about it.

You're talking while others use my version of nwatch.

 

Now I'd love to.. well no. I wouldn't.

I was going to say how much I'd love to point out your future nonsense but I Infact wouldn't.

In fact, I'm not even going to reply to your crap anymore as it does NOTHING else BUT waste my time which is anything but the result I want or the reason why I made this thread.

If you're seeking for attention, go find it somewhere else.

I will gladly report you for spamming though.

 

Written in bold in case you try to interpret last part in your own way:

I am not closing this conversation because I have nothing to say but rather because I have dealt with the likes of you way too much for the past years and learned a thing or two when I'm being provoked for attention and have my effort being pissed away.

 

 

Edit:

New update with castle-details page along the way.

Won't say much what it is but I guarantee you guys will love it.  :D

 

p.s.

26 licences left.

 

 

Amen.

Guest
This topic is now closed to further replies.



  • Posts

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

×
×
  • Create New...