public override void InitializeAI() { base.InitializeAI(); ObjectGuid ownerGuid = me.GetOwnerGUID(); if (ownerGuid.IsEmpty()) { return; } // Find victim of Summon Gargoyle spell List <Unit> targets = new List <Unit>(); var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(me, me, 30.0f); var searcher = new UnitListSearcher(me, targets, u_check); Cell.VisitAllObjects(me, searcher, 30.0f); foreach (var iter in targets) { if (iter.GetAura(SpellSummonGargoyle1, ownerGuid) != null) { me.Attack(iter, false); break; } } }
bool IsInThreatList(Unit target) { Unit owner = me.GetCharmerOrOwner(); List <Unit> targets = new List <Unit>(); var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(me, me, 30.0f); var searcher = new UnitListSearcher(me, targets, u_check); Cell.VisitAllObjects(me, searcher, 40.0f); foreach (var unit in targets) { if (unit == target) { // Consider only units without CC if (!unit.HasBreakableByDamageCrowdControlAura(unit)) { var triggers = unit.GetThreatManager().getThreatList(); foreach (var reference in triggers) { // Try to find threat referenced to owner if (reference.getTarget() == owner) { return(true); } } } } } return(false); }
void SearchUnitInBox(List <Unit> targetList) { float extentsX, extentsY, extentsZ; unsafe { extentsX = GetTemplate().BoxDatas.Extents[0]; extentsY = GetTemplate().BoxDatas.Extents[1]; extentsZ = GetTemplate().BoxDatas.Extents[2]; } var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); float halfExtentsX = extentsX / 2.0f; float halfExtentsY = extentsY / 2.0f; float halfExtentsZ = extentsZ / 2.0f; float minX = GetPositionX() - halfExtentsX; float maxX = GetPositionX() + halfExtentsX; float minY = GetPositionY() - halfExtentsY; float maxY = GetPositionY() + halfExtentsY; float minZ = GetPositionZ() - halfExtentsZ; float maxZ = GetPositionZ() + halfExtentsZ; AxisAlignedBox box = new AxisAlignedBox(new Vector3(minX, minY, minZ), new Vector3(maxX, maxY, maxZ)); targetList.RemoveAll(unit => !box.contains(new Vector3(unit.GetPositionX(), unit.GetPositionY(), unit.GetPositionZ()))); }
void SearchUnitInCylinder(List <Unit> targetList) { var check = new AnyUnitInObjectRangeCheck(this, GetTemplate().MaxSearchRadius, false); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); float height = GetTemplate().CylinderDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; targetList.RemoveAll(unit => unit.GetPositionZ() < minZ || unit.GetPositionZ() > maxZ); }
void SearchUnits(List <Unit> targetList, float radius, bool check3D) { var check = new AnyUnitInObjectRangeCheck(this, radius, check3D); if (IsServerSide()) { var searcher = new PlayerListSearcher(this, targetList, check); Cell.VisitWorldObjects(this, searcher, GetTemplate().MaxSearchRadius); } else { var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); } }
void SearchUnitInSphere(List <Unit> targetList) { float radius = GetTemplate().SphereDatas.Radius; if (GetTemplate().HasFlag(AreaTriggerFlags.HasDynamicShape)) { if (GetMiscTemplate().MorphCurveId != 0) { radius = MathFunctions.lerp(GetTemplate().SphereDatas.Radius, GetTemplate().SphereDatas.RadiusTarget, Global.DB2Mgr.GetCurveValueAt(GetMiscTemplate().MorphCurveId, GetProgress())); } } var check = new AnyUnitInObjectRangeCheck(this, radius); var searcher = new UnitListSearcher(this, targetList, check); Cell.VisitAllObjects(this, searcher, GetTemplate().MaxSearchRadius); }
static bool TestArea(StringArguments args, CommandHandler handler) { float radius = 40.0f; WorldObject obj = handler.GetPlayer(); // Get Creatures List <Unit> creatureList = new List <Unit>(); var go_check = new AnyUnitInObjectRangeCheck(obj, radius); var go_search = new UnitListSearcher(obj, creatureList, go_check); Cell.VisitGridObjects(obj, go_search, radius); if (!creatureList.Empty()) { handler.SendSysMessage("Found {0} Creatures.", creatureList.Count); uint paths = 0; uint uStartTime = Time.GetMSTime(); float gx, gy, gz; obj.GetPosition(out gx, out gy, out gz); foreach (var creature in creatureList) { PathGenerator path = new PathGenerator(creature); path.CalculatePath(gx, gy, gz); ++paths; } uint uPathLoadTime = Time.GetMSTimeDiffToNow(uStartTime); handler.SendSysMessage("Generated {0} paths in {1} ms", paths, uPathLoadTime); } else { handler.SendSysMessage("No creatures in {0} yard range.", radius); } return(true); }
void Init() { Unit owner = me.GetCharmerOrOwner(); List <Unit> targets = new List <Unit>(); var u_check = new AnyUnfriendlyUnitInObjectRangeCheck(me, me, 30.0f); var searcher = new UnitListSearcher(me, targets, u_check); Cell.VisitAllObjects(me, searcher, 40.0f); Unit highestThreatUnit = null; float highestThreat = 0.0f; Unit nearestPlayer = null; foreach (var unit in targets) { // Consider only units without CC if (!unit.HasBreakableByDamageCrowdControlAura(unit)) { // Take first found unit if (!highestThreatUnit && !unit.IsTypeId(TypeId.Player)) { highestThreatUnit = unit; continue; } if (!nearestPlayer && unit.IsTypeId(TypeId.Player)) { nearestPlayer = unit; continue; } // else compare best fit unit with current unit var triggers = unit.GetThreatManager().getThreatList(); foreach (var reference in triggers) { // Try to find threat referenced to owner if (reference.getTarget() == owner) { // Check if best fit hostile unit hs lower threat than this current unit if (highestThreat < reference.getThreat()) { // If so, update best fit unit highestThreat = reference.getThreat(); highestThreatUnit = unit; break; } } } // In case no unit with threat was found so far, always check for nearest unit (only for players) if (unit.IsTypeId(TypeId.Player)) { // If this player is closer than the previous one, update it if (me.GetDistance(unit.GetPosition()) < me.GetDistance(nearestPlayer.GetPosition())) { nearestPlayer = unit; } } } } // Prioritize units with threat referenced to owner if (highestThreat > 0.0f && highestThreatUnit) { me.Attack(highestThreatUnit, false); } // If there is no such target, try to attack nearest hostile unit if such exists else if (nearestPlayer) { me.Attack(nearestPlayer, false); } }