Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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())));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
            }
        }