fix areatrigger issue on tp
This commit is contained in:
@@ -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*/)
|
||||
|
||||
Reference in New Issue
Block a user