Get rid of monster movement flags, since it's really spline flags.

Thanks to Ralek for research.
This commit is contained in:
tomrus88 2010-02-07 14:53:09 +03:00
parent 4a3081e7d5
commit db547a008a
20 changed files with 206 additions and 182 deletions

View file

@ -71,7 +71,7 @@ template<>
void
ConfusedMovementGenerator<Creature>::_InitSpecific(Creature &creature, bool &is_water_ok, bool &is_land_ok)
{
creature.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK);
creature.RemoveSplineFlag(SPLINEFLAG_WALKMODE);
is_water_ok = creature.canSwim();
is_land_ok = creature.canWalk();
@ -158,7 +158,7 @@ template<>
void ConfusedMovementGenerator<Creature>::Finalize(Creature &unit)
{
unit.clearUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE);
unit.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
unit.AddSplineFlag(SPLINEFLAG_WALKMODE);
}
template void ConfusedMovementGenerator<Player>::Initialize(Player &player);

View file

@ -119,7 +119,7 @@ m_deathTimer(0), m_respawnTime(0), m_respawnDelay(25), m_corpseDelay(60), m_resp
m_subtype(subtype), m_defaultMovementType(IDLE_MOTION_TYPE), m_DBTableGuid(0), m_equipmentId(0),
m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false),
m_regenHealth(true), m_AI_locked(false), m_isDeadByDefault(false), m_meleeDamageSchoolMask(SPELL_SCHOOL_MASK_NORMAL),
m_creatureInfo(NULL), m_isActiveObject(false), m_monsterMoveFlags(MONSTER_MOVE_WALK)
m_creatureInfo(NULL), m_isActiveObject(false), m_splineFlags(SPLINEFLAG_WALKMODE)
{
m_regenTimer = 200;
m_valuesCount = UNIT_END;
@ -131,7 +131,7 @@ m_creatureInfo(NULL), m_isActiveObject(false), m_monsterMoveFlags(MONSTER_MOVE_W
m_CreatureCategoryCooldowns.clear();
m_GlobalCooldown = 0;
m_monsterMoveFlags = MONSTER_MOVE_WALK;
m_splineFlags = SPLINEFLAG_WALKMODE;
}
Creature::~Creature()
@ -749,7 +749,7 @@ bool Creature::isCanTrainingAndResetTalentsOf(Player* pPlayer) const
&& pPlayer->getClass() == GetCreatureInfo()->trainer_class;
}
void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, MonsterMovementFlags flags, uint8 type)
void Creature::AI_SendMoveToPacket(float x, float y, float z, uint32 time, SplineFlags flags, uint8 type)
{
/* uint32 timeElap = getMSTime();
if ((timeElap - m_startMove) < m_moveTime)
@ -1257,7 +1257,7 @@ void Creature::setDeathState(DeathState s)
CreatureInfo const *cinfo = GetCreatureInfo();
SetUInt32Value(UNIT_DYNAMIC_FLAGS, 0);
RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE);
AddMonsterMoveFlag(MONSTER_MOVE_WALK);
AddSplineFlag(SPLINEFLAG_WALKMODE);
SetUInt32Value(UNIT_NPC_FLAGS, cinfo->npcflag);
Unit::setDeathState(ALIVE);
clearUnitState(UNIT_STAT_ALL_STATE);
@ -1692,7 +1692,7 @@ bool Creature::LoadCreaturesAddon(bool reload)
SetUInt32Value(UNIT_NPC_EMOTESTATE, cainfo->emote);
if (cainfo->move_flags != 0)
SetMonsterMoveFlags(MonsterMovementFlags(cainfo->move_flags));
SetSplineFlags(SplineFlags(cainfo->move_flags));
if(cainfo->auras)
{
@ -2058,7 +2058,7 @@ void Creature::SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transi
}
}
//float orientation = (float)atan2((double)dy, (double)dx);
SendMonsterMove(x, y, z, 0, GetMonsterMoveFlags(), transitTime, player);
SendMonsterMove(x, y, z, 0, GetSplineFlags(), transitTime, player);
}
void Creature::SendAreaSpiritHealerQueryOpcode(Player *pl)

View file

@ -438,31 +438,31 @@ class MANGOS_DLL_SPEC Creature : public Unit
bool AIM_Initialize();
void AI_SendMoveToPacket(float x, float y, float z, uint32 time, MonsterMovementFlags MovementFlags, uint8 type);
void AI_SendMoveToPacket(float x, float y, float z, uint32 time, SplineFlags MovementFlags, uint8 type);
CreatureAI* AI() { return i_AI; }
void AddMonsterMoveFlag(MonsterMovementFlags f)
void AddSplineFlag(SplineFlags f)
{
bool need_walk_sync = (f & MONSTER_MOVE_WALK) != (m_monsterMoveFlags & MONSTER_MOVE_WALK);
m_monsterMoveFlags = MonsterMovementFlags(m_monsterMoveFlags | f);
bool need_walk_sync = (f & SPLINEFLAG_WALKMODE) != (m_splineFlags & SPLINEFLAG_WALKMODE);
m_splineFlags = SplineFlags(m_splineFlags | f);
if (need_walk_sync)
UpdateWalkMode(this,false);
UpdateWalkMode(this, false);
}
void RemoveMonsterMoveFlag(MonsterMovementFlags f)
void RemoveSplineFlag(SplineFlags f)
{
bool need_walk_sync = (f & MONSTER_MOVE_WALK) != (m_monsterMoveFlags & MONSTER_MOVE_WALK);
m_monsterMoveFlags = MonsterMovementFlags(m_monsterMoveFlags & ~f);
bool need_walk_sync = (f & SPLINEFLAG_WALKMODE) != (m_splineFlags & SPLINEFLAG_WALKMODE);
m_splineFlags = SplineFlags(m_splineFlags & ~f);
if (need_walk_sync)
UpdateWalkMode(this,false);
UpdateWalkMode(this, false);
}
bool HasMonsterMoveFlag(MonsterMovementFlags f) const { return m_monsterMoveFlags & f; }
MonsterMovementFlags GetMonsterMoveFlags() const { return m_monsterMoveFlags; }
void SetMonsterMoveFlags(MonsterMovementFlags f)
bool HasSplineFlag(SplineFlags f) const { return m_splineFlags & f; }
SplineFlags GetSplineFlags() const { return m_splineFlags; }
void SetSplineFlags(SplineFlags f)
{
bool need_walk_sync = (f & MONSTER_MOVE_WALK) != (m_monsterMoveFlags & MONSTER_MOVE_WALK);
m_monsterMoveFlags = f; // need set before
bool need_walk_sync = (f & SPLINEFLAG_WALKMODE) != (m_splineFlags & SPLINEFLAG_WALKMODE);
m_splineFlags = f; // need set before
if (need_walk_sync)
UpdateWalkMode(this,false);
UpdateWalkMode(this, false);
}
void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
@ -470,7 +470,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
uint32 GetShieldBlockValue() const //dunno mob block value
{
return (getLevel()/2 + uint32(GetStat(STAT_STRENGTH)/20));
return (getLevel() / 2 + uint32(GetStat(STAT_STRENGTH) / 20));
}
SpellSchoolMask GetMeleeDamageSchoolMask() const { return m_meleeDamageSchoolMask; }
@ -484,7 +484,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
bool HasSpell(uint32 spellID) const;
bool UpdateEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData* data=NULL);
bool UpdateEntry(uint32 entry, uint32 team = ALLIANCE, const CreatureData* data = NULL);
bool UpdateStats(Stats stat);
bool UpdateAllStats();
void UpdateResistances(uint32 school);
@ -670,7 +670,7 @@ class MANGOS_DLL_SPEC Creature : public Unit
GridReference<Creature> m_gridRef;
CreatureInfo const* m_creatureInfo; // in difficulty mode > 0 can different from ObjMgr::GetCreatureTemplate(GetEntry())
bool m_isActiveObject;
MonsterMovementFlags m_monsterMoveFlags;
SplineFlags m_splineFlags;
};
class AssistDelayEvent : public BasicEvent

View file

@ -310,7 +310,7 @@ template<>
void
FleeingMovementGenerator<Creature>::_Init(Creature &owner)
{
owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK);
owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE);
owner.SetTargetGUID(0);
is_water_ok = owner.canSwim();
is_land_ok = owner.canWalk();
@ -333,7 +333,7 @@ void FleeingMovementGenerator<Player>::Finalize(Player &owner)
template<>
void FleeingMovementGenerator<Creature>::Finalize(Creature &owner)
{
owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
owner.AddSplineFlag(SPLINEFLAG_WALKMODE);
owner.clearUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE);
}

View file

@ -27,7 +27,7 @@
void
HomeMovementGenerator<Creature>::Initialize(Creature & owner)
{
owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK);
owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE);
_setTargetLocation(owner);
}
@ -63,7 +63,7 @@ HomeMovementGenerator<Creature>::Update(Creature &owner, const uint32& time_diff
if (time_diff > i_travel_timer)
{
owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
owner.AddSplineFlag(SPLINEFLAG_WALKMODE);
// restore orientation of not moving creature at returning to home
if(owner.GetDefaultMovementType()==IDLE_MOTION_TYPE)

View file

@ -5897,7 +5897,7 @@ bool ChatHandler::HandleComeToMeCommand(const char *args)
uint32 newFlags = atoi(newFlagStr);
caster->SetMonsterMoveFlags(MonsterMovementFlags(newFlags));
caster->SetSplineFlags(SplineFlags(newFlags));
Player* pl = m_session->GetPlayer();

View file

@ -267,7 +267,7 @@ void WorldSession::HandleLogoutRequestOpcode( WorldPacket & /*recv_data*/ )
if( GetPlayer()->isInCombat() || //...is in combat
GetPlayer()->duel || //...is in Duel
//...is jumping ...is falling
GetPlayer()->m_movementInfo.HasMovementFlag(MovementFlags(MOVEFLAG_JUMPING | MOVEFLAG_FALLING)))
GetPlayer()->m_movementInfo.HasMovementFlag(MovementFlags(MOVEFLAG_FALLING | MOVEFLAG_FALLINGFAR)))
{
WorldPacket data( SMSG_LOGOUT_RESPONSE, (2+4) ) ;
data << (uint8)0xC;

View file

@ -276,7 +276,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
if (!((Creature*)unit)->hasUnitState(UNIT_STAT_MOVING))
{
// (ok) possibly some "hover" mode
unit->m_movementInfo.AddMovementFlag(MOVEFLAG_FLY_UNK1);
unit->m_movementInfo.AddMovementFlag(MOVEFLAG_ROOT);
}
else
{
@ -299,13 +299,13 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_ONTRANSPORT);
// remove unknown, unused etc flags for now
player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_SPLINE2);
player->m_movementInfo.RemoveMovementFlag(MOVEFLAG_SPLINE_ENABLED);
if(player->isInFlight())
{
ASSERT(player->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE);
player->m_movementInfo.AddMovementFlag(MOVEFLAG_FORWARD);
player->m_movementInfo.AddMovementFlag(MOVEFLAG_SPLINE2);
player->m_movementInfo.AddMovementFlag(MOVEFLAG_SPLINE_ENABLED);
}
}
break;
@ -328,11 +328,11 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
*data << float(unit->GetSpeed(MOVE_PITCH_RATE));
// 0x08000000
if(unit->m_movementInfo.GetMovementFlags() & MOVEFLAG_SPLINE2)
if(unit->m_movementInfo.GetMovementFlags() & MOVEFLAG_SPLINE_ENABLED)
{
if(GetTypeId() != TYPEID_PLAYER)
{
sLog.outDebug("_BuildMovementUpdate: MOVEFLAG_SPLINE2 for non-player");
sLog.outDebug("_BuildMovementUpdate: MOVEFLAG_SPLINE_ENABLED for non-player");
return;
}
@ -340,7 +340,7 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
if(!player->isInFlight())
{
sLog.outDebug("_BuildMovementUpdate: MOVEFLAG_SPLINE2 but not in flight");
sLog.outDebug("_BuildMovementUpdate: MOVEFLAG_SPLINE_ENABLED but not in flight");
return;
}
@ -348,23 +348,23 @@ void Object::BuildMovementUpdate(ByteBuffer * data, uint16 updateFlags) const
FlightPathMovementGenerator *fmg = (FlightPathMovementGenerator*)(player->GetMotionMaster()->top());
uint32 flags3 = MONSTER_MOVE_SPLINE_FLY;
uint32 flags3 = SPLINEFLAG_WALKMODE | SPLINEFLAG_FLYING;
*data << uint32(flags3); // splines flag?
if(flags3 & SPLINE_MOVE_FLAG_FACING) // may be orientation
if(flags3 & SPLINEFLAG_FINALFACING) // may be orientation
{
*data << float(0);
}
else
{
if(flags3 & SPLINE_MOVE_FLAG_GUID) // probably guid there
if(flags3 & SPLINEFLAG_FINALTARGET) // probably guid there
{
*data << uint64(0);
}
else
{
if(flags3 & SPLINE_MOVE_FLAG_POINT) // probably x,y,z coords there
if(flags3 & SPLINEFLAG_FINALPOINT) // probably x,y,z coords there
{
*data << float(0);
*data << float(0);

View file

@ -844,10 +844,10 @@ void ObjectMgr::LoadCreatureAddons(SQLStorage& creatureaddons, char const* entry
if (!sEmotesStore.LookupEntry(addon->emote))
sLog.outErrorDb("Creature (%s %u) have invalid emote (%u) defined in `%s`.", entryName, addon->guidOrEntry, addon->emote, creatureaddons.GetTableName());
if (addon->move_flags & (MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4))
if (addon->move_flags & (SPLINEFLAG_TRAJECTORY|SPLINEFLAG_UNKNOWN3))
{
sLog.outErrorDb("Creature (%s %u) movement flags mask defined in `%s` include forbidden flags (" I32FMT ") that can crash client, cleanup at load.", entryName, addon->guidOrEntry, creatureaddons.GetTableName(), (MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4));
const_cast<CreatureDataAddon*>(addon)->move_flags &= ~(MONSTER_MOVE_UNK1|MONSTER_MOVE_UNK4);
sLog.outErrorDb("Creature (%s %u) movement flags mask defined in `%s` include forbidden flags (" I32FMT ") that can crash client, cleanup at load.", entryName, addon->guidOrEntry, creatureaddons.GetTableName(), (SPLINEFLAG_TRAJECTORY|SPLINEFLAG_UNKNOWN3));
const_cast<CreatureDataAddon*>(addon)->move_flags &= ~(SPLINEFLAG_TRAJECTORY|SPLINEFLAG_UNKNOWN3);
}
ConvertCreatureAddonAuras(const_cast<CreatureDataAddon*>(addon), creatureaddons.GetTableName(), entryName);

View file

@ -20219,8 +20219,8 @@ void Player::ExitVehicle(Vehicle *vehicle)
WorldPacket data(MSG_MOVE_TELEPORT_ACK, 30);
data.append(GetPackGUID());
data << uint32(0); // counter?
data << uint32(MOVEFLAG_FLY_UNK1); // fly unk
data << uint16(0x40); // special flags
data << uint32(MOVEFLAG_ROOT); // fly unk
data << uint16(MOVEFLAG2_UNK4); // special flags
data << uint32(getMSTime()); // time
data << vehicle->GetPositionX(); // x
data << vehicle->GetPositionY(); // y

View file

@ -31,10 +31,10 @@ void PointMovementGenerator<T>::Initialize(T &unit)
unit.StopMoving();
unit.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE);
Traveller<T> traveller(unit);
i_destinationHolder.SetDestination(traveller,i_x,i_y,i_z);
i_destinationHolder.SetDestination(traveller, i_x, i_y, i_z);
if (unit.GetTypeId() == TYPEID_UNIT && ((Creature*)&unit)->canFly())
((Creature&)unit).AddMonsterMoveFlag(MONSTER_MOVE_FLY);
((Creature&)unit).AddSplineFlag(SPLINEFLAG_UNKNOWN7);
}
template<class T>

View file

@ -98,13 +98,13 @@ RandomMovementGenerator<Creature>::_setRandomLocation(Creature &creature)
if (is_air_ok)
{
i_nextMoveTime.Reset(i_destinationHolder.GetTotalTravelTime());
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
}
//else if (is_water_ok) // Swimming mode to be done with more than this check
else
{
i_nextMoveTime.Reset(urand(500+i_destinationHolder.GetTotalTravelTime(), 10000+i_destinationHolder.GetTotalTravelTime()));
creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
}
}
@ -115,9 +115,9 @@ void RandomMovementGenerator<Creature>::Initialize(Creature &creature)
return;
if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
else
creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
creature.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE);
_setRandomLocation(creature);
@ -168,15 +168,15 @@ RandomMovementGenerator<Creature>::Update(Creature &creature, const uint32 &diff
if (i_nextMoveTime.Passed())
{
if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
else
creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
_setRandomLocation(creature);
}
else if (creature.isPet() && creature.GetOwner() && !creature.IsWithinDist(creature.GetOwner(), PET_FOLLOW_DIST+2.5f))
{
creature.AddMonsterMoveFlag(MONSTER_MOVE_WALK);
creature.AddSplineFlag(SPLINEFLAG_WALKMODE);
_setRandomLocation(creature);
}
}

View file

@ -2890,7 +2890,7 @@ void Spell::update(uint32 difftime)
// check if the player caster has moved before the spell finished
if ((m_caster->GetTypeId() == TYPEID_PLAYER && m_timer != 0) &&
(m_castPositionX != m_caster->GetPositionX() || m_castPositionY != m_caster->GetPositionY() || m_castPositionZ != m_caster->GetPositionZ()) &&
(m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLING)))
(m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK || !((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLINGFAR)))
{
// always cancel for channeled spells
if( m_spellState == SPELL_STATE_CASTING )
@ -2922,7 +2922,7 @@ void Spell::update(uint32 difftime)
if( m_caster->GetTypeId() == TYPEID_PLAYER )
{
// check if player has jumped before the channeling finished
if(((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_JUMPING))
if(((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLING))
cancel();
// check for incapacitating player states
@ -4026,7 +4026,7 @@ SpellCastResult Spell::CheckCast(bool strict)
if( m_caster->GetTypeId() == TYPEID_PLAYER && ((Player*)m_caster)->isMoving() )
{
// skip stuck spell to allow use it in falling case and apply spell limitations at movement
if( (!((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLING) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
if( (!((Player*)m_caster)->m_movementInfo.HasMovementFlag(MOVEFLAG_FALLINGFAR) || m_spellInfo->Effect[0] != SPELL_EFFECT_STUCK) &&
(IsAutoRepeat() || (m_spellInfo->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED) != 0) )
return SPELL_FAILED_MOVING;
}

View file

@ -3618,7 +3618,7 @@ void Aura::HandleModPossessPet(bool apply, bool Real)
{
pet->AttackStop();
pet->GetMotionMaster()->MoveFollow(caster, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
pet->AddMonsterMoveFlag(MONSTER_MOVE_WALK);
pet->AddSplineFlag(SPLINEFLAG_WALKMODE);
}
}

View file

@ -6336,14 +6336,14 @@ void Spell::EffectCharge(uint32 /*i*/)
((Creature *)unitTarget)->StopMoving();
// Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
m_caster->SendMonsterMove(x, y, z, 0, m_caster->GetTypeId()==TYPEID_PLAYER ? MONSTER_MOVE_WALK : ((Creature*)m_caster)->GetMonsterMoveFlags(), 1);
m_caster->SendMonsterMove(x, y, z, 0, m_caster->GetTypeId() == TYPEID_PLAYER ? SPLINEFLAG_WALKMODE : ((Creature*)m_caster)->GetSplineFlags(), 1);
if (m_caster->GetTypeId() != TYPEID_PLAYER)
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation());
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster, x, y, z, m_caster->GetOrientation());
// not all charge effects used in negative spells
if (unitTarget != m_caster && !IsPositiveSpell(m_spellInfo->Id))
m_caster->Attack(unitTarget,true);
m_caster->Attack(unitTarget, true);
}
void Spell::EffectCharge2(uint32 /*i*/)
@ -6364,14 +6364,14 @@ void Spell::EffectCharge2(uint32 /*i*/)
return;
// Only send MOVEMENTFLAG_WALK_MODE, client has strange issues with other move flags
m_caster->SendMonsterMove(x, y, z, 0, m_caster->GetTypeId()==TYPEID_PLAYER ? MONSTER_MOVE_WALK : ((Creature*)m_caster)->GetMonsterMoveFlags(), 1);
m_caster->SendMonsterMove(x, y, z, 0, m_caster->GetTypeId() == TYPEID_PLAYER ? SPLINEFLAG_WALKMODE : ((Creature*)m_caster)->GetSplineFlags(), 1);
if (m_caster->GetTypeId() != TYPEID_PLAYER)
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster,x,y,z,m_caster->GetOrientation());
m_caster->GetMap()->CreatureRelocation((Creature*)m_caster, x, y, z, m_caster->GetOrientation());
// not all charge effects used in negative spells
if (unitTarget && unitTarget != m_caster && !IsPositiveSpell(m_spellInfo->Id))
m_caster->Attack(unitTarget,true);
m_caster->Attack(unitTarget, true);
}
void Spell::EffectSummonCritter(uint32 i, uint32 forceFaction)

View file

@ -74,7 +74,7 @@ void TargetedMovementGeneratorMedium<T,D>::_setTargetLocation(T &owner)
D::_addUnitStateMove(owner);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
((Creature&)owner).AddMonsterMoveFlag(MONSTER_MOVE_FLY);
((Creature&)owner).AddSplineFlag(SPLINEFLAG_UNKNOWN7);
}
template<>
@ -141,7 +141,7 @@ bool TargetedMovementGeneratorMedium<T,D>::Update(T &owner, const uint32 & time_
{
D::_addUnitStateMove(owner);
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->canFly())
((Creature&)owner).AddMonsterMoveFlag(MONSTER_MOVE_FLY);
((Creature&)owner).AddSplineFlag(SPLINEFLAG_UNKNOWN7);
i_destinationHolder.StartTravel(traveller);
return true;
@ -199,10 +199,10 @@ template<>
void ChaseMovementGenerator<Creature>::Initialize(Creature &owner)
{
owner.addUnitState(UNIT_STAT_CHASE|UNIT_STAT_CHASE_MOVE);
owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK);
owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE);
if (((Creature*)&owner)->canFly())
owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
owner.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
_setTargetLocation(owner);
}
@ -273,7 +273,7 @@ void FollowMovementGenerator<Creature>::Initialize(Creature &owner)
_updateSpeed(owner);
if (((Creature*)&owner)->canFly())
owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
owner.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
_setTargetLocation(owner);
}

