Skip to content

Commit 9727756

Browse files
author
Github Actions
committed
Merge 3.3.5-base_patch to 3.3.5-pvpranks
2 parents 00d84b4 + 0b55c6b commit 9727756

File tree

25 files changed

+355
-292
lines changed

25 files changed

+355
-292
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ALTER TABLE `creature_classlevelstats` CHANGE `basehp0` `basehp0` int unsigned NOT NULL DEFAULT '1';
2+
ALTER TABLE `creature_classlevelstats` CHANGE `basehp1` `basehp1` int unsigned NOT NULL DEFAULT '1';
3+
ALTER TABLE `creature_classlevelstats` CHANGE `basehp2` `basehp2` int unsigned NOT NULL DEFAULT '1';
4+
ALTER TABLE `creature_classlevelstats` CHANGE `basemana` `basemana` int unsigned NOT NULL DEFAULT '1';
5+
ALTER TABLE `creature_classlevelstats` CHANGE `basearmor` `basearmor` int unsigned NOT NULL DEFAULT '1';

sql/updates/world/3.3.5/2025_02_02_00_world.sql

Lines changed: 215 additions & 0 deletions
Large diffs are not rendered by default.

src/server/database/Database/Implementation/CharacterDatabase.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
176176
// 0: uint32, 1: uint8, 3: string, 4: uint32, 5: uint32
177177
PrepareStatement(CHAR_INS_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights, BankMoneyPerDay) VALUES (?, ?, ?, ?, ?)", CONNECTION_ASYNC);
178178
PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32
179-
PrepareStatement(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
179+
PrepareStatement(CHAR_DEL_GUILD_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
180180
PrepareStatement(CHAR_INS_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)", CONNECTION_ASYNC); // 0: uint32, 1: uint8
181181
PrepareStatement(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8
182182
PrepareStatement(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint32

src/server/database/Database/Implementation/CharacterDatabase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ enum CharacterDatabaseStatements : uint32
155155
CHAR_DEL_GUILD_MEMBERS,
156156
CHAR_INS_GUILD_RANK,
157157
CHAR_DEL_GUILD_RANKS,
158-
CHAR_DEL_GUILD_LOWEST_RANK,
158+
CHAR_DEL_GUILD_RANK,
159159
CHAR_INS_GUILD_BANK_TAB,
160160
CHAR_DEL_GUILD_BANK_TAB,
161161
CHAR_DEL_GUILD_BANK_TABS,

src/server/game/Battlegrounds/Battleground.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,10 @@ void Battleground::EndBattleground(uint32 winner)
769769
CharacterDatabase.Execute(stmt);
770770
}
771771

772+
// remove temporary currency bonus auras before rewarding player
773+
player->RemoveAura(SPELL_HONORABLE_DEFENDER_25Y);
774+
player->RemoveAura(SPELL_HONORABLE_DEFENDER_60Y);
775+
772776
// Reward winner team
773777
if (team == winner)
774778
{

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

Lines changed: 50 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ Player::Player(WorldSession* session): Unit(true)
263263
SetLastRuneGraceTimer(i, 0);
264264
}
265265

266-
for (uint8 i=0; i < MAX_TIMERS; i++)
266+
for (uint8 i = 0; i < MAX_TIMERS; i++)
267267
m_MirrorTimer[i] = DISABLED_MIRROR_TIMER;
268268

269269
m_MirrorTimerFlags = UNDERWATER_NONE;
@@ -524,7 +524,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo
524524
SetArenaFaction(0);
525525

526526
SetUInt32Value(PLAYER_GUILDID, 0);
527-
SetRank(0);
527+
SetGuildRank(0);
528528
SetUInt32Value(PLAYER_GUILD_TIMESTAMP, 0);
529529

530530
for (int i = 0; i < KNOWN_TITLES_SIZE; ++i)
@@ -16746,14 +16746,17 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) const
1674616746
{
1674716747
uint32 questId = quest->GetQuestId();
1674816748
sGameEventMgr->HandleQuestComplete(questId);
16749-
WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4));
16750-
data << uint32(questId);
16749+
16750+
uint32 xp;
1675116751

1675216752
if (!IsMaxLevel())
16753-
data << uint32(XP);
16753+
xp = XP;
1675416754
else
16755-
data << uint32(0);
16755+
xp = 0;
1675616756

16757+
WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4));
16758+
data << uint32(questId);
16759+
data << uint32(xp);
1675716760
data << uint32(quest->GetRewOrReqMoney(this));
1675816761
data << uint32(10 * quest->CalculateHonorGain(GetQuestLevel(quest)));
1675916762
data << uint32(quest->GetBonusTalents()); // bonus talents
@@ -18990,8 +18993,8 @@ void Player::SendSavedInstances()
1899018993
}
1899118994
}
1899218995

