From db547a008acea651dc99ab340d112d98e95c6b98 Mon Sep 17 00:00:00 2001 From: tomrus88 Date: Sun, 7 Feb 2010 14:53:09 +0300 Subject: [PATCH] Get rid of monster movement flags, since it's really spline flags. Thanks to Ralek for research. --- src/game/ConfusedMovementGenerator.cpp | 4 +- src/game/Creature.cpp | 12 +- src/game/Creature.h | 36 ++--- src/game/FleeingMovementGenerator.cpp | 4 +- src/game/HomeMovementGenerator.cpp | 4 +- src/game/Level3.cpp | 2 +- src/game/MiscHandler.cpp | 2 +- src/game/Object.cpp | 20 +-- src/game/ObjectMgr.cpp | 6 +- src/game/Player.cpp | 4 +- src/game/PointMovementGenerator.cpp | 4 +- src/game/RandomMovementGenerator.cpp | 14 +- src/game/Spell.cpp | 6 +- src/game/SpellAuras.cpp | 2 +- src/game/SpellEffects.cpp | 12 +- src/game/TargetedMovementGenerator.cpp | 10 +- src/game/Traveller.h | 10 +- src/game/Unit.cpp | 46 +++---- src/game/Unit.h | 184 ++++++++++++++----------- src/game/WaypointMovementGenerator.cpp | 6 +- 20 files changed, 206 insertions(+), 182 deletions(-) diff --git a/src/game/ConfusedMovementGenerator.cpp b/src/game/ConfusedMovementGenerator.cpp index 18d1e96d8..3e7e803a3 100644 --- a/src/game/ConfusedMovementGenerator.cpp +++ b/src/game/ConfusedMovementGenerator.cpp @@ -71,7 +71,7 @@ template<> void ConfusedMovementGenerator::_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::Finalize(Creature &unit) { unit.clearUnitState(UNIT_STAT_CONFUSED|UNIT_STAT_CONFUSED_MOVE); - unit.AddMonsterMoveFlag(MONSTER_MOVE_WALK); + unit.AddSplineFlag(SPLINEFLAG_WALKMODE); } template void ConfusedMovementGenerator::Initialize(Player &player); diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp index 251e4fc37..6b32e462f 100644 --- a/src/game/Creature.cpp +++ b/src/game/Creature.cpp @@ -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) diff --git a/src/game/Creature.h b/src/game/Creature.h index 931ea285e..0386783a4 100644 --- a/src/game/Creature.h +++ b/src/game/Creature.h @@ -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 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 diff --git a/src/game/FleeingMovementGenerator.cpp b/src/game/FleeingMovementGenerator.cpp index 768ae1ab2..ae6ea73e1 100644 --- a/src/game/FleeingMovementGenerator.cpp +++ b/src/game/FleeingMovementGenerator.cpp @@ -310,7 +310,7 @@ template<> void FleeingMovementGenerator::_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::Finalize(Player &owner) template<> void FleeingMovementGenerator::Finalize(Creature &owner) { - owner.AddMonsterMoveFlag(MONSTER_MOVE_WALK); + owner.AddSplineFlag(SPLINEFLAG_WALKMODE); owner.clearUnitState(UNIT_STAT_FLEEING|UNIT_STAT_FLEEING_MOVE); } diff --git a/src/game/HomeMovementGenerator.cpp b/src/game/HomeMovementGenerator.cpp index 945685758..7ecef5eb2 100644 --- a/src/game/HomeMovementGenerator.cpp +++ b/src/game/HomeMovementGenerator.cpp @@ -27,7 +27,7 @@ void HomeMovementGenerator::Initialize(Creature & owner) { - owner.RemoveMonsterMoveFlag(MONSTER_MOVE_WALK); + owner.RemoveSplineFlag(SPLINEFLAG_WALKMODE); _setTargetLocation(owner); } @@ -63,7 +63,7 @@ HomeMovementGenerator::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) diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp index f319cf05f..3809f7003 100644 --- a/src/game/Level3.cpp +++ b/src/game/Level3.cpp @@ -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(); diff --git a/src/game/MiscHandler.cpp b/src/game/MiscHandler.cpp index 00c625183..f01555f3b 100644 --- a/src/game/MiscHandler.cpp +++ b/src/game/MiscHandler.cpp @@ -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; diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 8e0578491..3dc042e36 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -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); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 499a0d107..0673d4c07 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -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(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(addon)->move_flags &= ~(SPLINEFLAG_TRAJECTORY|SPLINEFLAG_UNKNOWN3); } ConvertCreatureAddonAuras(const_cast(addon), creatureaddons.GetTableName(), entryName); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 8c98817ab..4c97824ae 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -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 diff --git a/src/game/PointMovementGenerator.cpp b/src/game/PointMovementGenerator.cpp index bcac405e3..c865c0296 100644 --- a/src/game/PointMovementGenerator.cpp +++ b/src/game/PointMovementGenerator.cpp @@ -31,10 +31,10 @@ void PointMovementGenerator::Initialize(T &unit) unit.StopMoving(); unit.addUnitState(UNIT_STAT_ROAMING|UNIT_STAT_ROAMING_MOVE); Traveller 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 diff --git a/src/game/RandomMovementGenerator.cpp b/src/game/RandomMovementGenerator.cpp index d6bf16295..bb69378dd 100644 --- a/src/game/RandomMovementGenerator.cpp +++ b/src/game/RandomMovementGenerator.cpp @@ -98,13 +98,13 @@ RandomMovementGenerator::_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::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::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); } } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 4ffdcffd1..4ed969efa 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -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; } diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index a686fb797..d2748d438 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -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); } } diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 67df434c8..35f5339b3 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -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) diff --git a/src/game/TargetedMovementGenerator.cpp b/src/game/TargetedMovementGenerator.cpp index 72baed1a6..4c521fe0b 100644 --- a/src/game/TargetedMovementGenerator.cpp +++ b/src/game/TargetedMovementGenerator.cpp @@ -74,7 +74,7 @@ void TargetedMovementGeneratorMedium::_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::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::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::Initialize(Creature &owner) _updateSpeed(owner); if (((Creature*)&owner)->canFly()) - owner.AddMonsterMoveFlag(MONSTER_MOVE_FLY); + owner.AddSplineFlag(SPLINEFLAG_UNKNOWN7); _setTargetLocation(owner); } diff --git a/src/game/Traveller.h b/src/game/Traveller.h index 9e9017b36..930004123 100644 --- a/src/game/Traveller.h +++ b/src/game/Traveller.h @@ -71,9 +71,9 @@ inline uint32 Traveller::GetTotalTrevelTimeTo(float x, float y, float z) template<> inline float Traveller::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::GetMoveDestinationTo(float x, float y, float z template<> inline void Traveller::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::Relocation(float x, float y, float z, float orien template<> inline void Traveller::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 CreatureTraveller; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 15830d569..afc064abb 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -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); diff --git a/src/game/Unit.h b/src/game/Unit.h index 940366f17..d2d38767b 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -610,106 +610,130 @@ 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) enum MovementFlags { - MOVEFLAG_NONE = 0x00000000, - MOVEFLAG_FORWARD = 0x00000001, - MOVEFLAG_BACKWARD = 0x00000002, - MOVEFLAG_STRAFE_LEFT = 0x00000004, - MOVEFLAG_STRAFE_RIGHT = 0x00000008, - MOVEFLAG_LEFT = 0x00000010, - MOVEFLAG_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_LEVITATING = 0x00000400, - MOVEFLAG_FLY_UNK1 = 0x00000800, - MOVEFLAG_JUMPING = 0x00001000, - MOVEFLAG_FALLING = 0x00002000, - MOVEFLAG_UNK4 = 0x00004000, - // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000 - MOVEFLAG_SWIMMING = 0x00200000, // appears with fly flag also - MOVEFLAG_FLY_UP = 0x00400000, // swim up also - MOVEFLAG_FLY_DOWN = 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_WATERWALKING = 0x10000000, // prevent unit from falling through water - MOVEFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive) - MOVEFLAG_UNK3 = 0x40000000 + MOVEFLAG_NONE = 0x00000000, + MOVEFLAG_FORWARD = 0x00000001, + MOVEFLAG_BACKWARD = 0x00000002, + MOVEFLAG_STRAFE_LEFT = 0x00000004, + MOVEFLAG_STRAFE_RIGHT = 0x00000008, + MOVEFLAG_TURN_LEFT = 0x00000010, + MOVEFLAG_TURN_RIGHT = 0x00000020, + MOVEFLAG_PITCH_UP = 0x00000040, + MOVEFLAG_PITCH_DOWN = 0x00000080, + MOVEFLAG_WALK_MODE = 0x00000100, // Walking + MOVEFLAG_ONTRANSPORT = 0x00000200, + MOVEFLAG_LEVITATING = 0x00000400, + 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_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_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_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(); diff --git a/src/game/WaypointMovementGenerator.cpp b/src/game/WaypointMovementGenerator.cpp index 5324890a0..e703210ed 100644 --- a/src/game/WaypointMovementGenerator.cpp +++ b/src/game/WaypointMovementGenerator.cpp @@ -143,7 +143,7 @@ bool WaypointMovementGenerator::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::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)