aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2017-06-08 00:25:06 +0200
committerShauren <shauren.trinity@gmail.com>2017-06-08 00:25:06 +0200
commitf6c849729b27b77228704b595de3adaf24da2c10 (patch)
treeb9f7e1ae9c6db0aa367c353ebd2a3f5dddf860d1 /src/server/game/Entities/Unit
parent1660bb7d27d6f42b49012a6b57e3c2b2eab20fd3 (diff)
[3.3.5] Get zone/area IDs from vmap data in the liquid update (#19840)
* Add new method Map::getFullVMapDataForPosition to get area info and liquid info in a single vmap lookup * Use this lookup in Map:: relocation methods to update m_areaId and m_zoneId fields on WorldObject * Adjust GetZoneId/GetAreaId on WorldObject to always return these cached fields * Clean up liquid state handling on Unit and Player * Hand floor's Z coord up through GetFullTerrainStatusForPosition, use it to update a new field in WorldObject, and use that to feed a new GetFloorZ call on WorldObject. Closes #16489
Diffstat (limited to 'src/server/game/Entities/Unit')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp60
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
2 files changed, 25 insertions, 39 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e1633edbeaa..dcfe56ed69c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -470,7 +470,6 @@ void Unit::Update(uint32 p_time)
UpdateSplineMovement(p_time);
i_motionMaster->UpdateMotion(p_time);
- UpdateUnderwaterState(GetMap(), GetPositionX(), GetPositionY(), GetPositionZ());
}
bool Unit::haveOffhandWeapon() const
@@ -3353,48 +3352,34 @@ bool Unit::IsUnderWater() const
return GetBaseMap()->IsUnderWater(GetPositionX(), GetPositionY(), GetPositionZ());
}
-void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z)
+void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
{
- if (IsFlying() || (!IsPet() && !IsVehicle()))
- return;
+ WorldObject::ProcessPositionDataChanged(data);
+ ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo);
+}
- LiquidData liquid_status;
- ZLiquidStatus res = m->getLiquidStatus(x, y, z, MAP_ALL_LIQUIDS, &liquid_status);
- if (!res)
- {
- if (_lastLiquid && _lastLiquid->SpellId)
- RemoveAurasDueToSpell(_lastLiquid->SpellId);
+void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
+{
+ if (IsFlying() || (!IsControlledByPlayer()))
+ return;
+ // remove appropriate auras if we are swimming/not swimming respectively
+ if (status & MAP_LIQUID_STATUS_SWIMMING)
+ RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER);
+ else
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
- _lastLiquid = NULL;
- return;
- }
- if (uint32 liqEntry = liquid_status.entry)
+ // liquid aura handling
+ LiquidTypeEntry const* curLiquid = nullptr;
+ if ((status & MAP_LIQUID_STATUS_SWIMMING) && liquidData)
+ curLiquid = sLiquidTypeStore.LookupEntry(liquidData->entry);
+ if (curLiquid != _lastLiquid)
{
- LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry);
- if (_lastLiquid && _lastLiquid->SpellId && _lastLiquid->Id != liqEntry)
+ if (_lastLiquid && _lastLiquid->SpellId)
RemoveAurasDueToSpell(_lastLiquid->SpellId);
-
- if (liquid && liquid->SpellId)
- {
- if (res & (LIQUID_MAP_UNDER_WATER | LIQUID_MAP_IN_WATER))
- {
- if (!HasAura(liquid->SpellId))
- CastSpell(this, liquid->SpellId, true);
- }
- else
- RemoveAurasDueToSpell(liquid->SpellId);
- }
-
- RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_ABOVEWATER);
- _lastLiquid = liquid;
- }
- else if (_lastLiquid && _lastLiquid->SpellId)
- {
- RemoveAurasDueToSpell(_lastLiquid->SpellId);
- RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
- _lastLiquid = NULL;
+ if (curLiquid && curLiquid->SpellId)
+ CastSpell(this, curLiquid->SpellId, true);
+ _lastLiquid = curLiquid;
}
}
@@ -13906,8 +13891,7 @@ bool Unit::UpdatePosition(float x, float y, float z, float orientation, bool tel
else if (turn)
UpdateOrientation(orientation);
- // code block for underwater state update
- UpdateUnderwaterState(GetMap(), x, y, z);
+ UpdatePositionData();
return (relocated || turn);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 2c58b250b3c..61e1ad86c3e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1581,7 +1581,6 @@ class TC_GAME_API Unit : public WorldObject
virtual bool IsInWater() const;
virtual bool IsUnderWater() const;
- virtual void UpdateUnderwaterState(Map* m, float x, float y, float z);
bool isInAccessiblePlaceFor(Creature const* c) const;
void SendHealSpellLog(HealInfo& healInfo, bool critical = false);
@@ -2309,6 +2308,9 @@ class TC_GAME_API Unit : public WorldObject
void DisableSpline();
+ void ProcessPositionDataChanged(PositionFullTerrainStatus const& data) override;
+ virtual void ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData);
+
private:
void UpdateSplineMovement(uint32 t_diff);