示例#1
0
 public override void MovementInform(MovementGeneratorType type, uint id)
 {
     if (type == MovementGeneratorType.Point && id == 0)
     {
         _events.ScheduleEvent(Events.SayWarden1, TimeSpan.FromSeconds(1));
     }
 }
示例#2
0
 public override void OnMovementGeneratorFinalized(MovementGeneratorType type)
 {
     if (type == MovementGeneratorType.TimedFleeing)
     {
         EnterEvadeMode(EvadeReason.Other);
     }
 }
示例#3
0
        public override void AttackStart(Unit who)
        {
            // dont allow charmed npcs to act on their own
            if (me.HasFlag(UnitFields.Flags, UnitFlags.PlayerControlled))
            {
                if (who && mCanAutoAttack)
                {
                    me.Attack(who, true);
                }
                return;
            }

            if (who && me.Attack(who, me.IsWithinMeleeRange(who)))
            {
                if (mCanCombatMove)
                {
                    SetRun(mRun);

                    MovementGeneratorType type = me.GetMotionMaster().GetMotionSlotType(MovementSlot.Active);
                    if (type == MovementGeneratorType.Waypoint || type == MovementGeneratorType.Point)
                    {
                        me.StopMoving();
                    }

                    me.GetMotionMaster().MoveChase(who);
                }
            }
        }
示例#4
0
 public override void MovementInform(MovementGeneratorType type, uint id)
 {
     if (type == MovementGeneratorType.Point && id == ActionIds.PackWalk)
     {
         _doFacing = true;
     }
 }
示例#5
0
 public override void MovementInform(MovementGeneratorType type, uint id)
 {
     if (type == MovementGeneratorType.Point)
     {
         _nextMovement = (MovementIds)(id + 1);
     }
 }
示例#6
0
文件: PetAI.cs 项目: uvbs/CypherCore
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            // Receives notification when pet reaches stay or follow owner
            switch (type)
            {
            case MovementGeneratorType.Point:
            {
                // Pet is returning to where stay was clicked. data should be
                // pet's GUIDLow since we set that as the waypoint ID
                if (id == me.GetGUID().GetCounter() && me.GetCharmInfo().IsReturning())
                {
                    ClearCharmInfoFlags();
                    me.GetCharmInfo().SetIsAtStay(true);
                    me.GetMotionMaster().Clear();
                    me.GetMotionMaster().MoveIdle();
                }
                break;
            }

            case MovementGeneratorType.Follow:
            {
                // If data is owner's GUIDLow then we've reached follow point,
                // otherwise we're probably chasing a creature
                if (me.GetCharmerOrOwner() && me.GetCharmInfo() != null && id == me.GetCharmerOrOwner().GetGUID().GetCounter() && me.GetCharmInfo().IsReturning())
                {
                    ClearCharmInfoFlags();
                    me.GetCharmInfo().SetIsFollowing(true);
                }
                break;
            }

            default:
                break;
            }
        }
示例#7
0
 public override void MovementInform(MovementGeneratorType moveType, uint data)
 {
     if (moveType == MovementGeneratorType.Follow && data == _summonerGuid.GetCounter())
     {
         me.CastSpell((Unit)null, Spells.DarkOffering, false);
         me.DespawnOrUnsummon(1000);
     }
 }
示例#8
0
 public override void MovementInform(MovementGeneratorType type, uint id)
 {
     if (id == EventId.Jump)
     {
         me.RemoveAurasDueToSpell(SpellIds.AssassinVisual);
         DoZoneInCombat();
     }
 }
示例#9
0
        /// <summary>
        /// Initializes a new instance of the MovementGenerator class.
        /// </summary>
        /// <param name="unit">The owner of the generator instance.</param>
        public MovementGenerator(Unit unit)
        {
            this.mover = unit;
            generatorType = MovementGeneratorType.None;

            this.mover.LocationChanged += OnLocationChanged;
            this.mover.Relocated += mover_Relocated;
        }
示例#10
0
 public override void MovementInform(MovementGeneratorType type, uint pointId)
 {
     if (type == MovementGeneratorType.Point && pointId == Misc.PointLanding)
     {
         me.Dismount();
         me.RemoveFlag(UnitFields.Flags, UnitFlags.ImmuneToPc | UnitFlags.ImmuneToNpc);
         DoCastAOE(SpellIds.InvaderTaunt);
     }
 }
示例#11
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point || id != DeprogrammingData.POINT_DESPAWN)
            {
                return;
            }

            me.DespawnOrUnsummon();
        }
示例#12
0
            public override void MovementInform(MovementGeneratorType type, uint id)
            {
                if (type != MovementGeneratorType.Point || id != Misc.PointTargetBonestormPlayer)
                {
                    return;
                }

                // lock movement
                me.GetMotionMaster().MoveIdle();
            }
