All pastes #1009876 Raw Edit

Mine

public text v1 · immutable
#1009876 ·published 2008-05-06 23:15 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
			/* Return if we're in station */
			if (${Me.InStation})
			{
				return
			}
			This:UpdateLists
			if ${Config.Combat.LaunchCombatDrones} && \
				(${Miner.CurrentState.Equal[MINE]} || ${Miner.CurrentState.Equal[UNKNOWN]} || \
				${Miner.CurrentState.Equal[IDLE]})
			{
				if ${Social.IsSafe} && !${This.NeedDefense} && ${This.RatsOnMe} && ${Me.Ship.ShieldPct} < 100
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: Detected threat, handling"]
					This.NeedDefense:Set[TRUE]
					return
				}
				elseif !${This.RatsOnMe} && ${This.NeedDefense}
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: No drone threat"]
					This.NeedDefense:Set[FALSE]
					This.StartedAttack:Set[FALSE]
					This.HaveResetTargets:Set[FALSE]
					return
				}
				elseif ${This.RatsOnMe} && ${This.NeedDefense}
				{
					if !${Social.IsSafe}
					{
						This.StartedAttack:Set[FALSE]
						This.HaveResetTargets:Set[FALSE]
						This.NeedDefense:Set[FALSE]
						UI:UpdateConsole["DroneDefense: Aborting drone routines due to hostiles"]
						return
					}
					This:Defend
					return
				}
				if ${Ship.Drones.DronesInSpace} > 0
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneCombat: Recalling drones"]
					EVE:DronesReturnToDroneBay[Ship.Drones.ActiveDroneIDList]
				}
			}
			else
			{
				echo "Mine State ${Miner.CurrentState}"
				echo "Ship Drones ${Ship.Drones.DronesInBay}"
			}
		}
	}

	/* 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 (${Target:Last(exists)} && ${TargetIterator:First(exists)})
				{
					if ${This.Debug}
						UI:UpdateConsole["DroneDefense: Unlocking a target because Ihave too many"]
					if (${Target.Value.ID} != ${TargetIterator.Value.ID})
					{
						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 */
}