Jump to content

Recommended Posts

Posted

Λοιπών ξεκινώντας αυτό το guide δεν είναι για high-mid rate server me gm shop

 

Τι είναι οι soul crystals?

Οι soul crystal μας δίνουν την δυνατότητα να προσθέσουμε μια special ability(SA) σε ένα όπλο

Ποια είναι τα SA των οπλών και τι κάνουν? 

Λοιπόν πρώτα πρέπει να δούμε τι SA χρειαζόμαστε..Τα sa's είναι τα εξής..

 

Acumen   

Magic casting speed increases with a fixed percentage.

Anger 

Enhances P. Atk. while decreasing maximum HP by a certain percent.

Back Blow 

Increases critical attack rate when attacking the enemy from behind.

Bodily Blessing 

Chance to cast Bless the Body magic upon the target when using good magic.

Cheap Shot 

When launching a general attack, MP consumption is reduced.

Conversion 

Increases maximum MP and decreases maximum HP.

Crt. Anger 

Decreases players HP while causing damage to target during critical attack.

Crt. Bleed 

Percent chance that target will bleed during critical attack.

Crt. Damage 

Inflicts extra damage to target when critical attack is launched.

Crt. Drain 

User absorbs HP from target during critical attack.

Crt. Poison 

Percent chance that target will be poisoned during critical attack.

Crt. Slow   

During a critical attack, the effect of Slow is produced at a certain rate of probability. Enhances damage to target during PvP.

Crt. Stun 

Percent chance of stun effect during critical attack.

Empower 

Increases magic power.

Evasion 

Increases evasion.

Focus 

Increases critical attack rate.

Guidance 

Increases accuracy.

Haste 

Increases attack speed.

Health 

Increases maximum HP by a certain percent.

HP Drain   

Restore 3% of melee damage inflicted on the enemy to oneself in HP.

HP Regeneration   

Increases HP regeneration rate. Also enhances damage to target during PvP.

Light 

Reduces a weapon's weight.

Magic Chaos 

Chance to cast Chaos magic upon the target when using bad magic.

Magic Damage 

When using harmful magic on a target, it delivers additional magic damage with a fixed percentage.

Magic Focus 

Chance to cast Focus magic upon the target when using good magic.

Magic Hold 

Chance to cast Dryad Root magic upon the target when using bad magic.

Magic Paralyze 

When using harmful magic on a target, it will paralyze the target with a fixed percentage.

Magic Poison 

Chance to cast Poison magic upon the target when using bad magic.

Magic Power 

When attacking with magic, the amount of MP used increases with a fixed percentage and magic power also increases.

Magic Regeneration 

Regenerates target's HP when using good magic.

Magic Shield   

Casts Mental Shield magic upon the target with a 50% chance of success when using good magic.

Magic Silence 

When using harmful magic on a target, it will silence the target with a fixed percentage.

Magic Weakness 

Chance to cast Weakness magic upon the target when using bad magic.

Mana Up 

Increases maximum MP by a certain percent.

Mental Shield 

Chance to cast Mental Shield magic upon the target when using good magic.

Miser  Reduces the amount of soulshots consumed.

MP Regeneration   

Increases MP regeneration rate. Also enhances damage to target during PvP.

Quick Recovery 

Reduces re-use delay.

Rsk. Evasion 

Increases Evasion when HP becomes low.

Rsk. Focus 

Increases critical attack rate when HP becomes low.

Rsk. Haste 

Increases Atk. Spd. when HP becomes low.

Towering Blow 

Increases attack range.

Wide Blow 

Broadens angle of attack.

 

 

Ωραία τώρα μια λίστα τι abilities μπορεί να έχει το κάθε όπλο

Πρώτα γράφετε το grade του όπλου μετά το όνομα και μετά τα SA's που μπορεί να πάρει

 

Blunt 

C  Stick of Faith (5)  Mana Up  Magic Hold    Magic Shield

C  Battle Axe (5)  Anger  Rsk.Focus  Haste

C  Big Hammer (5)  Health  Rsk.Focus  Haste

C  Silver Axe (5)  Anger  Rsk.Focus  Haste

C  Skull Graver (5)  Anger  Health  Rsk.Focus

C  Dwarven War Hammer (6)  Anger  Health  Haste

C  Club of Nature (7)  Magic Hold  Magic Mental Shield  Acumen

C  Mace of The Underworld (7)  Mana Up  Magic Silence  Conversion

C  Nirvana Axe (7)  Magic Poison  Magic Power  Magic Weakness

