//===== eAthena Script ======================================= //= Dynamical Shop //===== By =================================================== //= lllchrislll //===== Version ============================================== //= 1.0 - Script Created // - Nearly forgot the "OnBuyItem" part (Q.Q) // - Added the possibility to edit the price limit. //===== Compatible With ====================================== //= Every eAthena SVN //===== Description ========================================== //= This Shop can be changed dynamically ingame and has two // payment methods, to choose from: Zeny and Cash Points. //= Also you can edit the Price Limit as long it doesn't exceed // the server's default settings in the conf/script_athena.conf // > input_max_value. By default I put it on 10,000,000, near // line 76 you can find a small hint, which value is the max, // if it isn't noted inside of that file already. //===== Comments ============================================= //= None yet... //=========================================================== prontera,146,172,0 script Cash Shop 100,{ function ShopStuff; if(getgmlevel() >= .gm) { set @shop,0; mes .n$; mes "Hello, "+strcharinfo(0)+"."; mes "Current Currency: "+$Cur$[$Cur]; while(1) { if(@shop) { close2; break; } next; mes .n$; mes "How can I help you?"; next; switch(select("- View Settings:- Reset Shop:- Open Shop:- Nothing")) { case 1: mes .n$; mes "What do you want view?"; next; if(select("- Shop Managment:- Currency Setting") - 1) { mes .n$; if(getgmlevel() < .gm_pr) { mes "You don't have access to this service."; continue; } mes "What now?"; mes "^FF0000Note: On currency change I will delete every entry in the shop you have made so far.^000000"; switch(select("- Change currency ("+$Cur$[$Cur]+"):- Change Price Limit:- Nothing")) { case 1: next; mes .n$; mes "Please choose from the menu below, which currency I should use:"; select("- "+$Cur$[1]+":- "+$Cur$[2]); set $Cur,@menu; deletearray $cash_it[0],128; deletearray $cash_p[0],128; ShopStuff(4); continue; break; case 2: next; mes .n$; mes "Current Setting: "+$limit[@lim]; mes "Change?"; if(select("- Yes:- No") - 1) continue; next; mes .n$; mes "Please type the new value:"; // ========= Changing Max Limit of 10,000,000 ============ // // 10,000,000 is the default setting for the max input. // To change that open the conf/script_athena.conf and // edit the value of "input_max_value:" to "2147483647", // which is the highest value possible. // Then you only need to change it here :D. // ======================================================= // mes "Note: But you can't go higher than the server setting of 10,000,000."; next; if(input(@n_lim,1,10000000) != 0) { mes .n$; mes "Invalid Value, max 10,000,000."; continue; } mes .n$; mes "New Limit has been set."; setarray $limit[@lim],@n_lim; continue; break; case 3: continue; break; } } if($Cur == 0) { mes .n$; mes "I'm sorry, but I don't know with which Currency I should trade yet."; mes "Please choose an currency first."; continue; } if($limit[$Cur] == 0) { mes .n$; mes "You haven't set an price limit yet."; continue; } mes .n$; if(getarraysize($cash_it) < 1) { mes "There is no item in the Shop yet."; } else { mes "There are currently the following "+getarraysize($cash_it)+" Items in the Shop:"; mes "============================"; for ( set .@i,0; .@i < getarraysize($cash_it); set .@i,.@i + 1) { mes getitemname($cash_it[.@i])+" (ID: "+$cash_it[.@i]+")"; mes "Price:"+$cash_p[.@i]+" "+$Cur$[$Cur]; mes ( ($cash_it[.@i+1] != 0)?"---------------------------------":"============================"); } } next; switch(select("- Add Items:- Edit Items:- Delete Items:- Nothing")) { case 1: mes .n$; if(getarraysize($cash_it) >= 128) { mes "The Shop is full, please remove an item first."; continue; } mes "Please type the Item ID you want to add:"; mes "Max is 128 Items."; next; if(input(@item,501,.last_id) != 0) { mes .n$; mes "The id you have put is either too low or too high."; continue; } if(getitemname(@item) == "null" || getitemname(@item) == "") { mes .n$; mes "The item you requested doesn't exist."; continue; } mes .n$; mes "Chosen Item: "+getitemname(@item); mes " "; mes "Now input the price it should have, the current currency is \""+$Cur$[$Cur]+"\"."; mes "Maximum is "+$limit[$Cur]; next; if(input(@price,1,$limit[$Cur]) != 0) { mes .n$; mes "You have put an invalid price."; mes "Maximum is "+$limit[$Cur]; continue; } mes .n$; mes "Price: "+@price+" "+$Cur$[$Cur]; mes "Is that correct?"; if(select("- Yes:- No") - 1) continue; ShopStuff(1,0,@item,@price); continue; break; case 2: mes .n$; if(getarraysize($cash_it) < 1) { mes "There is no Item to edit."; mes "Please add one first :D."; continue; } mes "Please choose the item you want to edit:"; mes "Format: Name (Current Price)"; next; set @ed_list$,""; for ( set .@e,0; .@e < getarraysize($cash_it); set .@e,.@e + 1) set @ed_list$,@ed_list$ + "- "+getitemname($cash_it[.@e])+" ("+$cash_p[.@e]+")" + ( ($cash_it[.@e+1])?":":""); set @ed,select(@ed_list$) - 1; mes .n$; mes "Chosen Item: "+ getitemname($cash_it[@ed]); mes "Price: "+ $cash_p[@ed]+" "+$Cur$[$Cur]; mes "Correct?"; if(select("- Yes:- No") - 1) continue; next; mes .n$; mes "What do you want to edit?"; next; if(select("- Item ID:- Price") - 1) { mes .n$; mes "Input the new price:"; next; if(input(@price,1,$limit[$Cur]) != 0) { mes .n$; mes "You have put an invalid price."; mes "Maximum is "+$limit[$Cur]; continue; } mes .n$; mes "Chosen Price: "+@price+" "+$Cur$[$Cur]; mes "Correct?"; if(select("- Yes:- No") - 1) continue; ShopStuff(3,@ed,$cash_it[@ed],@price); } else { mes .n$; mes "Input the new item id:"; next; if(input(@item,501,.last_id) != 0) { mes .n$; mes "The id you have put is either too low or too high."; continue; } if(getitemname(@item) == "null" || getitemname(@item) == "") { mes .n$; mes "The item you requested doesn't exist."; continue; } mes .n$; mes "Chosen Item: "+getitemname(@item); mes "Correct?"; if(select("- Yes:- No") - 1) continue; ShopStuff(3,@ed,@item,$cash_p[@ed]); } continue; break; case 3: mes .n$; if(getarraysize($cash_it) < 1) { mes "There is no Item to remove."; mes "Please add one first :D."; continue; } mes "Please choose the item you want to remove:"; mes "Format: Name (Current Price)"; next; set @r_list$,""; for ( set .@e,0; .@e < getarraysize($cash_it); set .@e,.@e + 1) set @r_list$,@r_list$ + "- "+getitemname($cash_it[.@e])+" ("+$cash_p[.@e]+")" + ( ($cash_it[.@e+1])?":":""); set @re,select(@r_list$) - 1; mes .n$; mes "Chosen Item: "+ getitemname($cash_it[@re]); mes "Price: "+ $cash_p[@re]+" "+$Cur$[$Cur]; mes "Correct?"; if(select("- Yes:- No") - 1) continue; ShopStuff(2,@ed); continue; break; case 4: continue; break; } case 2: mes .n$; mes "Do you really want to reset the shop?"; if(select("- Yes:- No") - 1) continue; ShopStuff(4); continue; break; case 3: set @shop,1; break; case 4: close; } } } if(!$Cur) { mes .n$; mes "I'm sorry, but I don't know with which Currency I should trade yet."; close; } if(getarraysize($cash_it) < 1) { mes .n$; mes "There are no items to purchase yet."; mes "Please come back as soon as I have some."; close; } if(.first == 1) ShopStuff(5); npctalk strnpcinfo(1)+": Accepted Payment Method: "+$Cur$[$Cur]; dispbottom strnpcinfo(1)+": You have "+ ( ($Cur == 1)?Zeny:#CASHPOINTS)+" "+$Cur$[$Cur]; npctalk "Notice: Discount Skill won't work at me, you'll have to pay the full price."; callshop "Dynam_Shop",1; npcshopattach "Dynam_Shop"; end; OnBuyItem: for ( set .@b,0; .@b < getarraysize(@bought_nameid); set .@b,.@b + 1) { for ( set .@l,0; .@l < getarraysize($cash_it); set .@l,.@l + 1) { if(@bought_nameid[.@b] == $cash_it[.@l]) { if(checkweight($cash_it[.@l],@bought_quantity[.@b]) == 1) { set @cost,$cash_p[.@l]*@bought_quantity[.@b]; set @total,@total+@cost; } else { dispbottom "Cash Shop: You would be overweight, please remove some items or buy less."; set @cost,0; set @total,0; deletearray @bought_nameid[0],128; deletearray @bought_quantity[0],128; end; } } } } if(@total > ( ($Cur == 1)?Zeny:#CASHPOINTS) ) { dispbottom strnpcinfo(1)+": You don't have the required "+$Cur$[$Cur]; dispbottom strnpcinfo(1)+": You need "+@total +" "+$Cur$[$Cur]+"."; set @cost,0; set @total,0; deletearray @bought_nameid[0],128; deletearray @bought_quantity[0],128; end; } // In case the lower version doesn't work accordingly. q.q //if($Cur == 1) set Zeny,Zeny - @total; //else if($Cur == 2) set #CASHPOINTS,#CASHPOINTS - @total; set ( ($Cur == 1)?Zeny:#CASHPOINTS),( ($Cur == 1)?Zeny:#CASHPOINTS) - @total; for ( set .@s,0; .@s < getarraysize(@bought_nameid); set .@s,.@s + 1) getitem @bought_nameid[.@s],@bought_quantity[.@s]; set @cost,0; set @total,0; deletearray @bought_nameid[0],128; deletearray @bought_quantity[0],128; end; function ShopStuff { // ==================================================== // // getarg(0): // * 1 - Add // * 2 - Remove // * 3 - Edit // * 4 - Delete Shop // * 5 - Shop Creation // getarg(1): Array Position for Edit & Remove // getarg(2): Item ID // getarg(3): Price // ==================================================== // // =========== Item Adding ============ // if(getarg(0) == 1) { npcshopadditem "Dynam_Shop",getarg(2),getarg(3); setarray $cash_it[getarraysize($cash_it)],getarg(2); setarray $cash_p[getarraysize($cash_p)],getarg(3); // =========== Item Removal ============ // } else if(getarg(0) == 2) { npcshopdelitem "Dynam_Shop",$cash_it[getarg(1)]; deletearray $cash_it[getarg(1)],1; deletearray $cash_p[getarg(1)],1; // =========== Item Edit ============ // } else if(getarg(0) == 3) { setarray $cash_it[getarg(1)],getarg(2); setarray $cash_p[getarg(1)],getarg(3); // Re-Create Shop after Edit npcshopitem "Dynam_Shop",$cash_it[0],$cash_p[0]; for ( set .@s,1; .@s < getarraysize($cash_it); set .@s,.@s + 1) npcshopadditem "Dynam_Shop",$cash_it[.@s],$cash_p[.@s]; // =========== Reset Shop ============ // } else if(getarg(0) == 4) { npcshopitem "Dynam_Shop",512,10; set .first,1; // =========== Shop Creation ============ // } else if(getarg(0) == 5) { ShopStuff(4); npcshopdelitem "Dynam_Shop",512; for ( set .@s,0; .@s < getarraysize($cash_it); set .@s,.@s + 1) npcshopadditem "Dynam_Shop",$cash_it[.@s],$cash_p[.@s]; set .first,0; } return; } OnInit: set .n$,"["+strnpcinfo(1)+"]"; set .gm,60; // General Access Level set .gm_pr,80; // Currency Setting Access Level set .first,1; // First Shop Creation set .last_id,30000; // Highest Item ID setarray $Cur$[0],"None","Zeny","Cash Points"; end; } - shop Dynam_Shop -1,512:-1