bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if (creature.hasUnitState(UNIT_STAT_NOT_MOVE)) { i_nextMoveTime.Update(i_nextMoveTime.GetExpiry()); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING_MOVE); return true; } i_nextMoveTime.Update(diff); if (i_destinationHolder.HasArrived() && !creature.IsStopped() && !creature.canFly()) creature.clearUnitState(UNIT_STAT_ROAMING_MOVE); if (!i_destinationHolder.HasArrived() && creature.IsStopped()) creature.addUnitState(UNIT_STAT_ROAMING_MOVE); CreatureTraveller traveller(creature); if (i_destinationHolder.UpdateTraveller(traveller, diff, false, true)) { if (!IsActive(creature)) // force stop processing (movement can move out active zone with cleanup movegens list) return true; // not expire now, but already lost if (i_nextMoveTime.Passed()) { float x,y,z; if(i_destinationHolder.HasDestination()) i_destinationHolder.GetLocationNowNoMicroMovement(x,y,z); else creature.GetPosition(x,y,z); if (creature.canFly() && !(creature.canWalk() && creature.IsAtGroundLevel(x,y,z))) creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7); else creature.AddSplineFlag(SPLINEFLAG_WALKMODE); _setRandomLocation(creature); } else if (creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(), PET_FOLLOW_DIST+2.5f)) { creature.AddSplineFlag(SPLINEFLAG_WALKMODE); _setRandomLocation(creature); } } return true; }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; creature.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); _setRandomLocation(creature); }
void RandomMovementGenerator<Creature>::Initialize(Creature& creature) { creature.addUnitState(UNIT_STAT_ROAMING); // _MOVE set in _setRandomLocation if (!creature.isAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE)) return; _setRandomLocation(creature); }
bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if (creature.IsStopped() || static_cast<MovementGenerator*>(this)->_recalculateTravel) { i_nextMoveTime.Update(diff); if (i_nextMoveTime.Passed() || static_cast<MovementGenerator*>(this)->_recalculateTravel) _setRandomLocation(creature); } return true; }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; if (!wander_distance) wander_distance = creature.GetRespawnRadius(); creature.AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); _setRandomLocation(creature); }
bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if(creature.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) { i_nextMoveTime.Update(i_nextMoveTime.GetExpiry()); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING); return true; } i_nextMoveTime.Update(diff); if(i_destinationHolder.HasArrived() && !creature.IsStopped() && !creature.canFly()) creature.clearUnitState(UNIT_STAT_ROAMING); if(!i_destinationHolder.HasArrived() && creature.IsStopped()) creature.addUnitState(UNIT_STAT_ROAMING); CreatureTraveller traveller(creature); if( i_destinationHolder.UpdateTraveller(traveller, diff, false, true) ) { if(i_nextMoveTime.Passed()) { if (creature.canFly()) creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); else // run with 1/RUNNING_CHANCE_RANDOMMV chance creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); _setRandomLocation(creature); } else if(creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(),PET_FOLLOW_DIST+2.5f)) { creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); _setRandomLocation(creature); } } return true; }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if(!creature.isAlive()) return; if (creature.canFly()) creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); else creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE ); _setRandomLocation(creature); }
bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if (creature.hasUnitState(UNIT_STAT_NOT_MOVE & ~UNIT_STAT_ON_VEHICLE)) { i_nextMoveTime.Update(i_nextMoveTime.GetExpiry()); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);; return true; } i_nextMoveTime.Update(diff); if (i_destinationHolder.HasArrived() && !creature.IsStopped() && !creature.canFly()) creature.clearUnitState(UNIT_STAT_ROAMING_MOVE); if (!i_destinationHolder.HasArrived() && creature.IsStopped()) creature.addUnitState(UNIT_STAT_ROAMING_MOVE); CreatureTraveller traveller(creature); if (i_destinationHolder.UpdateTraveller(traveller, diff, false, true)) { if (i_nextMoveTime.Passed()) { if (creature.canFly()) creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7); else creature.AddSplineFlag(SPLINEFLAG_WALKMODE); _setRandomLocation(creature); } else if (creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(), PET_FOLLOW_DIST+2.5f)) { creature.AddSplineFlag(SPLINEFLAG_WALKMODE); _setRandomLocation(creature); } } return true; }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; if (creature.canFly()) creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); else creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); _setRandomLocation(creature); }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; if (!wander_distance) wander_distance = creature.GetRespawnRadius(); if (irand(0, RUNNING_CHANCE_RANDOMMV) > 0) creature.AddUnitMovementFlag(MOVEMENTFLAG_WALKING); _setRandomLocation(creature); }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; if (creature.CanFly()) creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7); else creature.AddSplineFlag(SPLINEFLAG_WALKMODE); creature.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); _setRandomLocation(creature); }
bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if(creature.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) { i_nextMoveTime.Update(i_nextMoveTime.GetExpiry()); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING); return true; } i_nextMoveTime.Update(diff); if(i_destinationHolder.HasArrived() && !creature.IsStopped() && !creature.canFly()) creature.clearUnitState(UNIT_STAT_ROAMING); if(!i_destinationHolder.HasArrived() && creature.IsStopped()) creature.addUnitState(UNIT_STAT_ROAMING); CreatureTraveller traveller(creature); if( i_destinationHolder.UpdateTraveller(traveller, diff, false, true) ) { if(i_nextMoveTime.Passed()) { if (creature.canFly()) creature.AddUnitMovementFlag(MOVEMENTFLAG_FLYING2); else creature.SetUnitMovementFlags(irand(0,RUNNING_CHANCE_RANDOMMV) > 0 ? MOVEMENTFLAG_WALK_MODE : MOVEMENTFLAG_NONE); _setRandomLocation(creature); } else if(creature.isPet() && creature.GetOwner() && creature.GetDistance(creature.GetOwner()) > PET_FOLLOW_DIST+2.5f) { creature.SetUnitMovementFlags(MOVEMENTFLAG_NONE); _setRandomLocation(creature); } } return true; }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if (!creature.isAlive()) return; if (creature.canFly() && !(creature.canWalk() && creature.IsAtGroundLevel(creature.GetPositionX(), creature.GetPositionY(), creature.GetPositionZ()))) creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7); else creature.AddSplineFlag(SPLINEFLAG_WALKMODE); creature.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); _setRandomLocation(creature); }
void RandomMovementGenerator<Creature>::Initialize(Creature &creature) { if(!creature.isAlive()) return; if (creature.canFly()) creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY); else if(irand(0,RUNNING_CHANCE_RANDOMMV) > 0) creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK); else creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); // run with 1/RUNNING_CHANCE_RANDOMMV chance _setRandomLocation(creature); }
bool RandomMovementGenerator<Creature>::Update(Creature& creature, const uint32& diff) { if (creature.hasUnitState(UNIT_STAT_NOT_MOVE)) { i_nextMoveTime.Reset(0); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING_MOVE); return true; } if (creature.movespline->Finalized()) { i_nextMoveTime.Update(diff); if (i_nextMoveTime.Passed()) _setRandomLocation(creature); } return true; }
bool RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff) { if (creature.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED)) { i_nextMoveTime.Reset(0); // Expire the timer creature.clearUnitState(UNIT_STAT_ROAMING); return true; } if (creature.IsStopped() || static_cast<MovementGenerator*>(this)->_recalculateTravel) { i_nextMoveTime.Update(diff); if (i_nextMoveTime.Passed() || static_cast<MovementGenerator*>(this)->_recalculateTravel) _setRandomLocation(creature); } return true; }
bool RandomMovementGenerator<Creature>::Update(Creature* creature, const uint32 diff) { if (creature->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) { i_nextMoveTime.Reset(0); // Expire the timer creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } if (creature->movespline->Finalized()) { i_nextMoveTime.Update(diff); if (i_nextMoveTime.Passed()) _setRandomLocation(creature); } return true; }
bool RandomMovementGenerator<Creature>::DoUpdate(Creature* creature, const uint32 diff) { if (creature->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED | UNIT_STATE_DISTRACTED)) { _nextMoveTime.Reset(0); // Expire the timer creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } // xinef: if we got disable move flag, do not remove default generator - just prevent movement if (creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) { _nextMoveTime.Reset(0); // Expire the timer creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } // prevent movement while casting spells with cast time or channel time if (creature->HasUnitState(UNIT_STATE_CASTING)) { bool stop = true; if (Spell* spell = creature->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) if (!(spell->GetSpellInfo()->ChannelInterruptFlags & (AURA_INTERRUPT_FLAG_MOVE | AURA_INTERRUPT_FLAG_TURNING)) && !(spell->GetSpellInfo()->InterruptFlags & SPELL_INTERRUPT_FLAG_MOVEMENT)) stop = false; if (stop) { if (!creature->IsStopped()) creature->StopMoving(); return true; } } if (creature->movespline->Finalized()) { _nextMoveTime.Update(diff); if (_nextMoveTime.Passed()) _setRandomLocation(creature); } return true; }