18993-
//Send opcode 811. true or false means, whether you have current raid/heroic instances
18994-
data.Initialize(SMSG_UPDATE_INSTANCE_OWNERSHIP);
18996+
//Send opcode SMSG_UPDATE_INSTANCE_OWNERSHIP. true or false means, whether you have current raid/heroic instances
18997+
data.Initialize(SMSG_UPDATE_INSTANCE_OWNERSHIP, 4);
1899518998
data << uint32(hasBeenSaved);
1899618999
SendDirectMessage(&data);
1899719000

@@ -19004,7 +19007,7 @@ void Player::SendSavedInstances()
1900419007
{
1900519008
if (itr->second.perm)
1900619009
{
19007-
data.Initialize(SMSG_UPDATE_LAST_INSTANCE);
19010+
data.Initialize(SMSG_UPDATE_LAST_INSTANCE, 4);
1900819011
data << uint32(itr->second.save->GetMapId());
1900919012
SendDirectMessage(&data);
1901019013
}
@@ -19771,7 +19774,7 @@ void Player::_SaveInventory(CharacterDatabaseTransaction trans)
1977119774
// save all changes to the item...
1977219775
if (item->GetState() != ITEM_NEW) // only for existing items, no duplicates
1977319776
item->SaveToDB(trans);
19774-
// ...but do not save position in invntory
19777+
// ...but do not save position in inventory
1977519778
continue;
1977619779
}
1977719780
}
@@ -20437,7 +20440,7 @@ void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) const
2043720440
// 1: There are players offline in your party.
2043820441
// 2>: There are players in your party attempting to zone into an instance.
2043920442
*/
20440-
WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 4);
20443+
WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 8);
2044120444
data << uint32(reason);
2044220445
data << uint32(MapId);
2044320446
SendDirectMessage(&data);
@@ -20747,6 +20750,16 @@ void Player::TextEmote(std::string_view text, WorldObject const* /*= nullptr*/,
2074720750
SendMessageToSetInRange(&data, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), true, !GetSession()->HasPermission(rbac::RBAC_PERM_TWO_SIDE_INTERACTION_CHAT), true);
2074820751
}
2074920752

20753+
void Player::WhisperAddon(std::string const& text, Player* receiver)
20754+
{
20755+
std::string _text(text);
20756+
sScriptMgr->OnPlayerChat(this, CHAT_MSG_WHISPER, uint32(LANG_ADDON), _text, receiver);
20757+
20758+
WorldPacket data;
20759+
ChatHandler::BuildChatPacket(data, CHAT_MSG_WHISPER, LANG_ADDON, this, this, _text);
20760+
receiver->SendDirectMessage(&data);
20761+
}
20762+
2075020763
void Player::TextEmote(uint32 textId, WorldObject const* target /*= nullptr*/, bool /*isBossEmote = false*/)
2075120764
{
2075220765
Talk(textId, CHAT_MSG_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
@@ -26176,14 +26189,15 @@ void Player::SetReputation(uint32 factionentry, uint32 value)
2617626189
{
2617726190
GetReputationMgr().SetReputation(sFactionStore.LookupEntry(factionentry), value);
2617826191
}
26192+
2617926193
uint32 Player::GetReputation(uint32 factionentry) const
2618026194
{
2618126195
return GetReputationMgr().GetReputation(sFactionStore.LookupEntry(factionentry));
2618226196
}
2618326197

26184-
std::string const& Player::GetGuildName() const
26198+
std::string Player::GetGuildName() const
2618526199
{
26186-
return sGuildMgr->GetGuildById(GetGuildId())->GetName();
26200+
return GetGuildId() ? sGuildMgr->GetGuildById(GetGuildId())->GetName() : "";
2618726201
}
2618826202

2618926203
void Player::SendDuelCountdown(uint32 counter)
@@ -26276,6 +26290,26 @@ PetStable& Player::GetOrInitPetStable()
2627626290
return *m_petStable;
2627726291
}
2627826292

26293+
void Player::SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, uint8 error) const
26294+
{
26295+
WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8 + 4 + 4 + 4 + 4 + 4 * 4 + 4 * 4);
26296+
data << uint64(item->GetGUID()); // item guid
26297+
data << uint32(error); // 0, or error code
26298+
if (!error)
26299+
{
26300+
data << uint32(item->GetPaidMoney()); // money cost
26301+
data << uint32(iece->HonorPoints); // honor point cost
26302+
data << uint32(iece->ArenaPoints); // arena point cost
26303+
for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
26304+
{
26305+
data << uint32(iece->ItemID[i]);
26306+
data << uint32(iece->ItemCount[i]);
26307+
}
26308+
}
26309+
26310+
SendDirectMessage(&data);
26311+
}
26312+
2627926313
void Player::RefundItem(Item* item)
2628026314
{
2628126315
if (!item->IsRefundable())
@@ -26287,10 +26321,7 @@ void Player::RefundItem(Item* item)
2628726321
if (item->IsRefundExpired()) // item refund has expired
2628826322
{
2628926323
item->SetNotRefundable(this);
26290-
WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4);
26291-
data << uint64(item->GetGUID()); // Guid
26292-
data << uint32(10); // Error!
26293-
SendDirectMessage(&data);
26324+
SendItemRefundResult(item, nullptr, 10);
2629426325
return;
2629526326
}
2629626327

