本文整理汇总了C#中Actions.GetParameterValue方法的典型用法代码示例。如果您正苦于以下问题:C# Actions.GetParameterValue方法的具体用法?C# Actions.GetParameterValue怎么用?C# Actions.GetParameterValue使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Actions
的用法示例。
在下文中一共展示了Actions.GetParameterValue方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: KillClosestByNameAction
private void KillClosestByNameAction(Actions.Action action)
{
bool notTheClosest;
if (!bool.TryParse(action.GetParameterValue("notclosest"), out notTheClosest))
{
notTheClosest = false;
}
if (Cache.Instance.NormalApproach) Cache.Instance.NormalApproach = false;
List<string> targetNames = action.GetParameterValues("target");
// No parameter? Ignore kill action
if (targetNames.Count == 0)
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "No targets defined!", Logging.Teal);
Nextaction();
return;
}
//
// the way this is currently written is will NOT stop after killing the first target as intended, it will clear all targets with the Name given
//
Cache.Instance.AddPrimaryWeaponPriorityTarget(Cache.Instance.PotentialCombatTargets.Where(t => targetNames.Contains(t.Name)).OrderBy(t => t.Distance).Take(1).FirstOrDefault(),PrimaryWeaponPriority.PriorityKillTarget, "CombatMissionCtrl.KillClosestByName");
//if (Settings.Instance.TargetSelectionMethod == "isdp")
//{
if (Cache.Instance.GetBestPrimaryWeaponTarget((double)Distances.OnGridWithMe, false, "combat", Cache.Instance.PotentialCombatTargets.OrderBy(t => t.Distance).Take(1).ToList()))
_clearPocketTimeout = null;
//}
//else //use new target selection method
//{
// if (Cache.Instance.__GetBestWeaponTargets((double)Distances.OnGridWithMe, Cache.Instance.PotentialCombatTargets.Where(e => !e.IsSentry || (e.IsSentry && Settings.Instance.KillSentries)).OrderBy(t => t.Distance).Take(1).ToList()).Any())
// _clearPocketTimeout = null;
//}
// Do we have a timeout? No, set it to now + 5 seconds
if (!_clearPocketTimeout.HasValue) _clearPocketTimeout = DateTime.UtcNow.AddSeconds(5);
// Are we in timeout?
if (DateTime.UtcNow < _clearPocketTimeout.Value) return;
// We have cleared the Pocket, perform the next action \o/ - reset the timers that we had set for actions...
Nextaction();
// Reset timeout
_clearPocketTimeout = null;
return;
}
示例2: DebuggingWait
private void DebuggingWait(Actions.Action action)
{
// Default timeout is 1200 seconds
int timeout;
if (!int.TryParse(action.GetParameterValue("timeout"), out timeout))
timeout = 1200;
if (_waiting)
{
if (DateTime.Now.Subtract(_waitingSince).TotalSeconds < timeout)
return;
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Nothing targeted us within [ " + timeout + "sec]!", Logging.Teal);
// Nothing has targeted us in the specified timeout
_waiting = false;
Nextaction();
return;
}
// Start waiting
_waiting = true;
_waitingSince = DateTime.Now;
}
示例3: IgnoreAction
private void IgnoreAction(Actions.Action action)
{
bool clear;
if (!bool.TryParse(action.GetParameterValue("clear"), out clear))
clear = false;
//List<string> removehighestbty = action.GetParameterValues("RemoveHighestBty");
//List<string> addhighestbty = action.GetParameterValues("AddHighestBty");
List<string> add = action.GetParameterValues("add");
List<string> remove = action.GetParameterValues("remove");
//string targetNames = action.GetParameterValue("target");
//int distancetoapp;
//if (!int.TryParse(action.GetParameterValue("distance"), out distancetoapp))
// distancetoapp = 1000;
//IEnumerable<EntityCache> targets = Cache.Instance.Entities.Where(e => targetNames.Contains(e.Name));
// EntityCache target = targets.OrderBy(t => t.Distance).First();
//IEnumerable<EntityCache> targetsinrange = Cache.Instance.Entities.Where(b => Cache.Instance.DistanceFromEntity(b.X ?? 0, b.Y ?? 0, b.Z ?? 0,target) < distancetoapp);
//IEnumerable<EntityCache> targetsoutofrange = Cache.Instance.Entities.Where(b => Cache.Instance.DistanceFromEntity(b.X ?? 0, b.Y ?? 0, b.Z ?? 0, target) < distancetoapp);
if (clear)
Cache.Instance.IgnoreTargets.Clear();
else
{
add.ForEach(a => Cache.Instance.IgnoreTargets.Add(a.Trim()));
remove.ForEach(a => Cache.Instance.IgnoreTargets.Remove(a.Trim()));
}
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Updated ignore list", Logging.Teal);
if (Cache.Instance.IgnoreTargets.Any())
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Currently ignoring: " + Cache.Instance.IgnoreTargets.Aggregate((current, next) => current + "[" + next + "]"), Logging.Teal);
else
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Your ignore list is empty", Logging.Teal);
_currentAction++;
}
示例4: ActivateAction
private void ActivateAction(Actions.Action action)
{
bool optional;
if (!bool.TryParse(action.GetParameterValue("optional"), out optional))
optional = false;
string target = action.GetParameterValue("target");
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
target = "Acceleration Gate";
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByName(target).ToList();
if (!targets.Any())
{
if (!_waiting)
{
Logging.Log("CombatMissionCtrl", "Activate: Can't find [" + target + "] to activate! Waiting 30 seconds before giving up", Logging.Teal);
_waitingSince = DateTime.Now;
_waiting = true;
}
else if (_waiting)
{
if (DateTime.Now.Subtract(_waitingSince).TotalSeconds > Time.Instance.NoGateFoundRetryDelay_seconds)
{
Logging.Log("CombatMissionCtrl",
"Activate: After 30 seconds of waiting the gate is still not on grid: CombatMissionCtrlState.Error",
Logging.Teal);
if (optional) //if this action has the optional paramater defined as true then we are done if we cant find the gate
DoneAction();
else
_States.CurrentCombatMissionCtrlState = CombatMissionCtrlState.Error;
}
}
return;
}
//if (closest.Distance <= (int)Distance.CloseToGateActivationRange) // if your distance is less than the 'close enough' range, default is 7000 meters
EntityCache closest = targets.OrderBy(t => t.Distance).First();
if (closest.Distance < (int)Distance.GateActivationRange + 5000)
{
// Tell the drones module to retract drones
Cache.Instance.IsMissionPocketDone = true;
// We cant activate if we have drones out
if (Cache.Instance.ActiveDrones.Any())
return;
//
// this is a bad idea for a speed tank, we ought to somehow cache the object they are orbiting/approaching, etc
// this seemingly slowed down the exit from certain missions for me for 2-3min as it had a command to orbit some random object
// after the "done" command
//
if (closest.Distance < -10100)
{
if (DateTime.Now > Cache.Instance.NextOrbit)
{
closest.Orbit(1000);
Logging.Log("CombatMissionCtrl", "Activate: We are too close to [" + closest.Name + "] Initiating orbit", Logging.Orange);
}
return;
}
if (closest.Distance >= -10100)
{
// Add bookmark (before we activate)
if (Settings.Instance.CreateSalvageBookmarks)
BookmarkPocketForSalvaging();
//Logging.Log("CombatMissionCtrl", "Activate: Reload before moving to next pocket", Logging.teal);
if (!Combat.ReloadAll(closest)) return;
if (DateTime.Now > Cache.Instance.NextActivateAction)
{
Logging.Log("CombatMissionCtrl", "Activate: [" + closest.Name + "] Move to next pocket after reload command and change state to 'NextPocket'", Logging.Green);
closest.Activate();
// Do not change actions, if NextPocket gets a timeout (>2 mins) then it reverts to the last action
_moveToNextPocket = DateTime.Now;
_States.CurrentCombatMissionCtrlState = CombatMissionCtrlState.NextPocket;
}
return;
}
}
else if (closest.Distance < (int)Distance.WarptoDistance) //else if (closest.Distance < (int)Distance.WarptoDistance) //if we are inside warpto distance then approach
{
// Move to the target
if (DateTime.Now > Cache.Instance.NextApproachAction && (Cache.Instance.IsOrbiting || Cache.Instance.Approaching == null || Cache.Instance.Approaching.Id != closest.Id))
{
Logging.Log("CombatMissionCtrl.Activate", "Approaching target [" + closest.Name + "][ID: " + closest.Id + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
closest.Approach();
}
else if (Cache.Instance.IsOrbiting || Cache.Instance.Approaching == null || Cache.Instance.Approaching.Id != closest.Id)
{
Logging.Log("CombatMissionCtrl", "Activate: Delaying approach for: [" + Math.Round(Cache.Instance.NextApproachAction.Subtract(DateTime.Now).TotalSeconds, 0) + "] seconds", Logging.Teal);
}
return;
}
else if (closest.Distance > (int)Distance.WarptoDistance)//we must be outside warpto distance, but we are likely in a deadspace so align to the target
{
//.........这里部分代码省略.........
示例5: ClearPocketAction
private void ClearPocketAction(Actions.Action action)
{
if (!Cache.Instance.NormalApproach)
Cache.Instance.NormalApproach = true;
// Get lowest range
double range = Cache.Instance.MaxRange;
int DistanceToClear;
if (!int.TryParse(action.GetParameterValue("distance"), out DistanceToClear))
DistanceToClear = (int)range;
if (DistanceToClear != 0 && DistanceToClear != -2147483648 && DistanceToClear != 2147483647)
{
range = Math.Min(Cache.Instance.MaxRange, DistanceToClear);
}
//panic handles adding any priority targets and combat will prefer to kill any priority targets
EntityCache target = null;
// Or is there a target that is targeting us?
target = target ?? Cache.Instance.TargetedBy.Where(t => !t.IsSentry && !t.IsEntityIShouldLeaveAlone && !t.IsContainer && t.IsNpc && t.CategoryId == (int)CategoryID.Entity && t.GroupId != (int)Group.LargeCollidableStructure && !Cache.Instance.IgnoreTargets.Contains(t.Name.Trim())).OrderBy(t => t.Distance).FirstOrDefault();
// Or is there any target?
target = target ?? Cache.Instance.Entities.Where(t => !t.IsSentry && !t.IsEntityIShouldLeaveAlone && !t.IsContainer && t.IsNpc && t.CategoryId == (int)CategoryID.Entity && t.GroupId != (int)Group.LargeCollidableStructure && !Cache.Instance.IgnoreTargets.Contains(t.Name.Trim())).OrderBy(t => t.Distance).FirstOrDefault();
if (Settings.Instance.KillSentries)
{
target = target ?? Cache.Instance.Entities.Where(t => !t.IsEntityIShouldLeaveAlone && !t.IsContainer && t.IsNpc && t.CategoryId == (int)CategoryID.Entity && t.GroupId != (int)Group.LargeCollidableStructure && !Cache.Instance.IgnoreTargets.Contains(t.Name.Trim())).OrderBy(t => t.Distance).FirstOrDefault();
}
if (target == null)
_targetNull = true;
else
_targetNull = false;
int targetedby = Cache.Instance.TargetedBy.Count(t => !t.IsSentry && !t.IsEntityIShouldLeaveAlone && !t.IsContainer && t.IsNpc && t.CategoryId == (int)CategoryID.Entity && t.GroupId != (int)Group.LargeCollidableStructure && !Cache.Instance.IgnoreTargets.Contains(t.Name.Trim()));
if (target != null)
{
// Reset timeout
_clearPocketTimeout = null;
// Lock target if within weapons range
if (target.Distance < range)
{
//panic handles adding any priority targets and combat will prefer to kill any priority targets
if (_targetNull && targetedby == 0 && DateTime.Now > Cache.Instance.NextReload)
{
if (!Combat.ReloadAll(target)) return;
}
if (Cache.Instance.DirectEve.ActiveShip.MaxLockedTargets > 0)
{
if (target.IsTarget || target.IsTargeting || target.IsActiveTarget || !target.IsValid) //This target is already targeted no need to target it again
{
//noop
}
else if (!Cache.Instance.IgnoreTargets.Contains(target.Name.Trim()))
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Targeting [" + target.Name + "][ID: " + target.Id + "][" + Math.Round(target.Distance / 1000, 0) + "k away]", Logging.Teal);
target.LockTarget();
}
if (Cache.Instance.IgnoreTargets.Contains(target.Name.Trim()))
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "We have attempted to target an NPC that is on the ignore list (why?) Name [" + target.Name + "][" + target.Id + "][" + target.Distance + "]", Logging.Teal);
}
}
}
NavigateOnGrid.NavigateIntoRange(target, "CombatMissionCtrl." + _pocketActions[_currentAction]);
if (target.Distance > range) //target is not in range...
{
if (DateTime.Now > Cache.Instance.NextReload)
{
//Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction] ,"ReloadAll: Reload weapons",Logging.teal);
if (!Combat.ReloadAll(target)) return;
}
}
return;
}
// Do we have a timeout? No, set it to now + 5 seconds
if (!_clearPocketTimeout.HasValue)
_clearPocketTimeout = DateTime.Now.AddSeconds(5);
// Are we in timeout?
if (DateTime.Now < _clearPocketTimeout.Value)
return;
// We have cleared the Pocket, perform the next action \o/ - reset the timers that we had set for actions...
Nextaction();
// Reset timeout
_clearPocketTimeout = null;
}
示例6: MoveToAction
private void MoveToAction(Actions.Action action)
{
if (Cache.Instance.NormalApproach)
Cache.Instance.NormalApproach = false;
string target = action.GetParameterValue("target");
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
target = "Acceleration Gate";
int DistanceToApproach;
if (!int.TryParse(action.GetParameterValue("distance"), out DistanceToApproach))
DistanceToApproach = 4000;
bool stopWhenTargeted;
if (!bool.TryParse(action.GetParameterValue("StopWhenTargeted"), out stopWhenTargeted))
stopWhenTargeted = false;
bool stopWhenAggressed;
if (!bool.TryParse(action.GetParameterValue("StopWhenAggressed"), out stopWhenAggressed))
stopWhenAggressed = false;
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByName(target).ToList();
if (!targets.Any())
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "no entities found named [" + target + "] proceeding to next action", Logging.Teal);
Nextaction();
return;
}
EntityCache closest = targets.OrderBy(t => t.Distance).First();
if (stopWhenTargeted)
{
if (Cache.Instance.TargetedBy != null && Cache.Instance.TargetedBy.Any())
{
if (Cache.Instance.Approaching != null)
{
Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.CmdStopShip);
Cache.Instance.Approaching = null;
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Stop ship, we have been targeted and are [" + DistanceToApproach + "] from [ID: " +
closest.Name + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
}
}
}
if (stopWhenAggressed)
{
if (Cache.Instance.Aggressed.Any(t => !t.IsSentry))
{
if (Cache.Instance.Approaching != null)
{
Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.CmdStopShip);
Cache.Instance.Approaching = null;
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Stop ship, we have been targeted and are [" + DistanceToApproach + "] from [ID: " +
closest.Name + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
}
}
}
if (closest.Distance <= DistanceToApproach) // if we are inside the range that we are supposed to approach assume we are done
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "We are [" + Math.Round(closest.Distance, 0) + "] from a [" + target + "] we do not need to go any further", Logging.Teal);
Nextaction();
if (Cache.Instance.Approaching != null)
{
Cache.Instance.DirectEve.ExecuteCommand(DirectCmd.CmdStopShip);
Cache.Instance.Approaching = null;
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Stop ship, we are [" + DistanceToApproach + "] from [ID: " + closest.Name + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
}
//if (Settings.Instance.SpeedTank)
//{
// //this should at least keep speed tanked ships from going poof if a mission XML uses moveto
// closest.Orbit(Cache.Instance.OrbitDistance);
// Logging.Log("CombatMissionCtrl","MoveTo: Initiating orbit after reaching target")
//}
}
else if (closest.Distance < (int)Distance.WarptoDistance) // if we are inside warptorange you need to approach (you cant warp from here)
{
// Move to the target
if (DateTime.Now > Cache.Instance.NextApproachAction && (Cache.Instance.Approaching == null || Cache.Instance.Approaching.Id != closest.Id))
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Approaching target [" + closest.Name + "][ID: " + closest.Id + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
closest.Approach();
}
}
else // if we are outside warpto distance (presumably inside a deadspace where we cant warp) align to the target
{
if (DateTime.Now > Cache.Instance.NextAlign)
{
// Probably never happens
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Aligning to target [" + closest.Name + "][ID: " + closest.Id + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
closest.AlignTo();
}
}
return;
}
示例7: UseDrones
private void UseDrones(Actions.Action action)
{
bool usedrones;
if (!bool.TryParse(action.GetParameterValue("use"), out usedrones))
usedrones = true;
if (!usedrones)
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Disable launch of drones", Logging.Teal);
Cache.Instance.UseDrones = false;
}
else
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Enable launch of drones", Logging.Teal);
Cache.Instance.UseDrones = true;
}
Nextaction();
return;
}
示例8: ActivateAction
private void ActivateAction(Actions.Action action)
{
if (DateTime.UtcNow < _nextCombatMissionCtrlAction)
return;
//we cant move in bastion mode, do not try
List<ModuleCache> bastionModules = null;
bastionModules = Cache.Instance.Modules.Where(m => m.GroupId == (int)Group.Bastion && m.IsOnline).ToList();
if (bastionModules.Any(i => i.IsActive))
{
Logging.Log("CombatMissionCtrl.Activate", "BastionMode is active, we cannot move, aborting attempt to Activate until bastion deactivates", Logging.Debug);
_nextCombatMissionCtrlAction = DateTime.UtcNow.AddSeconds(15);
return;
}
bool optional;
if (!bool.TryParse(action.GetParameterValue("optional"), out optional))
{
optional = false;
}
string target = action.GetParameterValue("target");
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
{
target = "Acceleration Gate";
}
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByName(target, Cache.Instance.EntitiesOnGrid.Where(i => i.Distance < (int)Distances.OnGridWithMe)).ToList();
if (!targets.Any())
{
if (!_waiting)
{
Logging.Log("CombatMissionCtrl", "Activate: Can't find [" + target + "] to activate! Waiting 30 seconds before giving up", Logging.Teal);
_waitingSince = DateTime.UtcNow;
_waiting = true;
}
else if (_waiting)
{
if (DateTime.UtcNow.Subtract(_waitingSince).TotalSeconds > Time.Instance.NoGateFoundRetryDelay_seconds)
{
Logging.Log("CombatMissionCtrl",
"Activate: After 30 seconds of waiting the gate is still not on grid: CombatMissionCtrlState.Error",
Logging.Teal);
if (optional) //if this action has the optional parameter defined as true then we are done if we cant find the gate
{
DoneAction();
}
else
{
_States.CurrentCombatMissionCtrlState = CombatMissionCtrlState.Error;
}
}
}
return;
}
//if (closest.Distance <= (int)Distance.CloseToGateActivationRange) // if your distance is less than the 'close enough' range, default is 7000 meters
EntityCache closest = targets.OrderBy(t => t.Distance).FirstOrDefault();
if (closest != null)
{
if (closest.Distance <= (int)Distances.GateActivationRange)
{
if (Settings.Instance.DebugActivateGate) Logging.Log("CombatMissionCtrl", "if (closest.Distance [" + closest.Distance + "] <= (int)Distances.GateActivationRange [" + (int)Distances.GateActivationRange + "])", Logging.Green);
// Tell the drones module to retract drones
Cache.Instance.IsMissionPocketDone = true;
// We cant activate if we have drones out
if (Cache.Instance.ActiveDrones.Any())
{
if (Settings.Instance.DebugActivateGate) Logging.Log("CombatMissionCtrl", "if (Cache.Instance.ActiveDrones.Any())", Logging.Green);
return;
}
//
// this is a bad idea for a speed tank, we ought to somehow cache the object they are orbiting/approaching, etc
// this seemingly slowed down the exit from certain missions for me for 2-3min as it had a command to orbit some random object
// after the "done" command
//
if (closest.Distance < -10100)
{
if (Settings.Instance.DebugActivateGate) Logging.Log("CombatMissionCtrl", "if (closest.Distance < -10100)", Logging.Green);
AttemptsToGetAwayFromGate++;
if (AttemptsToGetAwayFromGate > 30)
{
if (DateTime.UtcNow > Cache.Instance.NextOrbit)
{
closest.Orbit(1000);
Logging.Log("CombatMissionCtrl", "Activate: We are too close to [" + closest.Name + "] Initiating orbit", Logging.Orange);
}
return;
}
}
if (Settings.Instance.DebugActivateGate) Logging.Log("CombatMissionCtrl", "if (closest.Distance >= -10100)", Logging.Green);
//.........这里部分代码省略.........
示例9: ActivateBastionAction
private void ActivateBastionAction(Actions.Action action)
{
bool _done = false;
if (Cache.Instance.Modules.Any())
{
List<ModuleCache> bastionModules = null;
bastionModules = Cache.Instance.Modules.Where(m => m.GroupId == (int)Group.Bastion && m.IsOnline).ToList();
if (!bastionModules.Any() || bastionModules.Any(i => i.IsActive))
{
_done = true;
}
}
if (_done)
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "ActivateBastion Action completed.", Logging.Teal);
// Nothing has targeted us in the specified timeout
_waiting = false;
Nextaction();
return;
}
// Default timeout is 60 seconds
int DeactivateAfterSeconds;
if (!int.TryParse(action.GetParameterValue("DeactivateAfterSeconds"), out DeactivateAfterSeconds))
{
DeactivateAfterSeconds = 5;
}
Cache.Instance.NextBastionModeDeactivate = DateTime.UtcNow.AddSeconds(DeactivateAfterSeconds);
// Start bastion mode
if (!Combat.ActivateBastion()) return;
return;
}
示例10: OrbitEntityAction
private void OrbitEntityAction(Actions.Action action)
{
if (Cache.Instance.NormalApproach)
{
Cache.Instance.NormalApproach = false;
}
Cache.Instance.normalNav = false;
string target = action.GetParameterValue("target");
bool notTheClosest;
if (!bool.TryParse(action.GetParameterValue("notclosest"), out notTheClosest))
{
notTheClosest = false;
}
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "No Entity Specified to orbit: skipping OrbitEntity Action", Logging.Teal);
Nextaction();
return;
}
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByPartialName(target).ToList();
if (!targets.Any())
{
// Unlike activate, no target just means next action
_currentAction++;
return;
}
EntityCache closest = targets.OrderBy(t => t.Distance).FirstOrDefault();
if (notTheClosest)
{
closest = targets.OrderByDescending(t => t.Distance).FirstOrDefault();
}
if (closest != null)
{
// Move to the target
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Setting [" + closest.Name + "][" + Cache.Instance.MaskedID(closest.Id) + "][" + Math.Round(closest.Distance / 1000, 0) + "k away as the Orbit Target]", Logging.Teal);
closest.Orbit(Cache.Instance.OrbitDistance);
}
Nextaction();
return;
}
示例11: WaitUntilAggressed
private void WaitUntilAggressed(Actions.Action action)
{
// Default timeout is 60 seconds
int timeout;
if (!int.TryParse(action.GetParameterValue("timeout"), out timeout))
{
timeout = 60;
}
// Default timeout is 30 seconds
int WaitUntilShieldsAreThisLow;
if (!int.TryParse(action.GetParameterValue("WaitUntilShieldsAreThisLow"), out WaitUntilShieldsAreThisLow))
{
WaitUntilShieldsAreThisLow = 45;
Settings.Instance.MinimumShieldPct = WaitUntilShieldsAreThisLow;
}
// Default timeout is 30 seconds
int WaitUntilArmorIsThisLow;
if (!int.TryParse(action.GetParameterValue("WaitUntilArmorIsThisLow"), out WaitUntilArmorIsThisLow))
{
WaitUntilArmorIsThisLow = 100;
Settings.Instance.MinimumArmorPct = WaitUntilArmorIsThisLow;
}
if (_waiting)
{
if (DateTime.UtcNow.Subtract(_waitingSince).TotalSeconds < timeout)
{
return;
}
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Nothing targeted us within [ " + timeout + "sec]!", Logging.Teal);
// Nothing has targeted us in the specified timeout
_waiting = false;
Nextaction();
return;
}
// Start waiting
_waiting = true;
_waitingSince = DateTime.UtcNow;
return;
}
示例12: MoveToBackgroundAction
private void MoveToBackgroundAction(Actions.Action action)
{
if (DateTime.UtcNow < _nextCombatMissionCtrlAction)
return;
//we cant move in bastion mode, do not try
List<ModuleCache> bastionModules = null;
bastionModules = Cache.Instance.Modules.Where(m => m.GroupId == (int)Group.Bastion && m.IsOnline).ToList();
if (bastionModules.Any(i => i.IsActive))
{
Logging.Log("CombatMissionCtrl.MoveToBackground", "BastionMode is active, we cannot move, aborting attempt to Activate until bastion deactivates", Logging.Debug);
_nextCombatMissionCtrlAction = DateTime.UtcNow.AddSeconds(15);
return;
}
if (Cache.Instance.NormalApproach)
{
Cache.Instance.NormalApproach = false;
}
Cache.Instance.normalNav = false;
int DistanceToApproach;
if (!int.TryParse(action.GetParameterValue("distance"), out DistanceToApproach))
{
DistanceToApproach = (int)Distances.GateActivationRange;
}
string target = action.GetParameterValue("target");
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
{
target = "Acceleration Gate";
}
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByName(target, Cache.Instance.EntitiesOnGrid.ToList());
if (!targets.Any())
{
// Unlike activate, no target just means next action
_currentAction++;
return;
}
EntityCache closest = targets.OrderBy(t => t.Distance).FirstOrDefault();
if (closest != null)
{
// Move to the target
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Approaching target [" + closest.Name + "][" + Cache.Instance.MaskedID(closest.Id) + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
closest.Approach(DistanceToApproach);
_nextCombatMissionCtrlAction = DateTime.UtcNow.AddSeconds(5);
}
Nextaction();
return;
}
示例13: MoveToAction
private void MoveToAction(Actions.Action action)
{
if (DateTime.UtcNow < _nextCombatMissionCtrlAction)
return;
//we cant move in bastion mode, do not try
List<ModuleCache> bastionModules = null;
bastionModules = Cache.Instance.Modules.Where(m => m.GroupId == (int)Group.Bastion && m.IsOnline).ToList();
if (bastionModules.Any(i => i.IsActive))
{
Logging.Log("CombatMissionCtrl.MoveTo", "BastionMode is active, we cannot move, aborting attempt to Activate until bastion deactivates", Logging.Debug);
_nextCombatMissionCtrlAction = DateTime.UtcNow.AddSeconds(15);
return;
}
if (Cache.Instance.NormalApproach)
{
Cache.Instance.NormalApproach = false;
}
Cache.Instance.normalNav = false;
string target = action.GetParameterValue("target");
// No parameter? Although we should not really allow it, assume its the acceleration gate :)
if (string.IsNullOrEmpty(target))
{
target = "Acceleration Gate";
}
int DistanceToApproach;
if (!int.TryParse(action.GetParameterValue("distance"), out DistanceToApproach))
{
DistanceToApproach = (int)Distances.GateActivationRange;
}
bool stopWhenTargeted;
if (!bool.TryParse(action.GetParameterValue("StopWhenTargeted"), out stopWhenTargeted))
{
stopWhenTargeted = false;
}
bool stopWhenAggressed;
if (!bool.TryParse(action.GetParameterValue("StopWhenAggressed"), out stopWhenAggressed))
{
stopWhenAggressed = false;
}
IEnumerable<EntityCache> targets = Cache.Instance.EntitiesByName(target, Cache.Instance.EntitiesOnGrid.ToList());
if (!targets.Any())
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "no entities found named [" + target + "] proceeding to next action", Logging.Teal);
Nextaction();
return;
}
EntityCache closest = targets.OrderBy(t => t.Distance).FirstOrDefault();
//if (Settings.Instance.TargetSelectionMethod == "isdp")
//{
Cache.Instance.GetBestPrimaryWeaponTarget(Cache.Instance.MaxRange, false, "Combat");
//}
//else //use new target selection method
//{
// Cache.Instance.__GetBestWeaponTargets(Cache.Instance.MaxRange);
//}
if (closest != null)
{
if (stopWhenTargeted)
{
if (Cache.Instance.TargetedBy != null && Cache.Instance.TargetedBy.Any())
{
if (Cache.Instance.Approaching != null)
{
if (Cache.Instance.MyShipEntity.Velocity != 0 && DateTime.UtcNow > Cache.Instance.NextApproachAction)
{
NavigateOnGrid.StopMyShip();
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Stop ship, we have been targeted and are [" + DistanceToApproach + "] from [ID: " + closest.Name + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
}
}
}
}
if (stopWhenAggressed)
{
if (Cache.Instance.Aggressed.Any(t => !t.IsSentry))
{
if (Cache.Instance.Approaching != null)
{
if (Cache.Instance.MyShipEntity.Velocity != 0 && DateTime.UtcNow > Cache.Instance.NextApproachAction)
{
NavigateOnGrid.StopMyShip();
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Stop ship, we have been targeted and are [" + DistanceToApproach + "] from [ID: " + closest.Name + "][" + Math.Round(closest.Distance / 1000, 0) + "k away]", Logging.Teal);
}
}
}
}
if (closest.Distance < DistanceToApproach) // if we are inside the range that we are supposed to approach assume we are done
//.........这里部分代码省略.........
示例14: LootItemAction
private void LootItemAction(Actions.Action action)
{
try
{
Cache.Instance.CurrentlyShouldBeSalvaging = true;
Cache.Instance.MissionLoot = true;
List<string> items = action.GetParameterValues("item");
List<string> targetNames = action.GetParameterValues("target");
// if we are not generally looting we need to re-enable the opening of wrecks to
// find this LootItems we are looking for
if (Settings.Instance.SpeedTank || !Settings.Instance.SpeedTank) Cache.Instance.OpenWrecks = true;
int quantity;
if (!int.TryParse(action.GetParameterValue("quantity"), out quantity))
{
quantity = 1;
}
bool done = items.Count == 0;
if (!done)
{
//if (!Cache.Instance.OpenCargoHold("CombatMissionCtrl.LootItemAction")) return;
if (Cache.Instance.CurrentShipsCargo.Window.IsReady)
{
if (Cache.Instance.CurrentShipsCargo.Items.Any(i => (items.Contains(i.TypeName) && (i.Quantity >= quantity))))
{
done = true;
}
}
}
if (done)
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "We are done looting - we have the item(s)", Logging.Teal);
// now that we have completed this action revert OpenWrecks to false
if (Settings.Instance.SpeedTank) Cache.Instance.OpenWrecks = false;
Cache.Instance.MissionLoot = false;
Cache.Instance.CurrentlyShouldBeSalvaging = false;
_currentAction++;
return;
}
//
// sorting by distance is bad if we are moving (we'd change targets unpredictably)... sorting by ID should be better and be nearly the same(?!)
//
IOrderedEnumerable<EntityCache> containers = Cache.Instance.Containers.Where(e => !Cache.Instance.LootedContainers.Contains(e.Id)).OrderBy(e => e.Distance);
if (!containers.Any())
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "We are done looting - no containers left to loot", Logging.Teal);
if (Settings.Instance.SpeedTank) Cache.Instance.OpenWrecks = false;
Cache.Instance.MissionLoot = false;
Cache.Instance.CurrentlyShouldBeSalvaging = false;
_currentAction++;
return;
}
EntityCache container = containers.FirstOrDefault(c => targetNames.Contains(c.Name)) ?? containers.FirstOrDefault();
if (container != null && (container.Distance > (int)Distances.SafeScoopRange && (Cache.Instance.Approaching == null || Cache.Instance.Approaching.Id != container.Id)))
{
if (DateTime.UtcNow > Cache.Instance.NextApproachAction && (Cache.Instance.Approaching == null || Cache.Instance.Approaching.Id != container.Id))
{
Logging.Log("CombatMissionCtrl[" + Cache.Instance.PocketNumber + "]." + _pocketActions[_currentAction], "Approaching target [" + container.Name + "][" + Cache.Instance.MaskedID(container.Id) + "] which is at [" + Math.Round(container.Distance / 1000, 0) + "k away]", Logging.Teal);
container.Approach();
}
}
}
catch (Exception exception)
{
Logging.Log("CombatMissionCtrl.LootItemAction","Exception logged was [" + exception + "]",Logging.Teal);
}
return;
}
示例15: KillOnceAction
private void KillOnceAction(Actions.Action action)
{
if (Cache.Instance.NormalApproach)
Cache.Instance.NormalApproach = false;
bool notTheClosest;
if (!bool.TryParse(action.GetParameterValue("notclosest"), out notTheClosest))
notTheClosest = false;
int numberToIgnore;
if (!int.TryParse(action.GetParameterValue("numbertoignore"), out numberToIgnore))
numberToIgnore = 0;
List<string> targetNames = action.GetParameterValues("target");
// No parameter? Ignore kill action
if (targetNames.Count == 0)
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "No targets defined in kill action!", Logging.Orange);
Nextaction();
return;
}
IEnumerable<EntityCache> targets = Cache.Instance.Entities.Where(e => targetNames.Contains(e.Name)).ToList();
if (targets.Count() == numberToIgnore)
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "All targets killed " + targetNames.Aggregate((current, next) => current + "[" + next + "]"), Logging.Teal);
// We killed it/them !?!?!? :)
Nextaction();
return;
}
EntityCache target = targets.OrderBy(t => t.Distance).First();
if (target != null)
{
// Reset timeout
_clearPocketTimeout = null;
// Are we approaching the active (out of range) target?
// Wait for it (or others) to get into range
// Lock priority target if within weapons range
if (notTheClosest)
target = targets.OrderByDescending(t => t.Distance).First();
if (target.Distance < Cache.Instance.MaxRange)
{
//panic handles adding any priority targets and combat will prefer to kill any priority targets
if (Cache.Instance.PriorityTargets.All(pt => pt.Id != target.Id))
{
//Adds the target we want to kill to the priority list so that combat.cs will kill it (especially if it is an LCO this is important)
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Adding [" + target.Name + "][ID: " + target.Id + "] as a priority target", Logging.Teal);
Cache.Instance.AddPriorityTargets(new[] { target }, Priority.PriorityKillTarget);
}
if (Cache.Instance.DirectEve.ActiveShip.MaxLockedTargets > 0)
{
if (!(target.IsTarget || target.IsTargeting)) //This target is not targeted and need to target it
{
Logging.Log("CombatMissionCtrl." + _pocketActions[_currentAction], "Targeting [" + target.Name + "][ID: " + target.Id + "][" + Math.Round(target.Distance / 1000, 0) + "k away]", Logging.Teal);
target.LockTarget();
// the target has been added to the priority targets list and has been targeted.
// this should ensure that the combat module (and/or the next action) kills the target.
Nextaction();
return;
}
}
}
NavigateOnGrid.NavigateIntoRange(target, "CombatMissionCtrl." + _pocketActions[_currentAction]);
return;
}
}