C  Stick of Eternity (7)  Empower  Rsk., Evasion  Bless the Body

C  War Axe (7)  Anger  Health  Haste

C  Ecliptic Axe ( 8)  Conversion  Magic Power  Magic Hold

C  Yaksa Mace ( 8)  Anger  Health  Rsk. Focus

B  Heavy War Axe (9)  Anger  Health  Rsk. Focus

B  Spell Breaker (9)  Acumen  Magic Mental Shield  Magic Hold

B  Art of Battle Axe (10)  Health  Rsk. Focus  Haste

B  Deadman's Glory (10)  Anger  Health  Haste

B  Kaim Vanul's Bones (10)  Mana Up  Magic Silence  Conversion

A  Meteor Shower (11)  Focus  Critical Bleed  Rsk. Haste

A  Spiritual Eye (11)  Mana Up  Magic Poison  Acumen

A  Elysian Axe (12)  Health  Anger  Critical Drain

A  Barakiel's Axe (12)  Health  Haste  Focus

A  Cabrio's Hand (12)  Conversion  Mana Up  Magic Silence

A  Flaming Dragon Skull (12)  Acumen  Magic Power  Magic Silence

S  Arcana Mace (13)  Acumen  MP Regeneration  Mana Up

S  Basalt Battlehammer (13)  HP Drain  Health  HP Regeneration

Two-Handed Blunts

C  Crystal Staff (5)  Rsk. Evasion  Mana Up  Bodily Blessing

C  Heavy Doom Axe (5)  Magic Poison  Magic Weakness  Magic Chaos

C  Heavy Doom Hammer (5)  Magic Regeneration  Mental Shield  Magic Hold

C  Cursed Staff (6)  Magic Hold  Magic Poison  Magic Weakness

C  Inferno Staff (7)  Magic Silence  Acumen  Magic Paralyze

C  Pa'agrian Hammer (7)  Rsk. Evasion  Magic Poison  Magic Weakness

C  Paradia Staff (7)  Magic Regeneration  Mental Shield  Magic Hold

C  Sage's Staff (7)  Magic Hold  Magic Poison  Magic Weakness

C  Pa'agrian Axe (7)  Mana Up  Magic Weakness  Magic Chaos

C  Karik Horn (7)  Critical Drain  Haste  Focus

C  Deadman's Staff ( 8)  Magic Regeneration  Mental Shield  Magic Hold

C  Demon's Staff ( 8)  Magic Poison  Magic Weakness  Magic Chaos

C  Ghoul's Staff ( 8)  Rsk. Evasion  Mana Up  Bodily Blessing

C  Dwarven Hammer ( 8)  Anger  Health  Critical Bleed

B  Sprite's Staff (9)  Magic Regeneration  Mental Shield  Magic Hold

B  Ice Storm Hammer (9)  Focus  Anger  Critical Bleed

B  Staff of Evil Spirit (10)  Magic Focus  Bodily Blessing  Magic Poison

B  Star Buster (10)  Health  Haste  Rsk. Focus

A  Dasparion's Staff (11)  Mana Up  Conversion  Acumen

A  Destroyer Hammer (11)  Health  Haste  Critical Drain

A  Branch of The Mother Tree (12)  Conversion  Magic Damage  Acumen

A  Behemoth's Tuning Fork (12)  Focus  Health  Anger

A  Daimon Crystal (12)  Mana Up  Acumen  Magic Mental Shield

A  Doom Crusher (12)  Health  Anger  Rsk. Haste

S  Imperial Staff (13)  Empower  MP Regeneration  Magic Hold

S  Dragon Hunter Axe (13)  HP Regeneration  Health  HP Drain

Bow

C  Crystallized Ice Bow (5)  Guidance  Evasion  Quick Recovery

C  Elemental Bow (5)  Guidance  Miser  Quick Recovery

C  Elven Bow of Nobility (6)  Evasion  Miser  Cheap Shot

C  Akat Long Bow (7)  Guidance  Evasion  Miser

C  Eminence Bow ( 8)  Guidance  Miser  Cheap Shot

B  Dark Elven Long Bow (9)  Evasion  Critical Bleed  Miser

B  Bow of Peril (10)  Guidance  Quick Recovery  Cheap Shot

A  Carnage Bow (11)  Light  Critical Bleed  Mana Up

A  Soul Bow (12)  Cheap Shot  Quick Recovery  Critical Poison

A  Shyeed's Bow (12)  Cheap Shot  Focus  Quick Recovery

