Core/AreaTriggers: Add AREATRIGGER_ACTION_TAVERN (#31035)

This commit is contained in:
Jason Dove
2025-06-15 08:54:43 -05:00
committed by GitHub
parent 9090a940bf
commit 8e6c7bdc5d
7 changed files with 87 additions and 13 deletions

View File

@@ -0,0 +1,19 @@
SET @ATID := 137;
SET @ATCREATEID := 132;
SET @ATSPAWNID := 231;
DELETE FROM `areatrigger_template` WHERE `Id` BETWEEN @ATID+0 AND @ATID+26;
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES
(@ATID+0, 1, 1, 0, 0x0, 0);
DELETE FROM `areatrigger_create_properties` WHERE `Id` BETWEEN @ATCREATEID+0 AND @ATCREATEID+26;
INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
(@ATCREATEID+0, 1, @ATID+0, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 4, 15, 15, 25, 25, 0, 0, 0, 0, '', 0);
DELETE FROM `areatrigger` WHERE `SpawnId` BETWEEN @ATSPAWNID+0 AND @ATSPAWNID+26;
INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `Comment`) VALUES
(@ATSPAWNID+0, @ATCREATEID+0, 1, 1220, '0', -62.13, 7000.73, 19.81, 4.45, 0, 'Illidari Stand - Tavern');
DELETE FROM `areatrigger_template_actions` WHERE `AreaTriggerId` BETWEEN @ATID+0 AND @ATID+26;
INSERT INTO `areatrigger_template_actions` (`AreaTriggerId`, `IsCustom`, `ActionType`, `ActionParam`, `TargetType`) VALUES
(@ATID+0, 1, 3, 0, 5);

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;
};

View File

@@ -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())
{