/* 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 */
}