From 0db0f35cae7f1bd5f65b2335c1e57212940aaab7 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Wed, 28 Mar 2018 18:45:36 +0200 Subject: [PATCH] Revert "Core/Entities: Some changes to LoS z checking & MotionMaster::MoveJumpTo" This reverts commit 157719d4b074d815411619ed496f7bc388935a27. --- src/server/game/Entities/Object/Object.cpp | 13 ++----- src/server/game/Entities/Object/Object.h | 2 -- src/server/game/Entities/Player/Player.cpp | 35 ++++++++++++++++++- src/server/game/Entities/Player/Player.h | 3 ++ src/server/game/Entities/Unit/Unit.cpp | 28 ++------------- src/server/game/Entities/Unit/Unit.h | 1 - src/server/game/Movement/MotionMaster.cpp | 4 +-- .../boss_northrend_beasts.cpp | 2 +- 8 files changed, 44 insertions(+), 44 deletions(-) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f555a7c413..6faab3cf2d 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1449,7 +1449,7 @@ bool WorldObject::IsWithinDistInMap(WorldObject const* obj, float dist2compare, Position WorldObject::GetHitSpherePointFor(Position const& dest) const { - G3D::Vector3 vThis(GetPositionX(), GetPositionY(), GetPositionZ() + GetMidsectionHeight()); + G3D::Vector3 vThis(GetPositionX(), GetPositionY(), GetPositionZ()); G3D::Vector3 vObj(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ()); G3D::Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * std::min(dest.GetExactDist(GetPosition()), GetObjectSize()); @@ -1462,14 +1462,11 @@ bool WorldObject::IsWithinLOS(float ox, float oy, float oz, LineOfSightChecks ch { float x, y, z; if (GetTypeId() == TYPEID_PLAYER) - { GetPosition(x, y, z); - z += GetMidsectionHeight(); - } else GetHitSpherePointFor({ ox, oy, oz }, x, y, z); - return GetMap()->isInLineOfSight(GetPhaseShift(), x, y, z, ox, oy, oz, checks, ignoreFlags); + return GetMap()->isInLineOfSight(GetPhaseShift(), x, y, z + 2.0f, ox, oy, oz + 2.0f, checks, ignoreFlags); } return true; @@ -1482,13 +1479,9 @@ bool WorldObject::IsWithinLOSInMap(const WorldObject* obj, LineOfSightChecks che float x, y, z; if (obj->GetTypeId() == TYPEID_PLAYER) - { obj->GetPosition(x, y, z); - z += GetMidsectionHeight(); - } else - obj->GetHitSpherePointFor({ GetPositionX(), GetPositionY(), GetPositionZ() + GetMidsectionHeight() }, x, y, z); - + obj->GetHitSpherePointFor(GetPosition(), x, y, z); return IsWithinLOS(x, y, z, checks, ignoreFlags); } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 2ba066cb38..958107e5ad 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -465,8 +465,6 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation virtual float GetStationaryO() const { return GetOrientation(); } float GetFloorZ() const; - virtual float GetCollisionHeight() const { return 0.0f; } - float GetMidsectionHeight() const { return GetCollisionHeight() / 2.0f; } uint16 GetAIAnimKitId() const { return m_aiAnimKitId; } void SetAIAnimKitId(uint16 animKitId); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index abb4141ead..d17dae14c9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2039,7 +2039,7 @@ void Player::SetObjectScale(float scale) SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, scale * DEFAULT_WORLD_OBJECT_SIZE); SetFloatValue(UNIT_FIELD_COMBATREACH, scale * DEFAULT_COMBAT_REACH); if (IsInWorld()) - SendMovementSetCollisionHeight(scale * GetCollisionHeight()); + SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted())); } bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const @@ -27679,6 +27679,39 @@ void Player::SendMovementSetCollisionHeight(float height) Movement::PacketSender(this, NULL_OPCODE, SMSG_MOVE_SET_COLLISION_HEIGHT, SMSG_MOVE_UPDATE_COLLISION_HEIGHT, &extra).Send(); } +float Player::GetCollisionHeight(bool mounted) const +{ + 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 = GetObjectScale(); // 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; + } +} + std::string Player::GetMapAreaAndZoneString() const { uint32 areaId = GetAreaId(); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 2923141a27..a2f4840379 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2331,6 +2331,9 @@ class TC_GAME_API Player : public Unit, public GridObject bool CanFly() const override { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); } + //! Return collision height sent to client + float GetCollisionHeight(bool mounted) const; + std::string GetMapAreaAndZoneString() const; std::string GetCoordsMapAreaAndZoneString() const; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84eb7fd626..6b67b49e1f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8107,7 +8107,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry) if (charm->GetTypeId() == TYPEID_UNIT) charm->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - player->SendMovementSetCollisionHeight(player->GetCollisionHeight()); + player->SendMovementSetCollisionHeight(player->GetCollisionHeight(true)); } RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT); @@ -8124,7 +8124,7 @@ void Unit::Dismount() if (Player* thisPlayer = ToPlayer()) { SendUpdateToSet(); - thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight()); + thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(false)); } WorldPacket data(SMSG_DISMOUNT, 8); @@ -14653,27 +14653,3 @@ SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo) const return spellInfo; } - -float Unit::GetCollisionHeight() const -{ - float scaleMod = GetObjectScale(); // 99% sure about this - - if (IsMounted()) - { - if (CreatureDisplayInfoEntry const* mountDisplayInfo = sCreatureDisplayInfoStore.LookupEntry(GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID))) - { - if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId)) - { - CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId()); - CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId); - return scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * 0.5f); - } - } - } - - //! Dismounting case - use basic default model data - CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId()); - CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId); - - return scaleMod * modelData->CollisionHeight; -} diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index bdfb5e66de..5cf383c341 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1895,7 +1895,6 @@ class TC_GAME_API Unit : public WorldObject virtual void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false); virtual void Whisper(uint32 textId, Player* target, bool isBossWhisper = false); - float GetCollisionHeight() const override; protected: explicit Unit (bool isWorldObject); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 52cdab6932..a1640997a2 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -450,9 +450,7 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ) float moveTimeHalf = speedZ / Movement::gravity; float dist = 2 * moveTimeHalf * speedXY; - _owner->GetNearPoint2D(x, y, dist, _owner->GetOrientation() + angle); - z = _owner->GetPositionZ() + _owner->GetMidsectionHeight(); - _owner->UpdateAllowedPositionZ(x, y, z); + _owner->GetClosePoint(x, y, z, _owner->GetObjectSize(), dist, angle); MoveJump(x, y, z, 0.0f, speedXY, speedZ); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 2d1ece5bed..20ce49097d 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -649,7 +649,7 @@ struct boss_jormungarAI : public BossAI events.SetPhase(PHASE_SUBMERGED); events.ScheduleEvent(EVENT_EMERGE, 5*IN_MILLISECONDS, 0, PHASE_SUBMERGED); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+ frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionY() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionZ() + me->GetMidsectionHeight()); + me->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX()+ frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionY() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionZ()); WasMobile = !WasMobile; }