///////////////////////////////////////////
/// Yaki's Rocket Mini Sentry Template	///
/// Sign Date: 9 Dec 21					///
/// Requested By: Skin King				///
///////////////////////////////////////////

// How this Template works
// Minisentries can fire rockets! Can be wrangled or not wrangled. Only fires rockets when it targets an enemy. 
// (however always fires while wrangled. Haven't figured that one out yet)

// Rockets cost 10 ammo. Change the ammo used on these lines:
// Threshhold amount == Line 288
// Ammo subtracted == Line 291

// The fire rates are on these lines
// Non-Wrangled Sentry (1 sec) == Line 251
// Wrangled Sentry (0.5 sec) == Line 252

// Other useful adjustments
// Origin of where rockets shoot from == Line 205
// How often logic checks sentry status == Line 232

WaveSchedule
{

/// standard mission stuff...

	StartingCurrency		30000
	RespawnWaveTime 1
	CanBotsAttackWhileInSpawnRoom No
	FixedRespawnWaveTime Yes
	
	Wave
	{
		WaveSpawn
		{
			WaitBeforeStarting 5
		}
	}
	Wave
	{
		WaveSpawn
		{
			WaitBeforeStarting 5
		}
	}
	Wave
	{
		WaveSpawn
		{
			WaitBeforeStarting 5
		}
	}
		
	ItemAttributes
	{
		ItemName "The Jag"
		"engy sentry damage bonus" 0	//makes normal bulletfire not deal damage
	}
	
/// ... onto the actual template...
	
	SpawnTemplate 
	{
		Name "initialize_logic_rocketminisentry"
	}
	
	
/// Point Templates for Rocket Mini Sentry

	PointTemplates
	{
		initialize_logic_rocketminisentry
		{
			NoFixUp 1	//IMPORTANT!!
			
/// detect buildings template
			OnSpawnOutput
			{
				Target "rafmod_map_rot"
				Action "Open"
			}
	//filters
			filter_activator_class	//detects all engineer devices
			{
				"targetname" "rafmod_filter_obj"
				"filterclass" "obj_*"
			}
	// func_door needed to detect buildings
			func_door
			{
				"targetname" "rafmod_map_rot"
				"mins" "-10 -10 -10"
				"maxs" "10 10 10"
				"movedir" "-90 0 0"
				"spawnflags" "4104"
				"speed" "0.1"
				"wait" "0.01"
				"OnFullyClosed" "!self,Open,,0,-1"
			}
			
			trigger_multiple
			{
				"targetname" "map_detect_building"
				"mins" "-10000 -10000 -10000"
				"maxs" "10000 10000 10000"
				"filtername" "rafmod_filter_obj"
				"spawnflags" "64"
				"parentname" "rafmod_map_rot"
				"OnStartTouch" "rafmod_filter_obj_sentrygun_is_rocket_mini,TestActivator,,0,-1"
			}
			filter_multi
			{
				"targetname" "rafmod_filter_obj_sentrygun_is_rocket_mini"
				"filter01" "rafmod_filter_obj_sentrygun_rocket_mini"
				"filter02" "rafmod_filter_var_rocket_mini"
				"filter03" "rafmod_filter_is_mini_sentry"
				
				"OnPass" "m_rocket_minisentry,ForceSpawnAtEntityOrigin,!activator,0,-1"
			}
			filter_activator_class
			{
				"targetname" "rafmod_filter_obj_sentrygun_rocket_mini"
				"filterclass" "obj_sentrygun"
			}
			$filter_variable
			{
				"targetname" "rafmod_filter_var_rocket_mini"
				"$name" "rocket_can_fire"
				"$value" "1"
				"Negated" "1"
                "$compare" "equal"
			}
			$filter_sendprop
			{
				"targetname" "rafmod_filter_is_mini_sentry"
				"$name" "m_bMiniBuilding"
				"$value" "1"
			}
			
/// rocket minisentry maker
			env_entity_maker
			{
				"targetname" "m_rocket_minisentry"
				"EntityTemplate" "t_rocket_minisentry"
			}
		}
		
/// Template for "m_rocket_minisentry"
		t_rocket_minisentry
		{
	/// This entire part parents the weapon mimic to the sentry.
	/// The "rafmod_obj_minirocket_trigger" is parented to the sentry ... that way we can adjust the weapon mimic's position on the sentry
	///
			OnSpawnOutput
			{
				Target "rafmod_obj_minirocket_rot"
				Action "Open"
			}
			filter_activator_class
			{
				"targetname" "rafmod_filter_minirocketsentry_obj_sentrygun"
				"filterclass" "obj_sentrygun"
			}
			func_door
			{
				"targetname" "rafmod_obj_minirocket_rot"
				"mins" "-10 -10 -10"
				"maxs" "10 10 10"
				"movedir" "-90 0 0"
				"spawnflags" "4104"
				"speed" "0.1"
				"wait" "0.01"
				"OnFullyClosed" "!self,Open,,0,-1"
			}
			trigger_multiple
			{
				"targetname" "rafmod_obj_minirocket_trigger"
				"parentname" "rafmod_obj_minirocket_rot"
				"filtername" "rafmod_filter_minirocketsentry_obj_sentrygun"
				"mins" "-5 -5 -5"
				"maxs" "5 5 5"
				"spawnflags" "64"
				"OnStartTouchAll" "rafmod_obj_minirocket_trigger,$SetKey$parentname,,0,1"
				"OnStartTouchAll" "rafmod_obj_minirocket_rot,Kill,,0.1,1"
				"OnStartTouchAll" "rafmod_obj_minirocket_trigger,SetParent,!activator,0,1"
				"OnStartTouchAll" "rafmod_obj_minirocket_trigger,SetParentAttachment,muzzle,0.1,1"		///sets the parent attachment to the "muzzle" part of the gun
				"OnStartTouchAll" "!activator,AddOutput,OnUser2 rafmod_filter_rocket_mini_can_fire:TestActivator::0:1,0,1"	//allows for firing of rockets
				"OnStartTouchAll" "!activator,FireUser2,,1,1"	// begins the check loop
				"OnStartTouchAll" "!activator,$SetVar$rocket_can_fire,1,0,1"	//custom var allows us to not have to name the sentrygun
				"OnStartTouchAll" "!activator,$SetKey$spawnflags,8,0,1"		//sets the sentry to have infinite ammo when shooting normally
			}
			
	/// sets the weapon mimic owner to sentry
			OnSpawnOutput
			{
				Target "rafmod_rocket_mini_shooter"
				Action "$SetOwner"
				Param "!activator"
			}
			tf_point_weapon_mimic
			{
				"targetname" "rafmod_rocket_mini_shooter"
				"parentname" "rafmod_obj_minirocket_trigger"
				"origin" "50 0 0"								//use origin to adjust where the rockets shoot from
				"speedmin" "1000"
				"speedmax" "1000"
				"WeaponType" "0"
				"SplashRadius" "160"
				"Damage" "75"
				"teamnum" "2"
				"OnUser1" "!self,FireOnce,,0,-1"
			}
			
	/// Goes through a series of filters to check if:
	/// It's firing + not disabled,
	/// If wrangled (if no, fire every 1 second) (if yes, fire every 0.5 seconds)
	/// ++ This part goes through a relay to ensure the sentry doesn't fire two rockets quickly
	/// "rocket_minisentry_has_ammo_can_fire_math" is used to track ammo
	/// ++ This constantly updates every time the rocket fires, and doesn't get muddled with an Engie repairing ammo
	/// Finally, sees if the sentry has greater than 10 ammo before firing.
	/// ++ comes with firing and empty clip sounds, too!
	
			filter_multi
			{
				"targetname" "rafmod_filter_rocket_mini_can_fire"
				"filter01" "rafmod_filter_rocket_mini_state"
				"filter02" "rafmod_filter_rocket_mini_disabled"
				
				"OnPass"	"rafmod_filter_rocket_mini_is_player_controlled,TestActivator,,0,-1"
				
				"OnFail"	"rafmod_filter_rocket_mini_can_fire,TestActivator,,0.5,-1"
			}
			$filter_sendprop
			{
				"targetname" "rafmod_filter_rocket_mini_is_player_controlled"
				"$name" "m_bPlayerControlled"
				"$value" "1"
				
				"OnPass"	"rafmod_relay_rocket_mini_fire,CancelPending,,0,-1"
				"OnPass"	"rafmod_relay_rocket_mini_fire,FireUser1,,0.01,-1"
				
				"OnFail"	"rafmod_relay_rocket_mini_fire,CancelPending,,0,-1"
				"OnFail"	"rafmod_relay_rocket_mini_fire,FireUser2,,0.01,-1"
			}
			
			logic_relay
			{
				"targetname" "rafmod_relay_rocket_mini_fire"
				
				"OnUser1" "rocket_minisentry_has_ammo_can_fire_math,GetValue,,0.5,-1"	//wrangler fire rate
				"OnUser2" "rocket_minisentry_has_ammo_can_fire_math,GetValue,,1,-1"		//standard, non-wrangled fire rate
			}
		
			math_counter
			{
				"targetname" "rocket_minisentry_has_ammo_can_fire_math"
				"min" "0"			//minimum ammo value
				"max" "150"			//max ammo value
				"startvalue" "150"	//starting ammo value
				
				"OutValue" "!activator,$SetProp$m_iAmmoShells,,0,-1"
				"OutValue" "rafmod_filter_rocket_mini_can_fire,TestActivator,,0,-1"
				
				"OnGetValue" "!activator,$GetProp$m_iAmmoShells,rocket_minisentry_has_ammo_can_fire_math|SetValueNoFire|,0,-1"
				"OnGetValue"	"rafmod_filter_rocket_mini_has_enough_ammo,TestActivator,,0,-1"
			}
	/// The filters
			$filter_sendprop
			{
				"targetname" "rafmod_filter_rocket_mini_state"
				"$name" "m_iState"
				"$value" "2"	//means it's firing or wrangled
			}
			$filter_sendprop
			{
				"targetname" "rafmod_filter_rocket_mini_disabled"
				"$name" "m_bDisabled"
				"$value" "0"	//if disabled
			}
			
	/// Final Touch
	/// This controls how much ammo is used, and subtracts the difference. If it doesn't have enough ammo, loops logic and plays an empty clip sound.
			$filter_sendprop	//compares if ammo if >=10
			{
				"targetname" "rafmod_filter_rocket_mini_has_enough_ammo"
				"$name" "m_iAmmoShells"
				"$value" "10"
				"$compare" "greater than or equal"

				"OnPass" "rocket_minisentry_has_ammo_can_fire_math,Subtract,10,0,-1"	//Subtracts 10 ammo on mini
				"OnPass" "rafmod_rocket_mini_shooter,FireUser1,,0,-1"					//fires the rocket, used in conjunction with "rafmod_filter_rocket_mini_has_enough_ammo"
				"OnPass" "!activator,$PlaySound,Building_Sentrygun.FireRocket,0,-1"			//sound for rocket fire
				
				"OnFail" "rocket_minisentry_has_ammo_can_fire_math,Add,0,0,-1"			//forces OutValue to refire
				"OnFail" "!activator,$PlaySound,Building_Sentrygun.Empty,0,-1"
			}
			RemoveIfKilled "rafmod_filter_minirocketsentry_obj_sentrygun"
			RemoveIfKilled "rafmod_obj_minirocket_trigger"
			RemoveIfKilled "rafmod_rocket_mini_shooter"
			RemoveIfKilled "rafmod_filter_rocket_mini_can_fire"
			RemoveIfKilled "rafmod_filter_rocket_mini_is_player_controlled"
			RemoveIfKilled "rafmod_relay_rocket_mini_fire"
			RemoveIfKilled "rocket_minisentry_has_ammo_can_fire_math"
			RemoveIfKilled "rafmod_filter_rocket_mini_state"
			RemoveIfKilled "rafmod_filter_rocket_mini_disabled"
			RemoveIfKilled "rafmod_filter_rocket_mini_has_enough_ammo"
		}
	}
}