public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { NWCreature self = (NWCreature)args[0]; return(builder.Do("RandomWalk", t => { if (self.IsInCombat || !_enmity.IsEnmityTableEmpty(self)) { if (_.GetCurrentAction(self.Object) == NWScript.ACTION_RANDOMWALK) { self.ClearAllActions(); } return BehaviourTreeStatus.Failure; } if (_.GetCurrentAction(self.Object) == NWScript.ACTION_INVALID && _.IsInConversation(self.Object) == NWScript.FALSE && _.GetCurrentAction(self.Object) != NWScript.ACTION_RANDOMWALK && _random.Random(100) <= 25) { self.AssignCommand(() => _.ActionRandomWalk()); } return BehaviourTreeStatus.Running; })); }
public void cant_create_an_unested_action_node() { Init(); Assert.Throws <ApplicationException>(() => { testObject .Do("some-node-1", t => Status.Running) .Build(); } ); }
public static BehaviourTreeBuilder Do <T>(this BehaviourTreeBuilder builder, params object[] args) where T : IRegisteredEvent { return(builder.Do(typeof(T).ToString(), t => { bool success = App.RunEvent <T>(args); return success ? BehaviourTreeStatus.Running : BehaviourTreeStatus.Failure; })); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { return(builder.Do("EquipBestMelee", t => { NWCreature self = (NWCreature)args[0]; if (!self.IsInCombat || self.RightHand.IsRanged) { return BehaviourTreeStatus.Failure; } self.AssignCommand(() => { _.ActionEquipMostDamagingMelee(new Object()); }); return BehaviourTreeStatus.Running; })); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { return(builder.Do("AggroTargetBySight", t => { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return BehaviourTreeStatus.Failure; } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 10.0f; } Location targetLocation = _.Location( self.Area.Object, _biowarePos.GetChangedPosition(self.Position, aggroRange, self.Facing), self.Facing + 180.0f); NWCreature creature = NWCreature.Wrap(_.GetFirstObjectInShape(NWScript.SHAPE_SPELLCYLINDER, aggroRange, targetLocation, NWScript.TRUE, NWScript.OBJECT_TYPE_CREATURE, self.Position)); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == NWScript.TRUE && !_enmity.IsOnEnmityTable(self, creature) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && !creature.HasAnyEffect(NWScript.EFFECT_TYPE_INVISIBILITY, NWScript.EFFECT_TYPE_SANCTUARY)) { _enmity.AdjustEnmity(self, creature, 0, 1); } creature = NWCreature.Wrap(_.GetNextObjectInShape(NWScript.SHAPE_SPELLCYLINDER, aggroRange, targetLocation, NWScript.TRUE, NWScript.OBJECT_TYPE_CREATURE, self.Position)); } return BehaviourTreeStatus.Running; })); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { return(builder.Do("AggroTargetBySound", t => { NWCreature self = (NWCreature)args[0]; if (self.IsInCombat) { return BehaviourTreeStatus.Failure; } float aggroRange = self.GetLocalFloat("AGGRO_RANGE"); if (aggroRange <= 0.0f) { aggroRange = 5.0f; } int nth = 1; NWCreature creature = NWCreature.Wrap(_.GetNearestObject(NWScript.OBJECT_TYPE_CREATURE, self.Object, nth)); while (creature.IsValid) { if (_.GetIsEnemy(creature.Object, self.Object) == NWScript.TRUE && !_enmity.IsOnEnmityTable(self, creature) && !creature.HasAnyEffect(NWScript.EFFECT_TYPE_SANCTUARY) && _.GetDistanceBetween(self.Object, creature.Object) <= aggroRange && _.LineOfSightObject(self.Object, creature.Object) == NWScript.TRUE) { _enmity.AdjustEnmity(self, creature, 0, 1); } nth++; creature = NWCreature.Wrap(_.GetNearestObject(NWScript.OBJECT_TYPE_CREATURE, self.Object, nth)); } return BehaviourTreeStatus.Running; })); }
public BehaviourTreeBuilder Build(BehaviourTreeBuilder builder, params object[] args) { NWCreature self = (NWCreature)args[0]; return(builder.Do("WarpToTargetIfStuck", t => { if (_enmity.IsEnmityTableEmpty(self) || _.GetMovementRate(self.Object) == 1) // 1 = Immobile { if (self.Data.ContainsKey("WarpToTargetIfStuck_Position")) { self.Data.Remove("WarpToTargetIfStuck_Position"); } if (self.Data.ContainsKey("WarpToTargetIfStuck_CyclesStuckInPlace")) { self.Data.Remove("WarpToTargetIfStuck_CyclesStuckInPlace"); } return BehaviourTreeStatus.Failure; } Vector previousPosition = new Vector(); if (self.Data.ContainsKey("WarpToTargetIfStuck_Position")) { previousPosition = (Vector)self.Data["WarpToTargetIfStuck_Position"]; } Vector currentPosition = self.Position; if (previousPosition.m_X == currentPosition.m_X && previousPosition.m_Y == currentPosition.m_Y && previousPosition.m_Z == currentPosition.m_Z) { var cyclesStuck = 0; if (self.Data.ContainsKey("WarpToTargetIfStuck_CyclesStuckInPlace")) { cyclesStuck = (int)self.Data["WarpToTargetIfStuck_CyclesStuckInPlace"]; } cyclesStuck++; if (cyclesStuck >= 12) // Stuck for 12 seconds - warp to the target if still in the area. { EnmityTable table = _enmity.GetEnmityTable(self); var topTarget = table.Values.OrderByDescending(o => o.TotalAmount).SingleOrDefault(); if (topTarget != null && topTarget.TargetObject.IsValid) { var location = topTarget.TargetObject.Location; _.AssignCommand(self.Object, () => _.JumpToLocation(location)); } cyclesStuck = 0; } self.Data["WarpToTargetIfStuck_CyclesStuckInPlace"] = cyclesStuck; } else { self.Data["WarpToTargetIfStuck_CyclesStuckInPlace"] = 0; } self.Data["WarpToTargetIfStuck_Position"] = currentPosition; return BehaviourTreeStatus.Running; })); }