diff options
| author | Machiavelli <machiavelli.trinity@gmail.com> | 2011-11-22 20:25:49 +0100 |
|---|---|---|
| committer | Machiavelli <machiavelli.trinity@gmail.com> | 2011-11-22 20:28:10 +0100 |
| commit | 844453274676d82c4d72bc90f2d0931c9fa912ff (patch) | |
| tree | bfe25f8afbd13abea55dfc2c024fdbc43b0c3d53 /src/server/game/Entities | |
| parent | 99ad58233bf1bc805d4ecc968795e92c4e5e2b93 (diff) | |
Core/Units: Second part of SMSG_MOVE_SET_COLLISION_HGT implementation: compute proper collision height according to client formulae and send this to the client when mounting up.
Diffstat (limited to 'src/server/game/Entities')
| -rwxr-xr-x | src/server/game/Entities/Player/Player.h | 37 | ||||
| -rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 8 |
2 files changed, 36 insertions, 9 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ddafefc087e..9aad63ccb1b 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2494,16 +2494,37 @@ class Player : public Unit, public GridObject<Player> bool IsInWhisperWhiteList(uint64 guid); //! Return collision height sent to client - //! we currently only send this on dismount - float GetCollisionHeight() + float GetCollisionHeight(bool mounted) { - CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()); - ASSERT(displayInfo); - CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(displayInfo->ModelId); - ASSERT(modelData); - - return modelData->CollisionHeight; + if (mounted) + { + CreatureDisplayInfoEntry const* mountDisplayInfo = sCreatureDisplayInfoStore.LookupEntry(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID)); + if (!mountDisplayInfo) + return GetCollisionHeight(false); + + CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId); + if (!mountModelData) + return GetCollisionHeight(false); + + CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()); + ASSERT(displayInfo); + CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(displayInfo->ModelId); + ASSERT(modelData); + + float scaleMod = GetFloatValue(OBJECT_FIELD_SCALE_X); // 99% sure about this + + return scaleMod * mountModelData->MountHeight + modelData->CollisionHeight * 0.5f; + } + else + { + //! Dismounting case - use basic default model data + CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.LookupEntry(GetNativeDisplayId()); + ASSERT(displayInfo); + CreatureModelDataEntry const* modelData = sCreatureModelDataStore.LookupEntry(displayInfo->ModelId); + ASSERT(modelData); + return modelData->CollisionHeight; + } //! TODO: Need a proper calculation for collision height when mounted } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6d8f7866657..b99ccd5f35f 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11934,6 +11934,12 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) else player->UnsummonPetTemporaryIfAny(); } + + WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); + data.append(GetPackGUID()); + data << uint32(sWorld->GetGameTime()); // Packet counter + data << player->GetCollisionHeight(true); + player->GetSession()->SendPacket(&data); } RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT); @@ -11952,7 +11958,7 @@ void Unit::Unmount() WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4); data.append(GetPackGUID()); data << uint32(sWorld->GetGameTime()); // Packet counter - data << thisPlayer->GetCollisionHeight(); + data << thisPlayer->GetCollisionHeight(false); thisPlayer->GetSession()->SendPacket(&data); } |