S  Draconic Bow (13)  Cheap Shot  Focus  Critical Slow

Dagger 

C  Cursed Dagger (5)  Critical Bleed  Critical Poison  Rsk. Haste

C  Dark Elven Dagger (5)  Focus  Back Blow  Rsk. Haste

C  Soulfire Dirk (6)  Magic Hold  Magic Silence  Mana Up

C  Stiletto (6)  Critical Bleed  Critical Poison  Rsk. Haste

C  Dark Screamer (7)  Evasion  Focus  Critical Bleed

C  Grace Dagger (7)  Evasion  Focus  Back Blow

C  Crystal Dagger ( 8)  Critical Bleed  Critical Poison  Critical Damage

B  Hell Knife (9)  Mental Shield  Magic Weakness  Magic Regeneration

B  Kris (9)  Evasion  Focus  Back Blow

B  Demon's Dagger (10)  Critical Bleed  Critical Poison  Critical Damage

A  Bloody Orchid (11)  Focus  Back Blow  Critical Bleed

A  Soul Separator (12)  Guidance  Critical Damage  Rsk. Haste

A  Naga Storm (12)  Focus  Critical Damage  Back Blow

S  Angel Slayer (13)  Crt. Damage  HP Drain  Haste

Fists 

C  Chakram (5)  Critical Drain  Critical Poison  Rsk. Haste

C  Fisted Blade (6)  Rsk. Evasion  Rsk. Haste  Haste

C  Knuckle Duster ( 8)  Rsk. Evasion  Rsk. Haste  Haste

C  Great Pata ( 8)  Critical Drain  Critical Poison  Rsk. Haste

B  Arthro Nail (9)  Critical Poison  Rsk. Evasion  Rsk. Haste

B  Bellion Cestus (10)  Critical Drain  Critical Poison  Rsk. Haste

A  Blood Tornado (11)  Haste  Focus  Anger

A  Dragon Grinder (12)  Rsk. Evasion  Guidance  Health

A  Sobekk's Hurricane (12)  Haste  Rsk. Haste  Critical Drain

S  Demon Splinter (13)  Focus  Health  Crt. Stun

Pole 

C  Body Slasher (5)  Critical Stun  Long Blow  Towering Blow

C  Orcish Glaive (5)  Anger  Critical Stun  Long Blow

C  Scythe (5)  Anger  Critical Stun  Light

C  Bec de Corbin (6)  Critical Stun  Long Blow  Light

C  Poleaxe (7)  Towering Blow  Long Blow  Critical Stun

C  Scorpion (7)  Anger  Critical Stun  Long Blow

C  Widow Maker (7)  Critical Stun  Long Blow  Towering Blow

C  Orcish Poleaxe ( 8)  Critical Stun  Long Blow  Towering Blow

B  Great Axe (9)  Anger  Critical Stun  Light

B  Lance (10)  Anger  Critical Stun  Towering Blow

A  Halberd (11)  Haste  Critical Stun  Towering Blow

A  Tallum Glaive (12)  Guidance  Health  Towering Blow

A  Tiphon's Spear (12)  Critical Stun  Towering Blow  Wild Blow

S  Saint Spear (13)  Health  Guidance  Haste

Sword 

C  Stormbringer (5)  Critical Anger  Focus  Light

C  Mysterious Sword (5)  Acumen  Magic Power  Magic Weakness

C  Katana (6)  Focus  Critical Damage  Haste

C  Raid Sword (6)  Focus  Critical Drain  Critical Poison

C  Shamshir (6)  Guidance  Back Blow  Rsk. Evasion

C  Spirit Sword (6)  Critical Damage  Critical Poison  Haste

C  Homunkulus's Sword (7)  Acumen  Conversion  Magic Paralyze

C  Sword of Whispering Death (7)  Empower  Magic Power  Magic Silence

C  Caliburs (7)  Guidance  Focus  Critical Damage

C  Sword of Delusion (7)  Focus  Health  Rsk. Haste

C  Sword of Limit (7)  Guidance  Critical Drain  Health

C  Sword of Nightmare (7)  Health  Focus  Light

C  Tsurugi (7)  Focus  Critical Damage  Haste

C  Ecliptic Sword ( 8)  Empower  Magic Power  Magic Silence

C  Samurai Longsword ( 8)  Focus  Critical Damage  Haste

B  Sword of Valhalla (9)  Acumen  Magic Weakness  Magic Regeneration

B  Keshanberk (9)  Guidance  Focus  Back Blow

B  Sword of Damascus (10)  Focus  Critical Damage  Haste

