fix areatrigger issue on tp

This commit is contained in:
luis
2026-03-21 00:07:18 -03:00
parent 197894449f
commit 396ff73361
@@ -48,9 +48,9 @@
#include <bit>
AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _spawnId(0), _aurEff(nullptr),
_duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()),
_isRemoved(false), _reachedDestination(true), _lastSplineIndex(0),
_areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
_duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(std::numeric_limits<float>::infinity()),
_isRemoved(false), _reachedDestination(true), _lastSplineIndex(0),
_areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
{
m_objectTypeId = TYPEID_AREATRIGGER;
@@ -215,20 +215,20 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::IsDecay), true);
AreaTriggerFieldFlags fieldFlags = [flags = GetCreateProperties()->Flags]()
{
AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape))
fieldFlags |= AreaTriggerFieldFlags::DynamicShape;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir))
fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain))
fieldFlags |= AreaTriggerFieldFlags::FollowsTerrain;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior))
fieldFlags |= AreaTriggerFieldFlags::AlwaysExterior;
return fieldFlags;
}();
{
AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape))
fieldFlags |= AreaTriggerFieldFlags::DynamicShape;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir))
fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain))
fieldFlags |= AreaTriggerFieldFlags::FollowsTerrain;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::AlwaysExterior))
fieldFlags |= AreaTriggerFieldFlags::AlwaysExterior;
return fieldFlags;
}();
ReplaceAllAreaTriggerFlags(fieldFlags);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS());
@@ -318,7 +318,7 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
return true;
}
AreaTrigger* AreaTrigger::CreateAreaTrigger(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Position const& pos, int32 duration, Unit * caster, Unit * target, SpellCastVisual spellVisual /*= { 0, 0 }*/, SpellInfo const* spellInfo /*= nullptr*/, Spell* spell /*= nullptr*/, AuraEffect const* aurEff /*= nullptr*/)
AreaTrigger* AreaTrigger::CreateAreaTrigger(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Position const& pos, int32 duration, Unit* caster, Unit* target, SpellCastVisual spellVisual /*= { 0, 0 }*/, SpellInfo const* spellInfo /*= nullptr*/, Spell* spell /*= nullptr*/, AuraEffect const* aurEff /*= nullptr*/)
{
AreaTrigger* at = new AreaTrigger();
if (!at->Create(areaTriggerCreatePropertiesId, caster->GetMap(), pos, duration, nullptr, caster, target, spellVisual, spellInfo, spell, aurEff))
@@ -505,10 +505,10 @@ void AreaTrigger::_UpdateDuration(int32 newDuration)
// should be sent in object create packets only
DoWithSuppressingObjectUpdates([&]()
{
SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Duration), _duration);
const_cast<UF::AreaTriggerData&>(*m_areaTriggerData).ClearChanged(&UF::AreaTriggerData::Duration);
});
{
SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::Duration), _duration);
const_cast<UF::AreaTriggerData&>(*m_areaTriggerData).ClearChanged(&UF::AreaTriggerData::Duration);
});
}
float AreaTrigger::CalcCurrentScale() const
@@ -621,18 +621,18 @@ void AreaTrigger::SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false>
switch (mode)
{
case CurveInterpolationMode::CatmullRom:
// catmullrom requires at least 4 points, impossible here
mode = CurveInterpolationMode::Cosine;
break;
case CurveInterpolationMode::Bezier3:
case CurveInterpolationMode::Bezier4:
case CurveInterpolationMode::Bezier:
// bezier requires more than 2 points, impossible here
mode = CurveInterpolationMode::Linear;
break;
default:
break;
case CurveInterpolationMode::CatmullRom:
// catmullrom requires at least 4 points, impossible here
mode = CurveInterpolationMode::Cosine;
break;
case CurveInterpolationMode::Bezier3:
case CurveInterpolationMode::Bezier4:
case CurveInterpolationMode::Bezier:
// bezier requires more than 2 points, impossible here
mode = CurveInterpolationMode::Linear;
break;
default:
break;
}
uint32 pointCount = 2;
@@ -674,32 +674,32 @@ void AreaTrigger::UpdateTargetList()
{
ConditionContainer const* conditions = sConditionMgr->GetConditionsForAreaTrigger(GetTemplate()->Id.Id, GetTemplate()->Id.IsCustom);
Trinity::Containers::EraseIf(targetList, [this, conditions](Unit const* target)
{
if (GetCasterGuid() == target->GetGUID())
{
if (HasActionSetFlag(AreaTriggerActionSetFlag::NotTriggeredbyCaster))
return true;
}
else
{
if (HasActionSetFlag(AreaTriggerActionSetFlag::OnlyTriggeredByCaster))
return true;
if (HasActionSetFlag(AreaTriggerActionSetFlag::CreatorsPartyOnly))
if (GetCasterGuid() == target->GetGUID())
{
Unit* caster = GetCaster();
if (!caster)
return true;
if (!caster->IsInRaidWith(target))
if (HasActionSetFlag(AreaTriggerActionSetFlag::NotTriggeredbyCaster))
return true;
}
}
if (Player const* player = target->ToPlayer())
{
switch (player->getDeathState())
else
{
if (HasActionSetFlag(AreaTriggerActionSetFlag::OnlyTriggeredByCaster))
return true;
if (HasActionSetFlag(AreaTriggerActionSetFlag::CreatorsPartyOnly))
{
Unit* caster = GetCaster();
if (!caster)
return true;
if (!caster->IsInRaidWith(target))
return true;
}
}
if (Player const* player = target->ToPlayer())
{
switch (player->getDeathState())
{
case DEAD:
if (!HasActionSetFlag(AreaTriggerActionSetFlag::AllowWhileGhost))
return true;
@@ -710,17 +710,17 @@ void AreaTrigger::UpdateTargetList()
break;
default:
break;
}
}
}
if (!HasActionSetFlag(AreaTriggerActionSetFlag::CanAffectUninteractible) && target->IsUninteractible())
return true;
if (!HasActionSetFlag(AreaTriggerActionSetFlag::CanAffectUninteractible) && target->IsUninteractible())
return true;
if (conditions)
return !sConditionMgr->IsObjectMeetToConditions(target, *conditions);
if (conditions)
return !sConditionMgr->IsObjectMeetToConditions(target, *conditions);
return false;
});
return false;
});
}
HandleUnitEnterExit(targetList);
@@ -769,9 +769,9 @@ void AreaTrigger::SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Uni
Position const& boxCenter = GetPosition();
Trinity::Containers::EraseIf(targetList, [boxCenter, extentsX, extentsY, extentsZ](Unit const* unit) -> bool
{
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, extentsZ / 2);
});
{
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, extentsZ / 2);
});
}
void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList)
@@ -787,11 +787,11 @@ void AreaTrigger::SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std
SearchUnits(targetList, GetMaxSearchRadius(), false);
Trinity::Containers::EraseIf(targetList, [this, minZ, maxZ](Unit const* unit) -> bool
{
return unit->GetPositionZ() < minZ
|| unit->GetPositionZ() > maxZ
|| !unit->IsInPolygon2D(*this, _polygonVertices);
});
{
return unit->GetPositionZ() < minZ
|| unit->GetPositionZ() > maxZ
|| !unit->IsInPolygon2D(*this, _polygonVertices);
});
}
void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList)
@@ -812,10 +812,10 @@ void AreaTrigger::SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder,
SearchUnits(targetList, radius, false);
Trinity::Containers::EraseIf(targetList, [minZ, maxZ](Unit const* unit) -> bool
{
return unit->GetPositionZ() < minZ
|| unit->GetPositionZ() > maxZ;
});
{
return unit->GetPositionZ() < minZ
|| unit->GetPositionZ() > maxZ;
});
}
void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList)
@@ -837,9 +837,9 @@ void AreaTrigger::SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<
SearchUnits(targetList, outerRadius, false);
Trinity::Containers::EraseIf(targetList, [this, innerRadius, minZ, maxZ](Unit const* unit) -> bool
{
return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ;
});
{
return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ;
});
}
void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList)
@@ -857,9 +857,9 @@ void AreaTrigger::SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& bo
Position const& boxCenter = GetPosition();
Trinity::Containers::EraseIf(targetList, [boxCenter, extentsX, extentsY](Unit const* unit) -> bool
{
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, MAP_SIZE);
});
{
return !unit->IsWithinBox(boxCenter, extentsX, extentsY, MAP_SIZE);
});
}
void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList, AreaTriggerExitReason exitMode)
@@ -899,9 +899,8 @@ void AreaTrigger::HandleUnitEnter(Unit* unit)
player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_ENTER, GetEntry(), 1);
if (AreaTriggerTemplate const* areaTriggerTemplate = GetTemplate())
if (areaTriggerTemplate->ActionSetId)
player->UpdateCriteria(CriteriaType::EnterAreaTriggerWithActionSet, areaTriggerTemplate->ActionSetId);
if (GetTemplate()->ActionSetId)
player->UpdateCriteria(CriteriaType::EnterAreaTriggerWithActionSet, GetTemplate()->ActionSetId);
}
DoActions(unit);
@@ -931,9 +930,8 @@ void AreaTrigger::HandleUnitExitInternal(Unit* unit, AreaTriggerExitReason exitM
{
player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_EXIT, GetEntry(), 1);
if (AreaTriggerTemplate const* areaTriggerTemplate = GetTemplate())
if (areaTriggerTemplate->ActionSetId)
player->UpdateCriteria(CriteriaType::LeaveAreaTriggerWithActionSet, areaTriggerTemplate->ActionSetId);
if (GetTemplate()->ActionSetId)
player->UpdateCriteria(CriteriaType::LeaveAreaTriggerWithActionSet, GetTemplate()->ActionSetId);
}
}
@@ -1123,29 +1121,29 @@ bool UnitFitToActionRequirement(Unit* unit, Unit* caster, AreaTriggerAction cons
{
switch (action.TargetType)
{
case AREATRIGGER_ACTION_USER_FRIEND:
{
return caster->IsValidAssistTarget(unit, sSpellMgr->GetSpellInfo(action.Param, caster->GetMap()->GetDifficultyID()));
}
case AREATRIGGER_ACTION_USER_ENEMY:
{
return caster->IsValidAttackTarget(unit, sSpellMgr->GetSpellInfo(action.Param, caster->GetMap()->GetDifficultyID()));
}
case AREATRIGGER_ACTION_USER_RAID:
{
return caster->IsInRaidWith(unit);
}
case AREATRIGGER_ACTION_USER_PARTY:
{
return caster->IsInPartyWith(unit);
}
case AREATRIGGER_ACTION_USER_CASTER:
{
return unit->GetGUID() == caster->GetGUID();
}
case AREATRIGGER_ACTION_USER_ANY:
default:
break;
case AREATRIGGER_ACTION_USER_FRIEND:
{
return caster->IsValidAssistTarget(unit, sSpellMgr->GetSpellInfo(action.Param, caster->GetMap()->GetDifficultyID()));
}
case AREATRIGGER_ACTION_USER_ENEMY:
{
return caster->IsValidAttackTarget(unit, sSpellMgr->GetSpellInfo(action.Param, caster->GetMap()->GetDifficultyID()));
}
case AREATRIGGER_ACTION_USER_RAID:
{
return caster->IsInRaidWith(unit);
}
case AREATRIGGER_ACTION_USER_PARTY:
{
return caster->IsInPartyWith(unit);
}
case AREATRIGGER_ACTION_USER_CASTER:
{
return unit->GetGUID() == caster->GetGUID();
}
case AREATRIGGER_ACTION_USER_ANY:
default:
break;
}
return true;
@@ -1163,38 +1161,38 @@ void AreaTrigger::DoActions(Unit* unit)
{
switch (action.ActionType)
{
case AREATRIGGER_ACTION_CAST:
caster->CastSpell(unit, action.Param, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCastId(m_areaTriggerData->CreatingEffectGUID->IsCast() ? *m_areaTriggerData->CreatingEffectGUID : ObjectGuid::Empty));
break;
case AREATRIGGER_ACTION_ADDAURA:
caster->AddAura(action.Param, unit);
break;
case AREATRIGGER_ACTION_TELEPORT:
case AREATRIGGER_ACTION_CAST:
caster->CastSpell(unit, action.Param, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
.SetOriginalCastId(m_areaTriggerData->CreatingEffectGUID->IsCast() ? *m_areaTriggerData->CreatingEffectGUID : ObjectGuid::Empty));
break;
case AREATRIGGER_ACTION_ADDAURA:
caster->AddAura(action.Param, unit);
break;
case AREATRIGGER_ACTION_TELEPORT:
{
if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(action.Param))
{
if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(action.Param))
{
if (Player* player = caster->ToPlayer())
{
if (player->GetMapId() != safeLoc->Loc.GetMapId())
{
if (WorldSafeLocsEntry const* instanceEntrance = player->GetInstanceEntrance(safeLoc->Loc.GetMapId()))
safeLoc = instanceEntrance;
}
player->TeleportTo(safeLoc->Loc);
}
}
break;
}
case AREATRIGGER_ACTION_TAVERN:
if (Player* player = caster->ToPlayer())
{
player->GetRestMgr().SetInnTrigger(InnAreaTrigger{ .IsDBC = false });
player->GetRestMgr().SetRestFlag(REST_FLAG_IN_TAVERN);
if (player->GetMapId() != safeLoc->Loc.GetMapId())
{
if (WorldSafeLocsEntry const* instanceEntrance = player->GetInstanceEntrance(safeLoc->Loc.GetMapId()))
safeLoc = instanceEntrance;
}
player->TeleportTo(safeLoc->Loc);
}
break;
default:
break;
}
break;
}
case AREATRIGGER_ACTION_TAVERN:
if (Player* player = caster->ToPlayer())
{
player->GetRestMgr().SetInnTrigger(InnAreaTrigger{ .IsDBC = false });
player->GetRestMgr().SetRestFlag(REST_FLAG_IN_TAVERN);
}
break;
default:
break;
}
}
}
@@ -1209,18 +1207,18 @@ void AreaTrigger::UndoActions(Unit* unit)
{
switch (action.ActionType)
{
case AREATRIGGER_ACTION_CAST:
[[fallthrough]];
case AREATRIGGER_ACTION_ADDAURA:
case AREATRIGGER_ACTION_CAST:
[[fallthrough]];
case AREATRIGGER_ACTION_ADDAURA:
unit->RemoveAurasDueToSpell(action.Param, GetCasterGuid());
break;
case AREATRIGGER_ACTION_TAVERN:
if (Player* player = unit->ToPlayer())
player->GetRestMgr().SetInnTrigger(std::nullopt);
break;
default:
break;
}
break;
case AREATRIGGER_ACTION_TAVERN:
if (Player* player = unit->ToPlayer())
player->GetRestMgr().SetInnTrigger(std::nullopt);
break;
default:
break;
}
}
}
}
@@ -1593,7 +1591,6 @@ void AreaTrigger::ClearValuesChangesMask()
m_values.ClearChangesMask(&AreaTrigger::m_areaTriggerData);
WorldObject::ClearValuesChangesMask();
}
//WowCommunity
AreaTrigger* AreaTrigger::CreateStaticAreaTrigger(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map* map, Position const& pos, int32 duration /*= -1*/)