void Mutate(MovementGenerator m, MovementSlot _slot) { int slot = (int)_slot; MovementGenerator curr = Impl[slot]; if (curr != null) { Impl[slot] = null; // in case a new one is generated in this slot during directdelete if (_top == slot && Convert.ToBoolean(_cleanFlag & MMCleanFlag.UPDATE)) { DelayedDelete(curr); } else { DirectDelete(curr); } } else if (_top < slot) { _top = slot; } Impl[slot] = m; if (_top > slot) { _needInit[slot] = true; } else { _needInit[slot] = false; m.Initialize(_owner); } }
void StartMovement(IMovementGenerator m, MovementSlot slot) { IMovementGenerator curr = _slot[(int)slot]; if (curr != null) { _slot[(int)slot] = null; // in case a new one is generated in this slot during directdelete if (_top == (int)slot && Convert.ToBoolean(_cleanFlag & MMCleanFlag.Update)) { DelayedDelete(curr); } else { DirectDelete(curr); } } else if (_top < (int)slot) { _top = (int)slot; } _slot[(int)slot] = m; if (_top > (int)slot) { _initialize[(int)slot] = true; } else { _initialize[(int)slot] = false; m.Initialize(_owner); } }
public void MoveFollow(Unit target, float dist, float angle, MovementSlot slot = MovementSlot.ACTIVE) { // ignore movement request if target not exist if (target == null || target == _owner || _owner.HasFlag(UnitFields.Flags, UnitFlags.DisableMove)) { return; } //_owner->AddUnitState(UNIT_STATE_FOLLOW); if (_owner.GetTypeId() == ObjectType.Player) { Log.outDebug("Player (GUID: {0}) follow to {1} (GUID: {2})", _owner.GetGUIDLow(), target.GetTypeId() == ObjectType.Player ? "player" : "creature", target.GetTypeId() == ObjectType.Player ? target.GetGUIDLow() : target.ToCreature().GetGUIDLow()); Mutate(new FollowMovementGenerator <Player>(target, dist, angle), slot); } else { Log.outDebug("Creature (Entry: {0} GUID: {1}) follow to {2} (GUID: {3})", _owner.GetEntry(), _owner.GetGUIDLow(), target.GetTypeId() == ObjectType.Player ? "player" : "creature", target.GetTypeId() == ObjectType.Player ? target.GetGUIDLow() : target.ToCreature().GetGUIDLow()); Mutate(new FollowMovementGenerator <Creature>(target, dist, angle), slot); } }
public IMovementGenerator GetMotionSlot(MovementSlot slot) { if (Empty() || slot >= MovementSlot.Max || _slot[(int)slot] == null) { return(null); } return(_slot[(int)slot]); }
public MovementGeneratorType GetMotionSlotType(MovementSlot slot) { if (Empty() || slot >= MovementSlot.Max || _slot[(int)slot] == null) { return(MovementGeneratorType.Max); } return(_slot[(int)slot].GetMovementGeneratorType()); }
public MovementGeneratorType GetMotionSlotType(MovementSlot slot) { if (_slot[(int)slot] == null) { return(MovementGeneratorType.Null); } else { return(_slot[(int)slot].GetMovementGeneratorType()); } }
void DelayedClean(MovementSlot slot) { IMovementGenerator motion = GetMotionSlot(slot); if (motion != null) { _slot[(int)slot] = null; DelayedDelete(motion); } while (!Empty() && Top() == null) { --_top; } }
public void Clear(MovementSlot slot) { if (Empty() || slot >= MovementSlot.Max) { return; } if (_cleanFlag.HasAnyFlag(MMCleanFlag.Update)) { DelayedClean(slot); } else { DirectClean(slot); } }
public void MoveFollow(Unit target, float dist = 0.0f, float angle = 0.0f, MovementSlot slot = MovementSlot.Idle) { if (!target || target == _owner) { return; } if (_owner.IsTypeId(TypeId.Player)) { StartMovement(new FollowMovementGenerator <Player>(target, dist, angle), slot); } else { StartMovement(new FollowMovementGenerator <Creature>(target, dist, angle), slot); } }
private void StartMovement(MovementGenerator movement, MovementSlot newMovementSlot) { int newMovementIndex = (int)newMovementSlot; FinishMovement(newMovementIndex); if (currentMovementIndex < newMovementIndex) { currentMovementIndex = newMovementIndex; } movementGenerators[newMovementIndex] = movement; if (currentMovementIndex > newMovementIndex) { startedMovement[newMovementIndex] = false; } else { BeginMovement(newMovementIndex); } }
private void CancelMovement(MovementType movementType, MovementSlot cancelledMovementSlot) { int cancelledIndex = (int)cancelledMovementSlot; if (movementGenerators[cancelledIndex] == null) { return; } if (movementGenerators[cancelledIndex].Type != movementType) { return; } if (currentMovementIndex == cancelledIndex) { ResetCurrentMovement(); } else { FinishMovement(cancelledIndex); } }
void DirectClean(MovementSlot slot) { IMovementGenerator motion = GetMotionSlot(slot); if (motion != null) { _slot[(int)slot] = null; DirectDelete(motion); } while (!Empty() && Top() == null) { --_top; } if (Empty()) { Initialize(); } else if (NeedInitTop()) { InitTop(); } }
public IMovementGenerator GetMotionSlot(MovementSlot slot) { Cypher.Assert((int)slot >= 0); return(_slot[(int)slot]); }