

Racaae
Members-
Posts
212 -
Joined
-
Last visited
-
Days Won
32
Content Type
Profiles
Forums
Downloads
Jobs Available
Server Database
Third-Party Services
Top Guides
Store
Crowdfunding
Everything posted by Racaae
-
Hi. Open the file \db\import\item_db.yml and add this code at the end of the file. This is the file you add all your custom items. Then save the file and use @reloaditemdb. - Id: 11314 AegisName: Merchant_Card Name: Carta do Mercador Type: Card Buy: 20 Weight: 10 Locations: Right_Hand: true Flags: BuyingStore: true DropEffect: CLIENT Script: | skill "MC_PUSHCART",9; skill "MC_VENDING",4; Make sure the following code is in the correct file: client_folder/system/iteminfo.lua or iteminfo.lub [11314] = { unidentifiedDisplayName = "Merchant Card", unidentifiedResourceName = "À̸§¾ø´ÂÄ«µå", unidentifiedDescriptionName = { "" }, identifiedDisplayName = "Merchant Card", identifiedResourceName = "À̸§¾ø´ÂÄ«µå", identifiedDescriptionName = { "Carta do Mercador. Permite o uso ", "da habilidade Usar Carrinho em Nível 9", "e Comércio em Nível 4.", "Class: ^777777Card^000000", "Compound on: ^777777Accessory^000000", "Peso: ^7777771^000000" }, slotCount = 0, ClassNum = 0 }, No need to add accessory files. Those are for equipment only.
-
Hi morocc,144,101,5 script Anxerous 4_F_RUSGREEN,{ .@time = 20; //Duration (minutes) .@SumPrice = 200000; //Zeny amount needed .@CashPrice = 50; //CASH amount needed // "<Type>", mob ID, "<Description>", setarray .@mobs$, "^FF6600Fire", 1646, "อัศวินผู้ใช้ดาบที่ถูกไฟเผาไหม้ มี HP สูงและพลังโจมตีที่แข็งแกร่ง เขาใช้ทักษะคุณสมบัติไฟในการโจมตีศัตรูและเพิ่มพลังโจมตีของตัวเอง", "^9ACD32Wind", 1650, "นักธนูหญิงที่มีปีก 4 ข้างซึ่งใช้ธนูยิงลูกศร เธอมี AGI และ DEX สูง ทำให้การโจมตีของเธอรวดเร็วและแม่นยำ", "^4876FFWater", 1779, "ปลายักษ์ที่มี HP สูงและพลังโจมตีที่แข็งแกร่ง มันใช้ทักษะคุณสมบัติน้ำในการโจมตีศัตรูและรักษาตัวเอง มันยังมีความต้านทานน้ำสูงด้วย", "^8B5A2BEarth", 1648, "ช่างตีเหล็กที่ใช้ค้อน เขามี VIT และ DEF สูง ทำให้ทนทาน เขาใช้ทักษะคุณสมบัติดินในการโจมตีและเพิ่มพลังป้องกันของตัวเอง เขายังสร้างอุปกรณ์ได้อีกด้วย", "^5D478BShadow", 2022, "เงาที่มี AGI และ LUK สูง ใช้ทักษะคุณสมบัติเงาเพื่อโจมตีและลดค่าสถานะของศัตรู นอกจากนี้ยังซ่อนตัวและโจมตีทันทีได้อีกด้วย", "^FFC125Holy", 1649, "นักบวชหญิงที่ใช้ไม้เท้า เธอมี INT สูงและรักษาพันธมิตร เธอใช้ทักษะคุณสมบัติศักดิ์สิทธิ์เพื่อโจมตีมอนสเตอร์อันเดดและสนับสนุนพันธมิตร", "^8B1A1AUndead", 1272, "อัศวินแห่งความมืดที่มี HP สูงและพลังโจมตีที่แข็งแกร่ง เขาใช้ทักษะคุณสมบัติอันเดดเพื่อโจมตีสิ่งมีชีวิตและดูดซับ HP ของพวกมัน เขายังต้านทานการโจมตีศักดิ์สิทธิ์ได้อีกด้วย", "^9F79EEGhost", 1651, "นักเวทย์หญิงที่มี INT และ MATK สูง เธอใช้ทักษะคุณสมบัติทางจิตวิญญาณเพื่อโจมตีและลดพลังของศัตรู เธอยังสร้างภาพลวงตาและเทเลพอร์ตได้อีกด้วย", "^CD00CDPoison", 1647, "นักฆ่าที่ใช้มีดสั้นที่เคลือบพิษ เขามีค่า AGI และ LUK สูง ทำให้โจมตีได้เร็วและคริติคอล เขาใช้ทักษะคุณสมบัติพิษเพื่อสร้างสถานะผิดปกติให้กับศัตรูและหลบเลี่ยงการโจมตี เขายังสามารถซ่อนตัวและโจมตีทันทีได้อีกด้วย", "^4F4F4FNeutral", 1623, "หุ่นยนต์ที่ใช้อาวุธต่างๆ ได้ มีสถิติและทักษะที่สมดุล สามารถโจมตีและป้องกันได้อย่างมีประสิทธิภาพ นอกจากนี้ยังทำลายตัวเองเพื่อสร้างความเสียหายอย่างรุนแรงให้กับศัตรูรอบข้างได้อีกด้วย"; mes "[ ^3AA32CAnxerous^000000 ]"; mes "สวัสดี ^80FF00" + strcharinfo(0) + "^000000."; mes "ฉันคือผู้ควบคุมธาตุ ที่สามารถเรียก Guardian มาช่วยเหลือคุณได้"; next; mes "[ ^3AA32CAnxerous^000000 ]"; mes "มันจะอยู่กับคุณเป็นเวลา " + .@time + " นาที"; if (.@SumPrice && .@CashPrice) mes "ราคาคือ ^000088" + F_InsertComma(.@SumPrice) + " Zeny ^000000 หรือ ^FF0000" + F_InsertComma(.@CashPrice) + " CASH points ^000000. คุณเลือกได้เลย"; else if (.@CashPrice) mes "ราคาคือ ^000088" + F_InsertComma(.@CashPrice) + " CASH points ^000000"; else mes "ราคาคือ ^FF0000" + F_InsertComma(.@SumPrice) + " Zeny ^000000"; mes "คุณต้องการเรียก Guardian หรือไม่?"; switch(select((.@SumPrice?"^FF0000•^000000 ใช่ ฉันจะจ่ายเป็น Zeny":""), (.@CashPrice?"^FF0000•^000000 ใช่ ฉันจะจ่ายเป็น CASH":""), "^FF0000•^000000 ยกเลิก")) { case 1: .@zeny = true; break; case 2: break; case 3: goto OnCancel; } clear; mes "[ ^3AA32CAnxerous^000000 ]"; mes "คุณต้องการ Guardian ประเภทไหน?"; .@menu$ = ""; for (.@i = 0; .@i < getarraysize(.@mobs$); .@i += 3) .@menu$ += "^FF0000•^000000 " + .@mobs$[.@i] + "^000000 Property:"; .@menu$ += "^FF0000•^000000 ยกเลิก"; .@s = (select(.@menu$) - 1) * 3; if (.@s >= getarraysize(.@mobs$)) goto OnCancel; clear; mes "[ ^3AA32CAnxerous^000000 ]"; mes .@mobs$[.@s+2]; mes "คุณแน่ใจหรือไม่ว่าต้องการเรียก Guardian ประเภท " + .@mobs$[.@s] + " ^000000?"; next; if(select("^FF0000•^000000 เรียก","^FF0000•^000000 ยกเลิก") == 2) goto OnCancel; mes "[ ^3AA32CAnxerous^000000 ]"; if (.@zeny && Zeny < .@SumPrice) { mes "^FF0000คุณมี Zeny ไม่เพียงพอ ^000000"; close; } if (!.@zeny && #CASHPOINTS < .@CashPrice) { mes "^FF0000คุณมี CASH ไม่เพียงพอ ^000000"; close; } mes "เริ่มกันเลย ลองเรียกมันออกมาสิ"; close2; specialeffect EF_FLOWERCAST; sleep2 300; if (.@zeny) { if (Zeny < .@SumPrice) { mes "^FF0000คุณมี Zeny ไม่เพียงพอ... ^000000"; close; } Zeny -= .@SumPrice; } else { if (#CASHPOINTS < .@CashPrice) { mes "^FF0000คุณมี CASH ไม่เพียงพอ... ^000000"; close; } #CASHPOINTS -= .@CashPrice; } .@gid = summon("--en--", atoi(.@mobs$[.@s+1]), .@time * 60000); #summons[getarraysize(#summons)] = .@gid; deltimer strnpcinfo(0) + "::OnTeleport"; sleep2 1; addtimer 10000, strnpcinfo(0) + "::OnTeleport"; setarray .@chat$, "ข้าขอเรียกเจ้า!", "ข้าขอร้องให้ท่านมา!", "จงตอบรับการเรียกขาน!", "จงฟังคำขอร้องของข้า!", "จงออกมา!", "จงปรากฏต่อหน้าข้า!", "ข้าขอวิงวอนท่าน!", "จงช่วยข้า!", "จงให้พลังของท่านแก่ข้า!"; unittalk getcharid(3), "" + strcharinfo(0) + " : " + .@chat$[rand(getarraysize(.@chat$))], bc_self; end; OnCancel: clear; mes "[ ^3AA32CAnxerous^000000 ]"; mes "เข้าใจแล้ว ลาก่อน"; close; OnPCLoginEvent: OnTeleport: .@s = getarraysize(#summons); if (!.@s) end; getmapxy .@map$, .@x, .@y; copyarray .@summons[0], #summons[0], .@s; for( .@i = 0; .@i < .@s; .@i++ ) { if (unitexists(.@summons[.@i])) { getunitdata .@summons[.@i], .@mob; .@d = distance(.@x,.@y,.@mob[UMOB_X],.@mob[UMOB_Y]); if (mapid2name(.@mob[UMOB_MAPID]) != strcharinfo(3) || .@d > 14) unitwarp .@summons[.@i],.@map$, .@x, .@y; } else deletearray #summons[.@i], 1; } if (getarraysize(#summons)) { deltimer strnpcinfo(0) + "::OnTeleport"; sleep2 1; addtimer 10000, strnpcinfo(0) + "::OnTeleport"; } end; }
-
Run this in your database to fix the error in the image. ALTER TABLE `mob_db` ADD COLUMN `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL ; ALTER TABLE `mob_db2` ADD COLUMN `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL ; ALTER TABLE `mob_db_re` ADD COLUMN `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL ; ALTER TABLE `mob_db2_re` ADD COLUMN `racegroup_illusion_moonlight` tinyint(1) unsigned DEFAULT NULL ; Make sure your database is up to date by importing the latest files in \sql-files\upgrades.
-
Hi. You can search in your server files for how a item effect is scripted. Let's try to find Turtle General Card effect! There's 3 files for items. \db\re\item_db_usable.yml \db\re\item_db_equip.yml \db\re\item_db_etc.yml I found Turtle General Card in \db\re\item_db_etc.yml - Id: 4305 AegisName: Turtle_General_Card Name: Turtle General Card Type: Card Buy: 20 Weight: 10 Locations: Right_Hand: true Flags: BuyingStore: true DropEffect: CLIENT Script: | bonus2 bAddClass,Class_All,20; bonus3 bAutoSpell,"SM_MAGNUM",10,30; The Script part is what we are looking for. This card has 2 effects. And the Script also has 2 lines. # This item script is for the effect "ATK +20%": bonus2 bAddClass,Class_All,20; # This item script is for the effect "Add the chance of auto casting level 10 Magnum Break on enemy when doing Physical Attack.": bonus3 bAutoSpell,"SM_MAGNUM",10,30; After some search we discovered the item script for Turtle General effect card! You can check for the player BaseJob to make a extra effect for specific jobs. if (BaseJob == Job_Star_Gladiator) { # Extra effect for star gladiator and star emperor } Example: - Id: 2230000 AegisName: Turtle_General_Custom_Hat Name: Turtle General Custom Hat Type: Armor Locations: Head_Top: true ArmorLevel: 1 Refineable: true Script: | bonus2 bAddClass,Class_All,20; if (BaseJob == Job_Star_Gladiator) { bonus3 bAutoSpell,"SM_MAGNUM",10,30; }
-
Hi. rAthena does not update database sql files everytime there's new entries. You need to do it yourself. Open yaml2sql.exe in your server folder. It is used to convert yml files to sql files. Press Y to convert (and replace) the following files one by one: db/re/item_db_usable.yml db/re/item_db_equip.yml db/re/item_db_etc.yml db/re/mob_db.yml Then import the four .sql files in /sql-files to your database.
-
Hi. There's no specific class for MVP monster. MVPs are boss monsters. You can use the same bonus effect in your example. \doc\item_bonus.txt * Class (c) Class_Normal, Class_Boss, Class_Guardian, Class_All
-
Use a variable to track when the player delivers all the items. Put a if statement for said variable so that the NPC skips the whole items code and teleport the player directly. if (my_variable == 0) { mes "You don't have the variable..."; mes "You didn't do the quest!"; mes "Let's do the quest now."; my_variable = 1; close; } //Player can only get to this part if they have my_variable set. mes "You did the quest!"; mes "Go ahead."; lhz_dun03,239,78,4 script Bio Entrance 651,{ function F_Warp; if (countitem(501) > 0) goto case_1; end; case_1: //F_Warp("<map>",<x>,<y>,<item 1 ID>,<item 1 amount>{,<item 2 ID>,<item 2 amount>{...}} F_Warp("lhz_dun04",244,61,501,1,971,1,6471,1,7347,2,7345,3,6470,1); end; function F_Warp { .@map$ = getarg(0,""); .@x = getarg(1,0); .@y = getarg(2,0); if (bio_entrance_unlocked == false) { //This loop fills a array with all the needed items for(.@i = 3; .@i < getargcount(); .@i += 2) { .@items[.@i2] = getarg(.@i); .@amount[.@i2] = getarg(.@i + 1); .@i2++; } //This loop checks for each item needed for (.@i = 0; .@i < getarraysize(.@items); .@i++) { if (countitem(.@items[.@i]) < .@amount[.@i]) { if (!.@header) { mes "I don't have enough items to use this warp. I still need:"; .@header = true; } mes .@amount[.@i] + " " + mesitemlink(.@items[.@i]); .@missing = true; } } if (.@missing) return; //This loop removes each item needed for (.@i = 0; .@i < getarraysize(.@items); .@i++) delitem .@items[.@i], .@amount[.@i]; bio_entrance_unlocked = true; //warp unlocked! } warp .@map$, .@x, .@y; return; } }
-
Regarding the Chat/PUB Room, I don’t really know what its function is.
Racaae replied to Mice's question in Source Support
Try chatID. if( sd->chatID ) -
Find and edit this line. F_Warp("lhz_dun04",244,61,501,1,971,1,6471,1,7347,2,7345,3,6470,1); Each value is separated by "," (comma). The 1st value is for which map to teleport. In this case "lhz_dun04". The 2nd value is the x coordenate to warp the player in the map: 244. The 3rd value is the y coordenate to warp the player in the map: 61. The 4th value is the ID of the item requirement: 501 (Red Potion) The 5th value is the amount of the item in the previous parameter: 1 (need 1 Red Potion) The following values are for other items. This is where you put any item you want. 6th: 971 (Detrimindexta) 7th: 1 (need 1 Detrimindexta) 8th: 6471 (Goast_Chill) 9th: 1 (need 1 Goast_Chill) 10th: 7347 (Research Chart) 11th: 2 (need 2 Research Chart) Example: I want to make a warp to Geffen, the player need 15 Jellopy (item ID 909) and 84 Coals (item ID 1003). F_Warp("geffen",50,40,909,15,1003,84);
-
Make the function support more items, using arrays and loops. lhz_dun03,239,78,4 script Bio Entrance 651,{ function F_Warp; if (countitem(501) > 0) goto case_1; end; case_1: //F_Warp("<map>",<x>,<y>,<item 1 ID>,<item 1 amount>{,<item 2 ID>,<item 2 amount>{...}} F_Warp("lhz_dun04",244,61,501,1,971,1,6471,1,7347,2,7345,3,6470,1); end; function F_Warp { .@map$ = getarg(0,""); .@x = getarg(1,0); .@y = getarg(2,0); //This loop fills a array with all the needed items for(.@i = 3; .@i < getargcount(); .@i += 2) { .@items[.@i2] = getarg(.@i); .@amount[.@i2] = getarg(.@i + 1); .@i2++; } //This loop checks for each item needed for (.@i = 0; .@i < getarraysize(.@items); .@i++) { if (countitem(.@items[.@i]) < .@amount[.@i]) { if (!.@header) { mes "I don't have enough items to use this warp. I still need:"; .@header = true; } mes .@amount[.@i] + " " + mesitemlink(.@items[.@i]); .@missing = true; } } if (.@missing) return; //This loop removes each item needed for (.@i = 0; .@i < getarraysize(.@items); .@i++) delitem .@items[.@i], .@amount[.@i]; warp .@map$, .@x, .@y; return; } }
-
Hi. You can use INNER JOIN in the sql query to make the event check for your event_pick database. Example: .@sql$ = "SELECT `char`.`char_id`, `name`" + " FROM `char`" + " INNER JOIN `event_pick`" + " ON `char`.`char_id` = `event_pick`.`char_id`" + " WHERE `char`.`online` = 1" + " AND `event_pick`.`qualified` = 1" + " ORDER BY RAND()"; query_sql .@sql$, .@cid, .@name$; (Multiple lines not necessary. It's just for better readability.) byako,83,154,4 script Who's Online Event 99,{ mes "[Who's Online Event]"; if (getgroupid() < 99) { mes "Greetings! I see you're curious about our ^0000FFWho's Online Event^000000. Allow me to explain how it works."; next; mes "[Who's Online Event]"; mes "Every three hours I will select " + .winners + " random adventurers in the cities of Midgard to receive " + .prize_amt + " " + mesitemlink(.prize_id) + ". Only VIPs are eligible for the event."; close; } else { mes "Enable event?"; if (.winners_date$ != "") { mes " ", "^EE8800Winners " + .winners_date$ + "^000000"; for (.@i = 0; .@i < getarraysize(.winners_cid); .@i++) mes "- ^0000FF" + .winners_name$[.@i] + "^000000"; } if (select("Yes", "No") == 1) { mes "Event started."; donpcevent strnpcinfo(3) + "::OnStart"; } } close; OnHour00: OnHour03: OnHour06: OnHour09: OnHour12: OnHour15: OnHour18: OnHour21: OnStart: .winners_date$ = ""; deletearray .winners_cid[0]; deletearray .winners_name$[0]; .@sql$ = "SELECT `char`.`char_id`, `name`" + " FROM `char`" + " INNER JOIN `event_pick`" + " ON `char`.`char_id` = `event_pick`.`char_id`" + " WHERE `char`.`online` = 1" + " AND `event_pick`.`qualified` = 1" + " ORDER BY RAND()"; query_sql .@sql$, .@cid, .@name$; for (.@i = 0; .@i < getarraysize(.@cid); .@i++) { if (!checkvending(.@name$[.@i]) && getgroupid(.@cid[.@i]) >= 2 && inarray(.map$, strcharinfo(3,.@cid[.@i])) > -1) { setarray .winners_cid[.@i2], .@cid[.@i]; setarray .winners_name$[.@i2], .@name$[.@i]; .@i2++; if (getarraysize(.winners_cid) >= .winners) break; } } .winners_date$ = gettimestr("%Y/%m/%d %H:%M",21); if (getarraysize(.winners_cid) == 0) { announce "There were no eligible adventurers for the Exiled Lucky Pick.", bc_all, 0x00FF00; end; } .@size = getarraysize(.winners_cid); for (.@i = 0; .@i < .@size; .@i++) { .@text$ += .winners_name$[.@i]; if (.@size > 1) { if ((.@i + 2) == .@size) .@text$ += " and "; else if ((.@i + 1) < .@size) .@text$ += ", "; } getitem .prize_id, .prize_amt, convertpcinfo(.winners_cid[.@i],CPC_ACCOUNT); dispbottom "You won " + .prize_amt + " " + itemlink(.prize_id) + " in Exiled Lucky Pick!", 0x000000, .winners_cid[.@i]; } announce .@text$ + " won " + .prize_amt + " " + itemlink(.prize_id) + " in Exiled Lucky Pick!", bc_all, 0x00FF00; end; OnInit: setarray .map$, "prontera", "izlude", "payon"; .prize_id = 50043; //50043 .prize_amt = 1; .winners = 5; end; }
-
Disable this NPC in \npc\re\instances\WolfchevLaboratory.txt: // Warp portal to the 4th Fl. //============================================================ lhz_dun03,239,78,1 script lhz_dun03_lhz_dun04 WARPNPC,1,1,{ end; OnTouch: if (lght_duk01 > 0 && lght_duk01 < 6) { mes "In order to investigate human experimentation, I had to go down whilst I didn't want to because of gruesome sound."; close2; if (lght_duk01 < 3) { warp "que_lhz", 245, 56; } else if (lght_duk01 == 3) { warp "que_lhz", 96, 136; } else { warp "que_lhz", 148, 215; } } else { if (lhz_curse < 31) { mes "- Whistling sound -"; mes "From below, there comes a gruesome sound mingling with the wind."; close2; } warp "lhz_dun04", 245, 56; } end; }
-
[Error]: npc_parsesrcfile: Unknown syntax in file
Racaae replied to maciel's question in Scripting Support
Good evening, use TAB instead of SPACE in NPC headers. Also please use english in this forum section. There's a portuguese section available. PT: -
Hello. Try to understand the code. Feel free to ask about what you don't understand. //===== Script for rAthena by Racaae ========================= //= https://rathena.org/board/topic/142576-need-help-for-custom-refiner/ //===== Additional Comments: ================================= //= Modified from Euphy' Ticket Refiner //============================================================ prontera,160,160,3 script Custom Refiner 4_F_MORAFINE2,{ setarray .@list, //RefineCost, MaxRefine, RefinableEquip, 501, 10, 1001, 503, 10, 1002; disable_items; // Greetings mes "[Custom Refiner]"; mes "Hello! What's up?"; mes "I'm a refiner for specific items using specific catalysts."; mes "You don't have to worry! It's by +1 with a ^006400100% success rate^000000."; next; if(select("Which items do you refine?", "Refine") == 1) { mes "[Custom Refiner]"; mes "I can refine the following:"; for ( .@i = 0; .@i < getarraysize(.@list); .@i += 3 ) { mes "- [" + mesitemlink(.@list[.@i+2], false) + "] using"; mes "[" + mesitemlink(.@list[.@i], false) + "] up to +" + .@list[.@i+1] + "."; } if (.@i = getarraysize(.@list)) close; if (!.@i%3) { next; mes "[Custom Refiner]"; } } mes "[Custom Refiner]"; mes "Which equipment would you like to refine?"; //Use a array to store and show equips the player is using setarray .@position$[1],"Head upper","Armor","Left hand","Right hand","Robe","Shoes","Accessory 1","Accessory 2","Head middle","Head lower"; setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW; for ( .@i = 1; .@i <= 10; ++.@i ) .@menu$ += (getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : .@position$[.@i] + "- [Empty]") + ":"; //Saves which equipment the player chose .@part = .@indices[ select(.@menu$) ]; clear; if (!getequipisequiped(.@part)) { mes "[Custom Refiner]"; mes "You have to equip the item you want to refine."; close; } //Find player's equipment in the list of refinable options. for ( .@i = 2; .@i < getarraysize(.@list); .@i += 3 ) { if (getequipid(.@part) == .@list[.@i]) { .@cost = .@list[.@i-2]; .@max = .@list[.@i-1]; break; } } if (!.@cost) { mes "[Custom Refiner]"; mes "Oh, I'm sorry."; mes "This item is impossible for me to refine."; close; } .@refineitemid = getequipid(.@part); // save id of the item .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count if (countitem(.@cost) == 0) { mes "[Custom Refiner]"; mes "I need the [" + mesitemlink(.@cost, false) + "] to refine this item..."; mes "See you later!"; close; } if (getequiprefinerycnt(.@part) >= .@max) { mes "[Custom Refiner]"; mes "^8B4513This item is already refined as much as your deed.^000000"; close; } mes "[Custom Refiner]"; mes "I'm going to refine your ^006400" + getequipname(.@part) + "^8B4513 using the " + mesitemlink(.@cost) + "."; mes "May I proceed?"; next; if (select("No.", ":Yes.") == 1) close; if (countitem(.@cost) < 1) { mes "Error!"; mes "Please report this."; close; } delitem .@cost,1; // anti-hack if (F_IsEquipIDHack(.@part, .@refineitemid) || F_IsEquipRefineHack(.@part, .@refinerycnt)) { mes "[Custom Refiner]"; emotion ET_FRET; mes "Wait a second..."; mes "Do you think I'm stupid?!"; mes "You switched the item while I wasn't looking! Get out of here!"; close; } specialeffect EF_GANBANTEIN; specialeffect2 EF_PROVIDENCE; successrefitem .@part; mes "[Custom Refiner]"; mes "Alright, here it is~"; close; } Add this in \db\import\item_db.yml: (Remove the first line if your file already has Body:) Body: - Id: 1001 Refineable: false - Id: 1002 Refineable: false
-
At the end. After everything else.
-
Hi. Add this in \db\import\skill_db.yml. Then save the file and use @reloadskilldb and @reloadstatusdb or restart the server. (Remove the first line if your file already has Body:) Body: - Id: 271 Description: Asura Strike Duration1: 0 Duration2: 0
-
First we need to save in a variable which mvp was summoned. Find this line set Zeny, Zeny - .zeny[.mobze[.@m]]; And add below it: ultimo_mvp_invocado = .mobid[.@m]; Then insert it in the menu options when the player talks to NPC again. Find this line set .@m,select(.smenu$) - 1; And add above it: .@last = inarray(.mobid, ultimo_mvp_invocado); if (.@last > -1) { .@t$ = "^0000FF(Último) " + strmobinfo(1,.mobid[.@last]) + "^000000"; .@m = select(.@t$, .smenu$) - 2; if (.@m == -1) .@m = .@last; } else
-
Changing weapons and not removing the enchantment
Racaae replied to Kater's question in General Support
Hi. Add this in \db\import\status.yml. Then save and use @reloadstatusdb or restart the server. # Remove the first line if your file already has Body: Body: - Status: Encpoison Flags: RemoveOnUnequipWeapon: false - Status: Aspersio Flags: RemoveOnUnequipWeapon: false - Status: Fireweapon Flags: RemoveOnUnequipWeapon: false - Status: Waterweapon Flags: RemoveOnUnequipWeapon: false - Status: Windweapon Flags: RemoveOnUnequipWeapon: false - Status: Earthweapon Flags: RemoveOnUnequipWeapon: false - Status: Enchantarms Flags: RemoveOnUnequipWeapon: false -
Hi. Find this line: .fix_custom_sprite = true; // se o seu servidor tem sprites animados personalizados que se sobrepõem à animação da estátua repetidamente, ative isso And add this code below it: // Restrict the gain of MVP points on some specific maps. setarray $@mvp_mapas_restritos$, "prontera", "geffen", "pay_arche"; Find all OnNPCKillEvent: lines in the file and add below them: if (inarray($@mvp_mapas_restritos$, strcharinfo(3)) > -1) end;
-
Hello. Open the file \conf\import\battle_conf.txt and add: // EDP setting: (Note 3) // When switching/unequipping a right hand weapon, should EDP be removed? EDP can't be used with bare hand. // 0: Disabled (rAthena legacy and pre-renewal behavior). // 1: Enabled on pre-renewal. // 2: Enabled on renewal. // 3: 1+2 switch_remove_edp: 0 Save the file and restart your server.
-
Use TAB instead of space between the parameters. This is a tab: " " This is a space: " " Correct: bossnia_01,0,0,0,0 monster Poring 1002,70,0,0,0 bossnia_02,0,0,0,0 monster Poring 1002,70,0,0,0 bossnia_03,0,0,0,0 monster Poring 1002,70,0,0,0 bossnia_04,0,0,0,0 monster Poring 1002,70,0,0,0
-
It is possible, using a variable to track when the monster was summoned. cell_game,155,150,5 script Human King? 4_M_MINISTER,{ if ( mobcount( "this", strnpcinfo(3)+"::OnMobDead" ) ) { npctalk strnpcinfo(1) + " : Defeat the Warrior!"; end; } mes "^808080[ Human King? ]^000000"; mes "You are here, finally!"; next; switch ( select( "Tournament of Dimensions", "Return to our world") ) { case 1: for ( .@i = 0; .@i < getarraysize( .mvpid ); .@i++ ) { if (getd("TournamentD_" + .mvpid[.@i]) < gettimetick(2)) { .@mvpid_menu$ += strmobinfo(1, .mvpid[.@i]); .@ok = true; } .@mvpid_menu$ += ":"; } if (.@ok == false) { for ( .@i = 0; .@i < getarraysize( .mvpid ); .@i++ ) .@my_coldown[.@i] = getd("TournamentD_" + .mvpid[.@i]); mes "^808080[ Human King? ]^000000"; mes "You defeated all available warriors!"; mes "You can participate again when a warrior resurfaces in ^0000FF" + Time2Str(min(.@my_coldown)) + "^000000."; close; } if ( .cost_id ) { mes "^808080[ Human King? ]^000000"; if (.itemlink) mes "The cost to summon a Warrior is "+ F_InsertComma(.cost_amt) + " " + mesitemlink(.cost_id) + "."; else mes "The cost to summon a Warrior is ^0000FF"+ F_InsertComma(.cost_amt) + " " + getitemname(.cost_id) + "^000000."; next; set .@menu, select(.@mvpid_menu$) -1; mes "^808080[ Human King? ]^000000"; if (countitem(.cost_id) < .cost_amt ) { mes "You don't have the item."; close; } } else { set .@menu, select(.@mvpid_menu$) -1; mes "^808080[ Human King? ]^000000"; } mes "Please get ready."; specialeffect EF_MAP_MAGICZONE4; close2; if ( countitem(.cost_id) < .cost_amt ) end; delitem .cost_id, .cost_amt; monster "this", 0, 0, "--en--", .mvpid[.@menu], 1, strnpcinfo(3)+"::OnMobDead"; setd "TournamentD_" + .mvpid[.@menu], gettimetick(2) + .cooldown; sleep 3000; removespecialeffect EF_MAP_MAGICZONE4; end; case 2: mes "^808080[ Human King? ]^000000"; mes "Are you sure you want to leave?"; next; if ( select( "Yes", "No") == 1 ) warp .respawnmap$, .respawnx, .respawny; close; } OnMobDead: .@i = rand(.zeny_reward_min, .zeny_reward_max); Zeny += .@i; mapannounce strnpcinfo(4), strnpcinfo(1) + " : The Warrior dropped " + F_InsertComma(.@i) + "z!", 0; end; OnInit: // Config --------------------------------------------------------------------------------------- .itemlink = false; //use item link system? .cooldown = 3000; //seconds to wait to summon again (3000=1 hour) .cost_id = 909; // Item ID to summon .cost_amt = 6; // Item amount to summon .zeny_reward_min = 100000; // Minimum Zeny reward .zeny_reward_max = 999999; // Maximum Zeny reward setarray .mvpid[0], 1647,// Assassin Cross Eremes 1649,// High Priest Magaleta 1651,// High Wizard Katrinn 1646,// Lord Knight Seyren 1650,// Sniper Shecil 1648,// Whitesmith Harword 1658;// Ygnizem // Respawn point when players leave set .respawnmap$, "askald"; set .respawnx, 162; set .respawny, 237; // Config Ends ------------------------------------------------------------------------ mapannounce strnpcinfo(4), "An administrator has refreshed the server. Please re-register this room.", bc_map; mapwarp strnpcinfo(4), .respawnmap$, .respawnx, .respawny; end; }
-
Hello //===== rAthena Script ======================================= //= https://rathena.org/board/topic/142407-need-help-script-summon-monster/ //= Modified from AnnieRuru's Private MVP & Branch Room //============================================================ askald,166,237,1 script The Dimensions Tournament 110,{ set .@npc$,"^F904EA[ Human King ]^000000"; switch( select( "I would like more information", "Let's go" ) ) { case 1: mes .@npc$; mes "In a remote corner of the world of Midgard, a mysterious rift has opened, connecting our world to another dimension populated by fearsome human warriors."; next; mes .@npc$; mes "These warriors, coming from a parallel universe called ^FF7700Terra Nova^000000, have skills and powers different from those known in Midgard. "; next; mes .@npc$; mes "Their abilities often surpass those of our world's greatest heroes. An ancient prophecy says that these interdimensional warriors would be drawn to tournaments of strength and honor."; next; mes .@npc$; mes "So the king of Prontera, eager to test the bravery and skill of the adventurers of Midgard, organized a great tournament called The ^FF0000Tournament of Dimensions^000000."; next; mes .@npc$; mes "Each of these warriors has a unique strength and ability that makes them formidable. However, each victory against one of these fighters guarantees the winning hero a reward of"; next; mes .@npc$; mes "Registration for the tournament is open to all adventurers brave enough to challenge these fighters from another world."; next; mes .@npc$; mes "Rumors have it that the ultimate winner will receive not only a vast fortune in zeny, but also an artifact from Terra Nova, an item of immeasurable power capable of changing the course of Midgard's history."; close; case 2: mes .@npc$; if (.warped) { mes "I already sent a hero through the rift."; mes "We need to wait for their return so I can send someone else."; close; } mes "I'm counting on you !"; close2; warp "cell_game",150,143; .warped = true; initnpctimer; end; } end; OnTimer30000: stopnpctimer; if (getmapusers("cell_game")) initnpctimer; else .warped = false; end; } cell_game,155,150,5 script Human King? 110,{ if ( mobcount( "this", strnpcinfo(3)+"::OnMobDead" ) ) { npctalk strnpcinfo(1) + " : Defeat the Warrior!"; end; } mes "^808080[ Human King? ]^000000"; mes "You are here, finally!"; next; switch ( select( "Tournament of Dimensions", "Return to our world") ) { case 1: if ( mobcount( "this", strnpcinfo(3)+"::OnMobDead" ) ) { mes "^808080[ Human King? ]^000000"; mes "I cannot summon another MVP when there are monsters around."; close; } else if ( .cost_id ) { mes "^808080[ Human King? ]^000000"; mes "The cost to summon an Warrior is "+ F_InsertComma(.cost_amt) + " " + mesitemlink(.cost_id) + ".";; next; set .@menu, select(.mvpid_menu$) -1; mes "^808080[ Human King? ]^000000"; if (countitem(.cost_id) < .cost_amt ) { mes "You don't have the item."; close; } } else { set .@menu, select(.mvpid_menu$) -1; mes "^808080[ Human King? ]^000000"; } mes "Please get ready."; specialeffect EF_MAP_MAGICZONE4; close2; if ( countitem(.cost_id) < .cost_amt ) end; delitem .cost_id, .cost_amt; monster "this", 0, 0, "--ja--", .mvpid[.@menu], 1, strnpcinfo(3)+"::OnMobDead"; sleep 3000; removespecialeffect EF_MAP_MAGICZONE4; end; case 2: mes "^808080[ Human King? ]^000000"; mes "Are you sure you want to leave?"; next; if ( select( "Yes:No") == 1 ) warp .respawnmap$, .respawnx, .respawny; close; } OnMobDead: .@i = rand(.zeny_reward_min, .zeny_reward_max); Zeny += .@i; mapannounce strnpcinfo(4), strnpcinfo(1) + " : The Warrior dropped " + F_InsertComma(.@i) + "z!", 0; end; OnInit: // Config --------------------------------------------------------------------------------------- set .cost_id, 909; // Item ID to summon an MVP set .cost_amt, 6; // Item amount to summon an MVP .zeny_reward_min = 100000; // Minimum Zeny reward .zeny_reward_max = 999999; // Maximum Zeny reward setarray .mvpid[0], 1647,// Assassin Cross Eremes 1649,// High Priest Magaleta 1651,// High Wizard Katrinn 1646,// Lord Knight Seyren 1650,// Sniper Shecil 1648,// Whitesmith Harword 1658;// Ygnizem // Respawn point when players leave set .respawnmap$, "askald"; set .respawnx, 162; set .respawny, 237; // Config Ends ------------------------------------------------------------------------ .@size = getarraysize( .mvpid ); for ( .@i = 0; .@i < .@size; .@i++ ) .mvpid_menu$ = .mvpid_menu$ + getmonsterinfo( .mvpid[.@i], MOB_NAME ) +":"; mapannounce strnpcinfo(4), "An administrator has refreshed the server. Please re-register this room.", bc_map; mapwarp strnpcinfo(4), .respawnmap$, .respawnx, .respawny; end; }
-
Hi. Remove the ; (semicolon) from these lines. Permanent monster spawns don't need semicolon. bossnia_01,0,0,0,0 monster Poring 1002,70,0,0,0; bossnia_02,0,0,0,0 monster Poring 1002,70,0,0,0; bossnia_03,0,0,0,0 monster Poring 1002,70,0,0,0; bossnia_04,0,0,0,0 monster Poring 1002,70,0,0,0;
-
question about transfer enchant npc (random option)
Racaae replied to deborah's question in Script Requests
Hi. It is possible. Here's a example for you. //===== Script for rAthena by Racaae ========================= //= https://rathena.org/board/topic/142357-question-about-transfer-enchant-npc-random-option/ //===== Additional Comments: ================================= //= Modified from Sader1992' enchant npc //============================================================ prontera,165,215,5 script Costume Enchant Transfer 4_BULL,{ disable_items; mes "[Costume Enchant Transferer]"; mes "Hello!"; mes "Do you want to transfer enchantment from your equipped costume to another item?"; if (.ZenyCost) mes "This will cost ^0000FF" + F_InsertComma(.ZenyCost) + "z^000000 only!"; next; if (select("Random Option Transfer", "Enchant Socket Transfer") == 1) .@mode = true; for(.@i = 0; .@i < getarraysize(.s_all$); .@i++) { if (getequipid(.s_all_loc[.@i])>-1) set .@armor_menu$, .@armor_menu$ + .s_all$[.@i] + " - [ ^E81B02" + getitemname(getequipid(.s_all_loc[.@i])) + "^000000 ]:"; else set .@armor_menu$, .@armor_menu$ + .s_all$[.@i] + " - [ ^D6C4E8" + "No Equip" + "^000000 ]:"; } .@input_loc = select(.@armor_menu$) -1; mes "[Costume Enchant Transferer]"; if (getequipid(.s_all_loc[.@input_loc]) < 0){ mes "You don't have item equipped there."; close; } .@item = getequipid(.s_all_loc[.@input_loc]); .@refine = getequiprefinerycnt(.s_all_loc[.@input_loc]); .@card0 = getequipcardid(.s_all_loc[.@input_loc],0); .@card1 = getequipcardid(.s_all_loc[.@input_loc],1); .@card2 = getequipcardid(.s_all_loc[.@input_loc],2); .@card3 = getequipcardid(.s_all_loc[.@input_loc],3); for(.@i=0; .@i < (MAX_ITEM_RDM_OPT); .@i++) { .@r_id[.@i] = getequiprandomoption(.s_all_loc[.@input_loc],.@i,ROA_ID); .@r_v[.@i] = getequiprandomoption(.s_all_loc[.@input_loc],.@i,ROA_VALUE); .@r_p[.@i] = getequiprandomoption(.s_all_loc[.@input_loc],.@i,ROA_PARAM); } if (.@mode) { if (getarraysize(.@r_id) == 0) { mes "This costume has no Random Options..."; close; } } else if (!.@card0 && !.@card1 && !.@card2 && !.@card3) { mes "This costume has no enchants..."; close; } mes "Which enchantment to transfer?"; if (.@mode) { for(.@i=0; .@i < 5; .@i++) { if (.@r_id[.@i]) .@slot_menu$ += F_RDMOPT_Name(.@r_id[.@i],.@r_v[.@i]); .@slot_menu$ += ":"; } .@input_slot = select(.@slot_menu$) -1; } else { for(.@i=0; .@i < 4; .@i++) { if (getequipcardid(.s_all_loc[.@input_loc], .@i)) .@slot_menu$ += "[ ^E81B02" + getitemname(getequipcardid(.s_all_loc[.@input_loc],.@i)) + "^000000 ]:"; else .@slot_menu$ += ":"; } .@input_slot = select(.@slot_menu$) -1; } set .@item, getequipid(.s_all_loc[.@input_loc]); clear; mes "[Costume Enchant Transferer]"; mes "To what costume in your inventory you want to transfer?"; next; .@armor_menu$ = ""; for(.@i=0; .@i < getarraysize(.s_all$); .@i++) .@armor_menu$ += .s_all$[.@i] + ":"; .@output_type = select(.@armor_menu$) -1; getinventorylist; for(.@i = 0; .@i < @inventorylist_count; .@i++) { .@item_type = getiteminfo(@inventorylist_id[.@i], ITEMINFO_LOCATIONS); .@item_id = @inventorylist_id[.@i]; if (.@item_type & .s_all_loc2[.@output_type] && !@inventorylist_equip[.@i]) { .@item_ref = getarraysize(.@equipment_id_list); if (countinarray(.@equipment_id_list, .@item_id)) continue; .@equipment_id_list[.@item_ref] = @inventorylist_id[.@i]; .@menu_labels$[.@item_ref] = getitemname(@inventorylist_id[.@i]); } } if (!getarraysize(.@equipment_id_list[0])) { mes "[Costume Enchant Transferer]"; mes "There are no items of this category in your inventory."; close; } .@index = select(implode(.@menu_labels$, ":")) - 1; .@output_id = .@equipment_id_list[.@index]; mes "[Costume Enchant Transferer]"; mes "You selected " + getitemname(.@output_id) + "."; if (countitem(.@output_id) > 1) { mes "You have more than one of this item."; close; } getinventorylist; .@i2 = inarray(@inventorylist_id, .@output_id); .@output_refine = @inventorylist_refine[.@i2]; .@output_card0 = @inventorylist_card1[.@i2]; .@output_card1 = @inventorylist_card2[.@i2]; .@output_card2 = @inventorylist_card3[.@i2]; .@output_card3 = @inventorylist_card4[.@i2]; for(.@i = 0; .@i < (MAX_ITEM_RDM_OPT); .@i++) { .@output_r_id[.@i] = getd("@inventorylist_option_id" + (.@i + 1) + "[" + .@i2 + "]"); .@output_r_v[.@i] = getd("@inventorylist_option_value" + (.@i + 1) + "[" + .@i2 + "]"); .@output_r_p[.@i] = getd("@inventorylist_option_parameter" + (.@i + 1) + "[" + .@i2 + "]"); } if (.@mode) { for(.@i = 0; .@i < MAX_ITEM_RDM_OPT; .@i++) { if (.@output_r_id[.@i] == 0) { .@output_slot = .@i; .@ok = true; break; } } if (!.@ok) { mes "You already have full Random Options in this item."; close; } } else { mes "Transfer to which slot?"; .@slot_menu$ = ""; for(.@i = 0; .@i < 4; .@i++) { if (getd(".@output_card" + .@i)) .@slot_menu$ += "[^E81B02" + getitemname(getd(".@output_card" + .@i)) + "^000000 ]:"; else .@slot_menu$ += "[^D6C4E8" + "Empty" + "^000000 ]:"; } .@output_slot = select(.@slot_menu$) -1; if (!.Overwrite) { if(getd(".@output_card" + .@output_slot)) { mes "You already have enchant in this slot."; close; } } } clear; mes "[Costume Enchant Transferer]"; if (.@mode) mes "Transfer: ^FF7700" + F_RDMOPT_Name(.@r_id[.@input_slot],.@r_v[.@input_slot]) + "^000000"; else mes "Transfer: " + mesitemlink(getequipcardid(.s_all_loc[.@input_loc], .@input_slot)); mes "^FF0000From: " + getitemname(getequipid(.s_all_loc[.@input_loc])) + "^000000"; mes "^0000FFTo: " + getitemname(.@output_id) + "^000000"; mes "Are you sure?"; next; if(select("Cancel.", "Confirm") == 1) close; mes "[Costume Enchant Transferer]"; if (.ZenyCost && Zeny < .ZenyCost) { mes "Sorry, but you don't have enough zeny."; close; } mes "Stay put while the process is ongoing."; close2; specialeffect2 EF_MAPPILLAR; progressbar "ffff00", .progress_time; // anti-hack if (callfunc("F_IsEquipIDHack", .s_all_loc[.@input_loc], .@item) || callfunc("F_IsEquipCardHack", .s_all_loc[.@input_loc], .@card0, .@card1, .@card2, .@card3) || callfunc("F_IsEquipRefineHack", .s_all_loc[.@input_loc], .@refine) || countitem(.@output_id) != 1) { mes "[Costume Enchant Transferer]"; mes "You switched the item while I wasn't looking! Get out of here!"; close; } if (.ZenyCost && Zeny < .ZenyCost) { mes "Sorry, but you don't have enough zeny."; close; } Zeny -= .ZenyCost; if (.@mode) { .@output_r_id[.@output_slot] = .@r_id[.@input_slot]; .@output_r_v[.@output_slot] = .@r_v[.@input_slot]; .@output_r_p[.@output_slot] = .@r_p[.@input_slot]; deletearray .@r_id[.@input_slot], 1; deletearray .@r_v[.@input_slot], 1; deletearray .@r_p[.@input_slot], 1; } else { setd(".@output_card" + .@output_slot, getd(".@card" + .@input_slot)); setd(".@card" + .@input_slot, 0); } delequip .s_all_loc[.@input_loc]; delitem .@output_id, 1; getitem3 .@item, 1, 1, .@input_refine, 0, .@card0, .@card1, .@card2, .@card3,.@r_id,.@r_v,.@r_p; getitem3 .@output_id, 1, 1, .@output_refine, 0, .@output_card0, .@output_card1, .@output_card2, .@output_card3,.@output_r_id,.@output_r_v,.@output_r_p; equip .@item; npctalk "Enchant Transfer successful!", strnpcinfo(0), bc_self; end; OnInit: //--------------------------------------------------------------// //-------------------- configuration -----------------------// //--------------------------------------------------------------// //--------------------------------------------------------------// //if you want to remove one from the menu you need to remove it down too!! /or add //--------------------------------------------------------------// setarray .s_all$,"Upper","Middle","Lower","Garment"; setarray .s_all_loc,EQI_COSTUME_HEAD_TOP,EQI_COSTUME_HEAD_MID,EQI_COSTUME_HEAD_LOW,EQI_COSTUME_GARMENT; setarray .s_all_loc2,EQP_COSTUME_HEAD_TOP,EQp_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT; //--------------------------------------------------------------// //other configuration //--------------------------------------------------------------// .ZenyCost = 1000000; //if you don't want zeny requirment set it to 0 .Overwrite = true; //if true then you can overwrite the enchant .progress_time = 4; //the time that needed to wait until the socket end end; } You need to use this function to display random options in the NPC. ////////////////////////////////////////////////////////////////////////////////// // Returns Random Option name and value // -- callfunc "F_RDMOPT_Name",<ROA_ID>{,<Value>{,<2nd value>}}; ////////////////////////////////////////////////////////////////////////////////// function script F_RDMOPT_Name { if (getargcount() > 2) .@s$ = getarg(1) + "~" + getarg(2); else if (getargcount() > 1) .@s$ = getarg(1); else .@s$ = "?"; if (#langtype = 8) { //POR switch(getarg(0)){ case 3: return "FOR +" + .@s$; case 6: return "INT +" + .@s$; case 7: return "DES +" + .@s$; case 8: return "SOR +" + .@s$; case 232: return "EXP ganha de Amorfos +" + .@s$ + "%"; case 233: return "EXP ganha de Morto-Vivos +" + .@s$ + "%"; case 234: return "EXP ganha de Brutos +" + .@s$ + "%"; case 235: return "EXP ganha de Plantas +" + .@s$ + "%"; case 236: return "EXP ganha de Insetos +" + .@s$ + "%"; case 237: return "EXP ganha de Peixes +" + .@s$ + "%"; case 238: return "EXP ganha de Demônios +" + .@s$ + "%"; case 239: return "EXP ganha de Humanoides +" + .@s$ + "%"; case 240: return "EXP ganha de Anjos +" + .@s$ + "%"; case 241: return "EXP ganha de Dragões +" + .@s$ + "%"; case 242: return "EXP ganha de todas raças +" + .@s$ + "%"; } } switch(getarg(0)){ case 1: return "MaxHP +" + .@s$; case 2: return "MaxSP +" + .@s$; case 3: return "STR +" + .@s$; case 4: return "AGI +" + .@s$; case 5: return "VIT +" + .@s$; case 6: return "INT +" + .@s$; case 7: return "DEX +" + .@s$; case 8: return "LUK +" + .@s$; case 9: return "MaxHP +" + .@s$ + "%"; case 10: return "MaxSP +" + .@s$ + "%"; case 11: return "HP regen +" + .@s$ + "%"; case 12: return "SP regen +" + .@s$ + "%"; case 13: return "ATK +" + .@s$ + "%"; case 14: return "MATK +" + .@s$ + "%"; case 15: return "ASPD +" + .@s$; case 16: return "Delay after attack -" + .@s$ + "%"; case 17: return "ATK +" + .@s$; case 18: return "HIT +" + .@s$; case 19: return "MATK +" + .@s$; case 20: return "DEF +" + .@s$; case 21: return "MDEF +" + .@s$; case 22: return "FLEE +" + .@s$; case 23: return "Perfect dodge +" + .@s$; case 24: return "CRIT +" + .@s$; case 25: return "Neutral elemental resistance +" + .@s$ + "%"; case 26: return "Water elemental resistance +" + .@s$ + "%"; case 27: return "Earth elemental resistance +" + .@s$ + "%"; case 28: return "Fire elemental resistance +" + .@s$ + "%"; case 29: return "Wind elemental resistance +" + .@s$ + "%"; case 30: return "Poison elemental resistance +" + .@s$ + "%"; case 31: return "Holy elemental resistance +" + .@s$ + "%"; case 32: return "Shadow elemental resistance +" + .@s$ + "%"; case 33: return "Ghost elemental resistance +" + .@s$ + "%"; case 34: return "Undead elemental resistance +" + .@s$ + "%"; case 35: return "All elemental (except Neutral) resistance +" + .@s$ + "%"; case 36: return "Neutral monster resistance +" + .@s$ + "%"; case 37: return "ATK +" + .@s$ + "% against Neutral monster"; case 38: return "Water monster resistance +" + .@s$ + "%"; case 39: return "ATK +" + .@s$ + "% against Water monster"; case 40: return "Earth monster resistance +" + .@s$ + "%"; case 41: return "ATK +" + .@s$ + "% against Earth monster"; case 42: return "Fire monster resistance +" + .@s$ + "%"; case 43: return "ATK +" + .@s$ + "% against Fire monster"; case 44: return "Wind monster resistance +" + .@s$ + "%"; case 45: return "ATK +" + .@s$ + "% against Wind monster"; case 46: return "Poison monster resistance +" + .@s$ + "%"; case 47: return "ATK +" + .@s$ + "% against Poison monster"; case 48: return "Holy monster resistance +" + .@s$ + "%"; case 49: return "ATK +" + .@s$ + "% against Holy monster"; case 50: return "Shadow monster resistance +" + .@s$ + "%"; case 51: return "ATK +" + .@s$ + "% against Shadow monster"; case 52: return "Ghost monster resistance +" + .@s$ + "%"; case 53: return "ATK +" + .@s$ + "% against Ghost monster"; case 54: return "Undead monster resistance +" + .@s$ + "%"; case 55: return "ATK +" + .@s$ + "% against Undead monster"; case 56: return "Neutral monster magic resistance +" + .@s$ + "%"; case 57: return "MATK +" + .@s$ + "% against Neutral monster"; case 58: return "Water monster magic resistance +" + .@s$ + "%"; case 59: return "MATK +" + .@s$ + "% against Water monster"; case 60: return "Earth monster magic resistance +" + .@s$ + "%"; case 61: return "MATK +" + .@s$ + "% against Earth monster"; case 62: return "Fire monster magic resistance +" + .@s$ + "%"; case 63: return "MATK +" + .@s$ + "% against Fire monster"; case 64: return "Wind monster magic resistance +" + .@s$ + "%"; case 65: return "MATK +" + .@s$ + "% against Wind monster"; case 66: return "Poison monster magic resistance +" + .@s$ + "%"; case 67: return "MATK +" + .@s$ + "% against Poison monster"; case 68: return "Holy monster magic resistance +" + .@s$ + "%"; case 69: return "MATK +" + .@s$ + "% against Holy monster"; case 70: return "Shadow monster magic resistance +" + .@s$ + "%"; case 71: return "MATK +" + .@s$ + "% against Shadow monster"; case 72: return "Ghost monster magic resistance +" + .@s$ + "%"; case 73: return "MATK +" + .@s$ + "% against Ghost monster"; case 74: return "Undead monster magic resistance +" + .@s$ + "%"; case 75: return "MATK +" + .@s$ + "% against Undead monster"; case 76: return "Armor element Neutral"; case 77: return "Armor element Water"; case 78: return "Armor element Earth"; case 79: return "Armor element Fire"; case 80: return "Armor element Wind"; case 81: return "Armor element Poison"; case 82: return "Armor element Holy"; case 83: return "Armor element Shadow"; case 84: return "Armor element Ghost"; case 85: return "Armor element Undead"; case 87: return "Formless monster resistance +" + .@s$ + "%"; case 88: return "Undead monster resistance +" + .@s$ + "%"; case 89: return "Brute monster resistance +" + .@s$ + "%"; case 90: return "Plant monster resistance +" + .@s$ + "%"; case 91: return "Insect monster resistance +" + .@s$ + "%"; case 92: return "Fish monster resistance +" + .@s$ + "%"; case 93: return "Demon monster resistance +" + .@s$ + "%"; case 94: return "Demihuman monster resistance +" + .@s$ + "%"; case 95: return "Angel monster resistance +" + .@s$ + "%"; case 96: return "Dragon monster resistance +" + .@s$ + "%"; case 97: return "ATK +" + .@s$ + "% against Formless monster"; case 98: return "ATK +" + .@s$ + "% against Undead monster"; case 99: return "ATK +" + .@s$ + "% against Brute monster"; case 100: return "ATK +" + .@s$ + "% against Plant monster"; case 101: return "ATK +" + .@s$ + "% against Insect monster"; case 102: return "ATK +" + .@s$ + "% against Fish monster"; case 103: return "ATK +" + .@s$ + "% against Demon monster"; case 104: return "ATK +" + .@s$ + "% against Demihuman monster"; case 105: return "ATK +" + .@s$ + "% against Angel monster"; case 106: return "ATK +" + .@s$ + "% against Dragon monster"; case 107: return "MATK +" + .@s$ + "% against Formless monster"; case 108: return "MATK +" + .@s$ + "% against Undead monster"; case 109: return "MATK +" + .@s$ + "% against Brute monster"; case 110: return "MATK +" + .@s$ + "% against Plant monster"; case 111: return "MATK +" + .@s$ + "% against Insect monster"; case 112: return "MATK +" + .@s$ + "% against Fish monster"; case 113: return "MATK +" + .@s$ + "% against Devil monster"; case 114: return "MATK +" + .@s$ + "% against Demihuman monster"; case 115: return "MATK +" + .@s$ + "% against Angel monster"; case 116: return "MATK +" + .@s$ + "% against Dragon monster"; case 117: return "CRIT +" + .@s$ + " against Formless monster"; case 118: return "CRIT +" + .@s$ + " against Undead monster"; case 119: return "CRIT +" + .@s$ + " against Brute monster"; case 120: return "CRIT +" + .@s$ + " against Plant monster"; case 121: return "CRIT +" + .@s$ + " against Insect monster"; case 122: return "CRIT +" + .@s$ + " against Fish monster"; case 123: return "CRIT +" + .@s$ + " against Demon monster"; case 124: return "CRIT +" + .@s$ + " against Demihuman monster"; case 125: return "CRIT +" + .@s$ + " against Angel monster"; case 126: return "CRIT +" + .@s$ + " against Dragon monster"; case 127: return "Pierces " + .@s$ + "% DEF of Formless monster"; case 128: return "Pierces " + .@s$ + "% DEF of Undead monster"; case 129: return "Pierces " + .@s$ + "% DEF of Brute monster"; case 130: return "Pierces " + .@s$ + "% DEF of Plant monster"; case 131: return "Pierces " + .@s$ + "% DEF of Insect monster"; case 132: return "Pierces " + .@s$ + "% DEF of Fish monster"; case 133: return "Pierces " + .@s$ + "% DEF of Demon monster"; case 134: return "Pierces " + .@s$ + "% DEF of Demihuman monster"; case 135: return "Pierces " + .@s$ + "% DEF of Angel monster"; case 136: return "Pierces " + .@s$ + "% DEF of Dragon monster"; case 137: return "Pierces " + .@s$ + "% MDEF of Formless monster"; case 138: return "Pierces " + .@s$ + "% MDEF of Undead monster"; case 139: return "Pierces " + .@s$ + "% MDEF of Brute monster"; case 140: return "Pierces " + .@s$ + "% MDEF of Plant monster"; case 141: return "Pierces " + .@s$ + "% MDEF of Insect monster"; case 142: return "Pierces " + .@s$ + "% MDEF of Fish monster"; case 143: return "Pierces " + .@s$ + "% MDEF of Demon monster"; case 144: return "Pierces " + .@s$ + "% MDEF of Demihuman monster"; case 145: return "Pierces " + .@s$ + "% MDEF of Angel monster"; case 146: return "Pierces " + .@s$ + "% MDEF of Dragon monster"; case 147: return "ATK +" + .@s$ + "% against Normal monster"; case 148: return "ATK +" + .@s$ + "% against Boss monster"; case 149: return "Normal monster resistance +" + .@s$ + "%"; case 150: return "Boss monster resistance +" + .@s$ + "%"; case 151: return "MATK +" + .@s$ + "% against Normal monster"; case 152: return "MATK +" + .@s$ + "% against Boss monster"; case 153: return "Pierces " + .@s$ + "% DEF of Normal monster"; case 154: return "Pierces " + .@s$ + "% DEF of Boss monster"; case 155: return "Pierces " + .@s$ + "% MDEF of Normal monster"; case 156: return "Pierces " + .@s$ + "% MDEF of Boss monster"; case 157: return "ATK +" + .@s$ + "% against Small size monster"; case 158: return "ATK +" + .@s$ + "% against Medium size monster"; case 159: return "ATK +" + .@s$ + "% against Large size monster"; case 160: return "Small monster resistance +" + .@s$ + "%"; case 161: return "Medium monster resistance +" + .@s$ + "%"; case 162: return "Large monster resistance +" + .@s$ + "%"; case 163: return "Nullify weapon's DMG size penalty"; case 164: return "Critical attack +" + .@s$ + "%"; case 165: return "Critical DMG -" + .@s$ + "%"; case 166: return "Long range physical attack +" + .@s$ + "%"; case 167: return "Long range physical DMG -" + .@s$ + "%"; case 168: return "Healing skills +" + .@s$ + "%"; case 169: return "Restoration gained from Healing skills +" + .@s$ + "%"; case 170: return "Variable cast time -" + .@s$ + "%"; case 171: return "After cast delay -" + .@s$ + "%"; case 172: return "Reduces SP cost by " + .@s$ + "%"; case 175: return "Weapon element Neutral"; case 176: return "Weapon element Water"; case 177: return "Weapon element Earth"; case 178: return "Weapon element Fire"; case 179: return "Weapon element Wind"; case 180: return "Weapon element Poison"; case 181: return "Weapon element Holy"; case 182: return "Weapon element Shadow"; case 183: return "Weapon element Ghost"; case 184: return "Weapon element Undead"; case 185: return "Indestructible in battle"; case 186: return "Indestructible in battle"; case 187: return "MATK against Small size monster +" + .@s$ + "%"; case 188: return "MATK against Medium size monster +" + .@s$ + "%"; case 189: return "MATK against Large size monster +" + .@s$ + "%"; case 190: return "Small monster magic resistance +" + .@s$ + "%"; case 191: return "Medium monster magic resistance +" + .@s$ + "%"; case 192: return "Large monster magic resistance +" + .@s$ + "%"; case 193: return "Elemental attacks resistance +" + .@s$ + "%"; case 194: return "Formless monster resistance +" + .@s$ + "%"; case 195: return "Undead monster resistance +" + .@s$ + "%"; case 196: return "Brute monster resistance +" + .@s$ + "%"; case 197: return "Plant monster resistance +" + .@s$ + "%"; case 198: return "Insect monster resistance +" + .@s$ + "%"; case 199: return "Fish monster resistance +" + .@s$ + "%"; case 200: return "Demon monster resistance +" + .@s$ + "%"; case 201: return "Demihuman monster resistance +" + .@s$ + "%"; case 202: return "Angel monster resistance +" + .@s$ + "%"; case 203: return "Dragon monster resistance +" + .@s$ + "%"; case 206: return "Demi-Human players resistance + " + .@s$ + "%"; case 207: return "Doram players resistance +" + .@s$ + "%"; case 208: return "ATK against Demi-Human players +" + .@s$ + "%"; case 209: return "ATK against Doram players +" + .@s$ + "%"; case 210: return "MATK against Demi-Human players +" + .@s$ + "%"; case 211: return "MATK against Doram players +" + .@s$ + "%"; case 212: return "Critical +" + .@s$ + " for Demi-Human players"; case 213: return "Critical +" + .@s$ + " for Doram players"; case 214: return "Pierces " + .@s$ + "% DEF of Demi-Human players"; case 215: return "Pierces " + .@s$ + "% DEF of Doram players"; case 216: return "Pierces " + .@s$ + "% MDEF of Demi-Human players"; case 217: return "Pierces " + .@s$ + "% MDEF of Doram players"; case 218: return "Received reflected DMG -" + .@s$ + "%"; case 219: return "Melee physical DMG +" + .@s$ + "%"; case 220: return "Melee physical DMG -" + .@s$ + "%"; case 221: return "Neutral elemental magic skill DMG +" + .@s$ + "%"; case 222: return "Water elemental magic skill DMG +" + .@s$ + "%"; case 223: return "Earth elemental magic skill DMG +" + .@s$ + "%"; case 224: return "Fire elemental magic skill DMG +" + .@s$ + "%"; case 225: return "Wind elemental magic skill DMG +" + .@s$ + "%"; case 226: return "Poison elemental magic skill DMG +" + .@s$ + "%"; case 227: return "Holy elemental magic skill DMG +" + .@s$ + "%"; case 228: return "Shadow elemental magic skill DMG +" + .@s$ + "%"; case 229: return "Ghost elemental magic skill DMG +" + .@s$ + "%"; case 230: return "Undead elemental magic skill DMG +" + .@s$ + "%"; case 231: return "All elemental magic skill DMG +" + .@s$ + "%"; case 232: return "EXP gained from Formless race +" + .@s$ + "%"; case 233: return "EXP gained from Undead race +" + .@s$ + "%"; case 234: return "EXP gained from Brute race +" + .@s$ + "%"; case 235: return "EXP gained from Plant race +" + .@s$ + "%"; case 236: return "EXP gained from Insect race +" + .@s$ + "%"; case 237: return "EXP gained from Fish race +" + .@s$ + "%"; case 238: return "EXP gained from Demon race +" + .@s$ + "%"; case 239: return "EXP gained from Demi-Human race +" + .@s$ + "%"; case 240: return "EXP gained from Angel race +" + .@s$ + "%"; case 241: return "EXP gained from Dragon race +" + .@s$ + "%"; case 242: return "EXP gained from all races +" + .@s$ + "%"; case 243: return "POW + " + .@s$; case 244: return "SPL + " + .@s$; case 245: return "STA + " + .@s$; case 246: return "WIS + " + .@s$; case 247: return "CON + " + .@s$; case 248: return "CRT + " + .@s$; case 249: return "P.ATK + " + .@s$; case 250: return "S.MATK + " + .@s$; case 251: return "RES + " + .@s$; case 252: return "MRES + " + .@s$; case 253: return "H.PLUS + " + .@s$; case 254: return "C.RATE + " + .@s$; default: return "Unknow Random Option"; } }