Skip to content

Commit 8fdbe73

Browse files
author
Github Actions
committed
Merge 3.3.5 to 3.3.5-solocraft
2 parents 34d7c34 + c9ba09a commit 8fdbe73

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
@@ -497,9 +497,8 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
497497
SetPvpFlag(UNIT_BYTE2_FLAG_PVP);
498498
SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
499499
}
500+
500501
SetUnitFlag2(UNIT_FLAG2_REGENERATE_POWER);
501-
SetModCastingSpeed(1.0f); // fix cast time showed in spell tooltip on client
502-
SetHoverHeight(1.0f); // default for players in 3.0.3
503502

504503
SetInt32Value(PLAYER_FIELD_WATCHED_FACTION_INDEX, uint32(-1)); // -1 is default value
505504

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

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

545516
InitRunes();
546517

@@ -2016,12 +1987,12 @@ void Player::RegenerateAll()
20161987
// Food emote comes above drinking emote if we have to decide (mage regen food for example)
20171988
if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20181989
{
2019-
SendPlaySpellVisual(SPELL_VISUAL_KIT_FOOD);
1990+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_FOOD, 0);
20201991
break;
20211992
}
20221993
else if ((*itr)->GetBase()->HasEffectType(SPELL_AURA_MOD_POWER_REGEN) && (*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_NOT_SEATED)
20231994
{
2024-
SendPlaySpellVisual(SPELL_VISUAL_KIT_DRINK);
1995+
SendPlaySpellVisualKit(SPELL_VISUAL_KIT_DRINK, 0);
20251996
break;
20261997
}
20271998
}
@@ -2677,7 +2648,7 @@ void Player::InitStatsForLevel(bool reapplyMods)
26772648
{
26782649
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG + i, 0);
26792650
SetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, 0);
2680-
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.00f);
2651+
SetFloatValue(PLAYER_FIELD_MOD_DAMAGE_DONE_PCT + i, 1.0f);
26812652
}
26822653

26832654
//reset attack power, damage and attack speed fields
@@ -11296,7 +11267,6 @@ InventoryResult Player::CanEquipItem(uint8 slot, uint16 &dest, Item* pItem, bool
1129611267
// Do not allow polearm to be equipped in the offhand (rare case for the only 1h polearm 41750)
1129711268
if (type == INVTYPE_WEAPON && pProto->SubClass == ITEM_SUBCLASS_WEAPON_POLEARM)
1129811269
return EQUIP_ERR_WRONG_SLOT;
11299-
1130011270
else if (type == INVTYPE_WEAPON || type == INVTYPE_WEAPONOFFHAND)
1130111271
{
1130211272
if (!CanDualWield())
@@ -22221,6 +22191,19 @@ void Player::ReportedAfkBy(Player* reporter)
2222122191
reporter->SendDirectMessage(reportAfkResult.Write());
2222222192
}
2222322193

22194+
uint8 Player::GetStartLevel(uint8 playerClass) const
22195+
{
22196+
uint8 startLevel = sWorld->getIntConfig(CONFIG_START_PLAYER_LEVEL);
22197+
22198+
if (playerClass == CLASS_DEATH_KNIGHT)
22199+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_DEATH_KNIGHT_PLAYER_LEVEL), startLevel);
22200+
22201+
if (m_session->HasPermission(rbac::RBAC_PERM_USE_START_GM_LEVEL))
22202+
startLevel = std::max<uint8>(sWorld->getIntConfig(CONFIG_START_GM_LEVEL), startLevel);
22203+
22204+
return startLevel;
22205+
}
22206+
2222422207
WorldLocation Player::GetStartPosition() const
2222522208
{
2222622209
PlayerInfo const* info = sObjectMgr->GetPlayerInfo(GetRace(), GetClass());
@@ -23072,31 +23055,10 @@ void Player::LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue)
2307223055
if (skillValue < ability->MinSkillLineRank && ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_VALUE)
2307323056
RemoveSpell(ability->Spell);
2307423057
// need learn
23058+
else if (!IsInWorld())
23059+
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
2307523060
else
23076-
{
23077-
// 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
23078-
if (ability->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && ability->SupercededBySpell)
23079-
{
23080-
bool skipCurrent = false;
23081-
auto bounds = sSpellMgr->GetSkillLineAbilityMapBounds(ability->SupercededBySpell);
23082-
for (auto itr = bounds.first; itr != bounds.second; ++itr)
23083-
{
23084-
if (itr->second->AcquireMethod == SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN && skillValue >= itr->second->MinSkillLineRank)
23085-
{
23086-
skipCurrent = true;
23087-
break;
23088-
}
23089-
}
23090-
23091-
if (skipCurrent)
23092-
continue;
23093-
}
23094-
23095-
if (!IsInWorld())
23096-
AddSpell(ability->Spell, true, true, true, false, false, ability->SkillLine);
23097-
else
23098-
LearnSpell(ability->Spell, true, ability->SkillLine);
23099-
}
23061+
LearnSpell(ability->Spell, true, ability->SkillLine);
2310023062
}
2310123063
}
2310223064

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)