Jump to content

Recommended Posts

Posted

ΒΑΣΙΚΑ

Μπορείτε να αυξήσετε τα όπλα μέσω του σιδηρουργού NPC κάθε χωριού, εκτός από στα αρχικά χωριά για κάθε φυλή και το χωριό Gludin.

Όλος ο βαθμός Γ μέσω των όπλων βαθμού του S μπορεί να αυξηθεί. Ο βαθμός Γ και τα Ψ κατηγορίας όπλα απαιτούν τον πολύτιμο λίθο Δ, και μια ανάγκη Gemstone Γ. όπλων βαθμού και βαθμού του S. Για κάθε στοιχείο που αυξάνεται, μια πέτρα και οι πολύτιμοι λίθοι ζωής απαιτούνται, μαζί με το όπλο που ο φορέας θέλει να αυξήσει.Οι πέτρες ζωής μπορούν να αποκτηθούν από το κυνήγι των τεράτων. Υπάρχει μια υψηλότερη πιθανότητα μια υψηλού επιπέδου πέτρα ζωής από την επιδρομή/το κύριο τέρας παρά από ένα συνηθισμένο τέρας. Μια πέτρα ζωής παρουσιάζει το επίπεδο του χαρακτήρα που μπορεί να το χρησιμοποιήσει.

Το αυξημένο όπλο δεν μπορεί να ανταλλαχθεί, να πέσουν, να κυκλοφορήσει στο εμπόριο, να πωληθεί, να μεταφεθεί, ή να κατατεθεί στην αποθήκη εμπορευμάτων γενιών. Εντούτοις, η ιδιωτική αποθήκευση αποθηκών εμπορευμάτων είναι δυνατή. Ένα στοιχείο που έχει αφαιρέσει την αύξησή του μπορεί να μεταφερθεί κανονικά.

Τα όπλα με τις πρόσθετες δυνατότητες ή enchantment μπορούν να αυξηθούν. Είναι επίσης δυνατό να προστεθεί μια πρόσθετη δυνατότητα ή στα enchant αυξημένα στοιχεία. Ακόμα κι αν αφαιρείτε την αύξηση ενός όπλου, η πρόσθετη δυνατότητα ή η enchant θέση δεν θα αλλάξει. Ένα αυξημένο όπλο δεν μπορεί να χρησιμοποιηθεί για την επεξεργασία των διπλών ξιφών ή στο εμπόριο με το σιδηρουργό Mammon.

ΛΕΠΤΟΜΕΡΕΙΕΣ

Οι πέτρες ζωής υπάρχουν στους διάφορους βαθμούς και τα επίπεδα. Το επίπεδο μιας ζωής πέτρας επηρεάζει ποιο επίπεδο χαρακτήρων μπορεί να χρησιμοποιήσει την πέτρα, μαζί με τη γενική δύναμη αυξάνεται. Ο βαθμός επηρεάζει τη δύναμη αυξάνει πιό τόσο έπειτα το επίπεδό του, μαζί με μια πρόσθετη ζωτικότητα που εφαρμόζεται σε ένα όπλο σε ορισμένους βαθμούς.Εντούτοις, στο τέλος τα αποτελέσματα είναι ακόμα τυχαία. Τα επίπεδα πετρών ζωής επηρεάζουν άμεσα το επίπεδο ενεργών και ενεργητικών δεξιοτήτων στα αυξημένα όπλα. Επίσης προκειμένου να χρησιμοποιηθεί μια πέτρα ζωής πρέπει να είστε ίσοι ή υψηλότερου επιπέδου έπειτα το επίπεδο της πέτρας.

 

Life Stone Level  Skill Level

46 1

49 2

52 3

55 4

58 5

61 6

64 7

67 8

70 9

76 10

 

Υπάρχουν 4 βαθμοί πετρών: Κανονικός, μέσος-βαθμός, αρίστης ποιότητας, και κορυφαίος-βαθμός. Ο υψηλός και κορυφαίος βαθμός θα προσθέσει την πρόσθετη ζωτικότητα σε ένα όπλο. Αρίστης ποιότητας είναι μια πιό αδύνατη επίδραση, ενώ ο κορυφαίος βαθμός έχει μια ισχυρότερη επίδραση.

 

Υπάρχουν επίσης τέσσερα qualitys αυξάνουν. Η ποιότητα αυξάνει καθορίζεται από τους διαφορετικούς τύπους και τον αριθμό. Οι υψηλότερες ιδιότητες τελών θα προσθέσουν επίσης τη πρόσθετη επίδραση ζωτικότητας σε ένα όπλο.

 

ΑΠΟΤΕΛΕΣΜΑΤΑ ΣΠΑΝΙΟΤΗΤΩΝ ΧΡΩΜΑΤΟΣ

Κίτρινοι κοινοί τροποποιητές STAT

