All pastes #980366 Raw Edit

Miscellany

public text v1 · immutable
·published 2008-04-10 23:22 UTC
rendered paste body
/*	Object: Drone Combat - Designed to handle use of drones in a defensive manner, including 
		Launching, Targeting, Attacking, and Recalling.
	I designed this for use with obj_Miner, so that we may use our barges to tank rats while
	our drones destroy them. This way, we really don't have to worry about our drones being
	popped nearly as much, if at all. Just make sure you have a good tank.
		--Stealthy										*/

objectdef obj_DroneCombat
{
	/* Variables used in pulse checking */
	variable time NextPulse
	variable int PulseIntervalInSeconds = 3

	/* Variables used by DroneCombat */
	variable bool HaveResetTargets = FALSE
	variable index:entity TargetList
	variable index:entity LockedTargets
	variable iterator TargetIterator
	variable iterator Target
	variable bool StartedAttack = FALSE
	variable int MaxTargets
	variable bool NeedDefense = FALSE
	variable string DefendState = "IDLE"

	/* DEBUG SWITCH */
	variable bool Debug = TRUE

	method Initialize()
	{
		BotModules:Insert["DroneCombat"]
		Event[OnFrame]:AttachAtom[This:Pulse]
		UI:UpdateConsole["obj_DroneCombat: Initialized"]
	}

	method Pulse()
	{
		if ${EVEBot.Paused}
		{
			return
		}
		if ${Time.Timestamp} > ${This.NextPulse.Timestamp}
		{
			This.NextPulse:Set[${Time.Timestamp}]
			This.NextPulse.Second:Inc[${This.PulseIntervalInSeconds}]
			This.NextPulse:Update
			This:UpdateLists
			if ${Config.Combat.LaunchCombatDrones}
			{
				if ${Social.IsSafe} && ${This.RatsOnMe} && ${Me.Ship.ShieldPct} < 100
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: Detected threat, handling"]
					This.NeedDefense:Set[TRUE]
				}
				elseif !${This.RatsOnMe} && ${This.NeedDefense}
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: No drone threat"]
					if ${Ship.Drones.DronesInSpace} > 0
						call Ship.Drones.ReturnAllToDroneBay
					This.NeedDefense:Set[FALSE]
					return
				}
				elseif ${This.RatsOnMe} && ${This.NeedDefense}
				{
					if !${Social.IsSafe}
					{
						This.NeedDefense:Set[FALSE]
						UI:UpdateConsole["DroneDefense: Aborting drone routines due to hostiles"]
						return
					}
					This:Defend
					return
				}
			}	
		}
	}

	/* Update the target lists and iterators, etc */
	method UpdateLists()
	{
		Me:DoGetTargetedBy[TargetList, CategoryID, 11]
		TargetList:GetIterator[TargetIterator]
		Me:DoGetTargets[LockedTargets]
		LockedTargets:GetIterator[Target]

		/* Figure out how many things we can really have targeted */
		if (${Me.Ship.MaxLockedTargets} >= ${Me.MaxLockedTargets})
		{
			MaxTargets:Set[${Me.MaxLockedTargets}]
		}
		else
		{
			MaxTargets:Set[${Me.Ship.MaxLockedTargets}]
		}
	}

	/* Do we currently have rats on us? */
	member:bool RatsOnMe()
	{
		if (${TargetIterator:First(exists)})
		{
			return TRUE
		}
		return FALSE
	}

	method Defend()
	{

		/* While it's safe for us to defend ourselves... */
		while (${Social.IsSafe} && ${This.RatsOnMe})
		{
			/* Return having done nothing if we're targeting something */
			if (${Me.GetTargeting} > 0)
			{
				if ${This.Debug}
					UI:UpdateConsole["DroneDefense: Waiting on a target"]
				return
			}
	
			/* Send out our drones! */
			if (${Ship.Drones.DronesInSpace} == 0)
			{
				if ${This.Debug}
					UI:UpdateConsole["DroneDefense: Launching drones"]
				Ship.Drones:LaunchAll[]
				return
			}
	
			/* If we're full of targets... */
			if (!${This.STartedAttack} && ${This.MaxTargets} == ${Me.GetTargets})
			{
				if ${This.Debug}
					UI:UpdateConsole["DroneDefense: Unlocking a target because Ihave too many"]
				if (${Target:First(exists)})
				{
					Target.Value:UnlockTarget
				}
				return
			}
			/* We're not full of targets now! */
			elseif (!${This.HaveResetTargets} && ${Me.GetTargets} < ${This.MaxTargets})
			{
				if (${TargetIterator:First(exists)})
				{
					if ${This.Debug}
						UI:UpdateConsole["Starting to lock a target"]
					/* Lock its ass */
					TargetIterator.Value:LockTarget
					This.HaveResetTargets:Set[TRUE]
					return
				}
			}
			
			/* Targeting has been taken care of, bust some fuckers */
			if (${This.HaveResetTargets} && !${This.StartedAttack})
			{
				if (${Me.ActiveTarget.ID} != ${TargetIterator.Value.ID})
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: Making ${TargetIterator.Value.ID} active target"]
					echo ${TargetIterator.Value.Name}
					TargetIterator.Value:MakeActiveTarget
					return
				}
				if ${This.Debug}
					UI:UpdateConsole["DroneDefense: Sending in the drones!"]
				Ship.Drones:SendDrones
				This.StartedAttack:Set[TRUE]
				return
			}
			
			/* Make sure we're 
			if (${This.StartedAttacks})
			{
				return
			}
				
	
			/* If our "target" is dead, we need to clean up */
			if (${Target.Value.StructurePct} == 0)
			{
				if ${This.Debug}
					UI:UpdateConsole["DroneDefense: Drone target is dead"]
				/* If there is no next target, recall drones */
				if !${Target:Next(exists)}
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: No more targets, recalling drones"]
					This.StartedAttack:Set[FALSE]
					This.HaveResetTargets:Set[FALSE]
					return
				}

			}
			return
		}
		if ${This.Debug}
			UI:UpdateConsole["DroneDefense: Broke the while loop, cleaning up"]
		This.StartedAttack:Set[FALSE]
		This.HaveResetTargets:Set[FALSE]
		return
	}

	/* Helper methods */
}