Jump to content

Recommended Posts

Posted

I need a little bit of help with phx..i've foud a server where this cheat works.Can sombody say to me what packets do I need to copy to overenchant my weapon ?

Posted

 

INCLUDE StdLib\inventory.l2c 
// ===================================================================================================================

// START OF EDITING PART (YOU SHOULD CHANGE THE SETTINGS FROM BELOW TO YOUR NEEDS) 
// ===================================================================================================================
DEFINE_GLOBAL STRING item_name "Homunkulus's Sword"        // Here you need to change with what item you want to enchant 
DEFINE_GLOBAL STRING normal_enchant_name "Scroll: Enchant Weapon (C)"        // The exact name of your normal enchant scroll 
DEFINE_GLOBAL STRING blessed_enchant_name "Blessed Scroll: Enchant Weapon (C)"        // The exact name of you blessed enchant scroll(only for blessed enchants) 

DEFINE_GLOBAL INT type_of_enchanting 1    // The method of enchanting you want set from 1-7 (see below): 
         // 1 - Normal enchant each One by One; 
         // 2 - Normal enchant each One to Top; 
         // 3 - Blessed enchant only one item; 
         // 4 - Blessed enchant each One to Top; 
         // 5 - Blessed enchant each One by One an keep the highest; 
         // 6 - Normal enchant each One by One and stop to Top; 
         // 7 - Blessed enchant each One by One and stop to Top; 
                                  
DEFINE_GLOBAL INT keep_items_num 1        // How meny items you want to keep when enchanting One by One (for One by One enchanting + blessed) 

DEFINE_GLOBAL INT enchant_to_top 1        // The top level witch enchantig should stop at (for One to Top enchanting + blessed) 

DEFINE_GLOBAL INT enchant_safe 3        // Safe enchant level on witch normal anchant stop and continues with blessed (for Blessed enchanting) 

DEFINE_GLOBAL INT min_little_delay 205        // min_little_delay should be always lower than max_little_delay - these two are for random delay between the values. 
DEFINE_GLOBAL INT max_little_delay 327        // max_little_delay should be always higher than main_little_delay - this two will add some delay so carefull what you set. 
// ===================================================================================================================
// END OF EDITING PART (DON'T CHANGE NOTHING FROM BELOW) 
// ===================================================================================================================
// 
// AIO Auto Enchant v1.2 - have 7 methods of enchanting and is safe for auto kick 
//                                                                   (don't cancel the enchant window when ingame) 
// Fully working with L2NET v370 and on L2J Gracia Final (ct2.3) servers. 
// 
// special thanks to: slothmo, mpj123, rocket666, easy2k4, trixy and everybody working for l2net project 
// made by iosc 
// ===================================================================================================================
// ===================================================================================================================

DEFINE_GLOBAL INT min_delay 2118 
DEFINE_GLOBAL INT max_delay 2533 
DEFINE_GLOBAL INT rand_delay 0 
DEFINE_GLOBAL INT some_loop 0 
DEFINE_GLOBAL INT item_uid 0 
DEFINE_GLOBAL INT enchant_result 9999 
DEFINE_GLOBAL INT n_scroll_id 0 
DEFINE_GLOBAL INT b_scroll_id 0 
DEFINE_GLOBAL INT n_scrolls_count 0 
DEFINE_GLOBAL INT b_scrolls_count 0 
DEFINE_GLOBAL Inventory n_enchant_scroll 0 
DEFINE_GLOBAL Inventory b_enchant_scroll 0 
DEFINE_GLOBAL ARRAYLIST full_inventory 0 

ITEM_GET_ID n_scroll_id "<normal_enchant_name>" 
ITEM_GET_ID b_scroll_id "<blessed_enchant_name>" 

GET_INVENTORY full_inventory 
PRINT_TEXT "10 seconds ========================" 
PRINT_TEXT "== AIO Auto Enchant Script v1.1" 
PRINT_TEXT "================================" 
SLEEP 1000 
//SLEEP "<little_delay>" 
ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
ITEM_COUNT b_scrolls_count "<b_scroll_id>" 

FOREACH x Inventory full_inventory 
   IF full_inventory.x.name == normal_enchant_name 
      n_enchant_scroll = full_inventory.x 
   ENDIF 
   IF full_inventory.x.name == blessed_enchant_name 
      b_enchant_scroll = full_inventory.x 
   ENDIF 
