Jump to content

Recommended Posts

Posted (edited)

Καλησπέρα σε όλους τους φίλους εδώ στο Maxcheaters!

 

Αυτόν τον καιρό έχω αρχίσει να ξανά ασχολούμε με την Java γλώσσα, και μαθαίνω κάποια πράγματα. Έτσι, θέλω να μοιραστώ μαζί σας κάποια από τα βήματα που κάνω για να μάθω, και ελπίζω να σας φανεί χρήσιμο!

Δεν θα γράψω τίποτα σπουδαία πράγματα, απλά θα μεταφέρω κάποια από αυτά που μαθαίνω. Για τον λόγο ότι, υπάρχει ένας οδηγός στα Shares and Files, αλλά είναι στα αγγλικά.
Εγώ δεν γνωρίζω αγγλικά, ίσως αυτό το πρόβλημα να το έχουν και άλλοι. Οπότε, θα μεταφέρω δικά μου πράγματα...

(Θα προσπαθώ να βρίσκω χρόνο, και να βάζω περισσότερα πράγματα, και πιο χρήσιμα ακόμη).

Απλώς, το Ελληνικό Section, έχει νεκρώσει κάπως, και αφού ένας "πολύ" έμπειρος δεν βοηθάει, ας κάνω την αρχή, και όποιος θέλει να βοηθήσει με τις γνώσεις του, γράφει replay από κάτω, και τον ανεβάζω με Quote.

Έστω και 1 γνώση του καθένα, θα βοηθήσει πολλούς όταν γίνουν 10. ;)

 

Ας αρχίσουμε...

 

============================================================= 1o ΜΕΡΟΣ:

Καταρχάς χρειαζόμαστε Eclipse και ένα SVN ενός Project, για να μπορέσουμε να εργαστούμε σε αυτό που θέλουμε...

Δείτε τον παρακάτω οδηγό για το πως να κάνουμε Compile με το Eclipse, και θα το καταφέρετε...

Πως Να Κάνεις Compile & Πως Περνάς Έναν Java Code!

 

Παρακάτω θα δείξω, πως μπορούμε να κάνουμε ένα συγκεκριμένο Class, να πάρει κάποιο Item που θέλουμε όταν πάρει το πρώτο του Pvp... (θα ήταν ανούσιο το να δείξω για όλους τους χαρακτήρες, άμα δε μπορούμε να τσεκάρουμε μόνο έναν).

Εδώ είναι το κομμάτι Java που χρειαζόμαστε να επεξεργαστούμε για να το κάνουμε... L2PcIstance.java

 

Πως τσεκάρουμε το οποιοδήποτε Class?

Δείτε παρακάτω μερικά Class σαν παράδειγμα..

if(getClassId() == ClassId.sagittarius)
if(getClassId() == ClassId.duelist)
if(getClassId() == ClassId.dreadnought)
if(getClassId() == ClassId.phoenixKnight)
if(getClassId() == ClassId.hellKnight)

Εδώ τώρα... Όπως βλέπουμε, μας λέει ότι "εάν ο παίχτης παίρνει το ClassId, το οποίο είναι π.χ sagittarius"

Ας πάρουμε αυτό το κομμάτι, και να το εμπλουτίσουμε με τις σωστές εντολές. Γιατί έτσι από μόνο του είναι άχρηστο... Π.χ.. Αν ο παίχτης είναι Sagi, τι? Τίποτα!

Το πέρνουμε και αρχίζουμε γράφουμε...

 

   if (getPvpKills() == 1) Εάν πάρει το πρώτο του pvp, δηλαδή πάρει 1 PvpKills (μετά το 1ο δε παίρνει τίποτα)
   {

   if(getClassId() == ClassId.sagittarius) Όπως είπαμε.. Αν το χαρακτήρας είναι Sagittarius
   {
   addItem("Draconic Bow", 7577, 1, this, true); Εδώ θα πάρει 1 Draconic Bow
   addItem("Euro", 57, 1000000, this, true); Εδώ, θα πάρει 1κκ Euro(Adena).
   sendMessage("Κουφάλα! Πήρες δώρο ένα Dc Bow(Focus) και 1kk Adena."); Εδώ, του έρχεται το μήνυμα που θέλουμε να λέει.
   }

   }

 

