Hello @sader1992 I'm using your All in one Random Option Script.
I encounter an error.
I think when the random goes to the minimum value of the option it will error.
//===== rAthena Script =======================================
//= saders All in one Random Option Script
//= Free Script!!!!
//===== By: ==================================================
//= sader1992
//= https://sader1992.com/
//= https://rathena.org/board/profile/30766-sader1992/
//= https://sader1992.com/?page=item&item=54
//= For more , check out here >
//= https://sader1992.com/?page=ra_services
//= https://sader1992.com/?page=store
//= https://rathena.org/board/profile/30766-sader1992/content/?type=downloads_file
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//https://rathena.org/board/files/file/4309-all-in-one-random-options-script/
//https://github.com/sader1992/sader_scripts
//===== Update Log: =========================================
//= Version 1.0 Creating the script.
//===== Description: =========================================
//= This is a Highly Custumizable random option script
//= you can reuse the script by just creating a new file with different setting!.
//= read and understand the settings.
//============================================================
prontera,108,172,5 script Random Option 10434,{
disable_items; function rnd;
switch(select("Insert Random Options:Allowed Items List")){
case 1:
mes "You must equip the item to appear here!";
for(.@i=0;.@i<EQI_MAX;.@i++){
if(getequipisequiped(.@i)) {
.@m1$ += (inarray(.item_list,getequipid(.@i)) != -1?"^11AD09":"^F73831") + F_getpositionname(.@i) + "-[" + getequipname(.@i) + "]^000000";
.@exist = true;
}
.@m1$ += ":";
}
if(!.@exist){
mes "You have to equip the item you want to insert the random options into!.";
end;
}
.@eq = select(.@m1$) -1;
clear;
.@id = getequipid(.@eq);
if(inarray(.item_list,.@id) == -1){
mes "Sorry , I cannot deal with this item!";
end;
}
.@gid = .it[.@id];
if(!.@gid){
mes "Something went wrong!";
end;
}
if(!getequiprandomoption(.@eq,0,ROA_ID)){
.@zeny = .nz[.@gid];
.@cashpoint = .nk[.@gid];
.@costumpoint = .nc[.@gid];
copyarray(.@item,getd(".ni_" + .@gid),getarraysize(getd(".ni_" + .@gid)));
copyarray(.@amount,getd(".na_" + .@gid),getarraysize(getd(".na_" + .@gid)));
}else{
if(!.g_reroll[.@gid]){
mes "Sorry , i cannot reroll the random options in this item!";
end;
}
.@zeny = .rz[.@gid];
.@cashpoint = .rk[.@gid];
.@costumpoint = .rc[.@gid];
copyarray(.@item,getd(".ri_" + .@gid),getarraysize(getd(".ri_" + .@gid)));
copyarray(.@amount,getd(".ra_" + .@gid),getarraysize(getd(".ra_" + .@gid)));
}
mes "Selected Item [" + getequipname(.@eq) + "]";
mes "==== Cost ====";
if(.@zeny) mes "Zeny: " + .@zeny;
if(.@cashpoint) mes "CashPoint: " + .@cashpoint;
if(.@costumpoint) mes .CustomPointsName$ + ": " + .@costumpoint;
for(.@i=0;.@i<getarraysize(.@item);.@i++){
mes "(" + .@amount[.@i] + "pcs.) " + getitemname(.@item[.@i]) + " (" + .@item[.@i] + ")";
}
if(!.KeepItemData){
mes "^E01E00You will loss all the refine and cards in the item if you continue.^000000";
}
mes "Would you like to continue?";
if(select("Yes:No") == 2){
clear;
mes "Ok, see you next time!";
end;
}
clear;
if(Zeny < .@zeny){
mes "You don't have " + .@zeny + " Zeny";
.@close = true;
}
if(#CASHPOINTS < .@cashpoint){
mes "You don't have " + .@cashpoint + " CashPoints";
.@close = true;
}
if(getd(.CustomPointsVariable$) < .@costumpoint){
mes "You don't have " + .@costumpoint + " " + .CustomPointsName$;
.@close = true;
}
for(.@i=0;.@i<getarraysize(.@item);.@i++){
if(countitem(.@item[.@i]) < .@amount[.@i]){
mes "You don't have (" + .@amount[.@i] + ") " + getitemname(.@item[.@i]);
.@close = true;
}
}
if(.@close) end;
.@r = getequiprefinerycnt(.@eq);
for(.@i=0;.@i<4;.@i++){
if(getequipcardid(.@eq,.@i)){
setd ".@c" + .@i,getequipcardid(.@eq,.@i);
.@re[getarraysize(.@re)] = true;
}
}
copyarray(.@opt_id,getd(".ro_id_" + .@gid + "_0"),getarraysize(getd(".ro_id_" + .@gid + "_0")));
copyarray(.@opt_mn,getd(".ro_mn_" + .@gid + "_0"),getarraysize(getd(".ro_mn_" + .@gid + "_0")));
copyarray(.@opt_mx,getd(".ro_mx_" + .@gid + "_0"),getarraysize(getd(".ro_mx_" + .@gid + "_0")));
for(.@i=1;.@i<6;.@i++){
copyarray(getd(".@opt_id" + .@i),getd(".ro_id_" + .@gid + "_" + .@i),getarraysize(getd(".ro_id_" + .@gid + "_" + .@i)));
copyarray(getd(".@opt_mn" + .@i),getd(".ro_mn_" + .@gid + "_" + .@i),getarraysize(getd(".ro_mn_" + .@gid + "_" + .@i)));
copyarray(getd(".@opt_mx" + .@i),getd(".ro_mx_" + .@gid + "_" + .@i),getarraysize(getd(".ro_mx_" + .@gid + "_" + .@i)));
}
for(.@i=1;.@i<6;.@i++){
if(rand(100) > getd(".s_" + .@i + "[" + .@gid + "]"))
break;
if(getd(".ro_id_" + .@gid + "_" + .@i)){
if(!getarraysize(getd(".@opt_id" + .@i))) break;
.@ndx = rand(getarraysize(getd(".@opt_id" + .@i)));
.@result_id = getd(".@opt_id" + .@i + "[" + .@ndx + "]");
.@result_vl = rnd(getd(".@opt_mn" + .@i + "[" + .@ndx + "]"),getd(".@opt_mx" + .@i + "[" + .@ndx + "]"));
deletearray(getd(".@opt_id" + .@i + "[" + .@ndx + "]"),1);
deletearray(getd(".@opt_mn" + .@i + "[" + .@ndx + "]"),1);
deletearray(getd(".@opt_mx" + .@i + "[" + .@ndx + "]"),1);
}else{
if(!.@opt_id) break;
.@ndx = rand(getarraysize(.@opt_id));
.@result_id = .@opt_id[.@ndx];
.@result_vl = rnd(.@opt_mn[.@ndx],.@opt_mx[.@ndx]);
if(!.g_reuse[.@gid]){
deletearray(.@opt_id[.@ndx],1);
deletearray(.@opt_mn[.@ndx],1);
deletearray(.@opt_mx[.@ndx],1);
}
}
if(.ex[.@result_id]){
for(.@i2=0;.@i2<getarraysize(.@r_id);.@i2++){
if(.ex[.@result_id] == .ex[.@r_id[.@i2]]){
.@reject=true;
}
}
}
if(!.@reject){
.@s1=getarraysize(.@r_id);
.@r_id[.@s1] =.@result_id;
.@r_v[.@s1] =.@result_vl;
}else{
.@i--;
.@failsafe++;
if(.@failsafe> 50){
mes "Something went wrong , The server admin need to make sure that the config is done correctly!";
end;
}
}
}
if(Zeny < .@zeny) end;
if(#CASHPOINTS < .@cashpoint) end;
if(getd(.CustomPointsVariable$) < .@costumpoint) end;
for(.@i=0;.@i<getarraysize(.@item);.@i++){
if(countitem(.@item[.@i]) < .@amount[.@i]){
end;
}
}
// anti-hack
if (callfunc("F_IsEquipIDHack", .@eq, .@id) || callfunc("F_IsEquipCardHack", .@eq, .@c0, .@c1, .@c2, .@c3)) {
// anti-hack
emotion ET_FRET;
mes "Item Switch detected!";
end;
}
Zeny -= .@zeny;
#CASHPOINTS-= .@cashpoint;
setd(.CustomPointsVariable$,getd(.CustomPointsVariable$) - .@costumpoint);
for(.@i=0;.@i<getarraysize(.@item);.@i++){
delitem(.@item[.@i],.@amount[.@i]);
}
if(!.@r_id){
specialeffect2 EF_REFINEOK;
mes "Look Like you didn't get any random option, your luck is really bad!";
end;
}
delequip(.@eq);
specialeffect2 EF_REFINEOK;
if(.KeepItemData)
getitem3(.@id,1,1,.@r,0,.@c0,.@c1,.@c2,.@c3,.@r_id,.@r_v,.@null);
else
getitem3(.@id,1,1,0,0,0,0,0,0,.@r_id,.@r_v,.@null);
equip(.@id);
mes "Done!";
end;
case 2:
mes "The list of the allowed items in this npc!";
for(.@i=0;.@i<getarraysize(.item_list);.@i++){
mes "<ITEM>" + getitemname(.item_list[.@i]) + "[" + getitemslots(.item_list[.@i]) + "]<INFO>" + .item_list[.@i] + "</INFO></ITEM>";
if(.@i >= 10 && !(.@i%10)) next;
}
end;
}
end;
function rnd {
if(.HardBalance){
return rand(getarg(0),rand(getarg(0),getarg(1)));
}
return rand(getarg(0),getarg(1));
}
function AddGroup {
.@id = getarg(0);
for(.@i=1;.@i<getargcount();.@i++){
.it[getarg(.@i)] = .@id;
.item_list[getarraysize(.item_list)] = getarg(.@i);
}
return;
}
function AddGroupOption {
.@id = getarg(0);
.g_reroll[.@id] = getarg(1);
.g_reuse[.@id] = getarg(2);
return;
}
function AddGroupCost {
.@id = getarg(0);
.nz[.@id] = getarg(1);
.nk[.@id] = getarg(2);
.nc[.@id] = getarg(3);
for(.@i=4;.@i<getargcount();.@i+=2){
.@s = getarraysize(getd(".ni_" + .@id));
setd(".ni_" + .@id + "[" + .@s + "]",getarg(.@i));
setd(".na_" + .@id + "[" + .@s + "]",getarg(.@i+1));
}
return;
}
function AddGroupReRollCost {
.@id = getarg(0);
.rz[.@id] = getarg(1);
.rk[.@id] = getarg(2);
.rc[.@id] = getarg(3);
for(.@i=4;.@i<getargcount();.@i+=2){
.@s = getarraysize(getd(".ri_" + .@id));
setd(".ri_" + .@id + "[" + .@s + "]",getarg(.@i));
setd(".ra_" + .@id + "[" + .@s + "]",getarg(.@i+1));
}
return;
}
function AddGroupChance {
.@id = getarg(0);
.s_1[.@id] = getarg(1);
.s_2[.@id] = getarg(2);
.s_3[.@id] = getarg(3);
.s_4[.@id] = getarg(4);
.s_5[.@id] = getarg(5);
return;
}
function AddOpt {
.@id = getarg(0);
.@loc = getarg(1);
.@s = getarraysize(getd(".ro_id_" + .@id + "_" + .@loc));
setd(".ro_id_" + .@id + "_" + .@loc + "[" + .@s + "]",getarg(2));
setd(".ro_mn_" + .@id + "_" + .@loc + "[" + .@s + "]",getarg(3));
setd(".ro_mx_" + .@id + "_" + .@loc + "[" + .@s + "]",getarg(4));
return;
}
function AddExclusiveOpt {
.@s1 = getarraysize(.exv);
.exv[.@s1] = true;
for(.@i=0;.@i<getargcount();.@i++){
.ex[getarg(.@i)] = .@s1;
}
return;
}
OnInit:
.exv = true;//DO NOT REMOVE THIS.
.KeepItemData = true;//if this is 'false , the player will loss the refine+cards from the item when he use this npc.
.CustomPointsVariable$ = "#COSTUMPOINTS";//The variable name of the costum points.
.CustomPointsName$ = "Server RO Points";//The name of the costum points, this what the player will see.
.HardBalance = true;//if this is true , it would be much harder to get high value in the random option.
//AddGroup(<GroupID>,<ItemID>,<ItemID>,<ItemID>,<ItemID>,<ItemID>);
/*
AddGroup Doc
<GroupID> = a number between 1 and MAX_INT64
DO NOT REUSE THE GROUP ID IN THE SAME FILE CONFIG!
DO NOT REUSE THE SAME ITEM ID IN DIFFERENT GROUP!
will create a group id
you can add as many as you want items inside a group.
*/
//AddGroupOption(<GroupID>,<AllowReRoll?true:false>,<Allowreusealreadygottenoption?true:false>,<ZenyCost>,<CashPointCost>,<CustomPointsCost>,<Item1IDCost>,<Item1AmountCost>,<Item2IDCost>,<Item2AmountCost>,<....ETC>);
/*
AddGroupOption Doc
<GroupID> = A group id that is already created in AddGroup()!.
<AllowReRoll?true:false> = allow reroll an item with random option or not
<Allowreusealreadygottenoption?true:false> = for exammple if you have str in the options and the player gor it , can he get it again in another slot?
*/
//AddGroupCost(<GroupID>,<ZenyCost>,<CashPointCost>,<CustomPointsCost>,<Item1IDCost>,<Item1AmountCost>,<Item2IDCost>,<Item2AmountCost>,<....ETC>);
/*
AddGroupCost Doc
<GroupID> = A group id that is already created in AddGroup()!.
<ZenyCost> = the zeny cost (can be 0)
<CashPointCost> = the cashpoints cost (can be 0)
<CustomPointsCost> = if you are using costum points in the script , check out .CustomPointsVariable$ and .CustomPointsName$ at the start of the script (can be 0)
<Item1IDCost> = the item cost
<Item1AmountCost> = the item amount cost
You can use as many item,amount cost at the end of the function.
*/
//AddGroupReRollCost(<GroupID>,<ZenyCost>,<CashPointCost>,<CustomPointsCost>,<Item1IDCost>,<Item1AmountCost>,<Item2IDCost>,<Item2AmountCost>,<....ETC>);
/*
AddGroupReRollCost Doc
<GroupID> = A group id that is already created in AddGroup()!.
<ZenyCost> = the zeny cost (can be 0)
<CashPointCost> = the cashpoints cost (can be 0)
<CustomPointsCost> = if you are using costum points in the script , check out .CustomPointsVariable$ and .CustomPointsName$ at the start of the script (can be 0)
<Item1IDCost> = the item cost
<Item1AmountCost> = the item amount cost
You can use as many item,amount cost at the end of the function.
*/
//AddGroupChance(<GroupID>,<1st Option Chance>,<2nd Option Chance>,<3rd Option Chance>,<4th Option Chance>,<5th Option Chance>);
/*
AddGroupChance Doc
<GroupID> = A group id that is already created in AddGroup()!.
<1st Option Chance> = the Chance to get one of the random options in the slot 1 (can be 0)
<2nd Option Chance> = the Chance to get one of the random options in the slot 2 (can be 0)
<3rd Option Chance> = the Chance to get one of the random options in the slot 3 (can be 0)
<4th Option Chance> = the Chance to get one of the random options in the slot 4 (can be 0)
<5th Option Chance> = the Chance to get one of the random options in the slot 5 (can be 0)
Keep inmind that if the player didn't get lucky for example at the slot 2 , all the chances after will be ignored
you cannot skip a random option slot that would bug the game client.
*/
//AddOpt(<GroupID>,<Location>,<RandomOptionID>,<MinimumValue>,<MaximumValue>);
/*
AddOpt Doc
<GroupID> = A group id that is already created in AddGroup()!.
<Location> = you can spisfiy random option to a location from 1 to 5 , but you can use 0 , if you used 0 it will apply to all locations that doesn't have spisfied random options.
<RandomOptionID> = random option id , you can use the id or the variable , check out the file /rathena/db/re/item_randomopt_db.yml
<MinimumValue> = the minimum value
<MaximumValue> = the maximum value
*/
//AddExclusiveOpt(<RandomOptionID>,<RandomOptionID>,<RandomOptionID>,<RandomOptionID>,<RandomOptionID>);
/*
AddExclusiveOpt Doc
this will help you to prevent a group of random opions typs in the same item in different slots
for example
RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET
RDMOPT_DAMAGE_PROPERTY_WATER_TARGET
RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET
RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET
RDMOPT_DAMAGE_PROPERTY_WIND_TARGET
RDMOPT_DAMAGE_PROPERTY_POISON_TARGET
RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET
RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET
RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET
if the player got 1 of them in a slot , he wont get another one to another slot
*/
//Example!!!>
//this is just an example , this script allow you to create any random option system you want.
//Creating Group id 1 , with Hat items inside.
AddGroup(1,50001,50002,50004,50005,50006,50007,50008,50009,50010,50011,50014,50015);
//Group id 1 Options
AddGroupOption(1,true,false);
//Group id 1 Cost
AddGroupCost(1,0,0,0,677,50);
//Group id 1 ReRoll Cost
AddGroupReRollCost(1,0,0,0,677,50);
//Group id 1 Chances.
AddGroupChance(1,100,100,0,0,0);
//Group id 1 Random Option List. location 0 mean all the slot locations
AddOpt(1,1,RDMOPT_VAR_STRAMOUNT,5,10);
AddOpt(1,1,RDMOPT_VAR_INTAMOUNT,5,10);
//AddOpt(1,0,RDMOPT_VAR_VITAMOUNT,5,10);
//AddOpt(1,0,RDMOPT_VAR_LUKAMOUNT,5,10);
//AddOpt(1,0,RDMOPT_VAR_AGIAMOUNT,5,10);
//AddOpt(1,0,RDMOPT_VAR_DEXAMOUNT,5,10);
AddOpt(1,2,RDMOPT_VAR_MAXHPPERCENT,5,10);
AddOpt(1,2,RDMOPT_VAR_MAXSPPERCENT,5,10);
//those enchantment you wont get unless in slot 5
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,1,100);
AddOpt(1,5,RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET,1,100);
//this mean those random options cannot coexist in the same item!.
AddExclusiveOpt(RDMOPT_DAMAGE_PROPERTY_NOTHING_TARGET,
RDMOPT_DAMAGE_PROPERTY_WATER_TARGET,
RDMOPT_DAMAGE_PROPERTY_GROUND_TARGET,
RDMOPT_DAMAGE_PROPERTY_FIRE_TARGET,
RDMOPT_DAMAGE_PROPERTY_WIND_TARGET,
RDMOPT_DAMAGE_PROPERTY_POISON_TARGET,
RDMOPT_DAMAGE_PROPERTY_SAINT_TARGET,
RDMOPT_DAMAGE_PROPERTY_DARKNESS_TARGET,
RDMOPT_DAMAGE_PROPERTY_TELEKINESIS_TARGET,
RDMOPT_DAMAGE_PROPERTY_UNDEAD_TARGET);
end;
}
Question
dantoki
Hello @sader1992 I'm using your All in one Random Option Script.
I encounter an error.
I think when the random goes to the minimum value of the option it will error.
Link to comment
Share on other sites
1 answer to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.