rathena/npc/custom/etc/autopot.txt
Euphy 163a98cbc4 Major custom folder update!
These scripts have been chosen for being unique and useful, yet structurally simple. In this way, they can serve as usable reference material for future user scripts.

Contents:
* Battleground: bg_emp (Emperium breaker), bg_pvp (PVP match)
* Event: mvp_ladder (kill every MVP to win), devil_square (3-round monster summoning event)
* Utility: card_seller (sells all monster cards), mvp_room (private MVP summoning room), autopot (automatically use potions when hit)
Credits to AnnieRuru for offering up her scripts and modifying them for use.

Other changes:
* Moved previous custom battleground scripts into 'battleground/unofficial/'.
* Moved custom holiday event scripts into 'event/holiday/'.

Signed-off-by: Euphy <euphy.raliel@rathena.org>
2014-02-02 17:35:28 -05:00

189 lines
5.5 KiB
Plaintext

//===== rAthena Script =======================================
//= Auto-Potion
//===== By: ==================================================
//= Euphy
//===== Current Version: =====================================
//= 1.0
//===== Compatible With: =====================================
//= rAthena Project
//===== Description: =========================================
//= Provides an @autopot command to automatically use potions
//= when hit (i.e. 'autobonus2').
//===== Additional Comments: =================================
//= 1.0 First version. [Euphy]
//============================================================
- script #autopot -1,{
OnInit:
bindatcmd("autopot",strnpcinfo(0)+"::OnCommand");
end;
L_Help:
dispbottom "Available commands:";
dispbottom " @autopot <item id> {<min hp % [1..100]> {<delay [50..1000]>}}";
dispbottom " @autopot <on|off>";
dispbottom " @autopot list";
dispbottom " @autopot info";
dispbottom " @autopot help";
return;
L_Info:
dispbottom "------ Auto-Potion Information ------";
dispbottom "POTION: " + getitemname(@autopot_id) + " (" + @autopot_id + ")";
dispbottom "MIN HP: " + @autopot_min + " %";
dispbottom "DELAY: " + @autopot_delay + " ms";
dispbottom "---------------------------------------------";
return;
L_Start:
.@potion = getarg(0);
.@min = getarg(1);
.@delay = getarg(2);
if (.@min < 1 || .@min > 100) .@min = 90;
if (.@delay < 50 || .@delay > 1000) .@delay = 50; // lower values will increase server strain
switch (.@potion) {
case 501:
case 507:
case 545:
case 569: .@effect = EF_POTION1; break;
case 502: .@effect = EF_POTION2; break;
case 503:
case 508:
case 546:
case 579:
case 11500: .@effect = EF_POTION3; break;
case 504:
case 509:
case 547:
case 11501:
case 11503:
case 11548: .@effect = EF_POTION4; break;
case 512:
case 513:
case 515:
case 516:
case 548:
case 549:
case 550:
case 582:
case 607: .@effect = EF_POTION7; break;
default: .@effect = EF_EXIT; break;
}
if (BaseLevel < getiteminfo(.@potion,12)) {
message strcharinfo(0), "Your base level is too low to use '" + getitemname(.@potion) + "'.";
end;
}
@autopot_id = .@potion;
@autopot_min = .@min;
@autopot_delay = .@delay;
@autopot_eff = .@effect;
@autopot_none = 0;
bonus_script "{ callfunc \"start_autopot\"; }",86400,8,0,SI_INCHEALRATE;
message strcharinfo(0), "Auto-Potion started.";
callsub L_Info;
return;
OnCommand:
if (!getarraysize(.@atcmd_parameters$)) {
message strcharinfo(0), "Invalid syntax.";
callsub L_Help;
end;
}
.@command$ = strtolower(.@atcmd_parameters$[0]);
if (.@command$ == "on") {
if (@autopot_min)
message strcharinfo(0), "Auto-Potion is already on.";
else if (@autopot_min_) {
@autopot_min = @autopot_min_;
@autopot_min_ = 0;
message strcharinfo(0), "Auto-Potion enabled.";
callsub L_Info;
} else {
message strcharinfo(0), "Auto-Potion has not been set.";
callsub L_Help;
}
end;
} else if (.@command$ == "off") {
if (!@autopot_min)
message strcharinfo(0), "Auto-Potion is already off.";
else {
@autopot_min_ = @autopot_min;
@autopot_min = 0;
message strcharinfo(0), "Auto-Potion disabled.";
}
end;
} else if (.@command$ == "list") { // credits to AnnieRuru
getinventorylist;
for (; .@i < @inventorylist_count; .@i++) {
if (getiteminfo(@inventorylist_id[.@i],2) == IT_HEALING) {
.@items[.@count] = @inventorylist_id[.@i];
.@menu$ = .@menu$ + sprintf("~ ^0055FF%s^000000 (%dx):", getitemname(@inventorylist_id[.@i]), countitem(@inventorylist_id[.@i]));
.@count++;
}
}
if (.@count) { // 'mes' window needed if player is hit during selection
mes "[ Auto-Potion ]";
mes "Select a healing item.";
.@select = select(.@menu$ + " ^777777Cancel^000000") - 1;
if (.@select != .@count)
callsub L_Start, .@items[.@select], 0, 0;
close2;
} else
message strcharinfo(0), "There are no healing items in your inventory.";
end;
} else if (.@command$ == "info") {
if (@autopot_min) {
message strcharinfo(0), "Auto-Potion information is displayed below.";
callsub L_Info;
} else
message strcharinfo(0), "Auto-Potion is not enabled.";
end;
} else if (.@command$ == "help") {
message strcharinfo(0), "List of commands is displayed below.";
callsub L_Help;
end;
} else {
.@potion = atoi(.@atcmd_parameters$[0]);
if (getiteminfo(.@potion,2) != IT_HEALING) {
message strcharinfo(0), getitemname(.@potion) + " is not a healing item.";
end;
}
callsub L_Start, .@potion, atoi(.@atcmd_parameters$[1]), atoi(.@atcmd_parameters$[2]);
end;
}
}
function script start_autopot {
if (@autopot_active) end;
@autopot_active = 1;
while (Hp && Hp * 100 / MaxHp < @autopot_min) {
if (!countitem(@autopot_id)) {
if (@autopot_none <= gettimetick(2)) {
@autopot_none = gettimetick(2) + 10;
dispbottom "There are no '" + getitemname(@autopot_id) + "' in your inventory.";
}
break;
}
if (getstatus(SC_BERSERK) || getstatus(SC_SATURDAYNIGHTFEVER) || getstatus(SC_GRAVITATION) ||
getstatus(SC_TRICKDEAD) || getstatus(SC_HIDING) || getstatus(SC__SHADOWFORM) || getstatus(SC__INVISIBILITY) ||
getstatus(SC__MANHOLE) || getstatus(SC_KAGEHUMI) || getstatus(SC_HEAT_BARREL_AFTER))
break;
if (getstatus(SC_STONE) || getstatus(SC_FREEZE) || getstatus(SC_STUN) || getstatus(SC_SLEEP))
;
else {
delitem @autopot_id,1;
consumeitem @autopot_id;
specialeffect2 @autopot_eff;
}
sleep2 @autopot_delay;
}
@autopot_active = 0;
autobonus2 "{}",10000,1,BF_WEAPON|BF_MAGIC;
end;
}