@@ -26328,25 +26359,11 @@ void Player::RefundItem(Item* item)
2632826359

2632926360
if (store_error)
2633026361
{
26331-
WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4);
26332-
data << uint64(item->GetGUID()); // Guid
26333-
data << uint32(10); // Error!
26334-
SendDirectMessage(&data);
26362+
SendItemRefundResult(item, iece, 10);
2633526363
return;
2633626364
}
2633726365

26338-
WorldPacket data(SMSG_ITEM_REFUND_RESULT, 8+4+4+4+4+4*4+4*4);
26339-
data << uint64(item->GetGUID()); // item guid
26340-
data << uint32(0); // 0, or error code
26341-
data << uint32(item->GetPaidMoney()); // money cost
26342-
data << uint32(iece->HonorPoints); // honor point cost
26343-
data << uint32(iece->ArenaPoints); // arena point cost
26344-
for (uint8 i = 0; i < MAX_ITEM_EXTENDED_COST_REQUIREMENTS; ++i) // item cost data
26345-
{
26346-
data << uint32(iece->ItemID[i]);
26347-
data << uint32(iece->ItemCount[i]);
26348-
}
26349-
SendDirectMessage(&data);
26366+
SendItemRefundResult(item, iece, 0);
2635026367

2635126368
uint32 moneyRefund = item->GetPaidMoney(); // item-> will be invalidated in DestroyItem
2635226369

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct CharTitlesEntry;
4444
struct ChatChannelsEntry;
4545
struct CreatureTemplate;
4646
struct FactionEntry;
47+
struct ItemExtendedCostEntry;
4748
struct ItemSetEffect;
4849
struct ItemTemplate;
4950
struct Loot;
@@ -1145,6 +1146,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
11451146
/// Handles whispers from Addons and players based on sender, receiver's guid and language.
11461147
void Whisper(std::string_view text, Language language, Player* receiver, bool = false) override;
11471148
void Whisper(uint32 textId, Player* target, bool isBossWhisper = false) override;
1149+
void WhisperAddon(std::string const& text, Player* receiver);
11481150

11491151
/*********************************************************/
11501152
/*** STORAGE SYSTEM ***/
@@ -1537,7 +1539,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
15371539
void RemoveTemporarySpell(uint32 spellId);
15381540
void SetReputation(uint32 factionentry, uint32 value);
15391541
uint32 GetReputation(uint32 factionentry) const;
1540-
std::string const& GetGuildName() const;
1542+
std::string GetGuildName() const;
15411543

15421544
// Talents
15431545
uint32 GetFreeTalentPoints() const { return GetUInt32Value(PLAYER_CHARACTER_POINTS1); }
@@ -1671,8 +1673,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
16711673
void SendUpdateToOutOfRangeGroupMembers();
16721674

16731675
void SetInGuild(uint32 guildId);
1674-
void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); }
1675-
uint8 GetRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); }
1676+
void SetGuildRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); }
1677+
uint8 GetGuildRank() const { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); }
16761678
void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
16771679
uint32 GetGuildId() const { return GetUInt32Value(PLAYER_GUILDID); }
16781680
Guild* GetGuild();
@@ -2562,6 +2564,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
25622564
GuidSet m_refundableItems;
25632565
void SendRefundInfo(Item* item);
25642566
void RefundItem(Item* item);
2567+
void SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, uint8 error) const;
25652568

25662569
// know currencies are not removed at any point (0 displayed)
25672570
void AddKnownCurrency(uint32 itemId);