示例#13
0
        public override void MovementInform(MovementGeneratorType MovementType, uint Data)
        {
            if ((MovementType == MovementGeneratorType.Point && Data == EventId.SmartEscortLastOCCPoint) || MovementType == MovementGeneratorType.Follow)
                me.ClearUnitState(UnitState.Evade);

            GetScript().ProcessEventsFor(SmartEvents.Movementinform, null, (uint)MovementType, Data);
            if (MovementType != MovementGeneratorType.Point || !HasEscortState(SmartEscortState.Escorting))
                return;

            MovepointReached(Data);
        }
示例#14
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point || id != Misc.PointKrickIntro)
            {
                return;
            }

            Talk(TextIds.SayKrickOutro1);
            _phase = KrickPhase.Outro;
            _events.Reset();
            _events.ScheduleEvent(Events.Outro1, 1000);
        }
示例#15
0
            public override void MovementInform(MovementGeneratorType uiType, uint uiPointId)
            {
                if (uiType != MovementGeneratorType.Point)
                {
                    return;
                }

                if (uiPointId == 1)
                {
                    me.SetFacingTo(4.714f);
                }
            }
示例#16
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            switch (id)
            {
            case 1:
                me.HandleEmoteCommand(Emote.StateWorkChopwood);
                break;

            case 2:
                DoCast(me, SpellBuffSleep);
                break;
            }
        }
示例#17
0
        public GenericMovementGenerator(MoveSplineInit splineInit, MovementGeneratorType type, uint id, uint arrivalSpellId = 0, ObjectGuid arrivalSpellTargetGuid = default)
        {
            _splineInit             = splineInit;
            _type                   = type;
            _pointId                = id;
            _duration               = new();
            _arrivalSpellId         = arrivalSpellId;
            _arrivalSpellTargetGuid = arrivalSpellTargetGuid;

            Mode          = MovementGeneratorMode.Default;
            Priority      = MovementGeneratorPriority.Normal;
            Flags         = MovementGeneratorFlags.InitializationPending;
            BaseUnitState = UnitState.Roaming;
        }
示例#18
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Follow)
            {
                return;
            }

            if (instance.GetGuidData(DataType.Bronjahm).GetCounter() != id)
            {
                return;
            }

            me.CastSpell((Unit)null, SpellIds.ConsumeSoul, true);
            me.DespawnOrUnsummon();
        }
示例#19
0
        public static IMovementGenerator SelectMovementAI(Creature creature)
        {
            MovementGeneratorType type = MovementGeneratorType.Idle;

            if (creature.GetPlayerMovingMe() == null)
            {
                type = creature.GetDefaultMovementType();
            }

            return(type switch
            {
                MovementGeneratorType.Random => new RandomMovementGenerator(),
                MovementGeneratorType.Waypoint => new WaypointMovementGenerator(),
                MovementGeneratorType.Idle => new IdleMovementGenerator(),
                _ => null,
            });
示例#20
0
        public override void MovementInform(MovementGeneratorType moveType, uint pointId)
        {
            if (moveType != MovementGeneratorType.Point || !HasEscortState(EscortState.Escorting))
            {
                return;
            }

            //Combat start position reached, continue waypoint movement
            if (pointId == EscortPointIds.LastPoint)
            {
                Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original position before combat");

                me.SetWalk(!m_bIsRunning);
                RemoveEscortState(EscortState.Returning);

                if (m_uiWPWaitTimer == 0)
                {
                    m_uiWPWaitTimer = 1;
                }
            }
            else if (pointId == EscortPointIds.Home)
            {
                Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original home location and will continue from beginning of waypoint list.");

                CurrentWPIndex  = 0;
                m_uiWPWaitTimer = 1;
            }
            else
            {
                var currentWp = WaypointList[CurrentWPIndex];
                //Make sure that we are still on the right waypoint
                if (currentWp.Id != pointId)
                {
                    Log.outError(LogFilter.Misc, $"TSCR ERROR: EscortAI reached waypoint out of order {pointId}, expected {currentWp.Id}, creature entry {me.GetEntry()}");
                    return;
                }

                Log.outDebug(LogFilter.Scripts, $"EscortAI Waypoint {currentWp.Id} reached");

                //Call WP function
                WaypointReached(currentWp.Id);

                m_uiWPWaitTimer = currentWp.WaitTimeMs + 1;

                ++CurrentWPIndex;
            }
        }
示例#21
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point && type != MovementGeneratorType.Effect)
            {
                return;
            }

            switch (id)
            {
            case 0:
                if (_stage != 0)
                {
                    if (me.GetDistance2d(MiscData.ToCCommonLoc[1].GetPositionX(), MiscData.ToCCommonLoc[1].GetPositionY()) < 6.0f)
                    {
                        // Middle of the room
                        _stage = 1;
                    }
                    else
                    {
                        // Landed from Hop backwards (start trample)
                        if (Global.ObjAccessor.GetPlayer(me, _trampleTargetGUID))
                        {
                            _stage = 4;
                        }
                        else
                        {
                            _stage = 6;
                        }
                    }
                }
                break;

            case 1:     // Finish trample
                _movementFinish = true;
                break;

            case 2:
                instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor));
                me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable);
                me.SetReactState(ReactStates.Aggressive);
                me.SetInCombatWithZone();
                break;

            default:
                break;
            }
        }