B  Wizard's Tear (10)  Acumen  Magic Power  Conversion

A  Elemental Sword (11)  Magic Power  Magic Paralyze  Empower

A  Tallum Blade (11)  Critical Poison  Haste  Anger

A  Sword of Miracles (12)  Magic Power  Magic Silence  Acumen

A  Dark Legion's Edge (12)  Critical Damage  Health  Rsk. Focus

A  Sirra's Blade (12)  Haste  Health  Critical Poison

A  Themis' Tongue (12)  Mana Up  Magic Mental Shield  Magic Focus

S  Forgotten Blade (13)  Haste  Health  Focus

Two-Handed Swords 

C  Flamberge (5)  Critical Damage  Focus  Light

C  Pa'agrian Sword (7)  Focus  Health  Critical Drain

C  Berserker Blade ( 8)  Focus  Critical Damage  Haste

B  Great Sword (9)  Health  Critical Damage  Focus

B  Guardian Sword (10)  Critical Drain  Health  Critical Bleed

A  Infernal Master (11)  Haste  Critical Damage  Focus

A  Dragon Slayer (12)  Health  Critical Bleed  Critical Drain

A  Sword of Ipos (12)  Focus  Haste  Health

S  Heaven's Divider (13)  Haste  Health  Focus

 

Και γιατι εχει 3 διαφορετικα το καθένα?Και τι είναι αυτός ο αριθμός από διπλά?

Εδώ ερχόμαστε στο λόγω υπάρξεις του οδηγού αυτού..

Κάθε SA κάθε όπλου χρειάζεται και διαφορετικό κρύσταλλο.

Οι κρύσταλλοι χωρίζονται σε 3 κατηγορίες

Red-Green-Blue

Η πρώτη στήλη των SA δείχνουν το αποτέλεσμα με μπλε κρύσταλλο η δεύτερη των πρασίνων και οι τρίτη των μπλε..

Ο αριθμός δείχνει τι lvl πρέπει να είναι ο κρύσταλλος(Πιο αναλυτικά πιο κάτω)

 

Πως μπορώ να αγοράσω έναν κρύσταλλο?

'Η από τον Grand Magister-sto  Giran Magic Guilt Ή από την magister διπλά στο Aden Magic built..

Περνούμε το quest και επιλέγουμε τον κρύσταλλο που θέλουμε.. Άμα θέλουμε να πάρουμε 2 απλά πετάμε τον έναν κάτω και περνούμε ακόμα έναν άλλον.

Ή από το giran luxury shop με το αναλογώ κόστος

Οκ,τον εχω crystal πως το ανεβάζω

Πρώτα ας δούμε τις προϋποθέσεις για να ανεβάσεις έναν κρύσταλλο

1.Δεν κάνουμε Abort το quest

2.Πρέπει να έχεις μονό έναν κρύσταλλο στο inventory

3.Τo mob πρέπει να έχει κάτω από 50% hp άμα κάνει heal πρέπει να το ξαναχρησιμοποιήσουμε.

4.Για να πάει ένας κρύσταλλος πάνω από lvl10 θέλει raidboss

 

Η διαδικασία είναι απλή βαράμε το mob όταν πάει κάτω από 50 % hp όταν πέσει θα φανεί άμα πέτυχε η όχι ο κρύσταλλος (τα αποτέλεσμα θα εξηγηθούν αργότερα)

Oρίστε οι λίστα των mob το (A) σημαίνει aggresive το (P) passive

 

 

Stage 1-2

Garden of Eva:

Nos (A:40)

Light Worm (A:41)

Blade Stakato (P:41)

Blade Stakato Worker (P:42)

Blade Stakato Warrior (A:43)

Timak Outpost:

Timak Orc (P:40)

Timak Orc Archer (P:41)

Timak Orc Troop Archer (P:41)

Timak Orc Soldier (A:42)

Timak Orc Warrior (P:43)

Timak Orc Troop Warrior (P:43)

Stage 3

Devil's Isle:

Unpleasant Humming (A:46)

Light Bringer (A:46)

Forest of Mirrors:

Forest of Mirrors Ghost (A:46)

Garden of Eva:

Blade Stakato Drone (P:44)

Water Giant (A:45)

Queen Undine Lad (P:46)

Timak Outpost:

Timak Orc Shaman (P:44)

Timak Orc Troop Shaman (P:44)

Timak Orc Overlord (A:45)

Timak Orc Troop Leader (P:45)

Stage 4

Devil's Isle:

Death Flyer (P:47)