NEXTEACH 

IF n_scrolls_count == ONE 
   PRINT_TEXT "You don't have <normal_enchant_name>" 
   JUMP_TO_LABEL THE_END 
ENDIF 

SWITCH type_of_enchanting 
   CASE #i3 
   CASE #i4 
   CASE #i5 
   CASE #i7 
      IF b_scrolls_count == ONE 
         PRINT_TEXT "You don't have <blessed_enchant_name>" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      BREAK 1 
   DEFAULT 
      BREAK 1 
ENDSWITCH 

SWITCH type_of_enchanting 
   CASE #i1 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed the One by One method" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Keeping: <keep_items_num>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnebyOne 
      BREAK 1 
   CASE #i2 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed the One to Top method" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Enchant till: +<enchant_to_top>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnetoTop 
      BREAK 1 
   CASE #i3 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed Blessed Enchant one item" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Enchant till: +<enchant_to_top>" 
      PRINT_TEXT "== Safe enchant is set to: +<enchant_safe>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL BlessedEnchantOne 
      BREAK 1 
   CASE #i4 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed Blessed Enchant each One to Top" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Enchant till: +<enchant_to_top>" 
      PRINT_TEXT "== Safe enchant is set to: +<enchant_safe>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnetoTop 
      BREAK 1 
   CASE #i5 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed Blessed Enchant each One by One" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Keep enchanted: <keep_items_num>" 
      PRINT_TEXT "== Safe enchant is set to: +<enchant_safe>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnebyOne 
      BREAK 1 
   CASE #i6 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed each One by One and stop to Top" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Keep - <keep_items_num> - items or stop to +<enchant_to_top>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnebyOne 
      BREAK 1 
   CASE #i7 
      PRINT_TEXT "== " 
      PRINT_TEXT "== You chosed Blessed - One by One and stop to Top" 
      PRINT_TEXT "== Enchanting: <item_name>" 
      PRINT_TEXT "== Enchant till: +<enchant_to_top>" 
      PRINT_TEXT "== " 
      PRINT_TEXT "9 seconds =========================" 
      SLEEP 9000 
      CALL EnchantEachOnebyOne 
      BREAK 1 
   DEFAULT 
      PRINT_TEXT "Bad option chosen at Type of Enchant" 
ENDSWITCH 


LABEL THE_END 
GET_RAND rand_delay "<min_little_delay>" "<max_little_delay>" 
SLEEP "<rand_delay>" 
full_inventory.clear 
GET_INVENTORY full_inventory 
GET_RAND rand_delay "<min_little_delay>" "<max_little_delay>" 
SLEEP "<rand_delay>" 

PRINT_TEXT "===============================" 
PRINT_TEXT "== Thanks for using AIO Auto Enchant Script ==" 
PRINT_TEXT "===============================" 
FOREACH x Inventory full_inventory 
   IF full_inventory.x.name == item_name 
      PRINT_TEXT "==  <item_name> +<full_inventory>" 
   ENDIF 
NEXTEACH 
PRINT_TEXT "=======================iosc======" 


END_SCRIPT 



