Jump to content

[Guide]Ma8ete na paizete ton Ghost Sentinel![Update 15/05/2009]


Recommended Posts

Posted

Λοιπόν έκατσα και έφτιαξα ένα Guide για αρχάριους αλλα και έμπυρους στον character Ghost Sentinel.

 

Θα σας αναφέρω κάποια πράγματα που χρειαζόμαστε!(items,skills,Quest,Dyes)

 

Το guide περιεχέι:

Κείμενο

Εικόνες

 

Dark Elfs!

 

Οι χαρακτήρες Dark elf είναι επιθετικοί στο LineageII έχουν μια πολύ καλή επίθεση άλλα και νοημοσύνη(εξυπνάδα)από όλα τα άλλα races(π.χ humans,elfs,orc etc.)Χρησιμοποιουνέ μαύρη μάγια!

 

Οι Dark Fighter Elves είναι οι Palus Knight, Shillien Templar, Bladedancer, Spectral Dancer και ο Shillien Knight που μπορούν να ακινητοποιούσουν(paralyzed) τον αντίπαλο με το γνωστό skill “Lightening Strike.”

 

Η άλλη ομάδα(class) του Lineage 2 Dark Fighter Elves είναι οι Assassins. Έχουν καλά debuffs σαν το Hex,Power Brake. Έχουν κάποια παρόμοια πράγματα Human Rogue class. Μέτα απο αυτήν την ομάδα(class) είναι τα Ghost Hunter, Phantom Ranger, Ghost Sentinel και Abyss Walker που έχουν πολύ καλές μεθόδους για να σκοτώσουν, είναι επίσης πολύ καλή στα PVP.

 

Έχουν βέβαια μια Special ικανότητα: Dark elfs μπορούν να κρατήσουν ποιο πολύ αναπνοή και να πέσουν από ψιλά χωρίς να τραυματιστούν!

 

Quest

 

1st Quest ->Assasin

2nd Quest->Phantom Ranger

3rd Quest->Ghost Sentinel

 

 

Armors,Weapons & Jewels

 

 

ARMORS

 

Manticore.jpg -->D grade, Manticore skin shirt

 

Theca.jpg -->C grade, Theca Leather armor

 

Zubei.jpg -->B grade, Zuibei's Leather Shirt

 

Tallum.jpg -->A grade, Tallum plate Armor

 

Dragonic-1.jpg-->S grade, Dragonic Armor

 

 

 

WEAPONS

 

Eminence.jpg -->C grade, Eminence Bow

 

Peril.jpg -->B grade, Bow of Peril

 

Carnage.jpg -->A grade, Carnage Bow

 

 

Dragonic.jpg-->S grade Dragonic Bow(Εγώ το φοράω με Dragonic Armor)

 

Shining.jpg-->S grade, Shining Bow(Είναι ίδιο με το Dragnic Bow άπλα αλλάζει η εμφάνιση του, αυτό το φοράω με Imperial Armor)

 

Κάτι σημαντικό για να μπορείτε να χτυπάτε τον αντίπαλο με Τοξο ειναι τα βέλη χωρίς αυτά δεν μπορείτε να κάνετε ζημιά στον αντίπαλο με άπλα χτυπήματα(Attack), άλλα μόνο με skill!

