Skip to content

Commit b7e89f2

Browse files
author
Github Actions
committed
Merge 3.3.5 to 3.3.5-nemesis_anticheat
2 parents 6bb93b7 + c9ba09a commit b7e89f2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+726
-593
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
-- Update Knot Thimblejack spawn coordinates
2+
UPDATE `creature` SET `position_x`=581.0821533203125, `position_y`=523.2933349609375, `position_z`=-25.31939697265625, `orientation`=2.722713708877563476, `VerifiedBuild`=59207 WHERE `guid`=56804 AND `id`=14338;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--
2+
DELETE FROM `creature` WHERE `id`=16097;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
UPDATE `playercreateinfo_action` SET `action`=20154 WHERE `action`=21084;
2+
3+
DELETE FROM `spell_ranks` WHERE `first_spell_id`=20154;
4+
INSERT INTO `spell_ranks` (`first_spell_id`, `spell_id`, `rank`) VALUES
5+
(20154,20154,1),
6+
(20154,21084,2);
7+
8+
UPDATE `trainer_spell` SET `SpellId`=10321 WHERE `SpellId`=20271;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_pal_seal_of_righteousness';
2+
DELETE FROM `spell_script_names` WHERE `spell_id`=21084 AND `ScriptName`='spell_pal_seals';
3+
INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
4+
(-20154,'spell_pal_seal_of_righteousness'),
5+
(-20154,'spell_pal_seals');

src/common/Asio/DeadlineTimer.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,17 @@
1818
#ifndef DeadlineTimer_h__
1919
#define DeadlineTimer_h__
2020

21-
#include <boost/asio/deadline_timer.hpp>
21+
#include "Duration.h"
22+
#include <boost/asio/basic_waitable_timer.hpp>
23+
#include <boost/asio/io_context.hpp>
2224

23-
namespace Trinity
25+
namespace Trinity::Asio
2426
{
25-
namespace Asio
26-
{
27-
class DeadlineTimer : public boost::asio::basic_deadline_timer<boost::posix_time::ptime, boost::asio::time_traits<boost::posix_time::ptime>, boost::asio::io_context::executor_type>
28-
{
29-
public:
30-
using basic_deadline_timer::basic_deadline_timer;
31-
};
32-
}
27+
class DeadlineTimer : public boost::asio::basic_waitable_timer<std::chrono::steady_clock, boost::asio::wait_traits<std::chrono::steady_clock>, boost::asio::io_context::executor_type>
28+
{
29+
public:
30+
using basic_waitable_timer::basic_waitable_timer;
31+
};
3332
}
3433

3534
#endif // DeadlineTimer_h__