示例#22
0
        public static MovementGenerator SelectMovementGenerator(Unit unit)
        {
            MovementGeneratorType type = unit.GetDefaultMovementType();
            Creature creature          = unit.ToCreature();

            if (creature != null && creature.GetPlayerMovingMe() == null)
            {
                type = creature.GetDefaultMovementType();
            }

            return(type switch
            {
                MovementGeneratorType.Random => new RandomMovementGenerator(),
                MovementGeneratorType.Waypoint => new WaypointMovementGenerator(),
                MovementGeneratorType.Idle => new IdleMovementGenerator(),
                _ => null,
            });
示例#23
0
        public override void MovementInform(MovementGeneratorType moveType, uint pointId)
        {
            if (moveType != MovementGeneratorType.Point || !HasEscortState(eEscortState.Escorting))
            {
                return;
            }

            //Combat start position reached, continue waypoint movement
            if (pointId == 0xFFFFFF)
            {
                Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original position before combat");

                me.SetWalk(!m_bIsRunning);
                RemoveEscortState(eEscortState.Returning);

                if (m_uiWPWaitTimer == 0)
                {
                    m_uiWPWaitTimer = 1;
                }
            }
            else if (pointId == 0xFFFFFE)
            {
                Log.outDebug(LogFilter.Scripts, "EscortAI has returned to original home location and will continue from beginning of waypoint list.");

                WPIndex         = 0;
                m_uiWPWaitTimer = 1;
            }
            else
            {
                //Make sure that we are still on the right waypoint
                if (GetCurrentWaypoint().id != pointId)
                {
                    Log.outDebug(LogFilter.Server, "TSCR ERROR: EscortAI reached waypoint out of order {0}, expected {1}, creature entry {2}", pointId, GetCurrentWaypoint().id, me.GetEntry());
                    return;
                }

                Log.outDebug(LogFilter.Scripts, "EscortAI Waypoint {0} reached", GetCurrentWaypoint().id);

                //Call WP function
                WaypointReached(GetCurrentWaypoint().id);

                m_uiWPWaitTimer = GetCurrentWaypoint().WaitTimeMs + 1;

                ++WPIndex;
            }
        }
示例#24
0
 public override void MovementInform(MovementGeneratorType type, uint id)
 {
     if (type != MovementGeneratorType.Point)
     {
         return;
     }
     SetCombatMovement(true);
     AttackStart(me.GetVictim());
     if (_step < Misc.hadronoxStep.Length - 1)
     {
         return;
     }
     DoCastAOE(SpellIds.WebFrontDoors);
     DoCastAOE(SpellIds.WebSideDoors);
     _doorsWebbed = true;
     DoZoneInCombat();
 }
示例#25
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point || id != 0)
            {
                return;
            }

            me.SetDisplayId(EyeOfAcherus.EyeSmallDisplayId);

            me.CastSpell(me, EyeOfAcherus.SpellEyeFlight, true);
            me.Say(EyeOfAcherus.SayEyeUnderControl, Language.Universal);

            if (me.GetCharmer() && me.GetCharmer().IsTypeId(TypeId.Player))
            {
                me.GetCharmer().ToPlayer().SetClientControl(me, true);
            }
        }
示例#26
0
        public override void MovementInform(MovementGeneratorType moveType, uint Id)
        {
            // no action allowed if there is no escort
            if (!HasEscortState(EscortState.Escorting))
            {
                return;
            }

            //Combat start position reached, continue waypoint movement
            if (moveType == MovementGeneratorType.Point)
            {
                if (_pauseTimer == 0)
                {
                    _pauseTimer = 2000;
                }

                if (Id == EscortPointIds.LastPoint)
                {
                    Log.outDebug(LogFilter.Scripts, "EscortAI.MovementInform has returned to original position before combat");

                    me.SetWalk(!_running);
                    RemoveEscortState(EscortState.Returning);
                }
                else if (Id == EscortPointIds.Home)
                {
                    Log.outDebug(LogFilter.Scripts, "EscortAI.MovementInform: returned to home location and restarting waypoint path");
                    _started = false;
                }
            }
            else if (moveType == MovementGeneratorType.Waypoint)
            {
                Cypher.Assert(Id < _path.nodes.Count, $"EscortAI.MovementInform: referenced movement id ({Id}) points to non-existing node in loaded path");
                WaypointNode waypoint = _path.nodes[(int)Id];

                Log.outDebug(LogFilter.Scripts, $"EscortAI.MovementInform: waypoint node {waypoint.id} reached");

                // last point
                if (Id == _path.nodes.Count - 1)
                {
                    _started    = false;
                    _ended      = true;
                    _pauseTimer = 1000;
                }
            }
        }