arrows-1.jpg(Αυτα είναι τα S grade, εσείς παίρνετε το ανάλογο grade με το ανάλογο όπλο! [π.χ Dragonic bow S grade+Βέλη S grade)Αν κάνετε λάθος grade δεν θα μπορείτε να χτυπάτε τον αντίπαλο!

 

JEWELS

 

jewels.jpg

 

Raid Boss(Αν υπάρχουν στο Gm shop Raid boss jewels πάρτε αυτά)

valakas.jpg->Neklase of Valakas

 

zaken.jpg->Earring of Zaken

 

antharas.jpg->Earring of Antharas

 

AntQueen.jpg->Ring of AntQueen

 

baium.jpg->Ring of Baium

 

TATTOO

Το καλύτερο tattoo για Archer είναι αυτό, όταν έχουν ιδιότητες

doom.jpg->Tattoo of Doom ~~~>Ανεβάζει το P.attack

 

 

Dyes

 

 

Όταν φοράμε Dragonic Armor βάζουν αυτό το dye

dye.jpg->P.attack (+4str-4Con)

 

Exp place

 

20-30lvl -->Castle Gludio Town

35-50lvl-->Cruma Tower

50-60lvl-->Cemetary

60-70lvl-->The Frobidden Gateway

70-80lvl-->Ketra OR Varka Silenos

 

 

Skills

 

Attack.jpg->Attack:Χτηπαει τον αντίπαλο με άπλα βέλη(ΠΡΟΣΟΧΉ:Δεν είναι Skill)

 

Stunningshot.jpg->Stunning Shot:Skill το οποίο κάνει ζημιά άλλα έχει κάποιες πιθανότητες που μπορεί να κάνει τον αντίπαλο να μείνει ακίνητος για κάποια δευτερόλεπτα! Όσα ποιο μεγάλο level είσαι από τον αντίπαλο τόσο ποιο πολλές πιθανότητες έχεις για να ακινητοποιήσουν τον αντίπαλο.(Πάντα στην λίστα των skill μας)[MP cost:117

 

DoubleShot.jpg->Double Shot:Είναι ένα Skill το οποίο ρίχνει ταυτόχρονα 2 βέλη μαζί!(ΠΡΟΣΟΧΉ:Πάντα στην στήλη των Skill μας)[MP cost 166]

 

LethalShot.jpg->Lethal Shot:Είναι ενα απο τα ποιο καλά και δυνατά skill που έχουν οι Archers άλλα και λίγο ποιο αργό,έχεις κάποιες πιθανότητες να ποιασεις lethal αν ποιασεις υπάρχει περίπτωση να αφήσεις το αντίπαλο σου με 1 ζωή(hp)[MP cost 170]

 

Hamstringshot.jpg->Hamstring Shot:Ένα από τα καλύτερα skill που έχουν οι Archers. Ο λόγος είναι ότι έχεις μεγάλες πιθανότητες να κάνει το αντίπαλο να τρέχει ποιο αργά.(Αν είναι και daggeras ο αντίπαλος το καλύτερο για εμάς)[MP cost 86]

 

Evadeshot.jpgEvade Shot->Αν πετύχει κατεβάζει το evasion του αντιπάλου[MP cost 122]

 

FatalCounter.jpg->Fatal Counter:Είναι ένα αρκετά δυνατό skill που περιεχέι ο Ghost Sentinel..Ώση λιγότερη ζωή(hp) έχουμε, τόσο ποιο πολύ ζημιά κάνει στον αντίπαλο μας.

 

HeX.jpg->Hex:Ειναι ένα από τα βασικά skill που έχει ο Ghost Sentinel, κατεβάζει το P.defence του αντιπάλου κατά -23% p.defence ποιο κάτω! Αυτό το Skill χρειαζόσαστε σε κάθε pvp που κάνετε

 

PowerBreak.jpg->Power Break:Είναι ένα αντιστιχο skill με το Hex άλλα έχουν μια διάφορα, αυτό το skill δεν κατεβάζει το P.defence άλλα το P.attack του αντιπάλου κατά -23%(σαν το hex)…εγώ προσωπικά χρησιμοποιήσω το hex! Πάρα το Power Break άλλο ένα πράγμα που πρέπει να ξέρετε είναι οτι πάντα αυτά τα 2 skill είναι ότι ποιανει μόνο το ένα(π.χ κάνω hex στον αντίπαλο και αν κάνω μετά Power Break αντικαθιστά το Hex, δεν είναι και τα 2 μαζί!

 

Deadeye.jpgDead Eye->Κατεβαζει Attack.Speed και δινει Accurasy+P.attack+Critical power[MP cost 34]

 

Accurasy.jpg->Accurasy:Αυτο το skill δίνει Accurasy το οποίο βοηθά να πετυχαίνει τον αντίπαλο ποιο εύκολα! Δίνει +3 Accurasy παραπάνω (π.χ έχουμε 129 Accurasy χωρίς να έχουμε ενεργοποιημένο το skill άρα 129+3=132!αυτό το skill πρέπει να το εχουμε ενεργοποιήσει όταν κάνουμε pvp(ΠΡΟΣΟΧΉ: Σε κάθε θάνατο σας απενεργοποιείτε)καταναλώνοντας 1 MP.

 

ViciousStance.jpg->Visious Stance:Και αυτό το skill σαν το Accurasy, πρέπει να το έχετε ενεργοποιήσει κάθε φορά που κάνετε pvp....Λοιπόν τι δίνει,κάνει τα critical shot ποιο ισχυρά από όσο είναι(Επίσης και αυτό απενεργοποιείτε σε κάθε θάνατο σας)[MP cost:34]

 

focusskillmastery.jpgFocus skill Mastery->Ανεβαζει τις πηθανοτιτες να πετυχει το skill σας!(Επίσης και αυτό απενεργοποιείτε σε κάθε θάνατο σας)[MP cost: 56]

 

UltimateEvasion.jpg->Ultimate Evasion:Είναι ένα χρήσιμο skill όταν παίζετε pvp ειδικά με Archers..Αυτό που κάνει είναι να δίνει Evasion και όσο ποιο πολύ τόσο καλύτερα γιατί κάνει το αντίπαλο να μην βρίσκει στόχο! (π.χ έχουμε 114 evasion[Σαν Gost Sentinel με full buffs]Όταν το ενεργοποιήσουμε θα γίνει έτσι 114+20[που δίνει το skill]=134)Και έτσι είναι ποιο δύσκολο ο αντίπαλος να βρει τον στόχο του!

 

RapidShot.jpgRapid Shot->Είναι ένα πολύ σημαντικό skill ενός archer το οποίο όταν το ενεργοποιείς σου δίνει +12% attack speed!και έτσι βαράμε με μεγαλύτερη ταχύτητα![MP cost:25

 

Aarrow.jpgQuiver of Arrow:A Grade ->Δημιουργεί βέλη,κάθε φορά που το χρησιμοποιούμαι δίνει 700 και το φυλλ που φτάνει είναι 3.800(Χρειάζεται 1 A Crystal MP cost 366MP)

 

 

Sarrow.jpgQuiver of Arrow:S Grade->Δημιουργεί βέλη,κάθε φορά που το χρησιμοποιούμαι δίνει 900 και το φυλλ που φτάνει είναι 3.600(Χρειάζεται 1 S Crystal MP cost 398MP)

 

 

 

Μια στήλη του Ghost Sentinel είναι αυτί!

 

barskill.jpg

 

Αυτό είναι το Guide μου για τους Ghost Sentinel ελπίζω να μην έχω κάποιο λάθος..

Παρακαλώ αν έχω κάνει κάποιο λάθος να μην με παρεξηγείτε γιατί είναι το πρώτο Guide μου..Όποιο λάθος έχω παρακαλώ να μου το πείτε!

Και δεν θέλω άσχημα σχόλια όπως μ@λ@κ1@ κ.τ.λ.π απλά για να πάρει +1 post

 

Posted

kala bazeis 2 str+4? ma to deutero den dinei toso.an einai bale str +3 kai meta +2.kai kati alo IC 8a foreseis mono se pvp server me megala rates kai fisika full buffs.Se mid-rate kai low fisika Drag.

 

btw Good try

Posted

kala bazeis 2 str+4? ma to deutero den dinei toso.an einai bale str +3 kai meta +2.

 

dn ktlves kala an to koita3ei lew!

oti opoios foraei Imperial armor mporei na balei 2 dyes to 1)str kai to allo dex

kai apo katw lew oti opoios foraei Dragonic armor na balei to str;)

koita to kai pes mou!

Posted

File rios gia server me parapanw apo 5000xp afta pou grafeis apla gamane epeiseis 8elw na s pw oti ta les telei kai apo kapoia pragmata pou dn eixa katalavei ta epeisa edw!wreos kai na s pw xrisimopoiw peripou ta idia items

Posted

Xexases to simantikotero...Epidi i dark Elf archerades exoune ligo megalitero range...

 

HIT AND RUN..

 

kai afiste tous na sas lene noobs..

Otan paizw dark elf archer..Exw tin 1i bara idia me esena..Ston KvN (adaptor) otan epeza..

Apo poion server pires eikones???

Posted

dax rr c kalo guide kai 8a to valw sto topic me ta guide..aLLa re c

Ta cp pots ekei pisw???Hit+Run ine kai oi new players dn vARANe stun aLLa tcp.

keep it updated (Y)

Posted

dax rr c kalo guide kai 8a to valw sto topic me ta guide..aLLa re c

Ta cp pots ekei pisw???Hit+Run ine kai oi new players dn vARANe stan aLLa tcp.

keep it updated (Y)

koita 8eopoula otan eisai se shmeio me polla atoma dld san to PI dn sumferei na patas cp pots gt an exei o server polla atoma 8a tros ka8e fora pou 8a flagareis apo 2-3 atoma hits!

na xalas tsampa ta cp??dn leei

 

an eisai 1 vs 1 kai o allos einai archer dn xriazetai na kouniesai pisteuw!

 

P.S kai baibaia 8a to ananewno

Posted

Υπαρχει και η απλη λυση... Βαζεις ενα ACP και τελειωσε η δουλεια.

 

btw αυτο το guide εκτος απο το οτι ειναι μονο για x34099790 server εχει και πολλα λαθη...

 

Πρωτο, και βασικοτερο δε βαζουμε heavy σε archer, εκτος και αμα παιζεις σε x2398572389 server...

Δευτερο, το Fatal Counter, κανει damage αναλογα με το hp σου. Οσο πιο λιγο HP εχεις, τοσο πιο πολυ damage κανει.

Τριτο, το hex κατεβαζει το p def του αντιπαλου σε ποσοστο. -23 % για την ακριβεια.

Τεταρτο, το ιδιο ισχυει και για το power break. Οταν ειναι 1-2 lvl κατεβαζει το p atk κατα 20%, ενω οταν ειναι 3 lvl + το κατεβαζει κατα 23%.

Πεμπτο, το UE δεν ειναι καθολου χρησιμο απεναντι σε daggeria που εχουν MP. Επισης μειωνει τις πιθανοτητες να φας cancel, και γενικα ειναι χρησιμο απεναντι σε ολους τους fighter και τους summoner εκτος απο τους piano players (daggers, gladi κ tyrant καμια φορα...)

Τελος, το rapid shot lvl 1 δινει +8 % atk speed κ το lvl 2 +12 % :P

Posted

dn ktlves kala an to koita3ei lew!

oti opoios foraei Imperial armor mporei na balei 2 dyes to 1)str kai to allo dex

kai apo katw lew oti opoios foraei Dragonic armor na balei to str;)

koita to kai pes mou!

 

Srr psile diko moy la8os.Pantos kalo guide.

Posted

Mono gia kati noobo server's einai auto guide.

file an dn saresei min to diabazeis dn se upoxrewno!egw to ekana gia 2.000exp kai panw!

dn to ekana gia low rate!

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

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