View file

@ -71,9 +71,9 @@ inline uint32 Traveller<T>::GetTotalTrevelTimeTo(float x, float y, float z)
template<>
inline float Traveller<Creature>::Speed()
{
if(i_traveller.HasMonsterMoveFlag(MONSTER_MOVE_WALK))
if(i_traveller.HasSplineFlag(SPLINEFLAG_WALKMODE))
return i_traveller.GetSpeed(MOVE_WALK);
else if(i_traveller.HasMonsterMoveFlag(MONSTER_MOVE_FLY))
else if(i_traveller.HasSplineFlag(SPLINEFLAG_UNKNOWN7))
return i_traveller.GetSpeed(MOVE_FLIGHT);
else
return i_traveller.GetSpeed(MOVE_RUN);
@ -102,7 +102,7 @@ inline float Traveller<Creature>::GetMoveDestinationTo(float x, float y, float z
template<>
inline void Traveller<Creature>::MoveTo(float x, float y, float z, uint32 t)
{
i_traveller.AI_SendMoveToPacket(x, y, z, t, i_traveller.GetMonsterMoveFlags(), 0);
i_traveller.AI_SendMoveToPacket(x, y, z, t, i_traveller.GetSplineFlags(), 0);
}
// specialization for players
@ -137,8 +137,8 @@ inline void Traveller<Player>::Relocation(float x, float y, float z, float orien
template<>
inline void Traveller<Player>::MoveTo(float x, float y, float z, uint32 t)
{
//Only send MOVEFLAG_WALK_MODE, client has strange issues with other move flags
i_traveller.SendMonsterMove(x, y, z, 0, MONSTER_MOVE_WALK, t);
//Only send SPLINEFLAG_WALKMODE, client has strange issues with other move flags
i_traveller.SendMonsterMove(x, y, z, 0, SPLINEFLAG_WALKMODE, t);
}
typedef Traveller<Creature> CreatureTraveller;

View file

@ -124,7 +124,7 @@ void MovementInfo::Read(ByteBuffer &data)
data >> fallTime;
if(HasMovementFlag(MOVEFLAG_JUMPING))
if(HasMovementFlag(MOVEFLAG_FALLING))
{
data >> j_velocity;
data >> j_sinAngle;
@ -132,7 +132,7 @@ void MovementInfo::Read(ByteBuffer &data)
data >> j_xyspeed;
}
if(HasMovementFlag(MOVEFLAG_SPLINE))
if(HasMovementFlag(MOVEFLAG_SPLINE_ELEVATION))
{
data >> u_unk1;
}
@ -170,7 +170,7 @@ void MovementInfo::Write(ByteBuffer &data)
data << fallTime;
if(HasMovementFlag(MOVEFLAG_JUMPING))
if(HasMovementFlag(MOVEFLAG_FALLING))
{
data << j_velocity;
data << j_sinAngle;
@ -178,7 +178,7 @@ void MovementInfo::Write(ByteBuffer &data)
data << j_xyspeed;
}
if(HasMovementFlag(MOVEFLAG_SPLINE))
if(HasMovementFlag(MOVEFLAG_SPLINE_ELEVATION))
{
data << u_unk1;
}
@ -362,7 +362,7 @@ bool Unit::haveOffhandWeapon() const
return false;
}
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, MonsterMovementFlags flags, uint32 Time, Player* player)
void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, SplineFlags flags, uint32 Time, Player* player)
{
float moveTime = Time;
@ -375,27 +375,27 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
data << uint8(type); // unknown
switch(type)
{
case 0: // normal packet
case SPLINETYPE_NORMAL: // normal packet
break;
case 1: // stop packet (raw pos?)
case SPLINETYPE_STOP: // stop packet (raw pos?)
SendMessageToSet( &data, true );
return;
case 2: // facing spot, not used currently
case SPLINETYPE_FACINGSPOT: // facing spot, not used currently
data << float(0);
data << float(0);
data << float(0);
break;
case 3: // not used currently
case SPLINETYPE_FACINGTARGET: // not used currently
data << uint64(0); // probably target guid (facing target?)
break;
case 4: // not used currently
case SPLINETYPE_FACINGANGLE: // not used currently
data << float(0); // facing angle
break;
}
data << uint32(flags);
if(flags & MONSTER_MOVE_WALK)
if(flags & SPLINEFLAG_WALKMODE)
moveTime *= 1.05f;
data << uint32(moveTime); // Time in between points
@ -408,7 +408,7 @@ void Unit::SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 ty
SendMessageToSet( &data, true );
}
void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, MonsterMovementFlags flags)
void Unit::SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, SplineFlags flags)
{
uint32 traveltime = uint32(path.GetTotalLength(start, end) * 32);
@ -10573,26 +10573,26 @@ struct UpdateWalkModeHelper
void Unit::UpdateWalkMode(Unit* source, bool self)
{
if (GetTypeId() == TYPEID_PLAYER)
((Player*)this)->CallForAllControlledUnits(UpdateWalkModeHelper(source),false,true,true,true);
((Player*)this)->CallForAllControlledUnits(UpdateWalkModeHelper(source), false, true, true, true);
else if (self)
{
bool on = source->GetTypeId() == TYPEID_PLAYER
? ((Player*)source)->HasMovementFlag(MOVEFLAG_WALK_MODE)
: ((Creature*)source)->HasMonsterMoveFlag(MONSTER_MOVE_WALK);
: ((Creature*)source)->HasSplineFlag(SPLINEFLAG_WALKMODE);
if (on)
{
if (((Creature*)this)->isPet() && hasUnitState(UNIT_STAT_FOLLOW))
((Creature*)this)->AddMonsterMoveFlag(MONSTER_MOVE_WALK);
((Creature*)this)->AddSplineFlag(SPLINEFLAG_WALKMODE);
}
else
{
if (((Creature*)this)->isPet())
((Creature*)this)->RemoveMonsterMoveFlag(MONSTER_MOVE_WALK);
((Creature*)this)->RemoveSplineFlag(SPLINEFLAG_WALKMODE);
}
}
else
CallForAllControlledUnits(UpdateWalkModeHelper(source),false,true,true);
CallForAllControlledUnits(UpdateWalkModeHelper(source), false, true, true);
}
void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
@ -10603,11 +10603,11 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced)
case MOVE_RUN:
case MOVE_WALK:
case MOVE_SWIM:
if (GetTypeId()==TYPEID_UNIT && ((Creature*)this)->isPet() && hasUnitState(UNIT_STAT_FOLLOW))
if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->isPet() && hasUnitState(UNIT_STAT_FOLLOW))
{
if(Unit* owner = GetOwner())
{
SetSpeedRate(mtype,owner->GetSpeedRate(mtype),forced);
SetSpeedRate(mtype, owner->GetSpeedRate(mtype), forced);
return;
}
}
@ -12449,13 +12449,13 @@ void Unit::StopMoving()
clearUnitState(UNIT_STAT_MOVING);
// send explicit stop packet
// player expected for correct work MONSTER_MOVE_WALK
SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0, GetTypeId()==TYPEID_PLAYER ? MONSTER_MOVE_WALK : MONSTER_MOVE_NONE, 0);
// player expected for correct work SPLINEFLAG_WALKMODE
SendMonsterMove(GetPositionX(), GetPositionY(), GetPositionZ(), 0, GetTypeId() == TYPEID_PLAYER ? SPLINEFLAG_WALKMODE : SPLINEFLAG_NONE, 0);
// update position and orientation for near players
WorldPacket data;
BuildHeartBeatMsg(&data);
SendMessageToSet(&data,false);
SendMessageToSet(&data, false);
}
void Unit::SetFeared(bool apply, uint64 const& casterGUID, uint32 spellID, uint32 time)
@ -12468,7 +12468,7 @@ void Unit::SetFeared(bool apply, uint64 const& casterGUID, uint32 spellID, uint3
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_FLEEING);
GetMotionMaster()->MovementExpired(false);
CastStop(GetGUID()==casterGUID ? spellID : 0);
CastStop(GetGUID() == casterGUID ? spellID : 0);
Unit* caster = ObjectAccessor::GetUnit(*this,casterGUID);