示例#27
0
        public override void MovementInform(MovementGeneratorType movementType, uint pointId)
        {
            if (movementType == MovementGeneratorType.Waypoint && pointId == 2)
            {
                me.SetSheath(SheathState.Melee);
                me.RemoveAllAuras();

                Player owner = me.GetCharmerOrOwner().ToPlayer();
                if (owner)
                {
                    owner.RemoveAura(SpellIds.EyeFlightBoost);
                    for (UnitMoveType i = 0; i < UnitMoveType.Max; ++i)
                    {
                        me.SetSpeedRate(i, owner.GetSpeedRate(i));
                    }

                    Talk(TextIds.TalkControl, owner);
                }
                me.SetDisableGravity(false);
                DoCast(me, SpellIds.EyeFlight);
            }

            if (movementType == MovementGeneratorType.Point && pointId == 1)
            {
                me.SetDisableGravity(true);
                me.SetControlled(true, UnitState.Root);
                _scheduler.Schedule(System.TimeSpan.FromSeconds(5), task =>
                {
                    DoCast(me, SpellIds.EyeFlightBoost);

                    me.SetControlled(false, UnitState.Root);

                    Player owner = me.GetCharmerOrOwner().ToPlayer();
                    if (owner)
                    {
                        for (UnitMoveType i = 0; i < UnitMoveType.Max; ++i)
                        {
                            me.SetSpeedRate(i, owner.GetSpeedRate(i));
                        }
                        Talk(TextIds.TalkMoveStart, owner);
                    }
                    me.GetMotionMaster().MovePath(me.GetEntry() * 100, false);
                });
            }
        }
示例#28
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point)
                return;

            if (id == 1)
            {
                Creature colossus = instance.GetCreature(GDDataTypes.DrakkariColossus);
                if (colossus)
                {
                    colossus.GetAI().DoAction(Misc.ActionUnfreezeColossus);
                    if (colossus.GetAI().GetData(Misc.DataIntroDone) == 0)
                        colossus.GetAI().SetData(Misc.DataIntroDone, 1);
                    colossus.SetInCombatWithZone();
                    me.DespawnOrUnsummon();
                }
            }
        }
示例#29
0
        public override void MovementInform(MovementGeneratorType movementType, uint id)
        {
            if (movementType == MovementGeneratorType.Point && id == EventId.SmartEscortLastOCCPoint)
            {
                me.ClearUnitState(UnitState.Evade);
            }

            GetScript().ProcessEventsFor(SmartEvents.Movementinform, null, (uint)movementType, id);

            if (!HasEscortState(SmartEscortState.Escorting))
            {
                return;
            }

            if (movementType != MovementGeneratorType.Point && id == EventId.SmartEscortLastOCCPoint)
            {
                _OOCReached = true;
            }
        }
示例#30
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            ObjectGuid guid = _instance.GetGuidData(BossIds.Xt002);

            if (type == MovementGeneratorType.Follow && id == guid.GetCounter())
            {
                Creature xt002 = ObjectAccessor.GetCreature(me, guid);
                if (xt002)
                {
                    if (me.IsWithinMeleeRange(xt002))
                    {
                        DoCast(xt002, SpellIds.ScrapbotRideVehicle);
                        // Unapply vehicle aura again
                        xt002.RemoveAurasDueToSpell(SpellIds.ScrapbotRideVehicle);
                        me.DespawnOrUnsummon();
                    }
                }
            }
        }
示例#31
0
        public override void MovementInform(MovementGeneratorType type, uint id)
        {
            if (type != MovementGeneratorType.Point)
            {
                return;
            }

            switch (id)
            {
            case 0:
                instance.DoUseDoorOrButton(instance.GetGuidData(GameObjectIds.MainGateDoor));
                me.RemoveFlag(UnitFields.Flags, UnitFlags.NonAttackable | UnitFlags.NotSelectable);
                me.SetReactState(ReactStates.Aggressive);
                me.SetInCombatWithZone();
                break;

            default:
                break;
            }
        }