Τώρα, πάμε να κάνουμε ακριβώς το αντίθετο.. Δηλαδή να πάρουν όλοι οι άλλοι, εκτός του Saggitarius.

(Είναι πολύ σημαντικό αυτό, και θα καταλάβεται γιατί το κάνω...)

Λοιπόν... Όποτε σε έναν κώδικα συναντάμε την ένδειξη "  ! " σημαίνει το αντίθετο.. Δηλαδη...

 

   if (getPvpKills() == 1) Εάν πάρει το πρώτο του pvp, δηλαδή πάρει 1 PvpKills (μετά το 1ο δε παίρνει τίποτα)

   {

   if(getClassId() != ClassId.sagittarius) Όταν ένας χαρακτήρας, δεν είναι Saittarius..
   {
   addItem("Gold Bar", 3470, 1, this, true); Εδώ θα πάρει 1 Gold Bar
   addItem("Euro", 57, 1000000, this, true); Εδώ, θα πάρει 1κκ Euro(Adena).
   sendMessage("Κουφάλα! Πήρες δώρο ένα Gold Bar και 1kk Adena."); Εδώ, του έρχεται το μήνυμα που θέλουμε να λέει.

 

Ε. Ωραία αυτά... Όμως πως κάνουμε να πάρουν όλοι οι Fighter κάτι, αλλά οι Mage κάτι άλλο?

 

Α. Εφόσον με τα παραπάνω ήμαστε οκ, και καταλάβαμε πως πάει το πράγμα, τότε διαβάστε τον παρακάτω κώδικα...

 

   if (getPvpKills() == 1)
   {
   if (!isMageClass()) Δηλαδή εάν δεν είναι μάγος..
   {
   addItem("Angel Slayer", 6367, 1, this, true);
   sendMessage("Μόλις πήρες ένα Angel Slayer");
   }
  else Εδώ τώρα... προσθέσαμε το else, οπότε, οι άλλοι θα πάρουν τα παραπάνω, και ο μάγος τα παρακάτω. (Δηλαδή, αν πάρει ο μάγος το πρώτο του PvpKill, μόνο αυτός θα πάρει το Arcana Acumen..
   {
  addItem("Arcana Mace Acumen", 6608, 1, this, true);
  sendMessage("Μόλις πήρες ένα Arcana mace Acumen);
  }
  }
  }

 

Εάν βγάλουμε τελειώς το if (!isMageClass()), και όλες τις γραμμές από else και κάτω... Θα πάρουν όλοι αυτά τα Item. Δηλαδή να γίνει κάπως έτσι ο κώδικας...

if (getPvpKills() == 1)
    {
     {
      addItem("Angel Slayer", 6367, 1, this, true);
      sendMessage("Μόλις πήρες ένα Angel Slayer");
     }
    }

Ε. Πως μπορούμε να κάνουμε να παίρνει σε κάθε Pvp κάποιο Item?

Α. Εδώ, απλά θα πρέπει να αλλάξουμε τα " == " που σημαίνουν απόλυτα το συγκεκριμένο πράγμα... Δηλαδή αν είναι (item.getItemId() == 6367, τότε σημαίνει απόλυτα γι'αυτό το Item. Το αλλάζουμε λοιπόν,  με την ένδειξη " >= " που σημαίνει αυτού του, και μεγαλύτερου...

Οπότε ο κώδικας μας γίνεται κάπως έτσι...

if (getPvpKills() >= 1)
    {
     {
      addItem("Angel Slayer", 6367, 1, this, true);
      sendMessage("Μόλις πήρες ένα Angel Slayer");
     }
    }

Πάμε τώρα να επεξεργαστούμε κάτι άλλο για πλάκα, για να μπούμε λίγο περισσότερο στο νόημα....

Ας μάθουμε πως δίνουμε ένα Item στην μπάρα ας πούμε F9 του χαρακτήρα να το βρει όταν μπει..

Πάμε, Gameserver/network/clientpackets/CharacterCreate.java

 

Κάνουμε αναζήτηση για: newChar.registerShortCut(new L2ShortCut(11, 0, 1, item.getObjectId(), -1, 1));

Αφού το βρήκαμε, αφήνουμε ένα κενό, και βάζουμε το παρακάτω:

+ if (item.getItemId() == 6367) Εδώ μας λέει... Ότι, αν το Item, έχει το ID 6367(Angel Slayer), τότε αυτό θα μπει στη μπάρα.
+    newChar.registerShortCut(new L2ShortCut(8, 0, 1, item.getObjectId(), -1, 1)); Εδώ, μας δείχνει που θα κάνει εγγραφή, π.χ στο F9. Εκεί θα πάει το Angel Slayer. Βάζουμε 8, για να πάει στο 9.

Τώρα θα γίνει κάπως έτσι μέσα...

 if (item.getItemId() == 5588) // tutorial book shortcut
    newChar.registerShortCut(new L2ShortCut(11, 0, 1, item.getObjectId(), -1, 1));
  
+   if (item.getItemId() == 6367)
+    newChar.registerShortCut(new L2ShortCut(8, 0, 1, item.getObjectId(), -1, 1));

Έτσι λοιπόν, φτιάχνουμε/επεξεργαζόμαστε κάτι δικό μας.. Όπως είπα, δεν είναι κάτι σημαντικό αυτό που ανέφερα... Αλλά ίσως απαντήσει κάποια ερωτήματα..
(Όλα τα παραπάνω αποτελούν παράδειγμα, ασχέτως αν κάτι είναι σε λάθος σειρά ή δεν ισχύει).

 

============================================================= 2o ΜΕΡΟΣ:

Πάμε τώρα να μάθουμε, πως κάνουμε τα παραπάνω με Config.

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

 

 

Ο παρακάτω κώδικας, θα δώσει στους Fighter όταν πάνε στα 100 pvp kills, ένα Fighter Tattoo, ενώ στους μάγους ένα Mage Tattoo.

// Add Fighter or Mage Tattoos
     if (Config.REWARD_TATTOOS_ENABLE)
     {
      if (getPvpKills() == Config.PVP_COUNT)
      {
       if (!isMageClass())
       {
        addItem("Tattoo", Config.TATTOO_FIGHTER_ID, Config.FIGHTER_TATTOO_COUNT, this, true);
        sendMessage("Congratulations! " + Config.PVP_COUNT + "  PvP Kills! You won Fighter Tattoo.");
       }
       else
       {
        addItem("Tattoo", Config.TATTOO_MAGE_ID, Config.MAGE_TATTOO_COUNT, this, true);
        sendMessage("Congratulations! " + Config.PVP_COUNT + "  PvP Kills! You won Mage Tattoo.");
       }
      }
     }

Για να αφήνουμε τα σωστά κενά (πιο πολύ για καλύτερη εικόνα, και διάβασμα του κώδικα είναι αυτό), πατάμε Ctrl - Shift & F
(Ευχαριστώ τον NeverMore' που μου το έμαθε αυτό...)

Όλα αυτά περί PvpKills, τα Item που θέλουμε να δώσουμε, το πόσα Item θέλουμε να δώσουμε και αν θέλουμε να είναι ενεργοποιημένο αυτό το σύστημα, μπορούμε εύκολα να τα επεξεργαστούμε απλά, μέσα από τα Config μας!

 

Πάμε λοιπόν, nes/sf/l2j/Config.java

(Με την ένδειξη " + " είναι όλα αυτά που πρέπει να προσθέσουμε, αυτά που είναι χωρίς " + " απλά υπάρχουν για να ξέρουμε που ακριβώς να πάμε...)

 

Πάμε στα Config του Server μας, και φτιάχνουμε ένα νέο file με όνομα custom.properties. (Βασικά πάρτε ένα έτοιμο Property αρχείο, κάντε το μετανομασία, και απλά σβήνεται ότι έχει μέσα, και βάζετε τα καινούρια.

 

 

   public static final String CLANS_FILE = "./config/clans.properties"; Βρίσκουμε αυτό...
+ public static final String CUSTOMS_FILE = "./config/customs.properties"; Εδώ, είναι το καινούριο property file, που θα φτιάξουμε..

 

Εδώ θα φτιάξουμε τα Config που έχουμε δηλώσει στον κώδικα...

  public static final String SIEGE_FILE = "./config/siege.properties"; Βρίσκουμε αυτό...

+ // Custom Tattoo's

+ /** Fighter Tattoo */
+ public static boolean REWARD_TATTOOS_ENABLE; Λοιπόν.. Εδώ αν προσέξετε στον κώδικα, έχουμε "if (Config.REWARD_TATTOOS_ENABLE)" Δηλαδή, εάν αυτό είναι ενεργοποιημένο, προχωράμε στα παρακάτω βήματα..

+ public static int FIGHTER_TATTOO_COUNT; Εδώ ελέγχει τα πόσα Tattoo θέλουμε να δώσουμε στον Fighter παίχτη... addItem("Tattoo", Config.TATTOO_FIGHTER_ID, Config.FIGHTER_TATTOO_COUNT, this, true);

+ public static int TATTOO_FIGHTER_ID; Εδώ ελέγχει το ID του Item που θέλουμε να δώσουμε στον Fighter παίχτη... addItem("Tattoo", Config.TATTOO_FIGHTER_ID, Config.FIGHTER_TATTOO_COUNT, this, true);
+
+ /** Mage Tattoo */
+ public static int MAGE_TATTOO_COUNT; Εδώ ήμαστε στους μάγους τώρα... Είναι ίδια με τα παραπάνω... Ελέγχει τα πόσα Tattoo θέλουμε να δώσουμε στους μάγους. addItem("Tattoo", Config.TATTOO_MAGE_ID, Config.MAGE_TATTOO_COUNT, this, true);

+ public static int TATTOO_MAGE_ID; Εδώ ελέχγει το ID του Item που θέλουμε να δώσει στον μάγο. addItem("Tattoo", Config.TATTOO_MAGE_ID, Config.MAGE_TATTOO_COUNT, this, true);
+
+ /** Pvp Kills they need */
+ public static int PVP_COUNT; Εδώ ελέγχει τα πόσα PvpKills πρέπει να πάρει ο παίχτης, για να δώσει τα Item. Γι'αυτό και έχουμε βάλει "if (getPvpKills() == Config.PVP_COUNT)"
+
// --------------------------------------------------
// Clans settings
// --------------------------------------------------

 

Πάμε τώρα να βάλουμε και κάτι ακόμη που χρειάζεται για να μπούνε όλα αυτά στο customs.properties αρχείο που φτιάξαμε...

 

REMOVE_CASTLE_CIRCLETS = clans.getProperty("RemoveCastleCirclets", true);
+                       
+    // Custom Tattoo's
+   ExProperties customs = load(CUSTOMS_FILE); Εδώ κάνει εγγραφή το νέο μας Config αρχείο. Δεν θα χρειαστεί στο μέλλον να το ξανά βάλουμε αν θέλουμε απλά να περάσουμε άλλες σειρές στο custom.properties, το βάζουμε μόνο όταν φτιάχνουμε νέο Config αρχείο.
+   /** Fighter Tattoo */

 

Αφού το Config που φτιάξαμε λέγεται customs.properties εκεί που έχω με κόκκινο, θα βάζουμε το όνομα των κάθε config που θέλουμε να τα στείλουμε. Ενώ με πράσινο, σημαίνει πως πηγαίνει σε αυτό το αρχείο. Με πορτοκαλί, γράφουμε τις λέξεις που θα έχουμε μέσα στα Config μας.
+   REWARD_TATTOOS_ENABLE = customs.getProperty("RewardTattooEnable", false);

+   TATTOO_FIGHTER_ID = customs.getProperty("FighterTattooID", 492);

+   /** Mage Tattoo */
+   TATTOO_MAGE_ID = customs.getProperty("MageTattooID", 493);

+   /** Pvp Kills */
+   PVP_COUNT = customs.getProperty("PvpKillsCount", 100);

 

 

Πάμε τώρα μέσα στο custom.properties αρχείο που δημιουργήσαμε και γράφουμε τα παρακάτω...
Με την ένδειξη " # " θα την βάζουμε όταν θέλουμε να δείξουμε κάτι στον άλλον... Μόνο να του εξηγήσουμε τι είναι αυτό το σύστημα.

Εμάς όμως πρώτα, θα πρέπει να μας ενδιαφέρει να βάλουμε σωστά αυτά που έχω με κίτρινα...

 

# Custom Tattoo Fighter/Mage.
# Default: False & 100 Pvp kills.

RewardTattooEnable = false
# Fighter Tattoo
FighterTattooCount = 1
FighterTattooID = 492

# Mage Tattoo.
MageTattooCount = 1
MageTattooID = 493

# Pvp Kills Count.
PvpKillsCount = 100

 

 

Αυτά ήταν παίδες... Δεν είναι κάτι δύσκολο... Για όποια απορία, ρωτήστε και είμαι στην διάθεση σας...

Αύριο αν βρω χρόνο, θα ανεβάσω πως φτιάχνουμε δικό μας voicecommand, είτε για teleport, είτε για Items.

Edited by 'Baggos'
  • Upvote 1
Posted (edited)

 if(!(getClassId() == ClassId.sagittarius))

 

swpa re magka kanei kai tetia i tzava?

Εσύ τι δε κατάλαβες απ'όλα τα παραδείγματα? Δηλαδή έχεις συναντήσει να λέει "Κουφάλα μπλα μπλα"?

5 το πρωί θα με ένοιαζε που μπαίνει? Υποθετικά είναι μικρέ... Σταμάτα να σπαμάρεις για ποστ!

 

Από που ξεφεύγετε εσείς ρε ζώα γαμώτο και έρχεσται εδώ...

Edited by 'Baggos'
Posted

Καταρχάς Βαγγελάρα σόρρυ για αυτό που θα γράψω

 

 

 if(!(getClassId() == ClassId.sagittarius))

 

swpa re magka kanei kai tetia i tzava?

 

και κατά δεύτερον άμα ψάξεις και λίγο στο youtube ή αν δεις το υπόλοιπο φόρουμ εδώ θα καταλάβεις τι άλλα μπορεί να κάνει η java..

Posted (edited)

Καταρχάς Βαγγελάρα σόρρυ για αυτό που θα γράψω

 

 

 

και κατά δεύτερον άμα ψάξεις και λίγο στο youtube ή αν δεις το υπόλοιπο φόρουμ εδώ θα καταλάβεις τι άλλα μπορεί να κάνει η java..

Παραδειγματικό είναι το " ! " στον sagittarius για να καταλάβουν την σημασία του... Γι'αυτό έβαλα τον mage παρακάτω. Έφερα παράδειγμα γι'αυτήν την ένδειξη. Δεν έχω ιδέα αν πηγαίνει στον sagittarius έτσι ακριβώς, ούτε καν που το έχω δοκιμάσει.

Δε θα κρυφτώ ή θα το παίξω ξερόλας, το νόημα θέλω να τυπωθεί. :P

Edited by 'Baggos'
Posted

Βάλε τα κατάλληλα καινά στους κώδικες για να είναι πιο εύκολο να διαβαστούν , εαν δεν ξέρεις πως να το κάνεις πάτα στο eclipse ctrl+shift+f.

Δοκίμασε το και πες μου!

Posted

Καταρχάς Βαγγελάρα σόρρυ για αυτό που θα γράψω

 

 

 

και κατά δεύτερον άμα ψάξεις και λίγο στο youtube ή αν δεις το υπόλοιπο φόρουμ εδώ θα καταλάβεις τι άλλα μπορεί να κάνει η java..

 

 

 

re panivlaka

 if(!(getClassId() == ClassId.sagittarius))

grafete etsi apo kanoniko developer

 if(getClassId() != ClassId.sagittarius)
Posted

 

re panivlaka

 if(!(getClassId() == ClassId.sagittarius))

grafete etsi apo kanoniko developer

 if(getClassId() != ClassId.sagittarius)

 

 

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

 

//End of conversation

 

@`Baggos'

 

Συνέχισε έτσι τρελέ μου! ωραίος οδηγός!!!

Posted

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

 

//End of conversation

 

@`Baggos'

 

Συνέχισε έτσι τρελέ μου! ωραίος οδηγός!!!

Σ'ευχαριστώ ρε αλάνι.. Αν και πρέπει να πάρουμε μαθήματα από τον πιτσιρικά :lol: Το μικρό αγόρι που εκφράζει τα νεύρα του πληκτρολογόντας.. :lol:

Posted (edited)

 

+1 Rep Gia to Topic polli wraia douleia kai mpravo gia ton xrono sou!! :)

Σωστότατο το βίντεο... χαχα..

Σ'ευχαριστώ φίλε.. Μ'αρέσει να βοηθάω να καταλαβαίνονται κάποια πράγματα.. Και αν ένα παράδειγμα βγάζει ένα λάθος.. οκ! Όπως είπα γράφω αυτά που μαθαίνω για να ανέβει λίγο το Ελληνικό section...

Edited by 'Baggos'
Posted

Σωστότατο το βίντεο... χαχα..

Σ'ευχαριστώ φίλε.. Μ'αρέσει να βοηθάω να καταλαβαίνονται κάποια πράγματα.. Και αν ένα παράδειγμα βγάζει ένα λάθος.. οκ! Όπως είπα γράφω αυτά που μαθαίνω για να ανέβει λίγο το Ελληνικό section...

 

Ασε τους βλακες να ψαχνουν για λαθη. Eμενα προσωπικα, που δεν ξερω και πολλα απο coding, με βοηθησε τουλαχιστον να κατανοησω καποια πραγματα.. 

Πολυ ωραια δουλεια!

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

    • Verify if following is supposed to be the way to handle movement npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(point.getX(), point.getY(), point.getZ())); For me, it's not enough. And if it's the case, whole AI system is probably buggy.
    • hello, i want to wtt my charracter in l2elmorelab 1x harbor for 1.5kkk adena in l2reborn 10x new. Or if you interested tell me your offer. :)) Clean Mail 30 lvl Cleric Naked   Updated.
    • package ai.npc.NFWalker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import l2r.gameserver.enums.CtrlIntention; import l2r.gameserver.model.Location; import l2r.gameserver.model.actor.L2Npc; import l2r.gameserver.model.quest.Quest; import l2r.gameserver.network.clientpackets.Say2; import l2r.gameserver.network.serverpackets.NpcSay; public class NFWalkerAI extends Quest { private static final int WALKER_NPC_ID = 20116; private final Map<String, Route> routes = new HashMap<>(); private final Map<Integer, Integer> npcIndexes = new HashMap<>(); private final Map<Integer, Boolean> npcReverse = new HashMap<>(); private final Map<Integer, String> npcCurrentRoute = new HashMap<>(); public NFWalkerAI() { super(-1, NFWalkerAI.class.getSimpleName(), "ai/npc/NFWalker"); loadRoutes(); addSpawnId(WALKER_NPC_ID); } private void loadRoutes() { // Route 1 Data Route route1 = new Route("route1"); route1.addPoint(new RoutePoint(0, 149363, 172341, -941, 0, false, "")); route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff")); route1.addPoint(new RoutePoint(2, 148536, 172792, -980, 0, false, "")); // Route 2 Data Route route2 = new Route("route2"); route2.addPoint(new RoutePoint(0, 149363, 172341, -941, 0, false, "")); route2.addPoint(new RoutePoint(1, 150248, 172328, -980, 5, true, "Rise my children! Bring me the servants of the god! Let them be offered to our god Bifrons!")); route2.addPoint(new RoutePoint(2, 150248, 172776, -980, 0, false, "")); // Add routes to the map routes.put("route1", route1); routes.put("route2", route2); } @Override public String onSpawn(L2Npc npc) { if (npc.getId() == WALKER_NPC_ID) { selectInitialRouteForNpc(npc); } return super.onSpawn(npc); } @Override public String onAdvEvent(String event, L2Npc npc, l2r.gameserver.model.actor.instance.L2PcInstance player) { if (event.equalsIgnoreCase("move")) { moveNpc(npc); } else if (event.equalsIgnoreCase("check_reached")) { checkIfReached(npc); } return null; } private void moveNpc(L2Npc npc) { String routeName = npcCurrentRoute.get(npc.getObjectId()); Route route = routes.get(routeName); Integer pointIndex = npcIndexes.get(npc.getObjectId()); if (route != null && pointIndex != null) { RoutePoint point = route.getPoints().get(pointIndex); if (point.isRun()) { npc.setRunning(); } else { npc.setWalking(); } if (!point.getChat().isEmpty()) { npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), point.getChat())); } npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(point.getX(), point.getY(), point.getZ())); // Log movement intention System.out.println("NPC " + npc.getObjectId() + " moving to " + point.getX() + ", " + point.getY() + ", " + point.getZ()); // Schedule a check to see if the NPC has reached its destination startQuestTimer("check_reached", 1000, npc, null); } } private void checkIfReached(L2Npc npc) { String routeName = npcCurrentRoute.get(npc.getObjectId()); Route route = routes.get(routeName); Integer pointIndex = npcIndexes.get(npc.getObjectId()); if (route != null && pointIndex != null) { RoutePoint point = route.getPoints().get(pointIndex); Location currentLocation = npc.getLocation(); Location targetLocation = new Location(point.getX(), point.getY(), point.getZ()); // Check if the NPC has reached the target location if (currentLocation.equals(targetLocation)) { // Log that the NPC has reached the target System.out.println("NPC " + npc.getObjectId() + " reached target " + targetLocation); // Schedule the next movement startQuestTimer("move", point.getDelay() * 1000, npc, null); if (!npcReverse.get(npc.getObjectId())) { pointIndex++; if (pointIndex >= route.getPoints().size()) { npcReverse.put(npc.getObjectId(), true); pointIndex = route.getPoints().size() - 1; } } else { pointIndex--; if (pointIndex < 0) { npcReverse.put(npc.getObjectId(), false); pointIndex = 0; // Choose a new route after completing the current one in both directions switchRouteForNpc(npc); return; } } npcIndexes.put(npc.getObjectId(), pointIndex); } else { // Check again after 1 second startQuestTimer("check_reached", 1000, npc, null); } } } private void selectInitialRouteForNpc(L2Npc npc) { // Randomly select either route1 or route2 String selectedRouteName = "route" + (new Random().nextInt(2) + 1); npcCurrentRoute.put(npc.getObjectId(), selectedRouteName); npcIndexes.put(npc.getObjectId(), 0); npcReverse.put(npc.getObjectId(), false); startQuestTimer("move", 5000, npc, null); // Log initial route selection System.out.println("NPC " + npc.getObjectId() + " selected initial route " + selectedRouteName); } private void switchRouteForNpc(L2Npc npc) { String currentRoute = npcCurrentRoute.get(npc.getObjectId()); String newRoute = currentRoute.equals("route1") ? "route2" : "route1"; npcCurrentRoute.put(npc.getObjectId(), newRoute); npcIndexes.put(npc.getObjectId(), 0); npcReverse.put(npc.getObjectId(), false); startQuestTimer("move", 5000, npc, null); // Log route switching System.out.println("NPC " + npc.getObjectId() + " switched to route " + newRoute); } private static class Route { private List<RoutePoint> points = new ArrayList<>(); public Route(String name) { } public void addPoint(RoutePoint point) { points.add(point); } public List<RoutePoint> getPoints() { return points; } } private static class RoutePoint { private int id; private int x, y, z, delay; private boolean run; private String chat; public RoutePoint(int id, int x, int y, int z, int delay, boolean run, String chat) { this.id = id; this.x = x; this.y = y; this.z = z; this.delay = delay; this.run = run; this.chat = chat; } public int getId() { return id; } public int getX() { return x; } public int getY() { return y; } public int getZ() { return z; } public int getDelay() { return delay; } public boolean isRun() { return run; } public String getChat() { return chat; } } } I looking for help, with this, the npc not start to move. Im trying to create, an NPC wich have multiple walk routes basic logic is  random pick a route complite the route  like Route 1 start form zero (0 -> 1 -> 2(or more) -> 1 -> 0) When the npc return to 0, the script should pic the other route and start again.  And if there is a message like point 1 here     "route1.addPoint(new RoutePoint(1, 148568, 172328, -980, 5, true, "Puff"));" The npc should display the chat message. Currently my problem is the npc not moving, but if I manage it to start moving its randomly move between the route 1 and 2 set of coordinates. Currently for me its  a nightmare. I hope anyone can help somhow.
    • We are certainly not an ambulance, but we will definitely cure you of blacklists and empty pockets. Live freely with SX! Each of you will receive a trial version of SX to familiarize yourself with the product, all you have to do is post in this thread
  • Topics

×
×
  • Create New...