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