diff --git a/data/sql/updates/pending_db_world/rev_1666450482825467900.sql b/data/sql/updates/pending_db_world/rev_1666450482825467900.sql new file mode 100644 index 000000000..a1cf8c928 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1666450482825467900.sql @@ -0,0 +1,126 @@ +-- +ALTER TABLE `areatrigger_tavern` ADD COLUMN `faction` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `name`; + +SET @FACTION_ALLIANCE := 2; +SET @FACTION_HORDE := 4; +SET @FACTION_BOTH := 6; + +UPDATE `areatrigger_tavern` SET `faction` = @FACTION_ALLIANCE WHERE `id` IN ( +71, +562, +682, +707, +708, +709, +710, +712, +713, +715, +716, +717, +1024, +1042, +2266, +2786, +4090, +4240, +4241, +4337, +4374, +4376, +4377, +4381, +4383, +4499, +4961, +4964, +4965, +4966, +4993, +4528, +4558, +4753, +4756, +4769, +4867, +5182); + +UPDATE `areatrigger_tavern` SET `faction` = @FACTION_HORDE WHERE `id` IN ( +178, +719, +720, +721, +722, +742, +843, +844, +862, +982, +1022, +1025, +1606, +1646, +2267, +2286, +2610, +3547, +3690, +3886, +4108, +4109, +4265, +4336, +4373, +4375, +4378, +4380, +4486, +4494, +4526, +5323, +5360, +4967, +4970, +4979, +4868, +4910, +5045, +4861, +4775, +4755, +4595); + +UPDATE `areatrigger_tavern` SET `faction` = @FACTION_BOTH WHERE `id` IN ( +98, +743, +1023, +2287, +3985, +4058, +4300, +4382, +4498, +4521, +4555, +4577, +5183, +5200, +5204, +5217, +5227, +5314, +5315, +5316, +5317, +5327, +5062, +5164, +5030, +4975, +4976, +4977, +4607, +4608, +4640, +4714, +4847); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 20fab220f..13aa9f489 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -6320,7 +6320,7 @@ void ObjectMgr::LoadTavernAreaTriggers() _tavernAreaTriggerStore.clear(); // need for reload case - QueryResult result = WorldDatabase.Query("SELECT id FROM areatrigger_tavern"); + QueryResult result = WorldDatabase.Query("SELECT id, faction FROM areatrigger_tavern"); if (!result) { @@ -6346,7 +6346,9 @@ void ObjectMgr::LoadTavernAreaTriggers() continue; } - _tavernAreaTriggerStore.insert(Trigger_ID); + uint32 faction = fields[1].Get(); + + _tavernAreaTriggerStore.emplace(Trigger_ID, faction); } while (result->NextRow()); LOG_INFO("server.loading", ">> Loaded {} Tavern Triggers in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 88e82db54..72e8488a0 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -840,9 +840,15 @@ public: return 0; } - [[nodiscard]] bool IsTavernAreaTrigger(uint32 Trigger_ID) const + [[nodiscard]] bool IsTavernAreaTrigger(uint32 triggerID, uint32 faction) const { - return _tavernAreaTriggerStore.find(Trigger_ID) != _tavernAreaTriggerStore.end(); + auto itr = _tavernAreaTriggerStore.find(triggerID); + if (itr != _tavernAreaTriggerStore.end()) + { + return (itr->second & faction) != 0; + } + + return false; } [[nodiscard]] GossipText const* GetGossipText(uint32 Text_ID) const; @@ -1448,7 +1454,7 @@ private: typedef std::unordered_map GossipTextContainer; typedef std::unordered_map QuestAreaTriggerContainer; - typedef std::set TavernAreaTriggerContainer; + typedef std::unordered_map TavernAreaTriggerContainer; QuestAreaTriggerContainer _questAreaTriggerStore; TavernAreaTriggerContainer _tavernAreaTriggerStore; diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 35d9dc542..33d6a5b85 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -747,7 +747,8 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) return; } - bool isTavernAreatrigger = sObjectMgr->IsTavernAreaTrigger(triggerId); + uint32 teamFaction = player->GetTeamId(true) == TEAM_ALLIANCE ? FACTION_MASK_ALLIANCE : FACTION_MASK_HORDE; + bool isTavernAreatrigger = sObjectMgr->IsTavernAreaTrigger(triggerId, teamFaction); if (!player->IsInAreaTriggerRadius(atEntry, isTavernAreatrigger ? 5.f : 0.f)) { LOG_DEBUG("network", "HandleAreaTriggerOpcode: Player {} ({}) too far (trigger map: {} player map: {}), ignore Area Trigger ID: {}",