diff options
| author | Golrag <Golrag@users.noreply.github.com> | 2017-12-14 16:56:30 +0100 | 
|---|---|---|
| committer | funjoker <funjoker109@gmail.com> | 2021-03-15 20:17:31 +0100 | 
| commit | fe362cf2c9d5c71db4698480ce26cb35dbc58f28 (patch) | |
| tree | ee322a201886df019ba4f9b0cd31eca0814beb59 /src | |
| parent | 2313343227b9415a08a0efc1e95cced9e308ef9d (diff) | |
Core/Entities: Some changes to LoS z checking & MotionMaster::MoveJumpTo (PR #20970)
- Use Midsection height for LoS checking.
- Changed MotionMaster::MoveJumpTo to use correct z. This change also makes sure the _owner will jump towards the given angle. Instead of jumping to a unintended angle if the first one is not in LoS.
(cherry picked from commit 95456ab5d8bd623481d315ae55dfbb44b45ba9f5)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 35 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
| -rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 2 | ||||
| -rw-r--r-- | src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp | 2 | 
9 files changed, 44 insertions, 45 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 22970a8950e..118169837d3 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1084,7 +1084,7 @@ bool WorldObject::IsWithinDistInMap(WorldObject const* obj, float dist2compare,  Position WorldObject::GetHitSpherePointFor(Position const& dest) const  { -    G3D::Vector3 vThis(GetPositionX(), GetPositionY(), GetPositionZ()); +    G3D::Vector3 vThis(GetPositionX(), GetPositionY(), GetPositionZ() + GetMidsectionHeight());      G3D::Vector3 vObj(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());      G3D::Vector3 contactPoint = vThis + (vObj - vThis).directionOrZero() * std::min(dest.GetExactDist(GetPosition()), GetCombatReach()); @@ -1097,11 +1097,14 @@ 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 + 2.0f, ox, oy, oz + 2.0f, checks, ignoreFlags); +        return GetMap()->isInLineOfSight(GetPhaseShift(), x, y, z, ox, oy, oz, checks, ignoreFlags);      }      return true; @@ -1114,9 +1117,12 @@ bool WorldObject::IsWithinLOSInMap(WorldObject const* obj, LineOfSightChecks che      float x, y, z;      if (obj->GetTypeId() == TYPEID_PLAYER) +    {          obj->GetPosition(x, y, z); +        z += GetMidsectionHeight(); +    }      else -        obj->GetHitSpherePointFor(GetPosition(), x, y, z); +        obj->GetHitSpherePointFor({ GetPositionX(), GetPositionY(), GetPositionZ() + GetMidsectionHeight() }, 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 7f247ad3cb0..c49f029e82b 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -586,6 +586,8 @@ 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; }          virtual uint16 GetAIAnimKitId() const { return 0; }          virtual uint16 GetMovementAnimKitId() const { return 0; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 90398b2f1a2..38dda675437 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1657,7 +1657,7 @@ void Player::SetObjectScale(float scale)      SetBoundingRadius(scale * DEFAULT_PLAYER_BOUNDING_RADIUS);      SetCombatReach(scale * DEFAULT_PLAYER_COMBAT_REACH);      if (IsInWorld()) -        SendMovementSetCollisionHeight(scale * GetCollisionHeight(IsMounted()), WorldPackets::Movement::UpdateCollisionHeightReason::Scale); +        SendMovementSetCollisionHeight(scale * GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Scale);  }  bool Player::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index, Unit* caster) const @@ -28383,39 +28383,6 @@ bool Player::MeetPlayerCondition(uint32 conditionId) const      return true;  } -float Player::GetCollisionHeight(bool mounted) const -{ -    if (mounted) -    { -        CreatureDisplayInfoEntry const* mountDisplayInfo = sCreatureDisplayInfoStore.LookupEntry(GetMountDisplayId()); -        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 cc73af80dd1..867d754452c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2398,9 +2398,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>          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 3e9cf91b6d9..e39c596c60a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7895,7 +7895,7 @@ void Unit::Mount(uint32 mount, uint32 VehicleId, uint32 creatureEntry)              if (charm->GetTypeId() == TYPEID_UNIT)                  charm->AddUnitFlag(UNIT_FLAG_STUNNED); -        player->SendMovementSetCollisionHeight(player->GetCollisionHeight(true), WorldPackets::Movement::UpdateCollisionHeightReason::Mount); +        player->SendMovementSetCollisionHeight(player->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Mount);      }      RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_MOUNT); @@ -7910,7 +7910,7 @@ void Unit::Dismount()      RemoveUnitFlag(UNIT_FLAG_MOUNT);      if (Player* thisPlayer = ToPlayer()) -        thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(false), WorldPackets::Movement::UpdateCollisionHeightReason::Mount); +        thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Mount);      // dismount as a vehicle      if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit()) @@ -14485,3 +14485,27 @@ bool Unit::VisibleAuraSlotCompare::operator()(AuraApplication* left, AuraApplica  {      return left->GetSlot() < right->GetSlot();  } + +float Unit::GetCollisionHeight() const +{ +    float scaleMod = GetObjectScale(); // 99% sure about this + +    if (IsMounted()) +    { +        if (CreatureDisplayInfoEntry const* mountDisplayInfo = sCreatureDisplayInfoStore.LookupEntry(GetMountDisplayId())) +        { +            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 7a57301cbc6..71f82e27baf 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2037,6 +2037,7 @@ 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;          uint32 GetVirtualItemId(uint32 slot) const;          uint16 GetVirtualItemAppearanceMod(uint32 slot) const;          void SetVirtualItem(uint32 slot, uint32 itemId, uint16 appearanceModId = 0, uint16 itemVisual = 0); diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 55719daad2c..939a60d575f 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -456,7 +456,9 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ)      float moveTimeHalf = speedZ / Movement::gravity;      float dist = 2 * moveTimeHalf * speedXY; -    _owner->GetClosePoint(x, y, z, _owner->GetCombatReach(), dist, angle); +    _owner->GetNearPoint2D(x, y, dist, _owner->GetOrientation() + angle); +    z = _owner->GetPositionZ() + _owner->GetMidsectionHeight(); +    _owner->UpdateAllowedPositionZ(x, y, z);      MoveJump(x, y, z, 0.0f, speedXY, speedZ);  } diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 5d406d1288d..89aaa7db4c6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1842,7 +1842,7 @@ void AuraEffect::HandleAuraModShapeshift(AuraApplication const* aurApp, uint8 mo      if (Player* playerTarget = target->ToPlayer())      { -        playerTarget->SendMovementSetCollisionHeight(playerTarget->GetCollisionHeight(false), WorldPackets::Movement::UpdateCollisionHeightReason::Force); +        playerTarget->SendMovementSetCollisionHeight(playerTarget->GetCollisionHeight(), WorldPackets::Movement::UpdateCollisionHeightReason::Force);          playerTarget->InitDataForForm();      }      else 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 ab982426d17..15bf3343129 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -662,7 +662,7 @@ struct boss_jormungarAI : public BossAI          events.SetPhase(PHASE_SUBMERGED);          events.ScheduleEvent(EVENT_EMERGE, 5*IN_MILLISECONDS, 0, PHASE_SUBMERGED);          me->AddUnitFlag(UnitFlags(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->GetMotionMaster()->MovePoint(0, ToCCommonLoc[1].GetPositionX() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionY() + frand(-40.0f, 40.0f), ToCCommonLoc[1].GetPositionZ() + me->GetMidsectionHeight());          WasMobile = !WasMobile;      }  | 
