Core/Maps: fixed several issues with liquids by merging some 335 branch commits that are taking mopg flags into account

This commit is contained in:
Ovahlord committed 2018-08-07 12:35:02 +02:00
1 parent 2008854f56
commit 3f53afd39e
17 files changed
+435 -272

No files matched your search

+23 -41
View File
@@ -485,7 +485,6 @@ void Unit::Update(uint32 p_time)
UpdateSplineMovement(p_time);
i_motionMaster->UpdateMotion(p_time);
UpdateUnderwaterState(GetMap(), GetPositionX(), GetPositionY(), GetPositionZ());
}
bool Unit::haveOffhandWeapon() const
@@ -3207,51 +3206,37 @@ bool Unit::IsUnderWater() const
return GetBaseMap()->IsUnderWater(GetPhaseShift(), GetPositionX(), GetPositionY(), GetPositionZ());
}
void Unit::UpdateUnderwaterState(Map* m, float x, float y, float z)
void Unit::ProcessPositionDataChanged(PositionFullTerrainStatus const& data)
{
if (IsFlying() || (!IsPet() && !IsVehicle()))
WorldObject::ProcessPositionDataChanged(data);
ProcessTerrainStatusUpdate(data.liquidStatus, data.liquidInfo);
}
void Unit::ProcessTerrainStatusUpdate(ZLiquidStatus status, Optional<LiquidData> const& liquidData)
{
if (IsFlying() || (!IsControlledByPlayer()))
return;
LiquidData liquid_status;
ZLiquidStatus res = m->GetLiquidStatus(GetPhaseShift(), x, y, z, MAP_ALL_LIQUIDS, &liquid_status);
if (!res)
// 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);
// liquid aura handling
LiquidTypeEntry const* curLiquid = nullptr;
if ((status & MAP_LIQUID_STATUS_SWIMMING) && liquidData)
curLiquid = sLiquidTypeStore.LookupEntry(liquidData->entry);
if (curLiquid != _lastLiquid)
{
if (_lastLiquid && _lastLiquid->SpellId)
RemoveAurasDueToSpell(_lastLiquid->SpellId);
RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_NOT_UNDERWATER);
_lastLiquid = NULL;
return;
}
if (uint32 liqEntry = liquid_status.entry)
{
LiquidTypeEntry const* liquid = sLiquidTypeStore.LookupEntry(liqEntry);
if (_lastLiquid && _lastLiquid->SpellId && _lastLiquid->Id != liqEntry)
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;
Player* player = GetCharmerOrOwnerPlayerOrPlayerItself();
if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
CastSpell(this, curLiquid->SpellId, true);
_lastLiquid = curLiquid;
}
}
void Unit::DeMorph()
{
SetDisplayId(GetNativeDisplayId());
@@ -13849,9 +13834,6 @@ 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);
return (relocated || turn);
}