Jump to content

Recommended Posts

Posted

Auto-Enchant script

 

For Gracia1-2-Final (i use version L2NET v.371) UDPATE!

 

  Quote
INCLUDE StdLib\inventory.l2c

// ===================================================================================================================

// START OF EDITING PART (YOU SHOULD CHANGE THE SETTINGS FROM BELOW TO YOUR NEEDS)

// ===================================================================================================================

DEFINE_GLOBAL STRING item_name "Striped Mithril Shirt"        // Here you need to change with what item you want to enchant

DEFINE_GLOBAL STRING normal_enchant_name "Scroll: Enchant Armor (S)"        // The exact name of your normal enchant scroll

DEFINE_GLOBAL STRING blessed_enchant_name "Blessed Scroll: Enchant Armor (S)"        // The exact name of you blessed enchant scroll(only for blessed enchants)

DEFINE_GLOBAL INT type_of_enchanting 6    // 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 16        // The top level witch enchantig should stop at (for One to Top enchanting + blessed)

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

DEFINE_GLOBAL INT min_little_delay 120        // 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 220        // 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)

// ===================================================================================================================

//  

// TEMP Auto Enchant IS temporary solution - have 7 methods of enchanting and is safe for auto kick

//                                                                   (don't cancel the enchant window when ingame)

// Fully working with L2NET v37x 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 2333

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

DEFINE_GLOBAL ARRAYLIST remove_uid 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 "== Temp Auto Enchant Script"

PRINT_TEXT "================================"

SLEEP 1000

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

CALL RemoveFromInv

PRINT_TEXT "==============================="

PRINT_TEXT "== Thanks for using Temp Auto Enchant Script =="

PRINT_TEXT "==============================="

FOREACH x Inventory full_inventory

   IF full_inventory.x.name == item_name

       PRINT_TEXT "==  <&item_name&> +<&full_inventory.x.enchant&>"

   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

   CALL RemoveFromInv

   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

               CALL Enchanting VOID 1 n_enchant_scroll.id

           ELSE

               CALL Enchanting VOID 1 b_enchant_scroll.id

               IF type_of_enchanting == #i5

               bless_start = ONE

               ENDIF

           ENDIF

           ITEM_COUNT n_scrolls_count "<&n_scroll_id&>"

           ITEM_COUNT b_scrolls_count "<&b_scroll_id&>"

           IF enchant_result > 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)"

               remove_uid.ADD "#i<&item_uid&>"

           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

   CALL RemoveFromInv

   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

               CALL Enchanting VOID 1 n_enchant_scroll.id

           ELSE

               CALL Enchanting VOID 1 b_enchant_scroll.id

           ENDIF

           ITEM_COUNT n_scrolls_count "<&n_scroll_id&>"

           ITEM_COUNT b_scrolls_count "<&b_scroll_id&>"

           IF enchant_result > 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)"

               remove_uid.ADD "#i<&item_uid&>"

               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

   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

           CALL Enchanting VOID 1 n_enchant_scroll.id

       ELSE

           CALL Enchanting VOID 1 b_enchant_scroll.id

       ENDIF

   

       ITEM_COUNT b_scrolls_count "<&b_scroll_id&>"

       ITEM_COUNT n_scrolls_count "<&n_scroll_id&>"

       

       IF enchant_result > 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 RemoveFromInv

   DEFINE ARRAYLIST temp_arr 0

   

   FOREACH igzs Inventory full_inventory

       FOREACH zedt INT remove_uid

           

           IF full_inventory.igzs.ID == remove_uid.zedt

               full_inventory.igzs.NAME = "none"

               full_inventory.igzs.ID = #i0

               full_inventory.igzs.ITEM_ID = #i0

               full_inventory.igzs.ENCHANT = #i0

           ENDIF

           

       NEXTEACH

   NEXTEACH

RETURN VOID

FUNCTION BlankFunc

SLEEP 25 //e = mc^2 nonsence

RETURN VOID

 

 

 

 

 

 

 

 

 

 

 

Posted

