diff options
| author | Meji <alvaro.megias@outlook.com> | 2023-12-30 17:14:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-30 17:14:09 +0100 |
| commit | 37eb2e64a6ad075e9866af6feb72bb4fbccb2adc (patch) | |
| tree | 664b202a458f43fa73815fb40d39e1cae85debca /src/server/game/Entities | |
| parent | dbe54dc877416367c5d6297893fcefd269d2b031 (diff) | |
Core/AreaTriggers: Refactor (#29500)
* Moved IsServerside to custom flags
* Flags moved from areatrigger_template to areatrigger_create_properties
* New field to create custom CreateProperties (IsCustom)
* New field to reference custom areatriggers (IsAreatriggerCustom)
* Moved fields for shape data to areatrigger_create_properties
Diffstat (limited to 'src/server/game/Entities')
5 files changed, 202 insertions, 222 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 0af01e062a7..d99e005a76d 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -95,30 +95,30 @@ void AreaTrigger::RemoveFromWorld() WorldObject::RemoveFromWorld(); - if (_spawnId) + if (IsStaticSpawn()) Trinity::Containers::MultimapErasePair(GetMap()->GetAreaTriggerBySpawnIdStore(), _spawnId, this); GetMap()->GetObjectsStore().Remove<AreaTrigger>(GetGUID()); } } -bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spellInfo, Position const& pos, int32 duration, SpellCastVisual spellVisual, Spell* spell, AuraEffect const* aurEff) +bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map* map, Position const& pos, int32 duration, AreaTriggerSpawn const* spawnData /* nullptr */, Unit* caster /*= nullptr*/, Unit* target /*= nullptr*/, SpellCastVisual spellVisual /*= { 0, 0 }*/, SpellInfo const* spellInfo /*= nullptr*/, Spell* spell /*= nullptr*/, AuraEffect const* aurEff /*= nullptr*/) { _targetGuid = target ? target->GetGUID() : ObjectGuid::Empty; _aurEff = aurEff; - SetMap(caster->GetMap()); + SetMap(map); Relocate(pos); RelocateStationaryPosition(pos); if (!IsPositionValid()) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (areaTriggerCreatePropertiesId {}) not created. Invalid coordinates (X: {} Y: {})", areaTriggerCreatePropertiesId, GetPositionX(), GetPositionY()); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid coordinates (X: {} Y: {})", areaTriggerCreatePropertiesId.Id, uint32(areaTriggerCreatePropertiesId.IsCustom), GetPositionX(), GetPositionY()); return false; } _areaTriggerCreateProperties = sAreaTriggerDataStore->GetAreaTriggerCreateProperties(areaTriggerCreatePropertiesId); if (!_areaTriggerCreateProperties) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (areaTriggerCreatePropertiesId {}) not created. Invalid areatrigger create properties id ({})", areaTriggerCreatePropertiesId, areaTriggerCreatePropertiesId); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid areatrigger create properties id", areaTriggerCreatePropertiesId.Id, uint32(areaTriggerCreatePropertiesId.IsCustom)); return false; } @@ -126,59 +126,71 @@ bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Uni _areaTriggerTemplate = _areaTriggerCreateProperties->Template; - Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate() ? GetTemplate()->Id.Id : 0, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate() ? GetTemplate()->Id.Id : 0, GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); if (GetTemplate()) SetEntry(GetTemplate()->Id.Id); - SetDuration(duration); - SetObjectScale(1.0f); + SetDuration(duration); _shape = GetCreateProperties()->Shape; auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID()); + if (caster) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID()); if (spell) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreatingEffectGUID), spell->m_castId); - - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellID), spellInfo->Id); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spellInfo->Id); + if (spellInfo && !IsStaticSpawn()) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellID), spellInfo->Id); + if (spellInfo) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spellInfo->Id); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->GetMaxSearchRadius()); + if (!IsStaticSpawn()) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->Shape.GetMaxSearchRadius()); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetCreateProperties()->DecalPropertiesId); + if (IsServerSide()) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), 24); // Blue decal, for .debug areatrigger visibility - SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), GetCreateProperties()->ExtraScale); + AreaTriggerScaleCurveTemplate const extraScaleCurve = IsStaticSpawn() ? AreaTriggerScaleCurveTemplate() : *GetCreateProperties()->ExtraScale; + SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), extraScaleCurve); - if (Player const* modOwner = caster->GetSpellModOwner()) + if (caster) { - float multiplier = 1.0f; - int32 flat = 0; - modOwner->GetSpellModValues(spellInfo, SpellModOp::Radius, spell, *m_areaTriggerData->BoundsRadius2D, &flat, &multiplier); - if (multiplier != 1.0f) + if (Player const* modOwner = caster->GetSpellModOwner()) { - AreaTriggerScaleCurveTemplate overrideScale; - overrideScale.Curve = multiplier; - SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale); + float multiplier = 1.0f; + int32 flat = 0; + modOwner->GetSpellModValues(spellInfo, SpellModOp::Radius, spell, *m_areaTriggerData->BoundsRadius2D, &flat, &multiplier); + if (multiplier != 1.0f) + { + AreaTriggerScaleCurveTemplate overrideScale; + overrideScale.Curve = multiplier; + SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale); + } } } SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimationDataID), GetCreateProperties()->AnimId); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimKitID), GetCreateProperties()->AnimKitId); - if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK3)) + if (GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::Unk3)) SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::Field_C), true); - PhasingHandler::InheritPhaseShift(this, caster); - - if (target && GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + if (caster) + PhasingHandler::InheritPhaseShift(this, caster); + else if (IsStaticSpawn() && spawnData) { - m_movementInfo.transport.guid = target->GetGUID(); + if (spawnData->phaseUseFlags || spawnData->phaseId || spawnData->phaseGroup) + PhasingHandler::InitDbPhaseShift(GetPhaseShift(), spawnData->phaseUseFlags, spawnData->phaseId, spawnData->phaseGroup); } - UpdatePositionData(); - SetZoneScript(); + if (target && GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) + m_movementInfo.transport.guid = target->GetGUID(); + + if (!IsStaticSpawn()) + UpdatePositionData(); UpdateShape(); @@ -187,7 +199,7 @@ bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Uni if (GetCreateProperties()->OrbitInfo) { AreaTriggerOrbitInfo orbit = *GetCreateProperties()->OrbitInfo; - if (target && GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + if (target && GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) orbit.PathTarget = target->GetGUID(); else orbit.Center = pos; @@ -200,16 +212,20 @@ bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Uni } // movement on transport of areatriggers on unit is handled by themself - TransportBase* transport = m_movementInfo.transport.guid.IsEmpty() ? caster->GetTransport() : nullptr; - if (transport) + TransportBase* transport = nullptr; + if (caster) { - float x, y, z, o; - pos.GetPosition(x, y, z, o); - transport->CalculatePassengerOffset(x, y, z, &o); - m_movementInfo.transport.pos.Relocate(x, y, z, o); + transport = m_movementInfo.transport.guid.IsEmpty() ? caster->GetTransport() : nullptr; + if (transport) + { + float x, y, z, o; + pos.GetPosition(x, y, z, o); + transport->CalculatePassengerOffset(x, y, z, &o); + m_movementInfo.transport.pos.Relocate(x, y, z, o); - // This object must be added to transport before adding to map for the client to properly display it - transport->AddPassenger(this); + // This object must be added to transport before adding to map for the client to properly display it + transport->AddPassenger(this); + } } AI_Initialize(); @@ -218,25 +234,29 @@ bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Uni if (HasOrbit()) Relocate(CalculateOrbitPosition()); - if (!GetMap()->AddToMap(this)) + if (!IsStaticSpawn()) { - // Returning false will cause the object to be deleted - remove from transport - if (transport) - transport->RemovePassenger(this); - return false; + if (!GetMap()->AddToMap(this)) + { + // Returning false will cause the object to be deleted - remove from transport + if (transport) + transport->RemovePassenger(this); + return false; + } } - caster->_RegisterAreaTrigger(this); + if (caster) + caster->_RegisterAreaTrigger(this); - _ai->OnCreate(spell); + _ai->OnCreate(spell ? spell : nullptr); return true; } -AreaTrigger* AreaTrigger::CreateAreaTrigger(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spellInfo, Position const& pos, int32 duration, SpellCastVisual spellVisual, 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, target, spellInfo, pos, duration, spellVisual, spell, aurEff)) + if (!at->Create(areaTriggerCreatePropertiesId, caster->GetMap(), pos, duration, nullptr, caster, target, spellVisual, spellInfo, spell, aurEff)) { delete at; return nullptr; @@ -254,69 +274,25 @@ bool AreaTrigger::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool /*addTo { _spawnId = spawnId; - AreaTriggerSpawn const* position = sAreaTriggerDataStore->GetAreaTriggerSpawn(spawnId); - if (!position) + AreaTriggerSpawn const* spawnData = sAreaTriggerDataStore->GetAreaTriggerSpawn(spawnId); + if (!spawnData) return false; - AreaTriggerTemplate const* areaTriggerTemplate = sAreaTriggerDataStore->GetAreaTriggerTemplate(position->Id); - if (!areaTriggerTemplate) + AreaTriggerCreateProperties const* createProperties = sAreaTriggerDataStore->GetAreaTriggerCreateProperties(spawnData->Id); + if (!createProperties) return false; - return CreateServer(map, areaTriggerTemplate, *position); -} - -bool AreaTrigger::CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerSpawn const& position) -{ - SetMap(map); - Relocate(position.spawnPoint); - RelocateStationaryPosition(position.spawnPoint); - if (!IsPositionValid()) + SpellInfo const* spellInfo = nullptr; + SpellCastVisual spellVisual; + if (spawnData->SpellForVisuals) { - TC_LOG_ERROR("entities.areatrigger", "AreaTriggerServer (id {}) not created. Invalid coordinates (X: {} Y: {})", - areaTriggerTemplate->Id.Id, GetPositionX(), GetPositionY()); - return false; - } - - SetZoneScript(); - - _areaTriggerTemplate = areaTriggerTemplate; - - Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), areaTriggerTemplate->Id.Id, GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + spellInfo = sSpellMgr->GetSpellInfo(*spawnData->SpellForVisuals, DIFFICULTY_NONE); - SetEntry(areaTriggerTemplate->Id.Id); - - SetObjectScale(1.0f); - SetDuration(-1); - - _shape = position.Shape; - - auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); - if (position.SpellForVisuals) - { - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(*position.SpellForVisuals, DIFFICULTY_NONE); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), *position.SpellForVisuals); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellInfo->GetSpellXSpellVisualId()); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), 0); + if (spellInfo) + spellVisual.SpellXSpellVisualID = spellInfo->GetSpellXSpellVisualId(); } - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), _shape.GetMaxSearchRadius()); - if (IsServerSide()) - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), 24); // blue decal, for .debug areatrigger visibility - - SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), AreaTriggerScaleCurveTemplate()); - - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimationDataID), -1); - - if (position.phaseUseFlags || position.phaseId || position.phaseGroup) - PhasingHandler::InitDbPhaseShift(GetPhaseShift(), position.phaseUseFlags, position.phaseId, position.phaseGroup); - - UpdateShape(); - - AI_Initialize(); - - _ai->OnCreate(nullptr); - - return true; + return Create(spawnData->Id, map, spawnData->spawnPoint, -1, spawnData, nullptr, nullptr, spellVisual, spellInfo); } void AreaTrigger::Update(uint32 diff) @@ -324,7 +300,7 @@ void AreaTrigger::Update(uint32 diff) WorldObject::Update(diff); _timeSinceCreated += diff; - if (!IsServerSide()) + if (!IsStaticSpawn()) { // "If" order matter here, Orbit > Attached > Splines if (HasOverridePosition()) @@ -335,7 +311,7 @@ void AreaTrigger::Update(uint32 diff) { UpdateOrbitPosition(diff); } - else if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + else if (GetCreateProperties() && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) { if (Unit* target = GetTarget()) { @@ -344,7 +320,7 @@ void AreaTrigger::Update(uint32 diff) if (createProperties->FacingCurveId) orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION)) + if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) orientation += target->GetOrientation(); GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), orientation); @@ -361,7 +337,7 @@ void AreaTrigger::Update(uint32 diff) if (createProperties->FacingCurveId) { float orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION)) + if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) orientation += GetStationaryO(); SetOrientation(orientation); @@ -618,22 +594,22 @@ void AreaTrigger::UpdateTargetList() switch (_shape.Type) { - case AREATRIGGER_TYPE_SPHERE: + case AreaTriggerShapeType::Sphere: SearchUnitInSphere(targetList); break; - case AREATRIGGER_TYPE_BOX: + case AreaTriggerShapeType::Box: SearchUnitInBox(targetList); break; - case AREATRIGGER_TYPE_POLYGON: + case AreaTriggerShapeType::Polygon: SearchUnitInPolygon(targetList); break; - case AREATRIGGER_TYPE_CYLINDER: + case AreaTriggerShapeType::Cylinder: SearchUnitInCylinder(targetList); break; - case AREATRIGGER_TYPE_DISK: + case AreaTriggerShapeType::Disk: SearchUnitInDisk(targetList); break; - case AREATRIGGER_TYPE_BOUNDED_PLANE: + case AreaTriggerShapeType::BoundedPlane: SearchUnitInBoundedPlane(targetList); break; default: @@ -642,7 +618,7 @@ void AreaTrigger::UpdateTargetList() if (GetTemplate()) { - if (ConditionContainer const* conditions = sConditionMgr->GetConditionsForAreaTrigger(GetTemplate()->Id.Id, GetTemplate()->Id.IsServerSide)) + if (ConditionContainer const* conditions = sConditionMgr->GetConditionsForAreaTrigger(GetTemplate()->Id.Id, GetTemplate()->Id.IsCustom)) { Trinity::Containers::EraseIf(targetList, [conditions](Unit const* target) { @@ -657,7 +633,7 @@ void AreaTrigger::UpdateTargetList() void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D) { Trinity::AnyUnitInObjectRangeCheck check(this, radius, check3D); - if (IsServerSide()) + if (IsStaticSpawn()) { Trinity::PlayerListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check); Cell::VisitWorldObjects(this, searcher, GetMaxSearchRadius()); @@ -816,7 +792,7 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) if (Player* player = unit->ToPlayer()) { if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTERED, GetEntry()); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTITY_ENTERED, GetEntry(), IsCustom(), IsStaticSpawn(), GetGUID().GetCounter()); player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_ENTER, GetEntry(), 1); } @@ -833,7 +809,7 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) if (Player* player = leavingUnit->ToPlayer()) { if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_LEFT, GetEntry()); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTITY_LEFT, GetEntry(), IsCustom(), IsStaticSpawn(), GetGUID().GetCounter()); player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_EXIT, GetEntry(), 1); } @@ -891,14 +867,15 @@ float AreaTrigger::GetMaxSearchRadius() const void AreaTrigger::UpdatePolygonVertices() { AreaTriggerCreateProperties const* createProperties = GetCreateProperties(); + AreaTriggerShapeInfo const& shape = GetShape(); float newOrientation = GetOrientation(); // No need to recalculate, orientation didn't change - if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && (!createProperties || createProperties->PolygonVerticesTarget.empty())) + if (G3D::fuzzyEq(_verticesUpdatePreviousOrientation, newOrientation) && shape.PolygonVerticesTarget.empty()) return; - _polygonVertices.assign(createProperties->PolygonVertices.begin(), createProperties->PolygonVertices.end()); - if (!createProperties->PolygonVerticesTarget.empty()) + _polygonVertices.assign(shape.PolygonVertices.begin(), shape.PolygonVertices.end()); + if (!shape.PolygonVerticesTarget.empty()) { float progress = GetProgress(); if (createProperties->MorphCurveId) @@ -907,7 +884,7 @@ void AreaTrigger::UpdatePolygonVertices() for (std::size_t i = 0; i < _polygonVertices.size(); ++i) { Position& vertex = _polygonVertices[i]; - Position const& vertexTarget = createProperties->PolygonVerticesTarget[i].Pos; + Position const& vertexTarget = shape.PolygonVerticesTarget[i].Pos; vertex.m_positionX = G3D::lerp(vertex.GetPositionX(), vertexTarget.GetPositionX(), progress); vertex.m_positionY = G3D::lerp(vertex.GetPositionY(), vertexTarget.GetPositionY(), progress); @@ -1044,13 +1021,13 @@ bool UnitFitToActionRequirement(Unit* unit, Unit* caster, AreaTriggerAction cons void AreaTrigger::DoActions(Unit* unit) { - Unit* caster = IsServerSide() ? unit : GetCaster(); + Unit* caster = IsStaticSpawn() ? unit : GetCaster(); if (caster && GetTemplate()) { for (AreaTriggerAction const& action : GetTemplate()->Actions) { - if (IsServerSide() || UnitFitToActionRequirement(unit, caster, action)) + if (IsStaticSpawn() || UnitFitToActionRequirement(unit, caster, action)) { switch (action.ActionType) { @@ -1252,7 +1229,7 @@ Position AreaTrigger::CalculateOrbitPosition() const if (createProperties && createProperties->FacingCurveId) orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION)) + if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) { orientation += angle; orientation += cmi.CounterClockwise ? float(M_PI_4) : -float(M_PI_4); @@ -1310,8 +1287,8 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) float progress = sDB2Manager.GetCurveValueAt(createProperties->MoveCurveId, currentTimePercent); if (progress < 0.f || progress > 1.f) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: {}) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})", - GetEntry(), createProperties->Id, progress, createProperties->MoveCurveId); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})", + GetEntry(), createProperties->Id.Id, uint32(createProperties->Id.IsCustom), progress, createProperties->MoveCurveId); } else currentTimePercent = progress; @@ -1328,7 +1305,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) if (createProperties && createProperties->FacingCurveId) orientation += sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (GetTemplate() && !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION) && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR)) + if (GetCreateProperties() && !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation) && GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) { G3D::Vector3 derivative; _spline->evaluate_derivative(lastPositionIndex, percentFromLastPoint, derivative); @@ -1362,7 +1339,7 @@ void AreaTrigger::UpdateOverridePosition() if (createProperties->FacingCurveId) { orientation = sDB2Manager.GetCurveValueAt(createProperties->FacingCurveId, GetProgress()); - if (!GetTemplate() || !GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION)) + if (!GetCreateProperties() || !GetCreateProperties()->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation)) orientation += GetStationaryO(); } } diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 0d03f845cdf..5d49ba798eb 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -73,7 +73,9 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge AreaTriggerAI* AI() { return _ai.get(); } - bool IsServerSide() const { return _areaTriggerTemplate->Id.IsServerSide; } + bool IsCustom() const { return _areaTriggerTemplate->Id.IsCustom; } + bool IsServerSide() const { return _areaTriggerTemplate->Flags.HasFlag(AreaTriggerFlag::IsServerSide); } + bool IsStaticSpawn() const { return _spawnId != 0; } bool IsNeverVisibleFor(WorldObject const* seer, bool allowServersideObjects = false) const override; @@ -84,11 +86,10 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge void RelocateStationaryPosition(Position const& pos) { _stationaryPosition.Relocate(pos); } private: - bool Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spellInfo, Position const& pos, int32 duration, SpellCastVisual spellVisual, Spell* spell, AuraEffect const* aurEff); - bool CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerSpawn const& position); + bool Create(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map* map, Position const& pos, int32 duration, AreaTriggerSpawn const* spawnData = nullptr, Unit* caster = nullptr, Unit* target = nullptr, SpellCastVisual spellVisual = { 0, 0 }, SpellInfo const* spellInfo = nullptr, Spell* spell = nullptr, AuraEffect const* aurEff = nullptr); public: - static AreaTrigger* CreateAreaTrigger(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spellInfo, Position const& pos, int32 duration, SpellCastVisual spellVisual, Spell* spell = nullptr, AuraEffect const* aurEff = nullptr); + static 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); static ObjectGuid CreateNewMovementForceId(Map* map, uint32 areaTriggerId); bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate); diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp index 906d48437f7..769a3a4033c 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -31,7 +31,7 @@ AreaTriggerScaleCurveTemplate::AreaTriggerScaleCurveTemplate() : StartTimeOffset AreaTriggerShapeInfo::AreaTriggerShapeInfo() { - Type = AREATRIGGER_TYPE_MAX; + Type = AreaTriggerShapeType::Max; memset(DefaultDatas.Data, 0, sizeof(DefaultDatas.Data)); } @@ -39,17 +39,30 @@ float AreaTriggerShapeInfo::GetMaxSearchRadius() const { switch (Type) { - case AREATRIGGER_TYPE_SPHERE: + case AreaTriggerShapeType::Sphere: return std::max(SphereDatas.Radius, SphereDatas.RadiusTarget); - case AREATRIGGER_TYPE_BOX: + case AreaTriggerShapeType::Box: return std::sqrt(std::max( BoxDatas.Extents[0] * BoxDatas.Extents[0] + BoxDatas.Extents[1] * BoxDatas.Extents[1], BoxDatas.ExtentsTarget[0] * BoxDatas.ExtentsTarget[0] + BoxDatas.ExtentsTarget[1] * BoxDatas.ExtentsTarget[1])); - case AREATRIGGER_TYPE_CYLINDER: + case AreaTriggerShapeType::Polygon: + { + Position center(0.0f, 0.0f); + float maxSearchRadius = 0.0f; + + for (TaggedPosition<Position::XY> const& vertex : PolygonVertices) + maxSearchRadius = std::max(maxSearchRadius, center.GetExactDist2d(vertex)); + + for (TaggedPosition<Position::XY> const& vertex : PolygonVerticesTarget) + maxSearchRadius = std::max(maxSearchRadius, center.GetExactDist2d(vertex)); + + return maxSearchRadius; + } + case AreaTriggerShapeType::Cylinder: return std::max(CylinderDatas.Radius, CylinderDatas.RadiusTarget); - case AREATRIGGER_TYPE_DISK: + case AreaTriggerShapeType::Disk: return std::max(DiskDatas.OuterRadius, DiskDatas.OuterRadiusTarget); - case AREATRIGGER_TYPE_BOUNDED_PLANE: + case AreaTriggerShapeType::BoundedPlane: return std::sqrt(std::max( BoundedPlaneDatas.Extents[0] * BoundedPlaneDatas.Extents[0] / 4 + BoundedPlaneDatas.Extents[1] * BoundedPlaneDatas.Extents[1] / 4, BoundedPlaneDatas.ExtentsTarget[0] * BoundedPlaneDatas.ExtentsTarget[0] / 4 + BoundedPlaneDatas.ExtentsTarget[1] * BoundedPlaneDatas.ExtentsTarget[1] / 4)); @@ -60,17 +73,17 @@ float AreaTriggerShapeInfo::GetMaxSearchRadius() const return 0.0f; } -AreaTriggerTemplate::AreaTriggerTemplate() +AreaTriggerTemplate::AreaTriggerTemplate() : Flags(AreaTriggerFlag::None) { Id = { 0, false }; - Flags = 0; } AreaTriggerTemplate::~AreaTriggerTemplate() = default; -AreaTriggerCreateProperties::AreaTriggerCreateProperties() +AreaTriggerCreateProperties::AreaTriggerCreateProperties() : Flags(AreaTriggerCreatePropertiesFlag::None) { - Id = 0; + Id = { 0, false }; + Template = nullptr; MoveCurveId = 0; ScaleCurveId = 0; @@ -87,8 +100,6 @@ AreaTriggerCreateProperties::AreaTriggerCreateProperties() ExtraScale.emplace(); - Template = nullptr; - ScriptId = 0; } @@ -98,22 +109,3 @@ bool AreaTriggerCreateProperties::HasSplines() const { return SplinePoints.size() >= 2; } - -float AreaTriggerCreateProperties::GetMaxSearchRadius() const -{ - if (Shape.Type == AREATRIGGER_TYPE_POLYGON) - { - Position center(0.0f, 0.0f); - float maxSearchRadius = 0.0f; - - for (TaggedPosition<Position::XY> const& vertex : PolygonVertices) - maxSearchRadius = std::max(maxSearchRadius, center.GetExactDist2d(vertex)); - - for (TaggedPosition<Position::XY> const& vertex : PolygonVerticesTarget) - maxSearchRadius = std::max(maxSearchRadius, center.GetExactDist2d(vertex)); - - return maxSearchRadius; - } - - return Shape.GetMaxSearchRadius(); -} diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 735a6413e48..c6e3f4f67eb 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -19,6 +19,7 @@ #define TRINITYCORE_AREATRIGGER_TEMPLATE_H #include "Define.h" +#include "EnumFlag.h" #include "ObjectGuid.h" #include "Optional.h" #include "SpawnData.h" @@ -28,32 +29,24 @@ #define MAX_AREATRIGGER_ENTITY_DATA 8 #define MAX_AREATRIGGER_SCALE 7 -enum AreaTriggerFlags +enum class AreaTriggerFlag : uint32 { - AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION = 0x00001, - AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE = 0x00002, // Implemented for Spheres & Disks - AREATRIGGER_FLAG_HAS_ATTACHED = 0x00004, - AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR = 0x00008, - AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN = 0x00010, // NYI - AREATRIGGER_FLAG_UNK1 = 0x00020, - AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW = 0x00040, // NYI - AREATRIGGER_FLAG_HAS_ANIM_ID = 0x00080, // DEPRECATED - AREATRIGGER_FLAG_UNK3 = 0x00100, - AREATRIGGER_FLAG_HAS_ANIM_KIT_ID = 0x00200, // DEPRECATED - AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400, // DEPRECATED - AREATRIGGER_FLAG_UNK5 = 0x00800, + None = 0x00, + IsServerSide = 0x01 }; -enum AreaTriggerTypes +DEFINE_ENUM_FLAG(AreaTriggerFlag); + +enum class AreaTriggerShapeType : uint8 { - AREATRIGGER_TYPE_SPHERE = 0, - AREATRIGGER_TYPE_BOX = 1, - AREATRIGGER_TYPE_UNK = 2, - AREATRIGGER_TYPE_POLYGON = 3, - AREATRIGGER_TYPE_CYLINDER = 4, - AREATRIGGER_TYPE_DISK = 5, - AREATRIGGER_TYPE_BOUNDED_PLANE = 6, - AREATRIGGER_TYPE_MAX + Sphere = 0, + Box = 1, + Unk = 2, + Polygon = 3, + Cylinder = 4, + Disk = 5, + BoundedPlane = 6, + Max }; enum AreaTriggerActionTypes @@ -75,14 +68,35 @@ enum AreaTriggerActionUserTypes AREATRIGGER_ACTION_USER_MAX = 6 }; +enum class AreaTriggerCreatePropertiesFlag : uint32 +{ + None = 0x00000, + HasAbsoluteOrientation = 0x00001, + HasDynamicShape = 0x00002, + HasAttached = 0x00004, + HasFaceMovementDir = 0x00008, + HasFollowsTerrain = 0x00010, // NYI + Unk1 = 0x00020, + HasTargetRollPitchYaw = 0x00040, // NYI + HasAnimId = 0x00080, // DEPRECATED + Unk3 = 0x00100, + HasAnimKitId = 0x00200, // DEPRECATED + HasCircularMovement = 0x00400, // DEPRECATED + Unk5 = 0x00800, +}; + +DEFINE_ENUM_FLAG(AreaTriggerCreatePropertiesFlag); + struct AreaTriggerId { uint32 Id = 0; - bool IsServerSide = false; + bool IsCustom = false; friend bool operator==(AreaTriggerId const& left, AreaTriggerId const& right) = default; }; +typedef AreaTriggerId AreaTriggerCreatePropertiesId; + struct AreaTriggerAction { uint32 Param; @@ -110,15 +124,18 @@ struct AreaTriggerShapeInfo { AreaTriggerShapeInfo(); - bool IsSphere() const { return Type == AREATRIGGER_TYPE_SPHERE; } - bool IsBox() const { return Type == AREATRIGGER_TYPE_BOX; } - bool IsPolygon() const { return Type == AREATRIGGER_TYPE_POLYGON; } - bool IsCylinder() const { return Type == AREATRIGGER_TYPE_CYLINDER; } - bool IsDisk() const { return Type == AREATRIGGER_TYPE_DISK; } - bool IsBoudedPlane() const { return Type == AREATRIGGER_TYPE_BOUNDED_PLANE; } + bool IsSphere() const { return Type == AreaTriggerShapeType::Sphere; } + bool IsBox() const { return Type == AreaTriggerShapeType::Box; } + bool IsPolygon() const { return Type == AreaTriggerShapeType::Polygon; } + bool IsCylinder() const { return Type == AreaTriggerShapeType::Cylinder; } + bool IsDisk() const { return Type == AreaTriggerShapeType::Disk; } + bool IsBoundedPlane() const { return Type == AreaTriggerShapeType::BoundedPlane; } float GetMaxSearchRadius() const; - AreaTriggerTypes Type; + AreaTriggerShapeType Type; + + std::vector<TaggedPosition<Position::XY>> PolygonVertices; + std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget; union { @@ -127,28 +144,28 @@ struct AreaTriggerShapeInfo float Data[MAX_AREATRIGGER_ENTITY_DATA]; } DefaultDatas; - // AREATRIGGER_TYPE_SPHERE + // AreaTriggerShapeType::Sphere struct { float Radius; float RadiusTarget; } SphereDatas; - // AREATRIGGER_TYPE_BOX + // AreaTriggerShapeType::Box struct { float Extents[3]; float ExtentsTarget[3]; } BoxDatas; - // AREATRIGGER_TYPE_POLYGON + // AreaTriggerShapeType::Polygon struct { float Height; float HeightTarget; } PolygonDatas; - // AREATRIGGER_TYPE_CYLINDER + // AreaTriggerShapeType::Cylinder struct { float Radius; @@ -159,7 +176,7 @@ struct AreaTriggerShapeInfo float LocationZOffsetTarget; } CylinderDatas; - // AREATRIGGER_TYPE_DISK + // AreaTriggerShapeType::Disk struct { float InnerRadius; @@ -172,7 +189,7 @@ struct AreaTriggerShapeInfo float LocationZOffsetTarget; } DiskDatas; - // AREATRIGGER_TYPE_BOUNDED_PLANE + // AreaTriggerShapeType::BoundedPlane struct { float Extents[2]; @@ -202,10 +219,8 @@ public: AreaTriggerTemplate(); ~AreaTriggerTemplate(); - bool HasFlag(AreaTriggerFlags flag) const { return (Flags & flag) != 0; } - AreaTriggerId Id; - uint32 Flags; + EnumFlag<AreaTriggerFlag> Flags; std::vector<AreaTriggerAction> Actions; }; @@ -216,10 +231,10 @@ public: ~AreaTriggerCreateProperties(); bool HasSplines() const; - float GetMaxSearchRadius() const; - uint32 Id; + AreaTriggerCreatePropertiesId Id; AreaTriggerTemplate const* Template; + EnumFlag<AreaTriggerCreatePropertiesFlag> Flags; uint32 MoveCurveId; uint32 ScaleCurveId; @@ -238,8 +253,6 @@ public: Optional<AreaTriggerScaleCurveTemplate> ExtraScale; AreaTriggerShapeInfo Shape; - std::vector<TaggedPosition<Position::XY>> PolygonVertices; - std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget; std::vector<Position> SplinePoints; Optional<AreaTriggerOrbitInfo> OrbitInfo; @@ -251,9 +264,7 @@ struct AreaTriggerSpawn : SpawnData { AreaTriggerSpawn() : SpawnData(SPAWN_TYPE_AREATRIGGER) { } - AreaTriggerId Id; - - AreaTriggerShapeInfo Shape; + AreaTriggerCreatePropertiesId Id; Optional<int32> SpellForVisuals; }; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 96f75e910b4..4181d5611ca 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -441,20 +441,19 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe { AreaTrigger const* areaTrigger = ToAreaTrigger(); AreaTriggerCreateProperties const* createProperties = areaTrigger->GetCreateProperties(); - AreaTriggerTemplate const* areaTriggerTemplate = areaTrigger->GetTemplate(); AreaTriggerShapeInfo const& shape = areaTrigger->GetShape(); *data << uint32(areaTrigger->GetTimeSinceCreated()); *data << areaTrigger->GetRollPitchYaw().PositionXYZStream(); - bool hasAbsoluteOrientation = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ABSOLUTE_ORIENTATION); - bool hasDynamicShape = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE); - bool hasAttached = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED); - bool hasFaceMovementDir = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR); - bool hasFollowsTerrain = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN); - bool hasUnk1 = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK1); - bool hasTargetRollPitchYaw = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW); + bool hasAbsoluteOrientation = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation); + bool hasDynamicShape = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape); + bool hasAttached = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached); + bool hasFaceMovementDir = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir); + bool hasFollowsTerrain = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain); + bool hasUnk1 = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::Unk1); + bool hasTargetRollPitchYaw = createProperties && createProperties->Flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasTargetRollPitchYaw); bool hasScaleCurveID = createProperties && createProperties->ScaleCurveId != 0; bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0; bool hasFacingCurveID = createProperties && createProperties->FacingCurveId != 0; @@ -464,7 +463,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool hasAreaTriggerPolygon = createProperties && shape.IsPolygon(); bool hasAreaTriggerCylinder = shape.IsCylinder(); bool hasDisk = shape.IsDisk(); - bool hasBoundedPlane = shape.IsBoudedPlane(); + bool hasBoundedPlane = shape.IsBoundedPlane(); bool hasAreaTriggerSpline = areaTrigger->HasSplines(); bool hasOrbit = areaTrigger->HasOrbit(); bool hasMovementScript = false; @@ -533,15 +532,15 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (hasAreaTriggerPolygon) { - *data << int32(createProperties->PolygonVertices.size()); - *data << int32(createProperties->PolygonVerticesTarget.size()); + *data << int32(shape.PolygonVertices.size()); + *data << int32(shape.PolygonVerticesTarget.size()); *data << float(shape.PolygonDatas.Height); *data << float(shape.PolygonDatas.HeightTarget); - for (TaggedPosition<Position::XY> const& vertice : createProperties->PolygonVertices) + for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVertices) *data << vertice; - for (TaggedPosition<Position::XY> const& vertice : createProperties->PolygonVerticesTarget) + for (TaggedPosition<Position::XY> const& vertice : shape.PolygonVerticesTarget) *data << vertice; } |