FUNCTION EnchantEachOnebyOne 

   DEFINE ARRAYLIST current_items 0 
    
   DEFINE INT total_items 0 
   DEFINE INT enchanting_level 0 
   DEFINE INT lag_flag1 0 
   DEFINE INT lag_flag2 0 
   DEFINE INT lag_flag6 0 
   DEFINE INT bless_start 0 
   LABEL A_FLAGS 
    
   current_items.clear 
   full_inventory.clear 
   GET_INVENTORY full_inventory 
   GET_RAND rand_delay "<min_little_delay>" "<max_little_delay>" 
   SLEEP "<rand_delay>" 
    
   enchanting_level = #i65535 
   total_items = ZERO 
   ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
   ITEM_COUNT b_scrolls_count "<b_scroll_id>" 

   IF ( type_of_enchanting == #i5 ) && ( bless_start == ONE ) 
      FOREACH x Inventory full_inventory 
         IF ( full_inventory.x.name == item_name ) && ( full_inventory.x.enchant > ZERO ) 
            total_items = total_items + ONE 
            IF  full_inventory.x.enchant < enchanting_level 
               enchanting_level = full_inventory.x.enchant 
            ENDIF 
         ENDIF 
      NEXTEACH 
   ELSE 
      IF type_of_enchanting == #i6 
         FOREACH x Inventory full_inventory 
            IF full_inventory.x.name == item_name 
               total_items = total_items + ONE 
               IF (full_inventory.x.enchant < enchanting_level) && ( full_inventory.x.enchant < enchant_to_top ) 
                  enchanting_level = full_inventory.x.enchant 
               ENDIF 
            ENDIF 
         NEXTEACH 
      ELSE 
         IF type_of_enchanting == #i7 
            FOREACH x Inventory full_inventory 
               IF full_inventory.x.name == item_name 
                  IF ( full_inventory.x.enchant < enchanting_level ) && ( full_inventory.x.enchant < enchant_to_top ) 
                     enchanting_level = full_inventory.x.enchant 
                  ENDIF 
               ENDIF 
            NEXTEACH 
         ELSE 
            FOREACH x Inventory full_inventory 
               IF full_inventory.x.name == item_name 
                  total_items = total_items + ONE 
                  IF full_inventory.x.enchant < enchanting_level 
                     enchanting_level = full_inventory.x.enchant 
                  ENDIF 
               ENDIF 
            NEXTEACH 
         ENDIF 
      ENDIF 
   ENDIF 
   FOREACH x Inventory full_inventory 
      IF full_inventory.x.name == item_name 
         IF full_inventory.x.enchant == enchanting_level 
            current_items.ADD full_inventory.x.id 
         ENDIF 
      ENDIF 
   NEXTEACH 
    
   IF current_items.count == ZERO 
      lag_flag1 = lag_flag1 + ONE 
      IF lag_flag1 == #i3 
         PRINT_TEXT "No more items to echant." 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      JUMP_TO_LABEL A_FLAGS 
      lag_flag1 = ZERO 
   ENDIF 

   FOREACH y INT current_items 
      IF type_of_enchanting != #i7 
         IF total_items <= keep_items_num 
            lag_flag1 = lag_flag1 + ONE 
            IF lag_flag1 == #i3 
               PRINT_TEXT "We are done here. Your items number is <total_items>" 
               JUMP_TO_LABEL THE_END 
            ENDIF 
            JUMP_TO_LABEL A_FLAGS 
         ENDIF 
      ENDIF 
      IF n_scrolls_count == ONE 
         lag_flag2 = lag_flag2 + ONE 
         IF lag_flag2 == #i3 
            PRINT_TEXT "You are out of <normal_enchant_name>" 
            JUMP_TO_LABEL THE_END 
         ENDIF 
         JUMP_TO_LABEL A_FLAGS 
      ENDIF 
      IF ( type_of_enchanting == #i5 ) || ( type_of_enchanting == #i7 ) 
         IF b_scrolls_count == ONE 
            lag_flag6 = lag_flag6 + ONE 
            IF lag_flag6 == #i3 
               PRINT_TEXT "You are out of <blessed_enchant_name>" 
               JUMP_TO_LABEL THE_END 
            ENDIF 
            JUMP_TO_LABEL A_FLAGS 
         ENDIF 
      ENDIF 
      lag_flag1 = ZERO 
      lag_flag2 = ZERO 
      lag_flag6 = ZERO 
      
      item_uid = current_items.y 
      
      IF ( type_of_enchanting == #i5 ) || ( type_of_enchanting == #i7 ) 
    
         IF enchanting_level <enchant_safe> ZERO 
            IF type_of_enchanting == #i5 
               total_items = total_items - ONE 
            ELSE 
               JUMP_TO_LABEL A_FLAGS 
            ENDIF 
            PRINT_TEXT "Enchanting <item_name> faild at +<enchanting_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
         ELSE 
            PRINT_TEXT "Enchanting <item_name> succeeded from +<enchanting_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
         ENDIF 

      ELSE 
                
         CALL Enchanting VOID 1 n_enchant_scroll.id 
          
         ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
          
         IF enchant_result > ZERO 
            total_items = total_items - ONE 
            PRINT_TEXT "<item_name> was cristalized at +<enchanting_level>. (<n_scrolls_count> scrolls left)" 
         ELSE 
            PRINT_TEXT "Enchanting <item_name> succeeded from +<enchanting_level>. (<n_scrolls_count> scrolls left)" 
         ENDIF 
      ENDIF 
   NEXTEACH 
   JUMP_TO_LABEL A_FLAGS 

RETURN VOID 



FUNCTION EnchantEachOnetoTop 

   DEFINE INT enchant_level 0 
   DEFINE INT lag_flag3 0 
   DEFINE INT lag_flag4 0 
   DEFINE INT lag_flag5 0 
   LABEL B_FLAGS 
    
   full_inventory.clear 
   GET_INVENTORY full_inventory 
   GET_RAND rand_delay "<min_little_delay>" "<max_little_delay>" 
   SLEEP "<rand_delay>" 

   item_uid = ZERO 
   enchant_level = ZERO 
   ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
   ITEM_COUNT b_scrolls_count "<b_scroll_id>" 
    
   FOREACH x Inventory full_inventory 
      IF full_inventory.x.name == item_name 
         IF full_inventory.x.enchant < enchant_to_top 
            item_uid = full_inventory.x.id 
            enchant_level = full_inventory.x.enchant 
         ENDIF 
      ENDIF 
   NEXTEACH 
    
   IF item_uid == ZERO 
      lag_flag3 = lag_flag3 + ONE 
      IF lag_flag3 == #i3 
         PRINT_TEXT "We are done here. No more items to enchant." 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      JUMP_TO_LABEL B_FLAGS 
   ENDIF 
   IF n_scrolls_count == ONE 
      lag_flag4 = lag_flag4 + ONE 
      IF lag_flag4 == #i3 
         PRINT_TEXT "You are out of <normal_enchant_name>" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      JUMP_TO_LABEL B_FLAGS 
   ENDIF 
   IF type_of_enchanting == #i4 
      IF b_scrolls_count == ONE 
         lag_flag5 = lag_flag5 + ONE 
         IF lag_flag5 == #i3 
            PRINT_TEXT "You are out of <blessed_enchant_name>" 
            JUMP_TO_LABEL THE_END 
         ENDIF 
         JUMP_TO_LABEL B_FLAGS 
      ENDIF 
      lag_flag5 = ZERO 
   ENDIF 
   lag_flag3 = ZERO 
   lag_flag4 = ZERO 
    
    
   DO 
      IF n_scrolls_count == ONE 
         PRINT_TEXT "You are out of <normal_enchant_name>" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
    
      IF type_of_enchanting == #i4 

         IF b_scrolls_count == ONE 
            PRINT_TEXT "You are out of <blessed_enchant_name>" 
            JUMP_TO_LABEL THE_END 
         ENDIF 
      
         IF enchant_level <enchant_safe> ZERO 
            PRINT_TEXT "Enchanting <item_name> faild at +<enchant_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
            enchant_level = ZERO 
         ELSE 
            enchant_level = enchant_level + ONE 
            PRINT_TEXT "Enchanting <item_name> succeeded to +<enchant_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
         ENDIF 

      ELSE 
    
         CALL Enchanting VOID 1 n_enchant_scroll.id 
    
         ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
          
         IF enchant_result > ZERO 
            PRINT_TEXT "<item_name> was cristalized at +<enchant_level>. (<n_scrolls_count> scrolls left)" 
            JUMP_TO_LABEL B_FLAGS 
         ELSE 
            enchant_level = enchant_level + ONE 
            PRINT_TEXT "Enchanting <item_name> succeeded to +<enchant_level>. (<n_scrolls_count> scrolls left)" 
         ENDIF 
      
      ENDIF 
    
   LOOP enchant_level < enchant_to_top 
    
   JUMP_TO_LABEL B_FLAGS 

RETURN VOID 


FUNCTION BlessedEnchantOne 

   DEFINE INT enchant_level 0 
   DEFINE INT lag_flag8 0 
   LABEL C_FLAGS 
    
   full_inventory.clear 
   GET_INVENTORY full_inventory 
   GET_RAND rand_delay "<min_little_delay>" "<max_little_delay>" 
   SLEEP "<rand_delay>" 

   item_uid = ZERO 
   enchant_level = ZERO 
   ITEM_COUNT n_scrolls_count "<n_scroll_id>" 
   ITEM_COUNT b_scrolls_count "<b_scroll_id>" 
    
   FOREACH x Inventory full_inventory 
      IF full_inventory.x.name == item_name 
         IF full_inventory.x.enchant < enchant_to_top 
            item_uid = full_inventory.x.id 
            enchant_level = full_inventory.x.enchant 
         ENDIF 
      ENDIF 
   NEXTEACH 
    
   IF item_uid == ZERO 
      lag_flag8 = lag_flag8 + ONE 
      IF lag_flag8 == #i3 
         PRINT_TEXT "No item to enchant!" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      JUMP_TO_LABEL C_FLAGS 
   ENDIF 
   lag_flag8 = ZERO 
    
   DO 
    
      IF n_scrolls_count == ONE 
         PRINT_TEXT "You are out of <normal_enchant_name>" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
      IF b_scrolls_count == ONE 
         PRINT_TEXT "You are out of <blessed_enchant_name>" 
         JUMP_TO_LABEL THE_END 
      ENDIF 
    
      IF enchant_level <enchant_safe> ZERO 
         PRINT_TEXT "Enchanting <item_name> faild at +<enchant_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
         enchant_level = ZERO 
      ELSE 
         enchant_level = enchant_level + ONE 
         PRINT_TEXT "Enchanting <item_name> succeeded to +<enchant_level>. (<n_scrolls_count>/<b_scrolls_count> scrolls left)" 
      ENDIF 
    
   LOOP enchant_level < enchant_to_top 
    
   JUMP_TO_LABEL THE_END 

RETURN VOID 


FUNCTION Enchanting 1 scroll_id 

   enchant_result = #i9999 
   some_loop = ZERO 
   GET_RAND rand_delay "<&min_little_delay&>" "<&max_little_delay&>" 
   SLEEP "<&rand_delay&>" 
   SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" InsertItem 124 
   DEFINE BYTEBUFFER use_scroll_buffer 256 
   use_scroll_buffer.write_byte #i25 
   use_scroll_buffer.write_int32 scroll_id 
   use_scroll_buffer.write_int32 #i0 
   use_scroll_buffer.trim_to_index 
   INJECTBB use_scroll_buffer 
   DELETE use_scroll_buffer 
    
   WHILE some_loop == ZERO 
   SLEEP 50 
   WEND 
   LOCK A 
   SLEEP 50 
   UNLOCK A 
    
RETURN VOID 



FUNCTION InsertItem 
    
   LOCK A 
   some_loop = ONE 
    
   SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" BlankFunc 124 
   SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" ClickOK 129 
    
   GET_RAND rand_delay "<&min_little_delay&>" "<&max_little_delay&>" 
   SLEEP "<&rand_delay&>" 
    
   DEFINE BYTEBUFFER use_item_buffer 256 
   use_item_buffer.write_byte #i208 
   use_item_buffer.write_int16 #i76 
   use_item_buffer.write_int32 item_uid 
   use_item_buffer.trim_to_index 
   INJECTBB use_item_buffer 
   DELETE use_item_buffer 
    
RETURN VOID 


FUNCTION ClickOK 

   SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" BlankFunc 129 
   SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" EnchantComplete 135 

   GET_RAND rand_delay "<&min_delay&>" "<&max_delay&>" 
   SLEEP "<&rand_delay&>" 
    
   DEFINE BYTEBUFFER confirm_enchant_buffer 256 
   confirm_enchant_buffer.write_byte #i95 
   confirm_enchant_buffer.write_int32 item_uid 
   confirm_enchant_buffer.write_int32 #i0 
   confirm_enchant_buffer.trim_to_index 
   INJECTBB confirm_enchant_buffer 
   DELETE confirm_enchant_buffer 

RETURN VOID 


FUNCTION EnchantComplete 

   SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" BlankFunc 135 
    
   DEFINE INT result_byte 0 
    
   PACKET.READ_BYTE result_byte 
   PACKET.READ_INT32 enchant_result 
    
   DELETE result_byte 
    
   UNLOCK A 

RETURN VOID 


FUNCTION BlankFunc 

SLEEP 25 //e = mc^2 nonsence 

RETURN VOID

hf

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