Auto-Augment    (this one is for figther passive pattack and focus you must change..search_for_skills.ADD #i3240 // Item Skill: Might - Passive: Increases P. Atk. when equipped

search_for_skills.ADD #i3249 // Item Skill: Focus - Passive: Increases critical attack rate when equipped.) if you want other passive/active.

 

  Quote

INCLUDE StdLib\inventory.l2c

INCLUDE StdLib/npc.l2c

 

DEFINE_GLOBAL ARRAYLIST search_for_skills 0        // DON'T CHANGE

 

//===========================================================================================

//

// Augmentation script fully automated. v2.0.1 (13.06.09)

// Fully working with L2NET v370 and on L2J Gracia Final (ct2.3) servers.

//

//

// special thanks to: slothmo and everybody working for l2net project

// made by iosc

//===========================================================================================

 

 

 

DEFINE_GLOBAL STRING item_to_aug "Sword of Miracles"        // The name of the weapon you want to augment

DEFINE_GLOBAL STRING ls_for_aug "Top-Grade Life Stone: level 80"        // The EXACT name of the Life Stone used for augment

 

//===========================================================================================

// The skill ID's that you want to get

// You can add or delete some "search_for_skills.ADD #i" lines

// The IDs of skills are after "#i"  ex: #i3250 - 3250

//===========================================================================================

search_for_skills.ADD #i3240 // Item Skill: Might - Passive: Increases P. Atk. when equipped.

search_for_skills.ADD #i3249 // Item Skill: Focus - Passive: Increases critical attack rate when equipped.

 

 

 

 

 

//===========================================================================================

// DON'T EDIT ANYTHING FROM BELOW UNLESS U KNOW WHAT U'RE DOING

//===========================================================================================

DEFINE_GLOBAL STRING l2incgem "Magic Gem"

 

DEFINE_GLOBAL INT skills_flag 0

DEFINE_GLOBAL INT add_loop 0

DEFINE_GLOBAL INT rem_loop 0

DEFINE_GLOBAL INT first_round 0

DEFINE_GLOBAL INT _50d 50

DEFINE_GLOBAL INT adena_rem_aug 0

DEFINE_GLOBAL INT adena_checked 0

DEFINE_GLOBAL STRING request_skills "50"

DEFINE_GLOBAL STRING adena "Adena"

DEFINE_GLOBAL ARRAYLIST skill_ids 0

DEFINE_GLOBAL ARRAYLIST full_invent 0   

DEFINE_GLOBAL Inventory work_item 0

DEFINE_GLOBAL Inventory work_ls 0

DEFINE_GLOBAL Inventory work_gem 0

DEFINE_GLOBAL INT num_of_gems 0

DEFINE_GLOBAL INT ls_count 0

DEFINE_GLOBAL INT gem_count 0

DEFINE_GLOBAL INT id_of_ls 0

DEFINE_GLOBAL INT id_of_gem 0

DEFINE_GLOBAL INT id_of_adena 0

DEFINE_GLOBAL INT adena_count 0

DEFINE_GLOBAL INT uid_of_incgem 0

ITEM_GET_ID id_of_ls "<&ls_for_aug&>"

ITEM_GET_ID id_of_adena "<&adena&>"

ITEM_COUNT adena_count "<&id_of_adena&>"

ITEM_COUNT ls_count "<&id_of_ls&>"

CALL reload_invent

 

CALL f_random_delay VOID 1 ZERO

DEFINE STRING itemfound_name " "

ITEM_GET_NAME itemfound_name "<&work_item.ITEM_ID&>"

DEFINE STRING lsfound_name " "

ITEM_GET_NAME lsfound_name "<&work_ls.ITEM_ID&>"

 

 

PRINT_TEXT "====================================="

PRINT_TEXT "== Auto Augment Script started."

PRINT_TEXT "== Augmenting <&itemfound_name&>"

PRINT_TEXT "== With: <&lsfound_name&> (<&ls_count&>)"

PRINT_TEXT "====================================="

 

SLEEP 3000

 

LABEL INFINITE_LOOP

 

 

CALL reload_invent

 

CALL remove_augment

 

CALL f_random_delay VOID 1 ONE

 

CALL reload_invent

 

CALL add_augment

 

CALL f_random_delay VOID 1 ONE

 

CALL equip_augmented_item

 

CALL BeforeCheck

 

LOCK C

SLEEP 50

UNLOCK C

 

JUMP_TO_LABEL INFINITE_LOOP

 

 

LABEL THE_END

 

 

PRINT_TEXT "== Please go on ltwonet.org forum"

PRINT_TEXT "== and post you experience with this script."

PRINT_TEXT "====================================="

 

END_SCRIPT

 

 

 

 

FUNCTION add_augment

 

add_loop = ZERO

 

IF work_item.aug_id > ZERO

CALL f_random_delay VOID 1 ONE

CALL reload_invent

CALL f_random_delay VOID 1 ONE

IF work_item.aug_id > ZERO

RETURN VOID

ENDIF

ENDIF

 

 

ITEM_COUNT ls_count "<&id_of_ls&>"

CALL f_random_delay VOID 1 ZERO

 

IF ls_count <= ONE

CALL reload_invent

ITEM_COUNT ls_count "<&id_of_ls&>"

CALL f_random_delay VOID 1 ONE

CALL f_random_delay VOID 1 ONE

IF ls_count <= ONE

PRINT_TEXT "====================================="

PRINT_TEXT "== Not enough <&ls_for_aug&>."

PRINT_TEXT "====================================="

JUMP_TO_LABEL THE_END

 

ENDIF

ENDIF

 

IF first_round == ONE

ITEM_COUNT gem_count "<&id_of_gem&>"

CALL f_random_delay VOID 1 ZERO

 

IF gem_count <= num_of_gems

CALL reload_invent

ITEM_COUNT gem_count "<&id_of_gem&>"

CALL f_random_delay VOID 1 ONE

CALL f_random_delay VOID 1 ONE

 

IF gem_count <= num_of_gems

DEFINE STRING gem_name " "

ITEM_GET_NAME gem_name "<&id_of_gem&>"

PRINT_TEXT "====================================="

PRINT_TEXT "== Not enough <&gem_name&>."

PRINT_TEXT "====================================="

JUMP_TO_LABEL THE_END

 

ENDIF

ENDIF

ENDIF

PRINT_TEXT "====================================="

PRINT_TEXT "== Adding Augment..."

PRINT_TEXT "====================================="

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" add_after_target_talk 25

 

CALL f_random_delay VOID 1 ONE

 

CALL use_magic_gem

 

WHILE add_loop == ZERO

SLEEP 50

WEND

LOCK A

SLEEP 50

UNLOCK A

 

 

RETURN VOID

 

 

FUNCTION add_after_target_talk

 

LOCK A

add_loop = ONE

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" selecting_html_add_augment 25

 

NPC_DIALOG "bypass -h pc_augment_chat 0"

 

RETURN VOID

 

 

FUNCTION selecting_html_add_augment

CALL f_random_delay VOID 1 ONE

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 25

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" aug_insert_item 81

NPC_DIALOG "bypass -h pc_augment_start 1"

 

 

RETURN VOID

 

 

FUNCTION aug_insert_item

 

CALL f_random_delay VOID 1 ONE

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 81

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" aug_insert_ls 83

 

DEFINE BYTEBUFFER select_item_buffer 256

select_item_buffer.write_byte #i208

select_item_buffer.write_int16 #i38

select_item_buffer.write_int32 work_item.id

select_item_buffer.trim_to_index

INJECTBB select_item_buffer

DELETE select_item_buffer

 

RETURN VOID

 

 

FUNCTION aug_insert_ls

 

CALL f_random_delay VOID 1 ONE

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 83

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" aug_read_ins_gems 84

 

DEFINE BYTEBUFFER select_ls_buffer 256

select_ls_buffer.write_byte #i208

select_ls_buffer.write_int16 #i39

select_ls_buffer.write_int32 work_item.id

select_ls_buffer.write_int32 work_ls.id

select_ls_buffer.trim_to_index

INJECTBB select_ls_buffer

DELETE select_ls_buffer

 

RETURN VOID

 

 

FUNCTION aug_read_ins_gems

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 84

 

IF first_round == ZERO

DEFINE INT firstbyte 0

PACKET.READ_BYTE firstbyte

DELETE firstbyte

 

DEFINE INT expacket 0

PACKET.READ_INT16 expacket

DELETE expacket

 

DEFINE INT itemuid

PACKET.READ_INT32 itemuid

DELETE itemuid

 

DEFINE INT lsid

PACKET.READ_INT32 lsid

DELETE lsid

 

PACKET.READ_INT32 id_of_gem

PACKET.READ_INT32 num_of_gems

 

ITEM_COUNT gem_count "<&id_of_gem&>"

 

first_round = ONE

CALL reload_invent

 

ITEM_COUNT gem_count "<&id_of_gem&>"

CALL f_random_delay VOID 1 ZERO

 

IF gem_count <= num_of_gems

CALL reload_invent

ITEM_COUNT gem_count "<&id_of_gem&>"

CALL f_random_delay VOID 1 ONE

CALL f_random_delay VOID 1 ONE

 

IF gem_count <= num_of_gems

DEFINE STRING gem_name " "

ITEM_GET_NAME gem_name "<&id_of_gem&>"

PRINT_TEXT "====================================="

PRINT_TEXT "== Not enough <&gem_name&>."

PRINT_TEXT "====================================="

JUMP_TO_LABEL THE_END

 

ENDIF

ENDIF

ENDIF

CALL f_random_delay VOID 1 ONE

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" aug_start_aug 85

 

DEFINE BYTEBUFFER select_gem_buffer 256

select_gem_buffer.write_byte #i208

select_gem_buffer.write_int16 #i40

select_gem_buffer.write_int32 work_item.id

select_gem_buffer.write_int32 work_ls.id

select_gem_buffer.write_int32 work_gem.id

select_gem_buffer.write_int64 num_of_gems

select_gem_buffer.trim_to_index

INJECTBB select_gem_buffer

DELETE select_gem_buffer

 

RETURN VOID

 

 

FUNCTION aug_start_aug

CALL f_random_delay VOID 1 ONE

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 85

 

DEFINE BYTEBUFFER start_aug_buffer 256

start_aug_buffer.write_byte #i208

start_aug_buffer.write_int16 #i65

start_aug_buffer.write_int32 work_item.id

start_aug_buffer.write_int32 work_ls.id

start_aug_buffer.write_int32 work_gem.id

start_aug_buffer.write_int64 num_of_gems

start_aug_buffer.trim_to_index

INJECTBB start_aug_buffer

DELETE start_aug_buffer

 

UNLOCK A

 

RETURN VOID

 

FUNCTION remove_augment

rem_loop = ZERO

 

IF work_item.aug_id == ZERO

CALL f_random_delay VOID 1 ONE

CALL reload_invent

CALL f_random_delay VOID 1 ONE

IF work_item.aug_id == ZERO

RETURN VOID

ENDIF

ENDIF

PRINT_TEXT "== Removing Augment..."

PRINT_TEXT "====================================="

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" rem_after_target_talk 25

 

CALL f_random_delay VOID 1 ONE

 

CALL use_magic_gem

 

WHILE rem_loop == ZERO

SLEEP 50

WEND

LOCK B

SLEEP 50

UNLOCK B

RETURN VOID

 

FUNCTION rem_after_target_talk

 

LOCK B

rem_loop = ONE

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" selecting_html_rem_augment 25

NPC_DIALOG "bypass -h pc_augment_chat 0"

 

RETURN VOID

 

 

FUNCTION selecting_html_rem_augment

CALL f_random_delay VOID 1 ONE

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 25

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" rem_aug_item 82

NPC_DIALOG "bypass -h pc_augment_start 2"

 

RETURN VOID

 

FUNCTION rem_aug_item

 

CALL f_random_delay VOID 1 ONE

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 82

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" aug_start_rem 87

 

DEFINE BYTEBUFFER select_item_buffer 256

select_item_buffer.write_byte #i208

select_item_buffer.write_int16 #i66

select_item_buffer.write_int32 work_item.id

select_item_buffer.trim_to_index

INJECTBB select_item_buffer

DELETE select_item_buffer

 

RETURN VOID

 

 

FUNCTION aug_start_rem

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKETEX&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 87

IF adena_checked == ZERO

DEFINE INT firstbyte 0

PACKET.READ_BYTE firstbyte

DELETE firstByte

 

DEFINE INT expacket 0

PACKET.READ_INT16 expacket

DELETE expacket

 

DEFINE INT notinteresting 0

PACKET.READ_INT64 notinteresting

PACKET.READ_INT64 notinteresting

DELETE notinteresting

 

PACKET.READ_INT64 adena_rem_aug

CALL reload_invent

adena_checked = ONE

ENDIF

 

ITEM_COUNT adena_count "<&id_of_adena&>"

CALL f_random_delay VOID 1 ZERO

IF adena_count <= adena_rem_aug

CALL reload_invent

CALL f_random_delay VOID 1 ONE

CALL f_random_delay VOID 1 ONE

ITEM_COUNT adena_count "<&id_of_adena&>"

IF adena_count <= adena_rem_aug

PRINT_TEXT "====================================="

PRINT_TEXT "== Not enough Adena(<&adena_count&>) to remove augment!"

PRINT_TEXT "====================================="

JUMP_TO_LABEL THE_END

ENDIF

ENDIF

 

CALL f_random_delay VOID 1 ONE

DEFINE BYTEBUFFER rem_aug_buffer 256

rem_aug_buffer.write_byte #i208

rem_aug_buffer.write_int16 #i67

rem_aug_buffer.write_int32 work_item.id

rem_aug_buffer.trim_to_index

INJECTBB rem_aug_buffer

DELETE rem_aug_buffer

 

UNLOCK B

 

RETURN VOID

 

 

FUNCTION BeforeCheck

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" CheckSkillList 95

skills_flag = ZERO

 

DO

INJECT "<&request_skills&>"

CALL f_random_delay VOID 1 ONE

LOOP skills_flag == ZERO

 

RETURN VOID

 

 

FUNCTION CheckSkillList

 

SET_EVENT "<&SCRIPTEVENT_SERVERPACKET&>" "<&SYSTEM_CURRENTFILE&>" blankfunc 95

LOCK C

skills_flag = ONE

 

DEFINE INT skill_byte 0

DEFINE INT skill_list_size 0

 

PACKET.READ_BYTE skill_byte

PACKET.READ_INT32 skill_list_size

 

FOR Z 0 "<&skill_list_size&>" 1

 

DEFINE INT _i64

PACKET.READ_INT64 _i64

DELETE _i64

 

DEFINE INT skillID

PACKET.READ_INT32 skillID

skill_ids.ADD skillID

DELETE skillID

 

DEFINE INT c_byte

PACKET.READ_BYTE c_byte

DELETE c_byte

 

NEXT

 

DELETE skill_byte

DELETE skill_list_size

 

FOREACH X INT skill_ids

FOREACH Z INT search_for_skills

 

IF skill_ids.X == search_for_skills.Z

PRINT_TEXT "====================================="

PRINT_TEXT "== Augment Script finished."

PRINT_TEXT "== Augmentation with Skill ID <&search_for_skills.Z&> was succesfull."

PRINT_TEXT "====================================="

JUMP_TO_LABEL THE_END

ENDIF

 

NEXTEACH

NEXTEACH

CALL equip_augmented_item

 

ITEM_COUNT gem_count "<&id_of_gem&>"

DEFINE STRING gem_name " "

ITEM_GET_NAME gem_name "<&id_of_gem&>"

ITEM_COUNT ls_count "<&id_of_ls&>"

 

PRINT_TEXT "====================================="

PRINT_TEXT "== No luck this round..."

PRINT_TEXT "== Items Remaining:"

PRINT_TEXT "== <&gem_count&> - <&gem_name&>"

PRINT_TEXT "== <&ls_count&> - <&ls_for_aug&> "

PRINT_TEXT "====================================="

 

CALL f_random_delay VOID 1 ZERO

 

UNLOCK C

 

RETURN VOID

 

FUNCTION f_random_delay 1 lmh

DEFINE INT rand_min 0

DEFINE INT rand_max 0

SLEEP 25

SWITCH lmh

CASE #i0

rand_min = #i150

rand_max = #i300

BREAK 1

CASE #i1

rand_min = #i400

rand_max = #i550

BREAK 1

CASE #i2

rand_min = #i2103

rand_max = #i2408

BREAK 1

DEFAULT

BREAK 1

ENDSWITCH

DEFINE INT random_delay 0

GET_RAND random_delay "<&rand_min&>" "<&rand_max&>"

SLEEP 25

SLEEP "<&random_delay&>"

 

DELETE rand_min

DELETE rand_max

DELETE random_delay

 

RETURN VOID

 

FUNCTION reload_invent

 

GET_INVENTORY full_invent

CALL f_random_delay VOID 1 ZERO

 

FOREACH item Inventory full_invent

IF full_invent.item.name == item_to_aug   

work_item = full_invent.item

ENDIF

IF first_round == ONE

IF full_invent.item.ITEM_ID == id_of_gem   

work_gem = full_invent.item

ENDIF

ENDIF

IF full_invent.item.name == ls_for_aug   

work_ls = full_invent.item

ENDIF

IF full_invent.item.name == l2incgem

uid_of_incgem = full_invent.item.id

ENDIF

NEXTEACH

 

RETURN VOID

 

FUNCTION blankfunc

SLEEP 50

RETURN VOID

 

 

FUNCTION use_magic_gem

 

DEFINE BYTEBUFFER use_magic_gem_bufer 256

 

use_magic_gem_bufer.write_byte #i25

use_magic_gem_bufer.write_int32 uid_of_incgem

use_magic_gem_bufer.write_int32 #i0

use_magic_gem_bufer.trim_to_index

INJECTBB use_magic_gem_bufer

CALL f_random_delay VOID 1 ONE

 

DELETE use_magic_gem_bufer

 

RETURN VOID

 

 

FUNCTION equip_augmented_item

 

DEFINE BYTEBUFFER equip_item 256

 

equip_item.write_byte #i25

equip_item.write_int32 work_item.id

equip_item.write_int32 #i0

equip_item.trim_to_index

INJECTBB equip_item

CALL f_random_delay VOID 1 ONE

 

DELETE equip_item

 

RETURN VOID

Posted
  On 10/14/2009 at 4:41 PM, Oloss said:

i cant try it now but i will asap.. but i dont think that u made it by urself..

no i dont make it alone i just i ''fix'' the script i change some things like the type for enchant or i put passive might or focus passive at aug script

i just change some things and i post here if some1 need scripts for l2 net.

Posted

Okay, new rule was added how to post scripts, be sure to read it. I've edited your topic already so nothing to be worry about. I won't punish in next few days if somebody posts a script without proper pre-fix, cause it's a new rule. So be sure to read it :}

Posted
  On 10/14/2009 at 9:34 PM, Lain said:

Okay, new rule was added how to post scripts, be sure to read it. I've edited your topic already so nothing to be worry about. I won't punish in next few days if somebody posts a script without proper pre-fix, cause it's a new rule. So be sure to read it :}

script working i test it allready in l2inc,i just i dont tell the version from l2net.but we are humans sometimes we can do wrong things but we can fix it too :S

  • 3 weeks later...

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

    • 🔥 L2Gold.co x15 Interlude Server 2025 – Grand Opening! 🔥 Join us today and be part of the legendary L2Gold community! 🎉 Grand Opening: 14 March 2025 🎉 ⏰ Time: 21:00 GMT +2 🌍 Server Type: EURO PTS/L2OFF 🌟 Why Play on L2Gold.co? 🌟 ✅ No Wipes – Keep Your Progress Forever! Your characters and progress are permanent. No resets! ✅ Balanced & Fun Gameplay! Experience x15 rates for a smooth and enjoyable progression. ✅ Solo or Party Play Use MP potions and NPC buffers for a great solo experience or team up with friends. ✅ Long-Term Stability Our server is built to last with no interruptions! 📊 Server Rates & Details 📊 Category Rate EXP/SP x15 (Official rate without rune or VIP) Adena x10 (Official rate without rune or VIP) Drop x10 (Official rate without rune or VIP) Spoil x10 (Official rate without rune or VIP) Raid Boss Drop x10 (Official rate without rune or VIP) 🚀 Exciting New Features! 🚀 🎟️ 💰 Weekly Lottery System! – Win rare items, in-game currency, and exclusive rewards! 🎁 More Events & Rewards! – Special in-game activities with exclusive items! 📈 Real-Time Stats! – Track your progress, achievements, and rankings live! ⚔️ New Items Weekly! – Discover rare gear and unique items every week! 🌍 A Growing Global Community 🌍 Players from Greece 🇬🇷, Brazil 🇧🇷, Spain 🇪🇸, and beyond! 🔗 Stay Connected 🔗 Follow us on social media to stay updated! 🌎 Website: L2Gold.co 🎙️ Discord: Server 📘 Facebook: Page | Group 🎥 YouTube:   Watch Videos 🎵 TikTok: Follow Us 🔥 Prepare for Battle! 🔥 📅 The adventure begins on 14 March 2025! Join L2Gold.co and Experience an Unforgettable Adventure! 🎮✨
    • y girate unos archivitos del powerclass dale..... sin encrypt
    • Hi, im looking for cardinal pvp script for auto cleanse/rez/nobles etc etc and guide on how to setup as well as what programms do i need to run such scripts as i have never used any helper or something before,
    • [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!!! 🙂
  • Topics

×
×
  • Create New...