Skip to content

Commit 26dd506

Browse files
author
Github Actions
committed
Merge 3.3.5 to 3.3.5-base_patch
2 parents 65f4517 + c9ba09a commit 26dd506

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
@@ -509,9 +509,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
509509
SetPvpFlag(UNIT_BYTE2_FLAG_PVP);
510510
SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
511511
}
512+
512513
SetUnitFlag2(UNIT_FLAG2_REGENERATE_POWER);
513-
SetModCastingSpeed(1.0f); // fix cast time showed in spell tooltip on client
514-
SetHoverHeight(1.0f); // default for players in 3.0.3
515514

516515
SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1)); // -1 is default value
517516

@@ -522,37 +521,9 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
522521
SetFacialStyle(createInfo->FacialHair);
523522
SetRestState((GetSession()->IsARecruiter() || GetSession()->GetRecruiterId() != 0) ? REST_STATE_RAF_LINKED : REST_STATE_NOT_RAF_LINKED);
524523
SetNativeGender(Gender(createInfo->Gender));
525-
SetArenaFaction(0);
526-
527-
SetUInt32Value(PLAYER_GUILDID, 0);
528-
SetGuildRank(0);
529-
SetUInt32Value(PLAYER_GUILD_TIMESTAMP, 0);
530-
531-
for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
532-
SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES + i, 0); // 0=disabled
533-
SetUInt32Value(PLAYER_CHOSEN_TITLE, 0);
534-
535-
SetUInt32Value(PLAYER_FIELD_KILLS, 0);
536-
SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0);
537-
SetUInt32Value(PLAYER_FIELD_TODAY_CONTRIBUTION, 0);
538-
SetUInt32Value(PLAYER_FIELD_YESTERDAY_CONTRIBUTION, 0);
539524

540525
// set starting level
541-
uint32 start_level = GetClass() != CLASS_DEATH_KNIGHT
542-
? sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL)
543-
: sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL);
544-
545-
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
546-
{
547-
uint32 gm_level = GetClass() != CLASS_DEATH_KNIGHT
548-
? sWorld->getIntConfig(CONFIG_START_GM_LEVEL)
549-
: std::max(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL));
550-
551-
if (gm_level > start_level)
552-
start_level = gm_level;
553-
}
554-
555-
SetLevel(start_level, false);
526+
SetLevel(GetStartLevel(createInfo->Class), false);
556527

557528
InitRunes();
558529

@@ -2028,12 +1999,12 @@ void Player::RegenerateAll()
20281999
// Food emote comes above drinking emote if we have to decide (mage regen food for example)
20292000
if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20302001
{
2031-
SendPlaySpellVisual(SPELL_VISUAL_KIT_FOOD);
2002+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_FOOD, 0);
20322003
break;
20332004
}
20342005
else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20352006
{
2036-
SendPlaySpellVisual(SPELL_VISUAL_KIT_DRINK);
2007+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_DRINK, 0);
20372008
break;
20382009
}
20392010
}
@@ -2689,7 +2660,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
26892660
{
26902661
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + i, 0);
26912662
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, 0);
2692-
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.00f);
2663+
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.0f);
26932664
}
26942665

26952666
//reset attack power, damage and attack speed fields
@@ -11308,7 +11279,6 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool
1130811279
// Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1130911280
if (type == INVTYPE_WEAPON && pProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)
1131011281
return EQUIP_ERR_WRONG_SLOT;
11311-
1131211282
else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1131311283
{
1131411284
if (!CanDualWield())
@@ -22233,6 +22203,19 @@ void Player::ReportedAfkBy(Player* reporter)
2223322203
reporter->SendDirectMessage(reportAfkResult.Write());
2223422204
}
2223522205

22206+
uint8 Player::GetStartLevel(uint8 playerClass) const
22207+
{
22208+
uint8 startLevel = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL);
22209+
22210+
if (playerClass == CLASS_DEATH_KNIGHT)
22211+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL), startLevel);
22212+
22213+
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
22214+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), startLevel);
22215+
22216+
return startLevel;
22217+
}
22218+
2223622219
WorldLocation Player::GetStartPosition() const
2223722220
{
2223822221
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(GetRace(), GetClass());
@@ -23084,31 +23067,10 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
2308423067
if (skillValue < ability->MinSkillLineRank && ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
2308523068
RemoveSpell(ability->Spell);
2308623069
// need learn
23070+
else if (!IsInWorld())
23071+
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
2308723072
else
23088-
{
23089-
// 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
23090-
if (ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && ability->SupercededBySpell)
23091-
{
23092-
bool skipCurrent = false;
23093-
auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(ability->SupercededBySpell);
23094-
for (auto itr = bounds.first; itr != bounds.second; ++itr)
23095-
{
23096-
if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skillValue >= itr->second->MinSkillLineRank)
23097-
{
23098-
skipCurrent = true;
23099-
break;
23100-
}
23101-
}
23102-
23103-
if (skipCurrent)
23104-
continue;
23105-
}
23106-
23107-
if (!IsInWorld())
23108-
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
23109-
else
23110-
LearnSpell(ability->Spell, true, ability->SkillLine);
23111-
}
23073+
LearnSpell(ability->Spell, true, ability->SkillLine);
2311223074
}
2311323075
}
2311423076

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

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

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

356356
enum PlayerBytesOffsets
@@ -1673,6 +1673,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
16731673
float OCTRegenMPPerSpirit() const;
16741674
float GetRatingMultiplier(CombatRating cr) const;
16751675
float GetRatingBonusValue(CombatRating cr) const;
1676+
1677+
/// Returns base spellpower bonus from spellpower stat on items
16761678
uint32 GetBaseSpellPowerBonus() const { return m_baseSpellPower; }
16771679
int32 GetSpellPenetrationItemMod() const { return m_spellPenetrationItemMod; }
16781680

@@ -2065,6 +2067,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
20652067
float m_homebindY;
20662068
float m_homebindZ;
20672069

2070+
uint8 GetStartLevel(uint8 playerClass) const;
20682071
WorldLocation GetStartPosition() const;
20692072

20702073
// currently visible objects at player client

0 commit comments

Comments
 (0)