Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2025-05-09 22:07:43 +08:00
210 changed files with 1309 additions and 977 deletions

View File

@@ -18,6 +18,7 @@
#include "Player.h"
#include "AccountMgr.h"
#include "AchievementMgr.h"
#include "AreaDefines.h"
#include "ArenaSpectator.h"
#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
@@ -1485,7 +1486,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati
}
else
{
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && GetMapId() == 609 && !IsGameMaster() && !HasSpell(50977))
if (IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TELEPORT) && GetMapId() == MAP_EBON_HOLD && !IsGameMaster() && !HasSpell(50977))
{
SendTransferAborted(mapid, TRANSFER_ABORT_UNIQUE_MESSAGE, 1);
return false;
@@ -1730,7 +1731,7 @@ void Player::RemoveFromWorld()
m_session->DoLootRelease(lguid);
sOutdoorPvPMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
sWorldState->HandlePlayerLeaveZone(this, static_cast<WorldStateZoneId>(m_zoneUpdateId));
sWorldState->HandlePlayerLeaveZone(this, static_cast<AreaTableIDs>(m_zoneUpdateId));
}
// Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
@@ -1882,9 +1883,9 @@ void Player::Regenerate(Powers power)
ManaIncreaseRate = sWorld->getRate(RATE_POWER_MANA) * (2.066f - (GetLevel() * 0.066f));
if (recentCast) // Trinity Updates Mana in intervals of 2s, which is correct
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA)) * ManaIncreaseRate * 0.001f * m_regenTimer;
else
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER) * ManaIncreaseRate * 0.001f * m_regenTimer;
addvalue += GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + AsUnderlyingType(POWER_MANA)) * ManaIncreaseRate * 0.001f * m_regenTimer;
}
break;
case POWER_RAGE: // Regenerate rage
@@ -1897,7 +1898,14 @@ void Player::Regenerate(Powers power)
}
break;
case POWER_ENERGY: // Regenerate energy (rogue)
addvalue += 0.01f * m_regenTimer * sWorld->getRate(RATE_POWER_ENERGY);
// Regen per second
addvalue += (GetFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER + AsUnderlyingType(POWER_ENERGY)) + 10.f);
// Regen per millisecond
addvalue *= 0.001f;
// Milliseconds passed
addvalue *= m_regenTimer;
// Rate
addvalue *= sWorld->getRate(RATE_POWER_ENERGY);
break;
case POWER_RUNIC_POWER:
{
@@ -1918,8 +1926,8 @@ void Player::Regenerate(Powers power)
break;
}
// Mana regen calculated in Player::UpdateManaRegen()
if (power != POWER_MANA)
// Mana regen calculated in Player::UpdateManaRegen(), energy regen calculated in Player::UpdateEnergyRegen()
if (power != POWER_MANA && power != POWER_ENERGY)
{
AuraEffectList const& ModPowerRegenPCTAuras = GetAuraEffectsByType(SPELL_AURA_MOD_POWER_REGEN_PERCENT);
for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
@@ -1947,7 +1955,6 @@ void Player::Regenerate(Powers power)
addvalue += m_powerFraction[power];
uint32 integerValue = uint32(std::fabs(addvalue));
bool forcedUpdate = false;
if (addvalue < 0.0f)
{
if (curValue > integerValue)
@@ -1959,7 +1966,6 @@ void Player::Regenerate(Powers power)
{
curValue = 0;
m_powerFraction[power] = 0;
forcedUpdate = true;
}
}
else
@@ -1970,22 +1976,15 @@ void Player::Regenerate(Powers power)
{
curValue = maxValue;
m_powerFraction[power] = 0;
forcedUpdate = true;
}
else
{
m_powerFraction[power] = addvalue - integerValue;
}
}
if (m_regenTimerCount >= 2000 || forcedUpdate)
{
if (m_regenTimerCount >= 2000 || curValue == 0 || curValue == maxValue)
SetPower(power, curValue, true, true);
}
else
{
UpdateUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power, curValue);
}
UpdateUInt32Value(UNIT_FIELD_POWER1 + AsUnderlyingType(power), curValue);
}
void Player::RegenerateHealth()
@@ -2404,7 +2403,7 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward)
// Favored experience increase START
uint32 zone = GetZoneId();
float favored_exp_mult = 0;
if ((zone == 3483 || zone == 3562 || zone == 3836 || zone == 3713 || zone == 3714) && HasAnyAuras(32096 /*Thrallmar's Favor*/, 32098 /*Honor Hold's Favor*/))
if ((zone == AREA_HELLFIRE_PENINSULA || zone == AREA_HELLFIRE_RAMPARTS || zone == AREA_MAGTHERIDONS_LAIR || zone == AREA_THE_BLOOD_FURNACE || zone == AREA_THE_SHATTERED_HALLS) && HasAnyAuras(32096 /*Thrallmar's Favor*/, 32098 /*Honor Hold's Favor*/))
favored_exp_mult = 0.05f; // Thrallmar's Favor and Honor Hold's Favor
xp = uint32(xp * (1 + favored_exp_mult));
@@ -8249,7 +8248,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
// 8 Arena season id
packet.Worldstates.emplace_back(WORLD_STATE_ARENA_SEASON_ID, sArenaSeasonMgr->GetCurrentSeason());
if (mapId == 530) // Outland
if (mapId == MAP_OUTLAND)
{
packet.Worldstates.reserve(3);
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_UI_TOWER_SLIDER_DISPLAY, 0);
@@ -8266,18 +8265,18 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
// insert <field> <value>
switch (zoneId)
{
case 1: // Dun Morogh
case 11: // Wetlands
case 12: // Elwynn Forest
case 38: // Loch Modan
case 40: // Westfall
case 51: // Searing Gorge
case 1519: // Stormwind City
case 1537: // Ironforge
case 2257: // Deeprun Tram
case 3703: // Shattrath City
case AREA_DUN_MOROGH:
case AREA_WETLANDS:
case AREA_ELWYNN_FOREST:
case AREA_LOCH_MODAN:
case AREA_WESTFALL:
case AREA_SEARING_GORGE:
case AREA_STORMWIND_CITY:
case AREA_IRONFORGE:
case AREA_DEEPRUN_TRAM:
case AREA_SHATTRATH_CITY:
break;
case 139: // Eastern Plaguelands
case AREA_EASTERN_PLAGUELANDS:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_EP)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8318,7 +8317,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_EP_PLAGUEWOODTOWER_H, 0);
break;
case 1377: // Silithus
case AREA_SILITHUS:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_SI)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8335,7 +8334,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_SW, 0);
packet.Worldstates.emplace_back(WORLD_STATE_AHNQIRAJ_SANDWORM_E, 0);
break;
case 2597: // Alterac Valley
case AREA_ALTERAC_VALLEY:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AV)
battleground->FillInitialWorldStates(packet);
else
@@ -8418,7 +8417,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AV_AID_A_C, 1);
}
break;
case 3277: // Warsong Gulch
case AREA_WARSONG_GULCH:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_WS)
battleground->FillInitialWorldStates(packet);
else
@@ -8434,7 +8433,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_WS_FLAG_STATE_ALLIANCE, 1);
}
break;
case 3358: // Arathi Basin
case AREA_ARATHI_BASIN:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_AB)
battleground->FillInitialWorldStates(packet);
else
@@ -8474,7 +8473,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_AB_RESOURCES_WARNING, 1400); // warning limit (1400)
}
break;
case 3820: // Eye of the Storm
case AREA_EYE_OF_THE_STORM:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_EY)
battleground->FillInitialWorldStates(packet);
else
@@ -8517,7 +8516,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
break;
// any of these needs change! the client remembers the prev setting!
// ON EVERY ZONE LEAVE, RESET THE OLD ZONE'S WORLD STATE, BUT AT LEAST THE UI STUFF!
case 3483: // Hellfire Peninsula
case AREA_HELLFIRE_PENINSULA:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_HP)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8541,7 +8540,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_HP_STADIUM_H, 1);
}
break;
case 3518: // Nagrand
case AREA_NAGRAND:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_NA)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8577,7 +8576,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_NA_MAP_HALAA_ALLIANCE, 0);
}
break;
case 3519: // Terokkar Forest
case AREA_TEROKKAR_FOREST:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_TF)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8613,7 +8612,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_TF_UI_LOCKED_DISPLAY_ALLIANCE, 1);
}
break;
case 3521: // Zangarmarsh
case AREA_ZANGARMARSH:
if (outdoorPvP && outdoorPvP->GetTypeId() == OUTDOOR_PVP_ZM)
outdoorPvP->FillInitialWorldStates(packet);
else
@@ -8647,7 +8646,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OPVP_ZM_MAP_ALLIANCE_FLAG_READY, 0);
}
break;
case 3698: // Nagrand Arena
case AREA_NAGRAND_ARENA:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_NA)
battleground->FillInitialWorldStates(packet);
else
@@ -8658,7 +8657,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_NA_ARENA_SHOW, 0);
}
break;
case 3702: // Blade's Edge Arena
case AREA_BLADES_EDGE_ARENA:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_BE)
battleground->FillInitialWorldStates(packet);
else
@@ -8669,7 +8668,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_BE_ARENA_SHOW, 0);
}
break;
case 3968: // Ruins of Lordaeron
case AREA_RUINS_OF_LORDAERON:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RL)
battleground->FillInitialWorldStates(packet);
else
@@ -8680,7 +8679,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_RL_ARENA_SHOW, 0);
}
break;
case 4378: // Dalaran Sewers
case AREA_DALARAN_ARENA:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_DS)
battleground->FillInitialWorldStates(packet);
else
@@ -8691,7 +8690,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_DS_ARENA_SHOW, 0);
}
break;
case 4384: // Strand of the Ancients
case AREA_STRAND_OF_THE_ANCIENTS:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_SA)
battleground->FillInitialWorldStates(packet);
else
@@ -8727,7 +8726,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
// missing unknowns
}
break;
case 4406: // Ring of Valor
case ARENA_THE_RING_OF_VALOR:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_RV)
battleground->FillInitialWorldStates(packet);
else
@@ -8738,7 +8737,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_RV_ARENA_SHOW, 0);
}
break;
case 4710: // Isle of Conquest
case AREA_ISLE_OF_CONQUEST:
if (battleground && battleground->GetBgTypeID(true) == BATTLEGROUND_IC)
battleground->FillInitialWorldStates(packet);
else
@@ -8764,7 +8763,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_BATTLEGROUND_IC_HORDE_KEEP_CONTROLLED_H, 1);
}
break;
case 4987: // The Ruby Sanctum
case AREA_THE_RUBY_SANCTUM:
if (instance)
instance->FillInitialWorldStates(packet);
else
@@ -8775,8 +8774,8 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_RUBY_SANCTUM_CORPOREALITY_TOGGLE, 0);
}
break;
case 4812: // Icecrown Citadel
if (instance && mapId == 631)
case AREA_ICECROWN_CITADEL:
if (instance && mapId == MAP_ICECROWN_CITADEL)
instance->FillInitialWorldStates(packet);
else
{
@@ -8788,8 +8787,8 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_ICECROWN_CITADEL_ATTEMPTS_MAX, 50);
}
break;
case 4100: // The Culling of Stratholme
if (instance && mapId == 595)
case AREA_THE_CULLING_OF_STRATHOLME:
if (instance && mapId == MAP_THE_CULLING_OF_STRATHOLME)
instance->FillInitialWorldStates(packet);
else
{
@@ -8801,8 +8800,8 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_CULLING_OF_STRATHOLME_TIME_GUARDIAN_SHOW, 0);
}
break;
case 4228: // The Oculus
if (instance && mapId == 578)
case AREA_THE_OCULUS:
if (instance && mapId == MAP_THE_OCULUS)
instance->FillInitialWorldStates(packet);
else
{
@@ -8811,8 +8810,8 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_OCULUS_CENTRIFUGE_CONSTRUCT_AMOUNT, 0);
}
break;
case 4273: // Ulduar
if (instance && mapId == 603)
case AREA_ULDUAR:
if (instance && mapId == MAP_ULDUAR)
instance->FillInitialWorldStates(packet);
else
{
@@ -8821,7 +8820,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_ULDUAR_ALGALON_DESPAWN_TIMER, 0);
}
break;
case 4415: // Violet Hold
case AREA_THE_VIOLET_HOLD:
if (instance)
instance->FillInitialWorldStates(packet);
else
@@ -8832,8 +8831,8 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_VIOLET_HOLD_WAVE_COUNT, 0);
}
break;
case 4820: // Halls of Refection
if (instance && mapId == 668)
case AREA_HALLS_OF_REFLECTION:
if (instance && mapId == MAP_HALLS_OF_REFLECTION)
instance->FillInitialWorldStates(packet);
else
{
@@ -8842,7 +8841,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
packet.Worldstates.emplace_back(WORLD_STATE_HALLS_OF_REFLECTION_WAVE_COUNT, 0);
}
break;
case 4298: // Scarlet Enclave (DK starting zone)
case AREA_PLAGUELANDS_THE_SCARLET_ENCLAVE: // (DK starting zone)
// Get Mograine, GUID and ENTRY should NEVER change
if (Creature* mograine = ObjectAccessor::GetCreature(*this, ObjectGuid::Create<HighGuid::Unit>(29173, 130956)))
{
@@ -8858,7 +8857,7 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
}
}
break;
case 4197: // Wintergrasp
case AREA_WINTERGRASP:
if (battlefield && battlefield->GetTypeId() == BATTLEFIELD_WG)
{
battlefield->FillInitialWorldStates(packet);
@@ -13607,7 +13606,7 @@ uint32 Player::CalculateTalentsPoints() const
uint32 base_talent = GetLevel() < 10 ? 0 : GetLevel() - 9;
uint32 talentPointsForLevel = 0;
if (!IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TALENT_POINT_CALC) || GetMapId() != 609)
if (!IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_TALENT_POINT_CALC) || GetMapId() != MAP_EBON_HOLD)
{
talentPointsForLevel = base_talent;
}
@@ -13636,7 +13635,7 @@ bool Player::canFlyInZone(uint32 mapid, uint32 zone, SpellInfo const* bySpell)
// continent checked in SpellInfo::CheckLocation at cast and area update
uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
if (v_map == 571 && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
if (v_map == MAP_NORTHREND && !bySpell->HasAttribute(SPELL_ATTR7_IGNORES_COLD_WEATHER_FLYING_REQUIREMENT))
{
if (!HasSpell(54197)) // 54197 = Cold Weather Flying
{