123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- //===== 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;
- }
|