Μπλε ασυνήθιστες δεξιότητες πιθανότητας τροποποιητών STAT

Πορφυρές σπάνιες ενεργές δεξιότητες δεξιοτήτων πιθανότητας τροποποιητών STAT

 

Κόκκινες πολύ σπάνιες STAT τροποποιητών πιθανότητας ενεργητικές δεξιότητες δεξιοτήτων δεξιοτήτων ενεργές

 

Το ακόλουθο διάγραμμα απαριθμεί τις δαπάνες για ένα όπλο και οι δαπάνες για την αφαίρεση αυξάνουν. Παρακαλώ σημειώστε ότι η τιμή αφαίρεσης υπόκειται στην αλλαγή κάνει στους φόρους κάστρων.

 

GRADE GEMSTONES REMOVAL FEE

C 20 D 95,000 Adena

B 30 D 270,000 Adena

A 20 C 330,000 Adena

S 25 C 480,000 Adena

 

ΠΙΘΑΝΟΣ ΑΥΞΑΝΕΙ

Ο συνολικός αριθμός των αποτελεσμάτων σε ένα όπλο varie αλλά τη σειρά είναι 2 έως 5 πιθανά αυξάνει. Ο περισσότερος αυξάνει αποτελείται από 2-4 τροποποιητές STAT. Εντούτοις όταν οι δεξιότητες περιλαμβάνονται γενικά υπάρχουν λιγότερα αποτελέσματα, αλλά όπως δηλώνονται νωρίτερα τα αποτελέσματα είναι τυχαίοι έτσι δεν μπορείτε ποτέ πραγματικά να είστε βέβαιοι τι μπορεί να συμβεί.

 

 

STAT MODIFIERS

Accuracy: between +0.4 and +3.0

CP Recovery: between +0.1 and +0.8

Critical: between +4.9 and +32.7

Evasion: between +0.4 and +3.0

HP Recovery: between +0.1 and +0.8

M. Atk: between +2.5 and +28.2

Maximum CP: between +19.2 and +214.9

Maximum HP: between +12.7 and+155.9

Maximum MP: between +6.1 and +115.1

M. Def: between +4 and +30.8

MP Recovery: between +0.1 and 0.4

P. Atk: between +2.2 and +24.2

P. Def: between +5.1 and +38.2

CON +1

INT +1

MEN +1

STR +1 ACTIVE SKILLS

Active: Absorbs HP.

Active: Allows you to reflect some of the damage you incurred back to the enemy for a certain amount of time. Excludes damage from skill or remote attacks.

Active: Attacks by throwing a boulder.

Active: Burns up the enemy's MP.

Active: Decreases all skill MP consumption rates temporarily.

Active: Decreases all skill re-use times temporarily.

Active: Decreases a target's urge to attack.

Active: Decreases the magic MP consumption rate temporarily.

Active: Decreases the magic re-use time temporarily.

Active: Decreases the opponent's PVP P. Atk. temporarily.

Active: Decreases the skill MP consumption rate temporarily.

Active: Decreases the skill re-use time temporarily.

Active: Decreases the song/dance skill MP consumption rate temporarily.

Active: Decreases the song/dance skill re-use time temporarily.

Active: Decreases the target's urge to attack.

Active: Detonates a fireball by compressing the air around the caster.

Active: Ignites a firecracker.

Active: Ignites a large firecracker.

Active: Increases Accuracy temporarily.

Active: Increases Dodge temporarily.

Active: Increases M. Atk. temporarily.

Active: Increases M. Def. temporarily.

Active: Increases P. Atk. temporarily.

Active: Increases P. Def. temporarily.

Active: Increases PVP Damage temporarily.

Active: Increases resistance to damage from falling temporarily.

Active: Increases the ability to restore some HP from the damage inflicted on an enemy temporarily. Excludes damage by skill or long-range attacks.

Active: Increases the chance of a critical attack temporarily.

Active: Increases the critical attack rate of magic attacks temporarily.

Active: Increases the effectiveness of HP recovery magic temporarily.

Active: Increases the maximum CP temporarily.

Active: Increases the maximum HP temporarily.

Active: Increases the maximum HP temporarily and restores HP by the increased amount.

Active: Increases the maximum MP temporarily.

Active: Increases the power of HP recovery magic temporarily.

Active: Increases the recharge recover rate of MP.

Active: Increases the recharge recovery rate of MP.

Active: Increases the target's urge to attack.

Active: Inflicts a dark attack.

Active: Inflicts a dark attack in the shape of a parabola.

Active: Inflicts a elementally challenged attack.

Active: Inflicts a elementally challenged attack in the shape of a parabola.

Active: Inflicts a flaming attack.

Active: Inflicts a flaming attack in the shape of a parabola.

Active: Inflicts a gusting attack.

Active: Inflicts a gusting attack in the shape of a parabola.

