diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 31 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Entities/Player/RestMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/RestMgr.h | 13 | ||||
-rw-r--r-- | src/server/game/Handlers/MiscHandler.cpp | 7 |
6 files changed, 68 insertions, 13 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 2181840580e..868ad6fbbc1 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -33,6 +33,7 @@ #include "ObjectMgr.h" #include "PhasingHandler.h" #include "Player.h" +#include "RestMgr.h" #include "ScriptMgr.h" #include "SpellInfo.h" #include "SpellMgr.h" @@ -887,6 +888,9 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumUnitsInside), _insideUnits.size()); SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::NumPlayersInside), std::ranges::count_if(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); })); + + if (IsStaticSpawn()) + setActive(!_insideUnits.empty()); } uint32 AreaTrigger::GetScriptId() const @@ -1050,6 +1054,13 @@ void AreaTrigger::DoActions(Unit* unit) } 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; } @@ -1061,9 +1072,25 @@ void AreaTrigger::DoActions(Unit* unit) void AreaTrigger::UndoActions(Unit* unit) { if (GetTemplate()) + { for (AreaTriggerAction const& action : GetTemplate()->Actions) - if (action.ActionType == AREATRIGGER_ACTION_CAST || action.ActionType == AREATRIGGER_ACTION_ADDAURA) - unit->RemoveAurasDueToSpell(action.Param, GetCasterGuid()); + { + switch (action.ActionType) + { + 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; + } + } + } } void AreaTrigger::InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed) diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index a5846beb78c..5dba3e6b499 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -42,7 +42,8 @@ enum AreaTriggerActionTypes AREATRIGGER_ACTION_CAST = 0, AREATRIGGER_ACTION_ADDAURA = 1, AREATRIGGER_ACTION_TELEPORT = 2, - AREATRIGGER_ACTION_MAX = 3 + AREATRIGGER_ACTION_TAVERN = 3, + AREATRIGGER_ACTION_MAX = 4 }; enum AreaTriggerActionUserTypes diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f48bb73995e..fd8408873b7 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6432,12 +6432,27 @@ void Player::UpdateIndoorsOutdoorsAuras() void Player::UpdateTavernRestingState() { - AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(_restMgr->GetInnTriggerID()); + Optional<InnAreaTrigger> innTrigger = _restMgr->GetInnTrigger(); + if (!innTrigger) + { + if (_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN)) + _restMgr->RemoveRestFlag(REST_FLAG_IN_TAVERN); - if (_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN) && (!atEntry || !IsInAreaTrigger(atEntry))) - _restMgr->RemoveRestFlag(REST_FLAG_IN_TAVERN); - else if (!_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN) && IsInAreaTrigger(atEntry)) - _restMgr->SetRestFlag(REST_FLAG_IN_TAVERN); + return; + } + + if (innTrigger->IsDBC) + { + AreaTriggerEntry const* atEntry = sAreaTriggerStore.LookupEntry(innTrigger->AreaTriggerEntryId); + + if (_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN) && (!atEntry || !IsInAreaTrigger(atEntry))) + { + _restMgr->RemoveRestFlag(REST_FLAG_IN_TAVERN); + _restMgr->SetInnTrigger(std::nullopt); + } + else if (!_restMgr->HasRestFlag(REST_FLAG_IN_TAVERN) && IsInAreaTrigger(atEntry)) + _restMgr->SetRestFlag(REST_FLAG_IN_TAVERN); + } } Team Player::TeamForRace(uint8 race) diff --git a/src/server/game/Entities/Player/RestMgr.cpp b/src/server/game/Entities/Player/RestMgr.cpp index ef978b5056f..6fae5b98f29 100644 --- a/src/server/game/Entities/Player/RestMgr.cpp +++ b/src/server/game/Entities/Player/RestMgr.cpp @@ -23,7 +23,7 @@ #include "World.h" #include "WorldSession.h" -RestMgr::RestMgr(Player* player) : _player(player), _restTime(0), _innAreaTriggerId(0), _restFlagMask(0) +RestMgr::RestMgr(Player* player) : _player(player), _restTime(0), _restFlagMask(0) { for (uint8 i = REST_TYPE_XP; i < REST_TYPE_MAX; i++) _restBonus[i] = 0; diff --git a/src/server/game/Entities/Player/RestMgr.h b/src/server/game/Entities/Player/RestMgr.h index becde78ec24..b3d991a1677 100644 --- a/src/server/game/Entities/Player/RestMgr.h +++ b/src/server/game/Entities/Player/RestMgr.h @@ -19,6 +19,7 @@ #define RestMgr_h__ #include "Define.h" +#include "Optional.h" #include <ctime> class Player; @@ -55,6 +56,12 @@ enum RestFlag : uint32 REST_FLAG_IN_FACTION_AREA = 0x4 // used with AREA_FLAG_REST_ZONE_* }; +struct InnAreaTrigger +{ + bool IsDBC = true; + uint32 AreaTriggerEntryId = 0; +}; + class TC_GAME_API RestMgr { friend class Player; @@ -72,8 +79,8 @@ public: void RemoveRestFlag(RestFlag restFlag); uint32 GetRestBonusFor(RestTypes restType, uint32 xp); - uint32 GetInnTriggerID() const { return _innAreaTriggerId; } - void SetInnTriggerID(uint32 id) { _innAreaTriggerId = id; } + Optional<InnAreaTrigger> GetInnTrigger() const { return _innAreaTrigger; } + void SetInnTrigger(Optional<InnAreaTrigger> trigger) { _innAreaTrigger = trigger; } void Update(time_t now); @@ -85,7 +92,7 @@ protected: private: Player* _player; time_t _restTime; - uint32 _innAreaTriggerId; + Optional<InnAreaTrigger> _innAreaTrigger; float _restBonus[REST_TYPE_MAX]; uint32 _restFlagMask; }; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index facda1a71c2..c60ba89ab6a 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -567,9 +567,14 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPackets::AreaTrigger::AreaTrigge { // set resting flag we are in the inn if (packet.Entered) - player->GetRestMgr().SetInnTriggerID(atEntry->ID); + { + player->GetRestMgr().SetInnTrigger(InnAreaTrigger{ .IsDBC = true, .AreaTriggerEntryId = atEntry->ID }); + } else + { player->GetRestMgr().RemoveRestFlag(REST_FLAG_IN_TAVERN); + player->GetRestMgr().SetInnTrigger(std::nullopt); + } if (sWorld->IsFFAPvPRealm()) { |