/**
 * Hercules Script
 *
 * Feature: Hercules Battlegrounds
 * Version: 1.0
 * Author: eAmod & Smokexyz
 *
 * Description: Hercules Battlegrounds plugin.
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

bat_b02,328,150,0	script	Guillaume Crystal::Guillaume_Flag	OBJ_A2,1,1,{
	end;

OnTouch:
	if ($@Arena_Status != 1 || getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") != "Flavius_CTF" || Hp < 1)
		end;

	if (getcharid(4) == $@BG_Team2 && .Flag_Status < 2) { // Flag Captured
		set .Flag_Status, 2; // Taken
		set .Flag_Carrier, getcharid(0);

		sc_end SC_HIDING;
		sc_end SC_CLOAKING;
		sc_end SC_CHASEWALK;
		// Renewal invisibility
		sc_end SC_CLOAKINGEXCEED;
		sc_end SC_CAMOUFLAGE;
		sc_end SC__INVISIBILITY;

		// Disable Player's Item Use
		disable_items;

		mapannounce "bat_b02","Guillaume Crystal Taken by [ " + strcharinfo(0) + " ]",1,0xFF0000;
//		bg_rankpoints "ctf_taken",1;
		disablenpc "Guillaume_Flag";
		addtimer 2000, "Flavius_CTF::OnBlueFlash";
		stopnpctimer;
	} else if (getcharid(4) == $@BG_Team1) {
		if (.Flag_Status == 0 && getvariableofnpc(.Flag_Carrier,"Croix_Flag") == getcharid(0)) {
			set getvariableofnpc(.Flag_Carrier,"Croix_Flag"),0;
			set .Flag_Carrier, 0;
			mapannounce "bat_b02","Croix Crystal Captured by [ " + strcharinfo(0) + " ]!!",1,0x0000FF;
//			bg_rankpoints "ctf_captured",1;
			// Enable player's item usage.
			enable_items;
			stopnpctimer;
			donpcevent "Flavius_CTF::OnGuillaumeScore";
		}
		else if (.Flag_Status == 1) {
			mapannounce "bat_b02","Guillaume Crystal Returned by [ " + strcharinfo(0) + " ]!!",1,0x0000FF;
//			bg_rankpoints "fame",1;
			disablenpc "Guillaume_Flag";
			sleep 2000;
			movenpc "Guillaume_Flag",328,150; // Back to Base
			set .Flag_Status, 0;
			initnpctimer;
			enablenpc "Guillaume_Flag";
		}
	}
	end;

OnTimer2000:
	stopnpctimer;
	if (.Flag_Status < 2) {
		getmapxy .@m$, .@x, .@y, 1;
		hBG_viewpointmap "bat_b02",1, .@x, .@y, 1, 0x0000FF;
		specialeffect 223;
		initnpctimer;
	}
	end;

OnBase:
	movenpc "Guillaume_Flag",328,150;
	set .Flag_Status, 0;
	set .Flag_Carrier, 0;
	initnpctimer;
	enablenpc "Guillaume_Flag";
	end;
}

bat_b02,62,150,0	script	Croix Crystal::Croix_Flag	OBJ_B2,1,1,{
	end;

OnTouch:
	if ($@Arena_Status != 1 || getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") != "Flavius_CTF" || Hp < 1)
		end;

	if (getcharid(4) == $@BG_Team1 && .Flag_Status < 2) { // Flag Captured
		set .Flag_Status, 2; // Taken
		set .Flag_Carrier, getcharid(0);

		sc_end SC_HIDING;
		sc_end SC_CLOAKING;
		sc_end SC_CHASEWALK;
		// Renewal invisibility
		sc_end SC_CLOAKINGEXCEED;
		sc_end SC_CAMOUFLAGE;
		sc_end SC__INVISIBILITY;

		// Block Player's Item Use
		disable_items;

		mapannounce "bat_b02","Croix Crystal Taken by [ " + strcharinfo(0) + " ]",1,0x0000FF;
		disablenpc "Croix_Flag";
		addtimer 2000, "Flavius_CTF::OnRedFlash";
		stopnpctimer;
	} else if (getcharid(4) == $@BG_Team2) {
		if (.Flag_Status == 0 && getvariableofnpc(.Flag_Carrier,"Guillaume_Flag") == getcharid(0)) {
			set getvariableofnpc(.Flag_Carrier,"Guillaume_Flag"),0;
			set .Flag_Carrier, 0;
			mapannounce "bat_b02","Guillaume Crystal Captured by [ " + strcharinfo(0) + " ]!!",1,0xFF0000;
//			bg_rankpoints "ctf_captured",1;
			// Enable Player's Item Use
			enable_items;
			stopnpctimer;
			donpcevent "Flavius_CTF::OnCroixScore";
		}
		else if (.Flag_Status == 1) {
			mapannounce "bat_b02","Croix Crystal Returned by [ " + strcharinfo(0) + " ]!!",1,0xFF0000;
//			bg_rankpoints "fame",1;
			disablenpc "Croix_Flag";
			sleep 2000;
			movenpc "Croix_Flag",62,150; // Back to Base
			set .Flag_Status, 0;
			initnpctimer;
			enablenpc "Croix_Flag";
		}
	}
	end;

OnTimer2000:
	stopnpctimer;
	if (.Flag_Status < 2) {
		getmapxy .@m$, .@x, .@y, 1;
		hBG_viewpointmap "bat_b02",1, .@x, .@y, 2, 0xFF0000;
		specialeffect 223;
		initnpctimer;
	}
	end;

OnBase:
	movenpc "Croix_Flag",62,150;
	set .Flag_Status, 0;
	set .Flag_Carrier, 0;
	initnpctimer;
	enablenpc "Croix_Flag";
	end;
}

// Battleground Engine
// *********************************************************************

-	script	Flavius_CTF	FAKE_NPC,{
	end;

OnBlueFlash:
	if (getvariableofnpc(.Flag_Carrier,"Guillaume_Flag") == getcharid(0) && $@Arena_Status == 1 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF") {
		getmapxy .@m$, .@x, .@y, 0;
		hBG_viewpointmap "bat_b02",1, .@x, .@y, 1, 0x0000FF;
		specialeffect(EF_BOWLINGBASH);
		emotion e_hlp,1;
		addtimer 2000, "Flavius_CTF::OnBlueFlash";
		percentheal -5,-5;
	}
	end;

OnRedFlash:
	if (getvariableofnpc(.Flag_Carrier,"Croix_Flag") == getcharid(0) && $@Arena_Status == 1 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF") {
		getmapxy .@m$, .@x, .@y, 0;
		hBG_viewpointmap "bat_b02",1, .@x, .@y, 2, 0xFF0000;
		specialeffect(EF_BOWLINGBASH);
		emotion e_hlp,1;
		addtimer 2000, "Flavius_CTF::OnRedFlash";
		percentheal -5,-5;
	}
	end;

OnInit:
	disablenpc "Guillaume_Flag";
	disablenpc "Croix_Flag";
	end;

OnGuillaumeQuit:
	setquest 8506; // Deserter
	set @killer_bg_src, 0;
	if ($@Arena_Status != 0 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF")
		donpcevent "BG_Queue_Handler::OnQueueJoinEvent";
OnGuillaumeDie:
	if ($@Arena_Status == 1 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF" && getvariableofnpc(.Flag_Carrier,"Croix_Flag") == getcharid(0)) { // Drop Flag
		set getvariableofnpc(.Flag_Carrier,"Croix_Flag"), 0;
		// Enable Player's Item Use
		enable_items;
		getmapxy .@m$, .@x, .@y, 0;
		movenpc "Croix_Flag", .@x, .@y;
		mapannounce "bat_b02","Croix Flag Droped by [ " + strcharinfo(0) + " ]",1,0xFF0000;
//		bg_rankpoints "ctf_droped",1;
//		bg_rankpoints "fame",1,@killer_bg_src;
		set getvariableofnpc(.Flag_Status,"Croix_Flag"), 1; // OnFloor
		initnpctimer "Croix_Flag";
		enablenpc "Croix_Flag";
	}
	end;

OnCroixQuit:
	setquest 8506; // Deserter
	set @killer_bg_src, 0;
	if ($@Arena_Status != 0 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF")
		donpcevent "BG_Queue_Handler::OnQueueJoinEvent";
OnCroixDie:
	if ($@Arena_Status == 1 && getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") == "Flavius_CTF" && getvariableofnpc(.Flag_Carrier,"Guillaume_Flag") == getcharid(0)) { // Drop Flag
		set getvariableofnpc(.Flag_Carrier,"Guillaume_Flag"), 0;
		// Enable Player's Item Use
		enable_items;
		getmapxy .@m$, .@x, .@y, 0;
		movenpc "Guillaume_Flag", .@x, .@y;
		mapannounce "bat_b02","Guillaume Flag Droped by [ " + strcharinfo(0) + " ]",1,0x0000FF;
//		bg_rankpoints "ctf_droped",1;
//		bg_rankpoints "fame",1,@killer_bg_src;
		set getvariableofnpc(.Flag_Status,"Guillaume_Flag"), 1; // OnFloor
		initnpctimer "Guillaume_Flag";
		enablenpc "Guillaume_Flag";
	}
	end;

OnBuildTeams:
	set $@BG_Team1,hBG_team_create("bat_b02",390,10,0,"Flavius_CTF::OnGuillaumeQuit","Flavius_CTF::OnGuillaumeDie");
	set $@BG_Team2,hBG_team_create("bat_b02",10,290,1,"Flavius_CTF::OnCroixQuit","Flavius_CTF::OnCroixDie");
	end;

OnReady:
	if (getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") != "Flavius_CTF")
		end;

	initnpctimer;
	// BG Variables
	set .guillaume_score, 0;
	set .croix_score, 0;
	sleep 2000;
	bg_warp $@BG_Team1,"bat_b02",311,224;
	bg_warp $@BG_Team2,"bat_b02",87,75;
	sleep 2000;
	// Respawn NPC's
	donpcevent "#guictf_respawn::OnBGStart";
	donpcevent "#croctf_respawn::OnBGStart";
	// Start Match!!
	donpcevent "Flavius_CTF::OnMatchStart";
	end;

OnMatchStart:
	if ($@Arena_Status != 1 || getvariableofnpc(.BG_Arena$,"BG_Queue_Handler") != "Flavius_CTF")
		end;

	// Flags2Base
	donpcevent "Guillaume_Flag::OnBase";
	donpcevent "Croix_Flag::OnBase";
	mapannounce "bat_b02","The Flags have been set to their Bases!!",8;
	end;

OnGuillaumeScore:
	set .guillaume_score, .guillaume_score + 1;
	donpcevent "Flavius_CTF::OnMatchStop";
	end;

OnCroixScore:
	set .croix_score, .croix_score + 1;
	donpcevent "Flavius_CTF::OnMatchStop";
	end;

OnMatchStop:
	disablenpc "Guillaume_Flag";
	disablenpc "Croix_Flag";
	hBG_updatescore "bat_b02",.guillaume_score,.croix_score;

	hBG_viewpointmap "bat_b02",2, 0, 0, 1, 0x0000FF;
	hBG_viewpointmap "bat_b02",2, 0, 0, 2, 0xFF0000;

	if (.guillaume_score > 2) { // Guillaume Won
		mapannounce "bat_b02","The Guillaume army has won the Battle of Flavius CTF!",1,0x0000FF;
		donpcevent "Flavius_CTF::OnMatchEnd";
	} else if (.croix_score > 2) { // Croix Won
		mapannounce "bat_b02","The Croix army has won the Battle of Flavius CTF!",1,0xFF0000;
		donpcevent "Flavius_CTF::OnMatchEnd";
	} else { // Keep Playing
		sleep 8000;
		donpcevent "Flavius_CTF::OnMatchStart";
	}
	end;

OnTimer600000:
	set getvariableofnpc(.allowjoin,"BG_Queue_Handler"),0;
	mapannounce "bat_b02","The Battle will end in 5 minutes!!",1,0xA0522D;
	end;

OnTimer840000:
	mapannounce "bat_b02","The Battle will end in 1 minute!!",1,0xA0522D;
	end;

OnTimer900000:
	disablenpc "Guillaume_Flag";
	disablenpc "Croix_Flag";

	hBG_viewpointmap "bat_b02",2, 0, 0, 1, 0x0000FF;
	hBG_viewpointmap "bat_b02",2, 0, 0, 2, 0xFF0000;

	if (.guillaume_score > .croix_score)
		mapannounce "bat_b02","The Guillaume army has won the Battle of Flavius CTF!",1,0x0000FF;
	else if (.guillaume_score < .croix_score)
		mapannounce "bat_b02","The Croix army has won the Battle of Flavius CTF!",1,0xFF0000;
	else
		mapannounce "bat_b02","The battle is over. This is a Tie...!",1,0xA0522D;
	donpcevent "Flavius_CTF::OnMatchEnd";
	end;

OnMatchEnd:
	stopnpctimer;
	disablenpc "Guillaume_Flag";
	disablenpc "Croix_Flag";
	donpcevent "#guictf_respawn::OnBGStop";
	donpcevent "#croctf_respawn::OnBGStop";
	set $@Arena_Status, 2;
	// =======================================================
	// Team Rewards
	// =======================================================
	if (.guillaume_score > .croix_score) {
		hBG_reward $@BG_Team1,7773,15 + .guillaume_score,0,0,"BG_CTF",1,3,0;
		hBG_reward $@BG_Team2,7773,10 + .croix_score,0,0,"BG_CTF",1,3,2;
	} else if (.croix_score > .guillaume_score) {
		hBG_reward $@BG_Team1,7773,10 + .guillaume_score,0,0,"BG_CTF",1,3,2;
		hBG_reward $@BG_Team2,7773,15 + .croix_score,0,0,"BG_CTF",1,3,0;
	} else {
		hBG_reward $@BG_Team1,7773,10 + .guillaume_score,0,0,"BG_CTF",1,3,1;
		hBG_reward $@BG_Team2,7773,10 + .croix_score,0,0,"BG_CTF",1,3,1;
	}
	// =======================================================
	set .guillaume_score, 0;
	set .croix_score, 0;
	sleep 5000;
	// Restart Rotation
	donpcevent "BG_Queue_Handler::OnEndArena";
	hBG_updatescore "bat_b02",0,0;
	end;
}

// Battleground Respawn
// *********************************************************************

bat_b02,390,10,0	script	#guictf_respawn	HIDDEN_WARP_NPC,{
	end;

OnBGStart:
	initnpctimer;
	end;

OnBGStop:
	stopnpctimer;
	end;

OnTimer24000:
	specialeffect(EF_SANCTUARY);
	end;

OnTimer25000:
	areapercentheal "bat_b02",382,2,397,17,100,100;
	areawarp "bat_b02",382,2,397,17,"bat_b02",311,224;
	initnpctimer;
	end;
}

bat_b02,10,290,0	script	#croctf_respawn	HIDDEN_WARP_NPC,{
	end;

OnBGStart:
	initnpctimer;
	end;

OnBGStop:
	stopnpctimer;
	end;

OnTimer24000:
	specialeffect(EF_SANCTUARY);
	end;

OnTimer25000:
	areapercentheal "bat_b02",2,282,17,297,100,100;
	areawarp "bat_b02",2,282,17,297,"bat_b02",87,75;
	initnpctimer;
	end;
}

// Flags
// *********************************************************************

bat_b02,304,231,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat23	1_FLAG_LION
bat_b02,319,231,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat24	1_FLAG_LION
bat_b02,304,218,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat25	1_FLAG_LION
bat_b02,319,218,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat26	1_FLAG_LION
bat_b02,304,231,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat27	1_FLAG_LION
bat_b02,304,231,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat28	1_FLAG_LION
bat_b02,335,142,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat29	1_FLAG_LION
bat_b02,335,157,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat30	1_FLAG_LION
bat_b02,390,16,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat31	1_FLAG_LION
bat_b02,292,163,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat32	1_FLAG_LION
bat_b02,292,136,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat33	1_FLAG_LION
bat_b02,241,185,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat34	1_FLAG_LION
bat_b02,247,179,1	duplicate(Guillaume camp#bat)	Guillaume camp#bat35	1_FLAG_LION

bat_b02,96,81,1	duplicate(Croix camp#bat)	Croix camp#bat22	1_FLAG_EAGLE
bat_b02,96,68,1	duplicate(Croix camp#bat)	Croix camp#bat23	1_FLAG_EAGLE
bat_b02,79,81,1	duplicate(Croix camp#bat)	Croix camp#bat24	1_FLAG_EAGLE
bat_b02,79,68,1	duplicate(Croix camp#bat)	Croix camp#bat25	1_FLAG_EAGLE
bat_b02,96,81,1	duplicate(Croix camp#bat)	Croix camp#bat26	1_FLAG_EAGLE
bat_b02,96,81,1	duplicate(Croix camp#bat)	Croix camp#bat27	1_FLAG_EAGLE
bat_b02,59,164,1	duplicate(Croix camp#bat)	Croix camp#bat28	1_FLAG_EAGLE
bat_b02,59,137,1	duplicate(Croix camp#bat)	Croix camp#bat29	1_FLAG_EAGLE
bat_b02,10,296,1	duplicate(Croix camp#bat)	Croix camp#bat30	1_FLAG_EAGLE
bat_b02,110,162,1	duplicate(Croix camp#bat)	Croix camp#bat31	1_FLAG_EAGLE
bat_b02,110,137,1	duplicate(Croix camp#bat)	Croix camp#bat32	1_FLAG_EAGLE
bat_b02,152,120,1	duplicate(Croix camp#bat)	Croix camp#bat33	1_FLAG_EAGLE
bat_b02,158,114,1	duplicate(Croix camp#bat)	Croix camp#bat34	1_FLAG_EAGLE

// MapFlags
// *********************************************************************

bat_b02	mapflag	battleground	2
bat_b02	mapflag	nomemo
bat_b02	mapflag	nosave	SavePoint
bat_b02	mapflag	noteleport
bat_b02	mapflag	nowarp
bat_b02	mapflag	nowarpto
bat_b02	mapflag	noreturn
bat_b02	mapflag	nobranch
bat_b02	mapflag	nopenalty
//bat_b02	mapflag	noemergencycall