Active: Inflicts an earthen attack attack.

Active: Inflicts an earthen attack attack in the shape of a parabola.

Active: Inflicts a sacred attack.

Active: Inflicts a sacred attack in the shape of a parabola.

Active: Inflicts a water-type attack.

Active: Inflicts a water-type attack in the shape of a parabola.

Active: Inflicts damage by throwing a boulder.

Active: Instantly restores your HP.

Active: Launches a dark attack.

Active: Launches a sacred attack.

Active: Momentarily becomes invincible.

Active: Momentarily frightens the target, causing him to flee.

Active: Opens doors and treasure chests with a certain probability. Requires Keys of a Thief.

Active: Play music for a short duration.

Active: Puts the opponent's mind at peace and erases the desire to attack.

Active: Regenerates MP.

Active: Removes the target.

Active: Restores CP.

Active: Restores your own CP.

Active: Resurrects a corpse.

Active: Teleports party members to a village. Cannot be used in a specially designated place such as the GM Consultation Service.

Active: Teleports the caster to a village. Cannot be used in a specially designated place such as the GM Consultation Service.

Active: Teleports to a village regardless of time. Cannot be used in a specially designated place such as the GM Consultation Service.

Active: Temporarily blocks all of the target's physical/magic skills.

Active: Temporarily blocks a monster's pre-emptive attack. Fighting ability significantly decreases while in effect.

Active: Temporarily blocks the target's magic skills.

Active: Temporarily causes a target to bleed heavily.

Active: Temporarily decreases a target's Atk. Spd.

Active: Temporarily decreases a target's speed.

Active: Temporarily holds the target. The target cannot be affected by any additional hold attacks while the effect lasts.

Active: Temporarily Increases the distance you can jump without sustaining damage.

Active: Temporarily Increases your head size.

Active: Temporarily Increases your lung capacity.

Active: Temporarily paralyzes a target.

Active: Temporarily petrifies the target.

Active: Temporarily poisons the target.

Active: Temporarily puts the target to sleep. The target cannot be affected by any additional sleep attacks while the effect lasts.

Active: Temporarily resist damage from falls.

Active: Temporarily stuns the target.

Active: Unleashes a general attack and temporarily decreases your magic attack power during PvP. CHANCE

Chance: Blocks all of the physical/magic skills of the target that inflicts damage on you with a certain probability.

Chance: Blocks the magic skills of the target that inflicts damage on you with a certain probability.

Chance: Decreases the Atk. Spd. of the target that inflicts damage on you with a certain probability.

Chance: Decreases the PVP Damage of the target that inflicts damage on you with a certain probability.

Chance: Decreases the speed of the target that inflicts damage on you with a certain probability.

Chance: Decreases the urge to fight of the target that inflicts damage on you with a certain probability.

Chance: Has a chance to hold a target that damages you. The target cannot be affected by any additional hold attacks while the effect lasts.

Chance: Has a chance to paralyze a target that damages you.

Chance: Has a chance to petrify a target that damages you.

Chance: Has a chance to poison a target that damages you.

Chance: Has a chance to sleep a target that damages you.

Chance: Has a chance to sleep a target that damages you. The target cannot be affected by any additional sleep attacks while the effect lasts.

Chance: Has a chance to stun a target that damages you.

Chance: Increases accuracy with a certain probability when damage is incurred.

Chance: Increases critical attack rate of magic attacks with a certain probability when damage is incurred.

Chance: Increases critical attack rate with a certain probability when damage is incurred.

Chance: Increases evasion with a certain probability when damage is incurred.

Chance: Increases M. Atk. with a certain probability when damage is incurred.

Chance: Increases maximum CP with a certain probability when damage is incurred.

Chance: Increases maximum HP with a certain probability when damage is incurred.

Chance: Increases maximum MP with a certain probability when damage is incurred.

Chance: Increases M. Def. with a certain probability when damage is incurred.

Chance: Increases P. Atk. with a certain probability when damage is incurred.

Chance: Increases P. Def. with a certain probability when damage is incurred.

Chance: Increases PVP Damage with a certain probability when damage is incurred.

Chance: Increases recovery rate when receiving HP recovery magic with a certain probability after damage is incurred.

Chance: Increases recovery rate when receiving MP recovery magic with a certain probability after damage is incurred.

Chance: Momentarily blocks all of the target's physical and magic skills during a critical attack.

Chance: Momentarily blocks all of the target's physical and magic skills during a magic attack.

Chance: Momentarily blocks all of the target's physical and magic skills during a physical attack.

Chance: Momentarily blocks the target's magic skill during a critical attack.

Chance: Momentarily blocks the target's magic skill during a magic attack.

Chance: Momentarily blocks the target's magic skill during a physical attack.

Chance: Momentarily burns up the target's MP during a critical attack.