src/common/Metric/Metric.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ void Metric::ScheduleSend()
220220
{
221221
if (_enabled)
222222
{
223-
_batchTimer->expires_from_now(boost::posix_time::seconds(_updateInterval));
223+
_batchTimer->expires_after(std::chrono::seconds(_updateInterval));
224224
_batchTimer->async_wait(std::bind(&Metric::SendBatch, this));
225225
}
226226
else
@@ -250,7 +250,7 @@ void Metric::ScheduleOverallStatusLog()
250250
{
251251
if (_enabled)
252252
{
253-
_overallStatusTimer->expires_from_now(boost::posix_time::seconds(_overallStatusTimerInterval));
253+
_overallStatusTimer->expires_after(std::chrono::seconds(_overallStatusTimerInterval));
254254
_overallStatusTimer->async_wait([this](const boost::system::error_code&)
255255
{
256256
_overallStatusTimerTriggered = true;

src/server/authserver/Main.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,20 +229,20 @@ int main(int argc, char** argv)
229229
// Enabled a timed callback for handling the database keep alive ping
230230
int32 dbPingInterval = sConfigMgr->GetIntDefault("MaxPingTime", 30);
231231
std::shared_ptr<Trinity::Asio::DeadlineTimer> dbPingTimer = std::make_shared<Trinity::Asio::DeadlineTimer>(*ioContext);
232-
dbPingTimer->expires_from_now(boost::posix_time::minutes(dbPingInterval));
232+
dbPingTimer->expires_after(std::chrono::minutes(dbPingInterval));
233233
dbPingTimer->async_wait(std::bind(&KeepDatabaseAliveHandler, std::weak_ptr<Trinity::Asio::DeadlineTimer>(dbPingTimer), dbPingInterval, std::placeholders::_1));
234234

235235
int32 banExpiryCheckInterval = sConfigMgr->GetIntDefault("BanExpiryCheckInterval", 60);
236236
std::shared_ptr<Trinity::Asio::DeadlineTimer> banExpiryCheckTimer = std::make_shared<Trinity::Asio::DeadlineTimer>(*ioContext);
237-
banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(banExpiryCheckInterval));
237+
banExpiryCheckTimer->expires_after(std::chrono::seconds(banExpiryCheckInterval));
238238
banExpiryCheckTimer->async_wait(std::bind(&BanExpiryHandler, std::weak_ptr<Trinity::Asio::DeadlineTimer>(banExpiryCheckTimer), banExpiryCheckInterval, std::placeholders::_1));
239239

240240
#if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS
241241
std::shared_ptr<Trinity::Asio::DeadlineTimer> serviceStatusWatchTimer;
242242
if (m_ServiceStatus != -1)
243243
{
244244
serviceStatusWatchTimer = std::make_shared<Trinity::Asio::DeadlineTimer>(*ioContext);
245-
serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1));
245+
serviceStatusWatchTimer->expires_after(1s);
246246
serviceStatusWatchTimer->async_wait(std::bind(&ServiceStatusWatcher,
247247
std::weak_ptr<Trinity::Asio::DeadlineTimer>(serviceStatusWatchTimer),
248248
std::weak_ptr<Trinity::Asio::IoContext>(ioContext),
@@ -306,7 +306,7 @@ void KeepDatabaseAliveHandler(std::weak_ptr<Trinity::Asio::DeadlineTimer> dbPing
306306
TC_LOG_INFO("server.authserver", "Ping MySQL to keep connection alive");
307307
LoginDatabase.KeepAlive();
308308

309-
dbPingTimer->expires_from_now(boost::posix_time::minutes(dbPingInterval));
309+
dbPingTimer->expires_after(std::chrono::minutes(dbPingInterval));
310310
dbPingTimer->async_wait(std::bind(&KeepDatabaseAliveHandler, dbPingTimerRef, dbPingInterval, std::placeholders::_1));
311311
}
312312
}
@@ -321,7 +321,7 @@ void BanExpiryHandler(std::weak_ptr<Trinity::Asio::DeadlineTimer> banExpiryCheck
321321
LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_DEL_EXPIRED_IP_BANS));
322322
LoginDatabase.Execute(LoginDatabase.GetPreparedStatement(LOGIN_UPD_EXPIRED_ACCOUNT_BANS));
323323

324-
banExpiryCheckTimer->expires_from_now(boost::posix_time::seconds(banExpiryCheckInterval));
324+
banExpiryCheckTimer->expires_after(std::chrono::seconds(banExpiryCheckInterval));
325325
banExpiryCheckTimer->async_wait(std::bind(&BanExpiryHandler, banExpiryCheckTimerRef, banExpiryCheckInterval, std::placeholders::_1));
326326
}
327327
}
@@ -338,7 +338,7 @@ void ServiceStatusWatcher(std::weak_ptr<Trinity::Asio::DeadlineTimer> serviceSta
338338
ioContext->stop();
339339
else if (std::shared_ptr<Trinity::Asio::DeadlineTimer> serviceStatusWatchTimer = serviceStatusWatchTimerRef.lock())
340340
{
341-
serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1));
341+
serviceStatusWatchTimer->expires_after(1s);
342342
serviceStatusWatchTimer->async_wait(std::bind(&ServiceStatusWatcher, serviceStatusWatchTimerRef, ioContextRef, std::placeholders::_1));
343343
}
344344
}

src/server/game/Entities/Creature/Trainer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ namespace Trainer
105105

106106
player->ModifyMoney(-moneyCost);
107107

108-
npc->SendPlaySpellVisual(179);
109-
npc->SendPlaySpellImpact(player->GetGUID(), 362);
108+
npc->SendPlaySpellVisualKit(179, 0); // 53 SpellCastDirected
109+
player->SendPlaySpellVisualKit(362, 1); // 113 EmoteSalute
110110

111111
// learn explicitly or cast explicitly
112112
if (trainerSpell->IsCastable())

src/server/game/Entities/Player/Player.cpp

Lines changed: 21 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -499,9 +499,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
499499
SetPvpFlag(UNIT_BYTE2_FLAG_PVP);
500500
SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
501501
}
502+
502503
SetUnitFlag2(UNIT_FLAG2_REGENERATE_POWER);
503-
SetModCastingSpeed(1.0f); // fix cast time showed in spell tooltip on client
504-
SetHoverHeight(1.0f); // default for players in 3.0.3
505504

506505
SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1)); // -1 is default value
507506

@@ -512,37 +511,9 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
512511
SetFacialStyle(createInfo->FacialHair);
513512
SetRestState((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED);
514513
SetNativeGender(Gender(createInfo->Gender));
515-
SetArenaFaction(0);
516-
517-
SetUInt32Value(PLAYER_GUILDID, 0);
518-
SetGuildRank(0);
519-
SetUInt32Value(PLAYER_GUILD_TIMESTAMP, 0);
520-
521-
for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
522-
SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
523-
SetUInt32Value(PLAYER_CHOSEN_TITLE, 0);
524-
525-
SetUInt32Value(PLAYER_FIELD_KILLS, 0);
526-
SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0);
527-
SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0);
528-
SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
529514