View file

@ -610,44 +610,7 @@ enum NPCFlags
UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // 100%
UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // cause client to send 997 opcode
UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // cause client to send 1015 opcode (spell click), dynamic, set at loading and don't must be set in DB
UNIT_NPC_FLAG_GUARD = 0x10000000, // custom flag for guards
};
// used in SMSG_MONSTER_MOVE
enum MonsterMovementFlags
{
MONSTER_MOVE_NONE = 0x00000000,
MONSTER_MOVE_FORWARD = 0x00000001,
MONSTER_MOVE_BACKWARD = 0x00000002,
MONSTER_MOVE_STRAFE_LEFT = 0x00000004,
MONSTER_MOVE_STRAFE_RIGHT = 0x00000008,
MONSTER_MOVE_LEFT = 0x00000010, // turn
MONSTER_MOVE_RIGHT = 0x00000020, // turn
MONSTER_MOVE_PITCH_UP = 0x00000040,
MONSTER_MOVE_PITCH_DOWN = 0x00000080,
MONSTER_MOVE_TELEPORT = 0x00000100,
MONSTER_MOVE_TELEPORT2 = 0x00000200,
MONSTER_MOVE_LEVITATING = 0x00000400,
MONSTER_MOVE_UNK1 = 0x00000800, // float+uint32
MONSTER_MOVE_WALK = 0x00001000, // run2?
MONSTER_MOVE_SPLINE = 0x00002000, // spline n*(float x,y,z)
// 0x4000, 0x8000, 0x10000, 0x20000 run
MONSTER_MOVE_SPLINE2 = 0x00040000, // spline n*(float x,y,z)
MONSTER_MOVE_UNK2 = 0x00080000, // used for flying mobs
MONSTER_MOVE_UNK3 = 0x00100000, // used for flying mobs
MONSTER_MOVE_UNK4 = 0x00200000, // uint8+uint32
MONSTER_MOVE_UNK5 = 0x00400000, // run in place, then teleport to final point
MONSTER_MOVE_UNK6 = 0x00800000, // teleport
MONSTER_MOVE_UNK7 = 0x01000000, // run
MONSTER_MOVE_FLY = 0x02000000, // swimming/flying (depends on mob?)
MONSTER_MOVE_UNK9 = 0x04000000, // run
MONSTER_MOVE_UNK10 = 0x08000000, // run
MONSTER_MOVE_UNK11 = 0x10000000, // run
MONSTER_MOVE_UNK12 = 0x20000000, // run
MONSTER_MOVE_UNK13 = 0x40000000, // levitating
// masks
MONSTER_MOVE_SPLINE_FLY = 0x00003000, // fly by points
UNIT_NPC_FLAG_GUARD = 0x10000000 // custom flag for guards
};
// used in most movement packets (send and received)
@ -658,58 +621,119 @@ enum MovementFlags
MOVEFLAG_BACKWARD = 0x00000002,
MOVEFLAG_STRAFE_LEFT = 0x00000004,
MOVEFLAG_STRAFE_RIGHT = 0x00000008,
MOVEFLAG_LEFT = 0x00000010,
MOVEFLAG_RIGHT = 0x00000020,
MOVEFLAG_TURN_LEFT = 0x00000010,
MOVEFLAG_TURN_RIGHT = 0x00000020,
MOVEFLAG_PITCH_UP = 0x00000040,
MOVEFLAG_PITCH_DOWN = 0x00000080,
MOVEFLAG_WALK_MODE = 0x00000100, // Walking
MOVEFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
MOVEFLAG_ONTRANSPORT = 0x00000200,
MOVEFLAG_LEVITATING = 0x00000400,
MOVEFLAG_FLY_UNK1 = 0x00000800,
MOVEFLAG_JUMPING = 0x00001000,
MOVEFLAG_FALLING = 0x00002000,
MOVEFLAG_UNK4 = 0x00004000,
// 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000
MOVEFLAG_ROOT = 0x00000800,
MOVEFLAG_FALLING = 0x00001000,
MOVEFLAG_FALLINGFAR = 0x00002000,
MOVEFLAG_PENDINGSTOP = 0x00004000,
MOVEFLAG_PENDINGSTRAFESTOP = 0x00008000,
MOVEFLAG_PENDINGFORWARD = 0x00010000,
MOVEFLAG_PENDINGBACKWARD = 0x00020000,
MOVEFLAG_PENDINGSTRAFELEFT = 0x00040000,
MOVEFLAG_PENDINGSTRAFERIGHT = 0x00080000,
MOVEFLAG_PENDINGROOT = 0x00100000,
MOVEFLAG_SWIMMING = 0x00200000, // appears with fly flag also
MOVEFLAG_FLY_UP = 0x00400000, // swim up also
MOVEFLAG_FLY_DOWN = 0x00800000, // swim down also
MOVEFLAG_ASCENDING = 0x00400000, // swim up also
MOVEFLAG_DESCENDING = 0x00800000, // swim down also
MOVEFLAG_CAN_FLY = 0x01000000, // can fly in 3.3?
MOVEFLAG_FLYING = 0x02000000, // Actual flying mode
MOVEFLAG_SPLINE = 0x04000000, // used for flight paths
MOVEFLAG_SPLINE2 = 0x08000000, // used for flight paths
MOVEFLAG_SPLINE_ELEVATION = 0x04000000, // used for flight paths
MOVEFLAG_SPLINE_ENABLED = 0x08000000, // used for flight paths
MOVEFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water
MOVEFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive)
MOVEFLAG_UNK3 = 0x40000000
MOVEFLAG_HOVER = 0x40000000
};
// flags that use in movement check for example at spell casting
MovementFlags const movementFlagsMask = MovementFlags(
MOVEFLAG_FORWARD |MOVEFLAG_BACKWARD |MOVEFLAG_STRAFE_LEFT |MOVEFLAG_STRAFE_RIGHT|
MOVEFLAG_PITCH_UP|MOVEFLAG_PITCH_DOWN|MOVEFLAG_FLY_UNK1 |
MOVEFLAG_JUMPING |MOVEFLAG_FALLING |MOVEFLAG_FLY_UP |
MOVEFLAG_FLYING |MOVEFLAG_SPLINE
MOVEFLAG_PITCH_UP|MOVEFLAG_PITCH_DOWN|MOVEFLAG_ROOT |
MOVEFLAG_FALLING |MOVEFLAG_FALLINGFAR|MOVEFLAG_ASCENDING |
MOVEFLAG_FLYING |MOVEFLAG_SPLINE_ELEVATION
);
MovementFlags const movementOrTurningFlagsMask = MovementFlags(
movementFlagsMask | MOVEFLAG_LEFT | MOVEFLAG_RIGHT
movementFlagsMask | MOVEFLAG_TURN_LEFT | MOVEFLAG_TURN_RIGHT
);
enum MovementFlags2
{
MOVEFLAG2_NONE = 0x0000,
MOVEFLAG2_UNK1 = 0x0001,
MOVEFLAG2_UNK2 = 0x0002,
MOVEFLAG2_UNK3 = 0x0004,
MOVEFLAG2_FULLSPEEDTURNING = 0x0008,
MOVEFLAG2_FULLSPEEDPITCHING = 0x0010,
MOVEFLAG2_ALLOW_PITCHING = 0x0020,
MOVEFLAG2_UNK1 = 0x0400,
MOVEFLAG2_UNK2 = 0x0800,
MOVEFLAG2_UNK3 = 0x1000,
MOVEFLAG2_INTERP_MASK = MOVEFLAG2_UNK1 | MOVEFLAG2_UNK2 | MOVEFLAG2_UNK3,
MOVEFLAG2_UNK4 = 0x0040,
MOVEFLAG2_UNK5 = 0x0080,
MOVEFLAG2_UNK6 = 0x0100,
MOVEFLAG2_UNK7 = 0x0200,
MOVEFLAG2_INTERP_MOVEMENT = 0x0400,
MOVEFLAG2_INTERP_TURNING = 0x0800,
MOVEFLAG2_INTERP_PITCHING = 0x1000,
MOVEFLAG2_UNK8 = 0x2000,
MOVEFLAG2_UNK9 = 0x4000,
MOVEFLAG2_UNK10 = 0x8000,
MOVEFLAG2_INTERP_MASK = MOVEFLAG2_INTERP_MOVEMENT | MOVEFLAG2_INTERP_TURNING | MOVEFLAG2_INTERP_PITCHING
};
enum SplineMoveFlags // possibly exactly same as MonsterMovementFlags
enum SplineFlags
{
SPLINE_MOVE_FLAG_NONE = 0x00000000,
SPLINE_MOVE_FLAG_POINT = 0x00008000,
SPLINE_MOVE_FLAG_GUID = 0x00010000,
SPLINE_MOVE_FLAG_FACING = 0x00020000,
SPLINEFLAG_NONE = 0x00000000,
SPLINEFLAG_FORWARD = 0x00000001,
SPLINEFLAG_BACKWARD = 0x00000002,
SPLINEFLAG_STRAFE_LEFT = 0x00000004,
SPLINEFLAG_STRAFE_RIGHT = 0x00000008,
SPLINEFLAG_LEFT = 0x00000010,
SPLINEFLAG_RIGHT = 0x00000020,
SPLINEFLAG_PITCH_UP = 0x00000040,
SPLINEFLAG_PITCH_DOWN = 0x00000080,
SPLINEFLAG_DONE = 0x00000100,
SPLINEFLAG_FALLING = 0x00000200,
SPLINEFLAG_NO_SPLINE = 0x00000400,
SPLINEFLAG_TRAJECTORY = 0x00000800,
SPLINEFLAG_WALKMODE = 0x00001000,
SPLINEFLAG_FLYING = 0x00002000,
SPLINEFLAG_KNOCKBACK = 0x00004000,
SPLINEFLAG_FINALPOINT = 0x00008000,
SPLINEFLAG_FINALTARGET = 0x00010000,
SPLINEFLAG_FINALFACING = 0x00020000,
SPLINEFLAG_CATMULLROM = 0x00040000,
SPLINEFLAG_UNKNOWN1 = 0x00080000,
SPLINEFLAG_UNKNOWN2 = 0x00100000,
SPLINEFLAG_UNKNOWN3 = 0x00200000,
SPLINEFLAG_UNKNOWN4 = 0x00400000,
SPLINEFLAG_UNKNOWN5 = 0x00800000,
SPLINEFLAG_UNKNOWN6 = 0x01000000,
SPLINEFLAG_UNKNOWN7 = 0x02000000,
SPLINEFLAG_UNKNOWN8 = 0x04000000,
SPLINEFLAG_UNKNOWN9 = 0x08000000,
SPLINEFLAG_UNKNOWN10 = 0x10000000,
SPLINEFLAG_UNKNOWN11 = 0x20000000,
SPLINEFLAG_UNKNOWN12 = 0x40000000
};
enum SplineMode
{
SPLINEMODE_LINEAR = 0,
SPLINEMODE_CATMULLROM = 1,
SPLINEMODE_BEZIER3 = 2
};
enum SplineType
{
SPLINETYPE_NORMAL = 0,
SPLINETYPE_STOP = 1,
SPLINETYPE_FACINGSPOT = 2,
SPLINETYPE_FACINGTARGET = 3,
SPLINETYPE_FACINGANGLE = 4
};
struct Position
@ -1333,8 +1357,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false);
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, MonsterMovementFlags flags, uint32 Time, Player* player = NULL);
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, MonsterMovementFlags flags);
void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, SplineFlags flags, uint32 Time, Player* player = NULL);
void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, SplineFlags flags);
void SendHighestThreatUpdate(HostileReference* pHostileReference);
void SendThreatClear();

