-
Posts
926 -
Joined
-
Last visited
-
Days Won
19
Content Type
Profiles
Forums
Downloads
Jobs Available
Server Database
Third-Party Services
Top Guides
Store
Crowdfunding
Posts posted by Poring King
-
-
Make sure you hex the client of your needs. Because you will get encounter with some client side error after launching the game.exe to avoid this make sure you know what you hex during the hex process
-
5 minutes ago, PARANOiA said:
before the BETWEEN the 'lv' should be changed to 'level' to work
query_sql("SELECT ID FROM `" + .mob_db$ + "` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND (drop3_item like '%_card' OR drop4_item like '%_card' OR drop5_item like '%_card' OR drop6_item like '%_card' OR drop7_item like '%_card' OR drop8_item like '%_card' OR drop9_item like '%_card' OR drop10_item like '%_card') AND ID < 2000 AND instr('"+.Blacklist$+"',ID) = 0 AND level BETWEEN " + (BaseLevel - 20) + " AND " + (BaseLevel + 10) + " ORDER BY rand() LIMIT " + .Quests, .@mob);
And I had to modify the values from
(BaseLevel - 5) + " AND " + (BaseLevel + 10)
to:
(BaseLevel - 20) + " AND " + (BaseLevel + 10)
because in lvl 99 is giving me the same monsters always.
Thank you so much for your help @Poring King! SOLVED
My bad typo . Just up the post so other will know that this trend will mark as solve
- 1
-
23 minutes ago, PARANOiA said:
Hello @Poring King is that the only line that you changed? Im not seeing any monster, Ive tried with a lvl 99 and with lvl 1
Try this. The SQL query may not be returning any results because there are no monsters in your database that match the specified criteria.query_sql("SELECT ID FROM `" + .mob_db$ + "` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND (drop3_item like '%_card' OR drop4_item like '%_card' OR drop5_item like '%_card' OR drop6_item like '%_card' OR drop7_item like '%_card' OR drop8_item like '%_card' OR drop9_item like '%_card' OR drop10_item like '%_card') AND ID < 2000 AND instr('"+.Blacklist$+"',ID) = 0 AND lv BETWEEN " + (BaseLevel - 5) + " AND " + (BaseLevel + 10) + " ORDER BY rand() LIMIT " + .Quests, .@mob);
Seems like i didn't understand well this part
"between 5 levels down and 10 levels up" -
Try this i adjust the SQL query that selects the monsters. Specifically, you need to add a condition that restricts the monster selection based on the player's level.
//===== rAthena Script ======================================= //= Hunting Missions //===== By: ================================================== //= Euphy //===== Current Version: ===================================== //= 1.4 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= Random hunting missions. //= Rewards are based on quest difficulty. //= //= NOTE: Requires SQL mob database. //===== Additional Comments: ================================= //= 1.0 Initial script. //= 1.1 Small improvements and fixes. //= 1.2 Added party support and replaced blacklists with an //= SQL query, both thanks to AnnieRuru. //= 1.3 Re-added a blacklist adapted for the SQL query. //= 1.3a Added mission reset options. //= 1.3b Function updates. //= 1.4 Check for deleted characters, thanks to AnnieRuru. //= Syntax updates and style cleaning. //============================================================ prontera,152,187,6 script Hunting Missions 4_F_EDEN_MASTER,{ function Chk; mes "[Hunting Missions]"; mes "Hello, " + strcharinfo(0) + "!"; if (!#Mission_Delay) { next; mes "[Hunting Missions]"; mes "I can't find any records..."; mes "You must be new here!"; emotion ET_HUK; next; callsub Mission_Info; emotion ET_GO; #Mission_Delay = 1; close; } mes F_Rand("Working hard, as always...", "Not slacking, I hope..."); mes "Is there anything I can help"; mes "you with?"; mes " "; mes "^777777~ You've completed " + F_InsertPlural(Mission_Total,"mission",0,"^0055FF%d^777777 %s") + ". ~^000000"; next; switch(select( ((!Mission0) ? " ~ New Mission::" : ": ~ Mission Status: ~ Abandon Mission") + ": ~ Information: ~ Mission Shop: ~ View Top Hunters: ~ ^777777Cancel^000000" )) { case 1: mes "[Hunting Missions]"; if (#Mission_Count) { mes "You've started a mission"; mes "on another character."; if (!@hm_char_del_check) { // check for deleted character query_sql("SELECT 1 FROM `char_reg_num` WHERE `key` = 'Mission0' AND `char_id` IN(SELECT `char_id` FROM `char` WHERE `account_id` = " + getcharid(3) + ")", .@i); if (!.@i) { next; mes "[Hunting Missions]"; mes "I can't seem to find any records"; mes "for that character, though..."; mes "One moment, please."; emotion ET_SCRATCH; #Mission_Count = 0; } @hm_char_del_check = true; } close; } if (#Mission_Delay > gettimetick(2) && .Delay) { mes "I'm afraid you'll have to wait " + Time2Str(#Mission_Delay) + " before taking another mission."; close; } mes "You must hunt:"; query_sql("SELECT ID FROM `" + .mob_db$ + "` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND (drop3_item like '%_card' OR drop4_item like '%_card' OR drop5_item like '%_card' OR drop6_item like '%_card' OR drop7_item like '%_card' OR drop8_item like '%_card' OR drop9_item like '%_card' OR drop10_item like '%_card') AND ID < 2000 AND instr('"+.Blacklist$+"',ID) = 0 AND lv BETWEEN " + (BaseLevel - 5) + " AND " + (BaseLevel + 10) + " ORDER BY rand() LIMIT " + .Quests, .@mob); for (.@i = 0; .@i < .Quests; .@i++) { setd "Mission" + .@i, .@mob[.@i]; setd "Mission" + .@i +"_", 0; } #Mission_Count = rand(.Count[0], .Count[1]); callsub Mission_Status; next; mes "[Hunting Missions]"; mes "Report back when"; mes "you've finished."; mes "Good luck!"; close; case 2: mes "[Hunting Missions]"; mes "Mission status:"; callsub Mission_Status; close; case 3: mes "[Hunting Missions]"; mes "Do you really want to"; mes "abandon your mission?"; if (.Reset < 0 && .Delay) mes "Your delay time will not be reset."; else if (.Reset > 0) mes "It will cost " + F_InsertComma(.Reset) + " Zeny."; next; switch(select(" ~ Abandon...: ~ ^777777Cancel^000000")) { case 1: if (.Reset > 0) { if (Zeny < .Reset) { mes "[Hunting Missions]"; mes "You don't have enough"; mes "Zeny to drop this mission."; emotion ET_SORRY; close; } Zeny -= .Reset; emotion ET_MONEY; } mes "[Hunting Missions]"; mes "Alright, I've dropped"; mes "your current mission."; specialeffect2 EF_STORMKICK4; for (.@i = 0; .@i < .Quests; .@i++) { setd "Mission"+.@i, 0; setd "Mission"+.@i+"_", 0; } #Mission_Count = 0; if (.Reset < 0 && .Delay) #Mission_Delay = gettimetick(2) + (.Delay * 3600); close; case 2: mes "[Hunting Missions]"; mes "I knew you were kidding!"; mes "Keep up the good work."; emotion ET_SMILE; close; } case 4: callsub Mission_Info; close; case 5: mes "[Hunting Missions]"; mes "You have ^0055FF" + #Mission_Points + "^000000 Mission Points."; mes "Use them well!"; callshop "mission_shop",1; npcshopattach "mission_shop"; end; case 6: mes "[Hunting Missions]"; mes "The top hunters are:"; query_sql("SELECT char_id AS id, (SELECT `name` FROM `char` WHERE char_id = id),`value` FROM `char_reg_num` WHERE `key` = 'Mission_Total' ORDER BY CAST(`value` AS SIGNED) DESC LIMIT 5", .@id, .@name$, .@val); for (.@i = 0; .@i < 5; .@i++) mes " [Rank " + (.@i+1) + "] " + ((.@name$[.@i] == "") ? "^777777none" : "^0055FF" + .@name$[.@i]+"^000000 : ^FF0000" + .@val[.@i] + " pt.") + "^000000"; close; case 7: mes "[Hunting Missions]"; mes "Nothing? Okay..."; emotion ET_SCRATCH; close; } end; Mission_Status: @f = false; deletearray .@j[0], getarraysize(.@j); for (.@i = 0; .@i < .Quests; .@i++) { .@j[.@i] = getd("Mission" + .@i); .@j[.Quests] = .@j[.Quests] + strmobinfo(3,.@j[.@i]); .@j[.Quests+1] = .@j[.Quests+1] + (strmobinfo(6,.@j[.@i]) / (getbattleflag("base_exp_rate") / 100) * .Modifier[0]); .@j[.Quests+2] = .@j[.Quests+2] + (strmobinfo(7,.@j[.@i]) / (getbattleflag("job_exp_rate") / 100) * .Modifier[1]); mes " > "+Chk(getd("Mission"+.@i+"_"),#Mission_Count) + strmobinfo(1,.@j[.@i]) + " (" + getd("Mission"+.@i+"_") + "/" + #Mission_Count + ")^000000"; } // Reward formulas: .@Mission_Points = 3 + (.@j[.Quests] / .Quests / 6); .@Base_Exp = #Mission_Count * .@j[.Quests+1] / 5; .@Job_Exp = #Mission_Count * .@j[.Quests+2] / 5; .@Zeny = #Mission_Count * .Quests * .@j[.@i] * .Modifier[2]; next; mes "[Hunting Missions]"; mes "Mission rewards:"; mes " > Mission Points: ^0055FF" + .@Mission_Points + "^000000"; mes " > Base Experience: ^0055FF" + F_InsertComma(.@Base_Exp) + "^000000"; mes " > Job Experience: ^0055FF" + F_InsertComma(.@Job_Exp) + "^000000"; mes " > Zeny: ^0055FF" + F_InsertComma(.@Zeny) + "^000000"; if (@f) { @f = false; return; } next; mes "[Hunting Missions]"; mes "Oh, you're done!"; mes "Good work."; mes "Here's your reward."; emotion ET_BEST; specialeffect2 EF_ANGEL; specialeffect2 EF_TRUESIGHT; #Mission_Points += .@Mission_Points; BaseExp += .@Base_Exp; JobExp += .@Job_Exp; Zeny += .@Zeny; for (.@i = 0; .@i < .Quests; .@i++) { setd "Mission" + .@i, 0; setd "Mission" + .@i+"_", 0; } #Mission_Count = 0; if (.Delay) #Mission_Delay = gettimetick(2) + (.Delay * 3600); Mission_Total++; if (Mission_Total == 1) query_sql("INSERT INTO `char_reg_num` (`char_id`,`key`,`index`,`value`) VALUES (" + getcharid(0) + ",'Mission_Total','0',1)"); else query_sql("UPDATE `char_reg_num` SET `value` = " + Mission_Total + " WHERE `char_id` = " + getcharid(0) + " AND `key` = 'Mission_Total'"); close; Mission_Info: mes "[Hunting Missions]"; mes "If you so choose, I can assign"; mes "you a random hunting quest."; mes "Some are easier than others, but"; mes "the rewards increase with difficulty."; next; mes "[Hunting Missions]"; mes "Missions points are shared"; mes "amongst all your characters."; if (.Delay) mes "Delay time is, too."; mes "You can't take missions on"; mes "multiple characters at once."; next; mes "[Hunting Missions]"; mes "You can start a quest"; mes (.Delay ? "every " + ((.Delay == 1) ? "hour." : .Delay + " hours.") : "whenever you want."); mes "That's everything~"; return; function Chk { if (getarg(0) < getarg(1)) { @f = true; return "^FF0000"; } else return "^00FF00"; } OnBuyItem: .@size = getarraysize(@bought_nameid); for (.@i = 0; .@i < .@size; .@i++) { .@j = inarray(.Shop, @bought_nameid[.@i]); .@cost += (.Shop[.@j+1] * @bought_quantity[.@i]); } mes "[Hunting Missions]"; if (.@cost > #Mission_Points) mes "You don't have enough Mission Points."; else { for (.@i = 0; .@i < .@size; .@i++) { getitem @bought_nameid[.@i], @bought_quantity[.@i]; dispbottom "Purchased " + @bought_quantity[.@i] + "x " + getitemname(@bought_nameid[.@i]) + "."; } #Mission_Points -= .@cost; mes "Deal completed."; emotion ET_MONEY; } deletearray @bought_nameid[0], .@size; deletearray @bought_quantity[0], .@size; close; OnNPCKillEvent: if (!getcharid(1) || !.Party) { if (!#Mission_Count || !Mission0) end; for (.@i = 0; .@i < .Quests; .@i++) { if (strmobinfo(1,killedrid) == strmobinfo(1,getd("Mission" + .@i))) { if (getd("Mission" + .@i + "_") < #Mission_Count) { dispbottom "[Hunting Mission] Killed " + (set(getd("Mission" + .@i + "_"),getd("Mission" + .@i + "_") + 1)) + " of " + #Mission_Count + " " + strmobinfo(1,killedrid) + "."; end; } } } } else if (.Party) { .@mob = killedrid; getmapxy(.@map1$,.@x1,.@y1); getpartymember getcharid(1),1; getpartymember getcharid(1),2; for (.@i = 0; .@i < $@partymembercount; .@i++) { if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) { set .@Mission_Count, getvar(#Mission_Count, $@partymembercid[.@i]); set .@Mission0, getvar(Mission0, $@partymembercid[.@i]); set .@HP, readparam(HP, $@partymembercid[.@i]); if (.@Mission_Count && .@Mission0 && .@HP > 0) { getmapxy(.@map2$,.@x2,.@y2,BL_PC,rid2name($@partymemberaid[.@i])); if ((.@map1$ == .@map2$ || .Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || .Party < 3)) { for (.@j = 0; .@j < .Quests; .@j++) { .@my_mob_id = getvar( getd("Mission"+.@j),$@partymembercid[.@i] ); .@my_count = getvar( getd("Mission"+.@j+"_"), $@partymembercid[.@i] ); if (strmobinfo(1,.@mob) == strmobinfo(1,.@my_mob_id)) { if (.@my_count < .@Mission_Count) { setd "Mission"+.@j+"_", (.@my_count+1), $@partymembercid[.@i]; dispbottom "[Hunting Mission] Killed " + (.@my_count+1) + " of " + .@Mission_Count + " " + strmobinfo(1,.@mob) + ".", 0x777777, $@partymembercid[.@i]; break; } } } } } } } end; OnInit: .Delay = 12; // Quest delay, in hours (0 to disable). .Quests = 4; // Number of subquests per mission (increases rewards). .Party = 3; // Party options: 0 (exclude party kills), 1 (include party kills), 2 (same map only), 3 (screen area only) .Reset = -1; // Reset options: -1 (abandoning mission sets delay time), 0 (no delay time), [Zeny] (cost to abandon mission, no delay time) setarray .Count[0], // Min and max monsters per subquest (increases rewards). 40,70; setarray .Modifier[0], // Multipliers for Base Exp, Job Exp, and Zeny rewards. getbattleflag("base_exp_rate")/100,getbattleflag("job_exp_rate")/100,60; .mob_db$ = // Table name of SQL mob database (checkre(0))?"mob_db_re":"mob_db"; setarray .Shop[0], // Reward items: <ID>,<point cost> (about 10~20 points per hunt). 512,1,513,1,514,1,538,5,539,5,558,10,561,10; .Blacklist$ = // Blacklisted mob IDs. "1062,1088,1183,1186,1200,1212,1220,1221,1234,1235,"+ "1244,1245,1250,1268,1290,1293,1294,1296,1298,1299,"+ "1300,1301,1303,1304,1305,1306,1308,1309,1311,1313,"+ "1515,1588,1618,1676,1677,1678,1679,1796,1797,1974,"+ "1975,1976,1977,1978,1979"; npcshopdelitem "mission_shop",512; for (.@i = 0; .@i < getarraysize(.Shop); .@i += 2) npcshopadditem "mission_shop", .Shop[.@i], .Shop[.@i+1]; end; }
I use this queryquery_sql("SELECT ID FROM `" + .mob_db$ + "` WHERE left(name_aegis, 4) != 'meta' AND left(name_aegis, 2) != 'E_' AND base_exp > 0 AND job_exp > 0 AND (class != 'boss' OR class is null) AND (drop3_item like '%_card' OR drop4_item like '%_card' OR drop5_item like '%_card' OR drop6_item like '%_card' OR drop7_item like '%_card' OR drop8_item like '%_card' OR drop9_item like '%_card' OR drop10_item like '%_card') AND ID < 2000 AND instr('"+.Blacklist$+"',ID) = 0 AND (ID BETWEEN " + (strcharinfo(3) - 10) + " AND " + (strcharinfo(3) + 5) + ") ORDER BY rand() LIMIT " + .Quests, .@mob);
in this modified SQL query,
(strcharinfo(3) - 10)
represents the user's level minus 10, and(strcharinfo(3) + 5)
represents the user's level plus 5. Adjust these numbers as needed to define the level range for the monsters.
Please test it out and let me know . Up the post if this things work so other player might encounter the same problem and they will see the mark [solve] -
Try this
//===== rAthena Script ======================================= //= Reset NPC //===== Description: ========================================= //= Resets skills, stats, or both. //===== Additional Comments: ================================= //= 1.0 First Version //= 1.1 Optimized for the greater good. [Kisuka] //= 1.2 Cleaning [Euphy] //= 1.3 All statuses removed upon skill reset. [Euphy] //= 1.4 Compressed Script, Added limit use option [Stolao] //= Changed set -> setarray, Improved text with F_InsertPlural //= 1.5 Added sc_end_class to reset related status changes [sader1992] //= 1.6 First three resets are free [YourName] //============================================================ prontera,150,193,4 script Reset Girl 124,{ // Skills, Stats, Both, Limit setarray .@Reset, 5000, 5000, 9000, 0; mes "[Reset Girl]"; if(.@Reset[3] && reset_limit > .@Reset[3]) { mes "Sorry, you can only reset "+callfunc("F_InsertPlural",.@Reset[3],"time")+" in your life."; close; } mes "I am the Reset Girl."; mes "Reset Stats: "+ callfunc("F_InsertComma",.@Reset[1]) +"z"; mes "Reset Skills: "+ callfunc("F_InsertComma",.@Reset[0]) +"z"; mes "Reset Both: "+ callfunc("F_InsertComma",.@Reset[2]) +"z"; if(.@Reset[3]) mes "You may only reset "+callfunc("F_InsertPlural",.@Reset[3],"time")+", so use "+((.@Reset[3]>1)?"them":"it")+" wisely."; mes "Please select the service you want:"; next; set .@i,(select("^FF3355Reset Skills:Reset Stats:Reset Both^000000:Cancel")); if(.@i > 3) close; mes "[Reset Girl]"; if (free_resets < 3) { mes "You are eligible for a free reset! This will be reset number "+(free_resets+1)+"."; } else { if (Zeny < .@Reset[.@i-1]) { mes "Sorry, you don't have enough Zeny."; close; } if(.@Reset[3]){ mes "You can only reset "+callfunc("F_InsertPlural",.@Reset[3],"time")+" in your life, are you sure?"; if(select("Let me think:That's fine") == 1) close; } set Zeny, Zeny-.@Reset[.@i-1]; } if(.@i&1){ sc_end_class; ResetSkill; } if(.@i&2) ResetStatus; if (free_resets < 3) { set free_resets, free_resets + 1; } mes "There you go!"; if(.@Reset[3]) set reset_limit, reset_limit + 1; close; }
-
New Variable
free_resets
:- This variable keeps track of the number of free resets a player has used.
-
Logic for Free Resets:
- If the player has used fewer than 3 free resets, they are informed that the reset will be free.
- Otherwise, the script checks if the player has enough Zeny and deducts it accordingly.
-
Incrementing
free_resets
:-
Each time a free reset is used,
free_resets
is incremented by 1.
-
Each time a free reset is used,
This script ensures that players get their first three resets for free, after which they will be charged the standard fees as defined in the
.@Reset
array.- 1
-
-
Get some idea with this . I just write it simple
prontera,150,150,5 script QueryMobDrops 1_M_MERCHANT,{ // NPC Dialogue mes "Enter the Mob ID:"; input .@mob_id; // SQL Query query_sql("SELECT m.id, m.name_japanese, i.id, i.name_english, md.rate " + "FROM mob_db m " + "JOIN mob_drop md ON m.id = md.mob_id " + "JOIN item_db i ON md.item_id = i.id " + "WHERE m.id = " + .@mob_id + ";", .@mob_id, .@mob_name$, .@item_id, .@item_name$, .@drop_rate); if (getarraysize(.@mob_id) > 0) { mes "Mob: " + .@mob_name$; for (.@i = 0; .@i < getarraysize(.@mob_id); .@i++) { mes "Item: " + .@item_name$[.@i] + " (ID: " + .@item_id[.@i] + "), Drop Rate: " + .@drop_rate[.@i] + "%"; } } else { mes "No drops found for this mob ID."; } close; }
-
This is the reason
save_point: clear; soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Your respawn point has been saved to Veil. Thank you."; savepoint "veil",120,104; <--------------------------------------- close;
You specifically put the map name with coordinates . Instead of doing that just put return to save point script . Im not gonna spoon feed you anymore so you will learn
-
I go that to my github. but here is your request i added a boss chance too . The code is user friendly so you can customize it with your desire . If it helps make sure to up my response so other player will know that the post is solve
prontera,155,185,5 script Random Card NPC 100,{ .@zeny_cost = 1000000; // Zeny cost per roll .@normal_chance = 89; // Normal monster card chance (89%) .@mini_chance = 10; // Mini monster card chance (10%) .@boss_chance = 1; // Boss card chance (1%) menu "Welcome to the Random Card NPC! What would you like to do?", "Roll for a random card (" + .@zeny_cost + " Zeny)", Roll, "Nevermind", Quit; OnInit: setarray .@normal_cards, 4001, 4002, 4003; // Example normal monster card IDs (You can add or remove as needed) setarray .@mini_cards, 4004, 4005, 4006; // Example mini monster card IDs (You can add or remove as needed) setarray .@boss_cards, 4007, 4008, 4009; // Example boss monster card IDs (You can add or remove as needed) end; Roll: if (countitem(zeny) < .@zeny_cost) { mes "[Random Card NPC]"; mes "You don't have enough Zeny."; close; } delitem zeny, .@zeny_cost; .@roll = rand(100); // Roll a random number between 0 and 99 if (.@roll < .@normal_chance) { // Player gets a normal monster card .@card_id = .@normal_cards[rand(getarraysize(.@normal_cards))]; getitem .@card_id, 1; mes "[Random Card NPC]"; mes "Congratulations! You got a normal monster card."; close; } else if (.@roll < .@normal_chance + .@mini_chance) { // Player gets a mini monster card .@card_id = .@mini_cards[rand(getarraysize(.@mini_cards))]; getitem .@card_id, 1; mes "[Random Card NPC]"; mes "Congratulations! You got a mini monster card."; close; } else if (.@roll < .@normal_chance + .@mini_chance + .@boss_chance) { // Player gets a boss monster card .@card_id = .@boss_cards[rand(getarraysize(.@boss_cards))]; getitem .@card_id, 1; mes "[Random Card NPC]"; mes "Congratulations! You got a boss monster card."; close; } else { // Player gets nothing mes "[Random Card NPC]"; mes "Sorry, you didn't get any card this time."; close; } Quit: mes "[Random Card NPC]"; mes "Come back anytime if you want to try your luck again!"; close; }
-
Try this i made
// Gold Room Entrance NPC firstcity,100,100,4 script Gold Room Entrance 857,{ mes "[Gold Room NPC]"; mes "Welcome to the Gold Room!"; mes "Do you want to enter the Gold Room?"; if(select("Yes:No") == 2) { mes "[Gold Room NPC]"; mes "Alright, come back if you change your mind."; close; } if (checkweight(969, 1)) { // Ensure the player has at least 1 weight free to collect Gold Bars warp "gold_room", 50, 50; // Replace "gold_room" with your actual Gold Room map name close; } else { mes "[Gold Room NPC]"; mes "You are carrying too much weight!"; close; } } // Exchange Gold Bars for Coins NPC gold_room,50,50,4 script Exchange NPC 858,{ mes "[Exchange NPC]"; mes "I can exchange your Gold Bars for coins."; mes "What would you like to do?"; switch(select("Exchange Gold Bars for Coins:Exchange Coins for Zeny:Cancel")) { case 1: callfunc("exchange_goldbars"); break; case 2: callfunc("exchange_coins"); break; case 3: mes "[Exchange NPC]"; mes "Come back if you change your mind."; close; } close; } function script exchange_goldbars { mes "[Exchange NPC]"; mes "How many Gold Bars do you want to exchange?"; input .@goldbars; if (countitem(969) < .@goldbars) { mes "You don't have that many Gold Bars."; close; } mes "Which coin do you want to receive?"; switch(select("Platinum Coin:Gold Coin:Bronze Coin:Cancel")) { case 1: delitem 969, .@goldbars; getitem 671, .@goldbars / 10; // Example exchange rate: 10 Gold Bars = 1 Platinum Coin break; case 2: delitem 969, .@goldbars; getitem 673, .@goldbars / 5; // Example exchange rate: 5 Gold Bars = 1 Gold Coin break; case 3: delitem 969, .@goldbars; getitem 672, .@goldbars / 1; // Example exchange rate: 1 Gold Bar = 1 Bronze Coin break; case 4: mes "Alright, come back if you change your mind."; close; } mes "Thank you! Here are your coins."; close; } function script exchange_coins { mes "[Exchange NPC]"; mes "Which coin do you want to exchange for Zeny?"; switch(select("Platinum Coin:Gold Coin:Bronze Coin:Cancel")) { case 1: mes "How many Platinum Coins do you want to exchange?"; input .@platinum; if (countitem(671) < .@platinum) { mes "You don't have that many Platinum Coins."; close; } delitem 671, .@platinum; set zeny, zeny + (.@platinum * 1000000); // Example exchange rate: 1 Platinum Coin = 1,000,000 Zeny break; case 2: mes "How many Gold Coins do you want to exchange?"; input .@gold; if (countitem(673) < .@gold) { mes "You don't have that many Gold Coins."; close; } delitem 673, .@gold; set zeny, zeny + (.@gold * 100000); // Example exchange rate: 1 Gold Coin = 100,000 Zeny break; case 3: mes "How many Bronze Coins do you want to exchange?"; input .@bronze; if (countitem(672) < .@bronze) { mes "You don't have that many Bronze Coins."; close; } delitem 672, .@bronze; set zeny, zeny + (.@bronze * 10000); // Example exchange rate: 1 Bronze Coin = 10,000 Zeny break; case 4: mes "Alright, come back if you change your mind."; close; } mes "Thank you! Here is your Zeny."; close; }
-
The script you provided is close to being functional, but there are some issues that need to be addressed to ensure it works correctly. Below is the corrected script with explanations for the changes:
Here is the corrected scriptfirstcity,229,87,4 script Salvage NPC 856,{ mes "[Salvage NPC]"; mes "Hello! I can salvage your old weapons and armor."; mes "In return, I'll give you a special item based on the weapon's level."; next; mes "[Salvage NPC]"; mes "Would you like to proceed?"; switch(select("Yes:No")) { case 1: callfunc("salvage_item"); break; case 2: mes "[Salvage NPC]"; mes "Alright, come back if you change your mind."; close; } close; } function script salvage_item { mes "[Salvage NPC]"; mes "Please show me the items you want to salvage."; next; // Fetch player's inventory getinventorylist; // Collect all weapons and armor in the player's inventory set .@item_count, 0; for (.@i = 0; .@i < @inventorylist_count; .@i++) { set .@type, getiteminfo(@inventorylist_id[.@i], ITEMINFO_TYPE); if ((.@type == IT_WEAPON || .@type == IT_ARMOR) && @inventorylist_equip[.@i] == 0) { // Type 4 = Weapon, Type 5 = Armor, and not equipped set .@salvageable_items[.@item_count], @inventorylist_id[.@i]; set .@salvageable_items_qty[.@item_count], @inventorylist_amount[.@i]; set .@item_count, .@item_count + 1; } } if (.@item_count == 0) { mes "[Salvage NPC]"; mes "You don't have any salvageable items."; close; } mes "[Salvage NPC]"; mes "Here is a summary of the items you can salvage:"; for (.@i = 0; .@i < .@item_count; .@i++) { mes "^0000FF" + getitemname(.@salvageable_items[.@i]) + "^000000 x" + .@salvageable_items_qty[.@i]; } next; if (select("Proceed with Salvage:Cancel") == 2) { mes "[Salvage NPC]"; mes "Alright, come back if you change your mind."; close; } // Call the shop callshop "salvage_shop", 1; npcshopattach "salvage_shop"; close; } // Shop definition with placeholder items (you need to fill this with the actual items you want to allow for salvage) - shop salvage_shop -1,501:10000,502:10000,503:10000,504:10000,505:10000,506:10000,507:10000,508:10000,509:10000,510:10000 OnSellItem: // Rewards based on weapon level setarray .@reward_common, 501, 502; // Example common loot item IDs setarray .@reward_rare, 503, 504; // Example rare loot item IDs setarray .@reward_unique, 505, 506; // Example unique loot item IDs setarray .@reward_legendary, 507, 508; // Example legendary loot item IDs setarray .@reward_ancient, 509, 510; // Example ancient loot item IDs set .@item_id, @sold_nameid; set .@weapon_level, getiteminfo(.@item_id, ITEMINFO_WEAPONLV); switch (.@weapon_level) { case 1: // Reward common item/points getitem .@reward_common[rand(getarraysize(.@reward_common))], 1; break; case 2: // Reward rare item/points getitem .@reward_rare[rand(getarraysize(.@reward_rare))], 1; break; case 3: // Reward unique item/points getitem .@reward_unique[rand(getarraysize(.@reward_unique))], 1; break; case 4: // Reward legendary item/points getitem .@reward_legendary[rand(getarraysize(.@reward_legendary))], 1; break; case 5: // Reward ancient item/points getitem .@reward_ancient[rand(getarraysize(.@reward_ancient))], 1; break; default: dispbottom "This item cannot be salvaged."; } dispbottom "Thank you! Here is your reward."; end;
-
The
OnSellItem
label should be properly defined and hooked into the shop functionality. - The shop definition needs to include the items that are eligible for sale.
-
The
getiteminfo
function needs to fetch the correct item information. -
Some logic and flow improvements.
Key Changes and Fixes:
-
Item Info Fetching:
-
Changed
getiteminfo(.@item_id, ITEMINFO_WEAPONLEVEL)
togetiteminfo(.@item_id, ITEMINFO_WEAPONLV)
to correctly fetch the weapon level.
-
Changed
-
Shop Definition:
-
The
salvage_shop
now includes example items with prices. Adjust these item IDs and prices according to your server's item database.
-
The
-
Shop Invocation:
-
Adjusted
callshop "salvage_shop", 1;
to make sure the shop is called correctly.
-
Adjusted
-
Reward Logic:
-
getiteminfo
usesITEMINFO_WEAPONLV
to fetch the weapon level correctly.
-
-
Item Type Constants:
-
Added constants
IT_WEAPON
andIT_ARMOR
for better readability.
-
Added constants
-
Make sure the items you want to allow for salvage are included in the
salvage_shop
definition. Adjust the item IDs and the rewards as per your server's requirements. This should make the script functional and enable the salvage NPC to work correctly.
-
The
-
Your script has the core logic to spawn a monster and handle its death, but there are some adjustments needed to ensure that the monster respawns correctly. Specifically, the issue seems to stem from not correctly transitioning from the monster's death event back to the initial spawning logic.
Here is an improved version of your script with these adjustments:function script BossniaHP { .@monsterID = getarg(0,0); .@monsterName$ = getarg(1,""); .@amount = getarg(2,0); .@map$ = getarg(3,""); .@hp = getarg(4,0); OnInit: // Spawn the monster and store its ID $@Cheffenia_ID = bg_monster("BossniaHP::OnMyMobDead", .@map$, 192, 99, .@monsterName$, .@monsterID, .@amount); setunitdata $@Cheffenia_ID, UMOB_HP, .@hp; // Set the monster's HP end; OnMyMobDead: // Initiate the timer to respawn the monster after a delay initnpctimer; end; OnTimer500: // Stop the timer stopnpctimer; // Respawn the monster by calling the OnInit label donpcevent "BossniaHP::OnInit"; end; }
-
Ensure the
OnMyMobDead
event properly respawns the monster. -
Correctly initialize the timer to control the respawning of the monster.
Explanation:
-
OnInit:
-
This section is called to initially spawn the monster. It uses the
bg_monster
function to spawn the monster and stores its ID in the variable$@Cheffenia_ID
. -
The
setunitdata
function sets the HP of the monster.
-
This section is called to initially spawn the monster. It uses the
-
OnMyMobDead:
-
This section is called when the monster dies. The
initnpctimer
function starts the timer which will eventually trigger theOnTimer500
event.
-
This section is called when the monster dies. The
-
OnTimer500:
-
This section is called when the timer started by
OnMyMobDead
reaches 500 milliseconds. -
The
stopnpctimer
function stops the timer. -
The
donpcevent "BossniaHP::OnInit"
function calls theOnInit
label, which respawns the monster.
-
This section is called when the timer started by
-
Common Issues to Check:
- Ensure that the timer duration (500 milliseconds in this case) is appropriate for your needs. You can adjust this value if you need a different respawn delay.
-
Verify that the monster ID and other parameters passed to the
bg_monster
function are correct and that the monster can be spawned without issues. -
Ensure there are no other script conflicts that might prevent the
OnMyMobDead
event from triggering. -
This should ensure that the monster respawns correctly after it is killed.
- 1
-
Ensure the
-
Try this if you encounter error let me know send the cmd part too i dont have time to test it write now.
- script Durengo Kafra Service FAKE_NPC,{ soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Hello, how can I be of service?"; next; switch(select("Save:Use Storage:Teleport Service:Cancel")) { case 1: goto save_point; case 2: goto storage; case 3: goto teleport_service; case 4: close; } save_point: soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Your respawn point has been saved to Veil. Thank you."; savepoint "veil",120,104; close; storage: soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Here is your storage vault."; openstorage; close; teleport_service: soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Please select your destination:"; switch(select("Town:Resource Ground:Cancel")) { case 1: goto town_teleport; case 2: goto resource_teleport; case 3: close; } resource_teleport: soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Please select your level range:"; switch(select("Level 1 to 60:Level 60 to 99:Cancel")) { case 1: if (BaseLevel > 60) { mes "Sorry, your level is above the requirement."; close; } warp "spl_fild01",78,249; close; case 2: if (BaseLevel < 60) { mes "Sorry, your level is below the requirement."; close; } warp "spl_fild02",30,198; close; case 3: close; } town_teleport: soundeffect "menu.wav",0; mes "^ce7e00 === FARIDAH === ^000000"; mes "Select your destination:"; switch(select( "Main Town:Alberta:Aldebaran:Amatsu:Ayothaya:Comodo:Einbech:Einbroch:Geffen:Hugel:Izlude:Jawaii:Juno:Gonryun:Lighthalzen:Louyang:Lutie:Morocc:Moscovia:Nameless Island (Day):Nameless Island (Night):Niflheim:Payon:Prontera:Rachel:Splendide:Thor Camp:Umbala:Veins:Cancel")) { case 1: warp "veil",120,104; close; case 2: warp "alberta",28,234; close; case 3: warp "aldebaran",140,131; close; case 4: warp "amatsu",198,84; close; case 5: warp "ayothaya",208,166; close; case 6: warp "comodo",209,143; close; case 7: warp "einbech",63,35; close; case 8: warp "einbroch",64,200; close; case 9: warp "geffen",119,59; close; case 10: warp "hugel",96,145; close; case 11: warp "izlude",128,108; close; case 12: warp "jawaii",251,132; close; case 13: warp "yuno",157,51; close; case 14: warp "gonryun",160,120; close; case 15: warp "lighthalzen",158,92; close; case 16: warp "louyang",217,100; close; case 17: warp "xmas",147,134; close; case 18: warp "morocc",156,93; close; case 19: warp "moscovia",223,184; close; case 20: warp "nameless_i",256,215; close; case 21: warp "nameless_n",256,215; close; case 22: warp "niflheim",202,174; close; case 23: warp "payon",179,100; close; case 24: warp "prontera",155,183; close; case 25: warp "rachel",130,110; close; case 26: warp "splendide",201,147; close; case 27: warp "thor_camp",246,68; close; case 28: warp "umbala",97,153; close; case 29: warp "veins",216,123; close; case 30: close; } } veil,120,114,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#veil 10041 alb2trea,57,70,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#alb2trea 10041 alberta,28,240,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#alberta 10041 aldebaran,145,118,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#aldebaran 10041 amatsu,203,87,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#amatsu 10041 ayothaya,209,169,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#ayothaya 10041 comodo,194,158,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#comodo 10041 einbech,59,38,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#einbech 10041 einbroch,69,202,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#einbroch 10041 gef_fild10,71,339,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#gef_fild10 10041 geffen,124,72,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#geffen 10041 glast_01,372,308,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#glast_01 10041 gonryun,162,122,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#gonryun 10041 hugel,101,151,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#hugel 10041 izlu2dun,110,92,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#izlu2dun 10041 izlude,134,150,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#izlude 10041 jawaii,253,138,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#jawaii 10041 lighthalzen,162,102,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#lighthalzen 10041 louyang,208,103,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#louyang 10041 manuk,274,146,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#manuk 10041 mid_camp,216,288,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#mid_camp 10041 mjolnir_02,85,364,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#mjolnir_02 10041 moc_ruins,64,164,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#moc_ruins 10041 morocc,159,97,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#morocc 10041 moscovia,229,191,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#moscovia 10041 nameless_n,259,213,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#nameless_n 10041 niflheim,205,179,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#niflheim 10041 pay_arche,42,134,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#pay_arche 10041 payon,182,108,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#payon 10041 prontera,159,192,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#prontera 10041 prt_fild05,279,223,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#prt_fild05 10041 rachel,135,116,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#rachel 10041 splendide,205,153,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#splendide 10041 thor_camp,249,76,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#thor_camp 10041 umbala,106,150,3 duplicate(Durengo Kafra Service) Durengo Kafra Service#umbala 10041 veins,214,123,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#veins 10041 xmas,150,136,6 duplicate(Durengo Kafra Service) Durengo Kafra Service#xmas 10041 yuno,162,47,4 duplicate(Durengo Kafra Service) Durengo Kafra Service#yuno 10041
Changes Made:
- Simplified Dialogue: Reduced unnecessary dialogue and made the conversation more concise.
- Structured Switches: Improved readability by aligning cases directly under their respective switches.
- Merged Common Operations: Combined repeated soundeffect and message commands into logical sections.
- Removed Redundant Labels: Removed unused labels to streamline the code.
- Optimized Condition Checks: Simplified level checks with direct if conditions.
- Consistent Formatting: Ensured consistent indentation and formatting for better readability.
-
3 hours ago, iamkevin said:
Hi, i was planning to create a server with me and my friends who loves the old RO.
I am looking for a latest rAthena server files that I can just use specific episodes like episode 5:Juno, but will be able to upgrade to episode 6,7,etc.
I wish to do this on my own but I do not have the time for it, so I am willing to pay for it if there is one selling this kind of server files.
Then you will need to hire someone that have time to setup a server for you
-
On 5/14/2024 at 8:28 AM, EXPPOC said:
Open you client files goto System folder find Iteminfo.lua you can change the information there so your server will display the data that you have been change . You just simply re-open your client and login your account once you change something and see if it goes thru
-
4 hours ago, IsabelaFernandez said:
I would like to change the payment method for the item with ID 7420 for example. currently the script is working ok, but it is only for zeny
thanks guys, much love
ayothaya.gat,150,158,4 script Equipamentos Campais 691,{
mes "Equipamentos Campais";
mes "Olá!";
mes "Gostaria de olhar nossa loja Campal?";
next;
switch(select("Armas:Acessórios:Variados:Hoje não")) {
case 1: // Pet Food
mes "Vou mostrar as armas Campais para você.";
close2; // Closes the NPC dialog without ending the script
callshop "PetFoodShop",1; // Only Sell window
end; // We end the script just after opening the shop so no need to break
case 2: // Pet Armor
mes "Vou mostrar os acessórios Campais para você.";
callshop "PetArmorShop",1;
end;
case 3: // Taming Items
mes "empty.";
callshop "TamingItemsShop",1;
end;
default: // Any other case not covered above. "Not today" in this example.
mes "Te vejo em breve.!";
close; // This statement closes and ends the script so no need to end again
}
// No need to close or end anything at this point
}// Please add yourself the items you want to sell, last one doesn't need a comma
- shop PetFoodShop -1,13036:-1,13411:-1,
- shop PetArmorShop -1,2720:-1,2721:-1,
- shop TamingItemsShop -1,Use Dynamic shop you can also see how the script works
-
Add set zeny then add condition statement
-
32 minutes ago, Finale said:
I already patched my kRO to the fullest but still getting the item error. Does patching the client have something to do with it?
Yes so you could get the latest Kro Files . Then when you are done doing it get the latest translation of item ... I recommend zack english translation or my transalation in my gethub . My translation is good for High rate server with TCG main currancy
- 1
-
1 hour ago, Finale said:
Hi Guys! is there any fix to this?
When summoning an item or buying items from NPC, all items are in X or unknown items (apple). Is there something wrong with my client files?
I'm using 2015-11-04aRagexe client.Meaning you are not supported the item .. Just patch your kRO renewal and Pre-re to get the latest files
-
On 10/4/2023 at 1:12 AM, Ukiram said:
@Poring King I'm getting this error too. How can I fixed it? Do you have the file?
By updating your kro . You already getting the newest file from main kro server
-
On 7/15/2023 at 1:57 AM, QueenPH said:
First Patch your KRO first so you will get all latest file that RO can offer . Then after that get the latest translation in rAthena . I recommend Chris English Pre-re . So you will get all Pre-re description and item
-
1 hour ago, Finale said:
Hi Guys!
Could someone please help on how to fix this attack animation for Lord Knight? As you can see the LK's head is not sync with its body. Kinda weird though.
Thanks in advance!
This is sprite animation problem . If you know how to fix this thru your act editor . You can find it on your GRF file this happen mostly on a GRF that has a lot of customization . To avoid this try to use a clean GRF or to fix this try to patch your client files like your KRO that you are using .
Just copy the original GRF that contain with fix LK attack act and paste it to your custom grf that has this problem .. There is a lot of way to fix this .. -
3 hours ago, mizanyan said:
It would be nice if you post your script . If you are asking if you want a NPC that will show in certain place
mapname,x,y,facing[TAB]Script[TAB]NPCID,{ mes "[ Simple NPC]"; mes "This is the paragraph"; end; }
-
Did you reload your file for after you change your gm permission ?
- 1
-
Official Headgears - Updated November 2022
in Spriting & Palette Showcase
Posted
You only need to do is to update your KRO both PRE-Re and Renewal to get the updated files from official server