Chance: Momentarily burns up the target's MP during a magic attack.

Chance: Momentarily burns up the target's MP during a physical attack.

Chance: Momentarily causes the target to bleed during a critical attack.

Chance: Momentarily causes the target to bleed during a magic attack.

Chance: Momentarily causes the target to bleed during a physical attack.

Chance: Momentarily decreases a target's Atk. Spd. during a critical attack.

Chance: Momentarily decreases a target's Atk. Spd. during a magic attack.

Chance: Momentarily decreases a target's Atk. Spd. during a physical attack.

Chance: Momentarily decreases a target's speed during a critical attack.

Chance: Momentarily decreases a target's speed during a physical attack.

Chance: Momentarily decreases the target's speed during a magic attack. Intensity 3.

Chance: Momentarily frightens the target, causing him to flee during a magic attack.

Chance: Momentarily frightens the target, causing him to flee during a physical attack.

Chance: Momentarily frightens the target during a critical attack.

Chance: Momentarily holds the target during a critical attack. The target cannot be affected by any additional hold attacks while the effect lasts.

Chance: Momentarily holds the target during a magic attack. The target cannot be affected by any additional hold attacks while the effect lasts.

Chance: Momentarily holds the target during a physical attack. The target cannot be affected by any additional hold attacks while the effect lasts.

Chance: Momentarily paralyzes the target during a critical attack.

Chance: Momentarily paralyzes the target during a magic attack.

Chance: Momentarily paralyzes the target during a physical attack.

Chance: Momentarily petrifies the target during a critical attack.

Chance: Momentarily petrifies the target during a magic attack.

Chance: Momentarily petrifies the target during a physical attack.

Chance: Momentarily poisons the target during a critical attack.

Chance: Momentarily poisons the target during a magic attack.

Chance: Momentarily poisons the target during a physical attack.

Chance: Momentarily puts the target to sleep during a critical attack. The target cannot be affected by any additional sleep attacks while the effect lasts.

Chance: Momentarily puts the target to sleep during a magic attack. The target cannot be affected by any additional sleep attacks while the effect lasts.

Chance: Momentarily puts the target to sleep during a physical attack. The target cannot be affected by any additional sleep attacks while the effect lasts.

Chance: Momentarily stuns the target during a critical attack.

Chance: Momentarily stuns the target during a magic attack.

Chance: Momentarily stuns the target during a physical attack.

Chance: Regenerates CP with a certain probability when damage is incurred.

Chance: Regenerates MP with a certain probability when damage is incurred.

Chance: Temporarily decreases a target's speed during a critical attack.

Chance: Temporarily decreases a target's speed during a physical attack.

Chance: Temporarily decreases a target's urge to attack during a critical attack.

Chance: Temporarily decreases a target's urge to attack during a physical attack.

Chance: Temporarily decreases the target's speed during a magic attack. Intensity 3.

Chance: Temporarily increases the target's urge to attack during a critical attack.

Chance: Temporarily increases the target's urge to attack during a physical attack.

Chance: Temporarily provokes a target to attack during a critical attack.

Chance: Temporarily provokes a target to attack during a physical attack.

Chance: Throw the target that inflicts damage on you into a state of fear and causes him to flee with a certain probability. PASSIVE

Passive: Decreases the magic MP consumption rate.

Passive: Decreases the MP consumption rate for all skills.

Passive: Decreases the skill MP consumption rate.

Passive: Decreases the song/dance skill MP consumption rate.

Passive: Increases accuracy.

Passive: Increases critical attack rate.

Passive: Increases evasion.

Passive: Increases lung capacity.

Passive: Increases Lung Capacity.

Passive: Increases M. Atk.

Passive: Increases M. Def.

Passive: Increases P. Atk.

Passive: Increases P. Def.

Passive: Increases PVP Damage.

Passive: Increases the ability to reflect some of the damage you incurred back to the enemy. Excludes damage by skill or long-range attacks.

Passive: Increases the critical attack rate of magic attacks.

Passive: Increases the effect of HP recovery magic.

Passive: Increases the height from which you can jump without sustaining damage.

Passive: Increases the power of HP recovery magic.

Passive: Increases the recharge recovery rate of MP.

Passive: Increases the weapon weight limit by 2 times.

Passive: Raises resistance to damage from falling.

 

 

Posted

K pisteueis oti katalavenouMe emeis apo auti tn ftini metafrasi tpt ?

 

Tn alli fora p 8a kaneis copy paste ena topiC apo to english s3ction k to kaneis metafrasi apo to google sto eLLiniko exeis -1  karma apo menA  :-\\

 

Mporei na 8es na voi8iseis h na anevaseis ta posts s^^ alla etC douleia dn ginete... Ama 8es pragmatika na voi8iseis h na anevaseis ta posts s xDD kane kt diko s!

 

l0ck3D

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