Fiend Archer (A:48)

Musveren (P:49)

Forest of Mirrors:

Forest of Mirrors Ghost (A:47-48)

Mirror (P:49)

Garden of Eva:

Eva's Seeker (P:47)

Theeder Piker (A:48)

Garden Guard (P:48)

Theeder Mage (P:49)

Stage 5

Devil's Isle:

Zaken's Guard (A:50)

Zaken's Royal Guard (A:50)

Kaim vanul (P:51)

Pirate Zombie Captain (A:52-60)

Forest of Mirrors:

Harit Lizardman (P:50)

Harit Lizardman Grunt (P:51)

Harit Lizardman Archer (A:52)

Garden of Eva:

Doll Master (A:50)

Garden Guard Leader (A:50)

Stage 6

Devil's Isle:

Doll Blader (P:53)

Sairon's Doll (P:53)

Sairon's Puppet (P:53)

Sairon (A:54)

Vale Master (A:54)

Giant's Cave:

Halingka (P:55)

Yintzu (A:56)

Back to top

Stage 7

Giant's Cave:

Paliote (P:57)

Hamrut (A:58)

Stage 8

Giant's Cave:

Kranrot (A:59)

Devastated Castle:

Doom Servant (A:60)

Stage 9

Devastated Castle:

Doom Guard (P:61-66)

Doom Archer (A:62)

Doom Archer (P:67)

Stage 10

Devastated Castle:

Doom Trooper (P:63)

Doom Warrior (P:64)

Doom Knight (A:65)

Tower of Insolence:

Erin Ediunce (A:66)

Platinum Series (Tribe, Guardian) (A:67-75)

Angel Series (Messenger, Guardian, Archangel, Seal) (A:70-75)

Antharas' Lair (DVC):

Malruk Knight (A:66)

Malruk Beserker (A:67)

Malruk Lord (A:68)

Limal Karinness (A:69)

Pytan Knight (P:68)

Pytan (A:69)

Karik (A:70)

Stage 11-12 (Raid Bosses)

Raid Bosses:

Zaken (60)

Beast Lord Behemoth (70)

Meanas Anor (70)

Roaring Skylancer (70)

Eilhalder Von Hellmann (71)

Antharas Priest Cloe (74)

Krokain Padisha Sobekk (74)

Baium (75)

Anakim (80)

Lilith (80)

Sailren (80)

Tyrannosaurus (80)

Stage 13-16 (Raid Bosses)*

 

Raid Bosses:

Anakazel (78)

Antharas (79) Gracia Final

Ember (80)

Frintezza (85) Gracia Final

Valakas (85) Gracia Final

Stage 15-16 (Raid Bosses)

Raid Bosses:

Beleth

Tiat  Gracia Final Boss

Ekimus  Gracia Final Boss

 

Για να γλειτωσει κόπο κανείς μπορεί ας πούμε να αρχίσει να ανεβάζει τον κρύσταλλο που θέλει να πάει lvl9 από τα lvl 9 τέρατα κατευθείαν και θα ανεβαίνει σιγά σιγά..

 

Αφού το τέρας πεθάνει θα έχουμε ένα από τα εξής αποτελέσματα:

Nothing happens: Κάτι που ξέχασα να αναφέρω πιο πάνω είναι ότι πρέπει να κανείς εσύ το last hit, αλλιώς περνεις αυτό το μήνυμα(επεισης άμα βγάλατε το quest πάλι αυτό θα βλέπετε)

The soul crystal resonates: Μονό έναν κρύσταλλο δώστε σε φύλο η σε πετ τον άλλον άμα θέλετε 2 η παραπάνω

The soul crystal is refusing to absorb a soul: Το mob είναι μικρότερο lvl από το lvl που πάτε να ανεβάσετε τον κρύσταλλο

The soul crystal was not able to absorb a soul:Όλα έγιναν σωστά απλά ήσασταν άτυχοι

The soul crystal succeeded in absorbing a soul:Ο κρύσταλλος ανέβηκε lvl , πετιέται από το inventory

 

Έχω τον κρύσταλλο και το όπλο τι άλλο χρειάζομαι?

Adena,Gemstone grade(ανάλογα με το όπλο),τον σωστό blacksmith . Από C μέχρι A grade οποιοσδήποτε blacksmith το κάνει(το όπλο πρέπει να είναι στο inventory). Από εκεί και πάνω blacksmith of mammoon.

 

Αυτό ήταν το guide μου

Credits:ME

Τους πινάκες τους πήρα από διάφορα site

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