530515
// set starting level
531-
uint32 start_level = GetClass() != CLASS_DEATH_KNIGHT
532-
? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
533-
: sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL);
534-
535-
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
536-
{
537-
uint32 gm_level = GetClass() != CLASS_DEATH_KNIGHT
538-
? sWorld->getIntConfig(CONFIG_START_GM_LEVEL)
539-
: std::max(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL));
540-
541-
if (gm_level > start_level)
542-
start_level = gm_level;
543-
}
544-
545-
SetLevel(start_level, false);
516+
SetLevel(GetStartLevel(createInfo->Class), false);
546517

547518
InitRunes();
548519

@@ -2026,12 +1997,12 @@ void Player::RegenerateAll()
20261997
// Food emote comes above drinking emote if we have to decide (mage regen food for example)
20271998
if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20281999
{
2029-
SendPlaySpellVisual(SPELL_VISUAL_KIT_FOOD);
2000+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_FOOD, 0);
20302001
break;
20312002
}
20322003
else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20332004
{
2034-
SendPlaySpellVisual(SPELL_VISUAL_KIT_DRINK);
2005+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_DRINK, 0);
20352006
break;
20362007
}
20372008
}
@@ -2687,7 +2658,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
26872658
{
26882659
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + i, 0);
26892660
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, 0);
2690-
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.00f);
2661+
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.0f);
26912662
}
26922663

26932664
//reset attack power, damage and attack speed fields
@@ -11306,7 +11277,6 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool
1130611277
// Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1130711278
if (type == INVTYPE_WEAPON && pProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)
1130811279
return EQUIP_ERR_WRONG_SLOT;
11309-
1131011280
else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1131111281
{
1131211282
if (!CanDualWield())
@@ -22231,6 +22201,19 @@ void Player::ReportedAfkBy(Player* reporter)
2223122201
reporter->SendDirectMessage(reportAfkResult.Write());
2223222202
}
2223322203

22204+
uint8 Player::GetStartLevel(uint8 playerClass) const
22205+
{
22206+
uint8 startLevel = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL);
22207+
22208+
if (playerClass == CLASS_DEATH_KNIGHT)
22209+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL), startLevel);
22210+
22211+
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
22212+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), startLevel);
22213+
22214+
return startLevel;
22215+
}
22216+
2223422217
WorldLocation Player::GetStartPosition() const
2223522218
{
2223622219
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(GetRace(), GetClass());
@@ -23082,31 +23065,10 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
2308223065
if (skillValue < ability->MinSkillLineRank && ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
2308323066
RemoveSpell(ability->Spell);
2308423067
// need learn
23068+
else if (!IsInWorld())
23069+
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
2308523070
else
23086-
{
23087-
// used to avoid double Seal of Righteousness on paladins, it's the only player spell which has both spell and forward spell in auto learn
23088-
if (ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && ability->SupercededBySpell)
23089-
{
23090-
bool skipCurrent = false;
23091-
auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(ability->SupercededBySpell);
23092-
for (auto itr = bounds.first; itr != bounds.second; ++itr)
23093-
{
23094-
if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skillValue >= itr->second->MinSkillLineRank)
23095-
{
23096-
skipCurrent = true;
23097-
break;
23098-
}
23099-
}
23100-
23101-
if (skipCurrent)
23102-
continue;
23103-
}
23104-
23105-
if (!IsInWorld())
23106-
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
23107-
else
23108-
LearnSpell(ability->Spell, true, ability->SkillLine);
23109-
}
23071+
LearnSpell(ability->Spell, true, ability->SkillLine);
2311023072
}
2311123073
}
2311223074

src/server/game/Entities/Player/Player.h

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -321,38 +321,38 @@ enum DrunkenState
321321