View file

@ -143,7 +143,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
creature.addUnitState(UNIT_STAT_ROAMING_MOVE);
if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
// Now we re-set destination to same node and start travel
const WaypointNode &node = i_path->at(i_currentNode);
@ -218,7 +218,7 @@ bool WaypointMovementGenerator<Creature>::Update(Creature &creature, const uint3
creature.addUnitState(UNIT_STAT_ROAMING_MOVE);
if (creature.canFly())
creature.AddMonsterMoveFlag(MONSTER_MOVE_FLY);
creature.AddSplineFlag(SPLINEFLAG_UNKNOWN7);
const WaypointNode &node = i_path->at(i_currentNode);
i_destinationHolder.SetDestination(traveller, node.x, node.y, node.z);
@ -292,7 +292,7 @@ void FlightPathMovementGenerator::Initialize(Player &player)
// do not send movement, it was sent already
i_destinationHolder.SetDestination(traveller, i_path[i_currentNode].x, i_path[i_currentNode].y, i_path[i_currentNode].z, false);
player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(),MONSTER_MOVE_SPLINE_FLY);
player.SendMonsterMoveByPath(GetPath(),GetCurrentNode(),GetPathAtMapEnd(), SplineFlags(SPLINEFLAG_WALKMODE|SPLINEFLAG_FLYING));
}
void FlightPathMovementGenerator::Finalize(Player & player)