src/server/game/Entities/Unit/Unit.cpp

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11100,8 +11100,9 @@ bool Unit::InitTamedPet(Pet* pet, uint8 level, uint32 spell_id)
1110011100
// only if not player and not controlled by player pet. And not at BG
1110111101
if ((durabilityLoss && !player && !victim->ToPlayer()->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
1110211102
{
11103-
TC_LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH));
11104-
plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH), false);
11103+
double baseLoss = sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH);
11104+
TC_LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", baseLoss);
11105+
plrVictim->DurabilityLossAll(baseLoss, false);
1110511106
// durability lost message
1110611107
plrVictim->SendDurabilityLoss();
1110711108
}
@@ -12210,6 +12211,17 @@ void Unit::UpdateObjectVisibility(bool forced)
1221012211
}
1221112212
}
1221212213

12214+
void Unit::SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin)
12215+
{
12216+
WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
12217+
data << GetPackGUID();
12218+
data << uint32(0); // counter
12219+
data << TaggedPosition<Position::XY>(vcos, vsin);
12220+
data << float(speedXY); // Horizontal speed
12221+
data << float(speedZ); // Z Movement speed (vertical)
12222+
player->SendDirectMessage(&data);
12223+
}
12224+
1221312225
void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ)
1221412226
{
1221512227
if (IsMovedByServer())
@@ -12220,15 +12232,7 @@ void Unit::KnockbackFrom(float x, float y, float speedXY, float speedZ)
1222012232
{
1222112233
float vcos, vsin;
1222212234
GetSinCos(x, y, vsin, vcos);
12223-
12224-
WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
12225-
data << GetPackGUID();
12226-
data << uint32(0); // counter
12227-
data << TaggedPosition<Position::XY>(vcos, vsin);
12228-
data << float(speedXY); // Horizontal speed
12229-
data << float(-speedZ); // Z Movement speed (vertical)
12230-
12231-
GetGameClientMovingMe()->SendDirectMessage(&data);
12235+
SendMoveKnockBack(GetGameClientMovingMe()->GetBasePlayer(), speedXY, -speedZ, vcos, vsin);
1223212236

1223312237
if (HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || HasAuraType(SPELL_AURA_FLY))
1223412238
SetCanFly(true, true);
@@ -12474,15 +12478,7 @@ void Unit::JumpTo(float speedXY, float speedZ, bool forward, Optional<Position>
1247412478
{
1247512479
float vcos = std::cos(angle+GetOrientation());
1247612480
float vsin = std::sin(angle+GetOrientation());
12477-
12478-
WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8+4+4+4+4+4));
12479-
data << GetPackGUID();
12480-
data << uint32(0); // Sequence
12481-
data << TaggedPosition<Position::XY>(vcos, vsin);
12482-
data << float(speedXY); // Horizontal speed
12483-
data << float(-speedZ); // Z Movement speed (vertical)
12484-
12485-
ToPlayer()->SendDirectMessage(&data);
12481+
SendMoveKnockBack(ToPlayer(), speedXY, -speedZ, vcos, vsin);
1248612482
}
1248712483
}
1248812484

src/server/game/Entities/Unit/Unit.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,6 +1204,7 @@ class TC_GAME_API Unit : public WorldObject
12041204
void UpdateOrientation(float orientation);
12051205
void UpdateHeight(float newZ);
12061206

1207+
void SendMoveKnockBack(Player* player, float speedXY, float speedZ, float vcos, float vsin);
12071208
void KnockbackFrom(float x, float y, float speedXY, float speedZ);
12081209
void JumpTo(float speedXY, float speedZ, bool forward = true, Optional<Position> dest = {});
12091210
void JumpTo(WorldObject* obj, float speedZ, bool withOrientation = false);

src/server/game/Globals/ObjectMgr.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10041,7 +10041,7 @@ void ObjectMgr::LoadCreatureClassLevelStats()
1004110041

1004210042
for (uint8 i = 0; i < MAX_EXPANSIONS; ++i)
1004310043
{
10044-
stats.BaseHealth[i] = fields[2 + i].GetUInt16();
10044+
stats.BaseHealth[i] = fields[2 + i].GetUInt32();
1004510045

1004610046
if (stats.BaseHealth[i] == 0)
1004710047
{
@@ -10057,8 +10057,8 @@ void ObjectMgr::LoadCreatureClassLevelStats()
1005710057
}
1005810058
}
1005910059

10060-
stats.BaseMana = fields[5].GetUInt16();
10061-
stats.BaseArmor = fields[6].GetUInt16();
10060+
stats.BaseMana = fields[5].GetUInt32();
10061+
stats.BaseArmor = fields[6].GetUInt32();
1006210062

1006310063
stats.AttackPower = fields[7].GetUInt16();
1006410064
stats.RangedAttackPower = fields[8].GetUInt16();

0 commit comments

Comments
 (0)