322322
enum PlayerFlags
323323
{
324-
PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
325-
PLAYER_FLAGS_AFK = 0x00000002,
326-
PLAYER_FLAGS_DND = 0x00000004,
327-
PLAYER_FLAGS_GM = 0x00000008,
328-
PLAYER_FLAGS_GHOST = 0x00000010,
329-
PLAYER_FLAGS_RESTING = 0x00000020,
330-
PLAYER_FLAGS_UNK6 = 0x00000040,
331-
PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
332-
PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
333-
PLAYER_FLAGS_IN_PVP = 0x00000200,
334-
PLAYER_FLAGS_HIDE_HELM = 0x00000400,
335-
PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
336-
PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time
337-
PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time
338-
PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000,
339-
PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something?
340-
PLAYER_FLAGS_UNK16 = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
341-
PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
342-
PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
343-
PLAYER_FLAGS_UBER = 0x00080000,
344-
PLAYER_FLAGS_UNK20 = 0x00100000,
345-
PLAYER_FLAGS_UNK21 = 0x00200000,
346-
PLAYER_FLAGS_COMMENTATOR2 = 0x00400000,
347-
PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_REQ_AMMO, SPELL_EFFECT_ATTACK, checked only for active player
348-
PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack
349-
PLAYER_FLAGS_NO_XP_GAIN = 0x02000000,
350-
PLAYER_FLAGS_UNK26 = 0x04000000,
351-
PLAYER_FLAGS_UNK27 = 0x08000000,
352-
PLAYER_FLAGS_UNK28 = 0x10000000,
353-
PLAYER_FLAGS_UNK29 = 0x20000000,
354-
PLAYER_FLAGS_UNK30 = 0x40000000,
355-
PLAYER_FLAGS_UNK31 = 0x80000000
324+
PLAYER_FLAGS_GROUP_LEADER = 0x00000001,
325+
PLAYER_FLAGS_AFK = 0x00000002,
326+
PLAYER_FLAGS_DND = 0x00000004,
327+
PLAYER_FLAGS_GM = 0x00000008,
328+
PLAYER_FLAGS_GHOST = 0x00000010,
329+
PLAYER_FLAGS_RESTING = 0x00000020,
330+
PLAYER_FLAGS_VOICE_CHAT = 0x00000040,
331+
PLAYER_FLAGS_UNK7 = 0x00000080, // pre-3.0.3 PLAYER_FLAGS_FFA_PVP flag for FFA PVP state
332+
PLAYER_FLAGS_CONTESTED_PVP = 0x00000100, // Player has been involved in a PvP combat and will be attacked by contested guards
333+
PLAYER_FLAGS_IN_PVP = 0x00000200,
334+
PLAYER_FLAGS_HIDE_HELM = 0x00000400,
335+
PLAYER_FLAGS_HIDE_CLOAK = 0x00000800,
336+
PLAYER_FLAGS_PLAYED_LONG_TIME = 0x00001000, // played long time
337+
PLAYER_FLAGS_PLAYED_TOO_LONG = 0x00002000, // played too long time
338+
PLAYER_FLAGS_IS_OUT_OF_BOUNDS = 0x00004000,
339+
PLAYER_FLAGS_DEVELOPER = 0x00008000, // <Dev> prefix for something?
340+
PLAYER_FLAGS_LOW_LEVEL_RAID_ENABLED = 0x00010000, // pre-3.0.3 PLAYER_FLAGS_SANCTUARY flag for player entered sanctuary
341+
PLAYER_FLAGS_TAXI_BENCHMARK = 0x00020000, // taxi benchmark mode (on/off) (2.0.1)
342+
PLAYER_FLAGS_PVP_TIMER = 0x00040000, // 3.0.2, pvp timer active (after you disable pvp manually)
343+
PLAYER_FLAGS_UBER = 0x00080000,
344+
PLAYER_FLAGS_UNK20 = 0x00100000,
345+
PLAYER_FLAGS_UNK21 = 0x00200000,
346+
PLAYER_FLAGS_COMMENTATOR2 = 0x00400000,
347+
PLAYER_ALLOW_ONLY_ABILITY = 0x00800000, // used by bladestorm and killing spree, allowed only spells with SPELL_ATTR0_REQ_AMMO, SPELL_EFFECT_ATTACK, checked only for active player
348+
PLAYER_FLAGS_UNK24 = 0x01000000, // disabled all melee ability on tab include autoattack
349+
PLAYER_FLAGS_NO_XP_GAIN = 0x02000000,
350+
PLAYER_FLAGS_UNK26 = 0x04000000,
351+
PLAYER_FLAGS_UNK27 = 0x08000000,
352+
PLAYER_FLAGS_UNK28 = 0x10000000,
353+
PLAYER_FLAGS_UNK29 = 0x20000000,
354+
PLAYER_FLAGS_UNK30 = 0x40000000,
355+
PLAYER_FLAGS_UNK31 = 0x80000000
356356
};
357357

358358
enum PlayerBytesOffsets
@@ -1675,6 +1675,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
16751675
float OCTRegenMPPerSpirit() const;
16761676
float GetRatingMultiplier(CombatRating cr) const;
16771677
float GetRatingBonusValue(CombatRating cr) const;
1678+
1679+
/// Returns base spellpower bonus from spellpower stat on items
16781680
uint32 GetBaseSpellPowerBonus() const { return m_baseSpellPower; }
16791681
int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; }
16801682

@@ -2067,6 +2069,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
20672069
float m_homebindY;
20682070
float m_homebindZ;
20692071

2072+
uint8 GetStartLevel(uint8 playerClass) const;
20702073
WorldLocation GetStartPosition() const;
20712074

20722075
// currently visible objects at player client

0 commit comments

Comments
 (0)