diff --git a/sql/updates/characters/4.3.4/2021_07_29_00_characters.sql b/sql/updates/characters/4.3.4/2021_07_29_00_characters.sql new file mode 100644 index 0000000000..453d83e730 --- /dev/null +++ b/sql/updates/characters/4.3.4/2021_07_29_00_characters.sql @@ -0,0 +1,2 @@ +ALTER TABLE `guild` +ADD COLUMN `WeeklyBonusMoney` bigint UNSIGNED NOT NULL DEFAULT 0 AFTER `completedRatedBattlegroundChallenges`; diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 2fd8f1c8f6..bd042ae94e 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -219,7 +219,8 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: string, 1: string, 2: uint32, 3: uint8 PrepareStatement(CHAR_UPD_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?, TabIcon = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint64, 1: uint32 + PrepareStatement(CHAR_UPD_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ?, WeeklyBonusMoney = ? WHERE guildid = ?", CONNECTION_ASYNC); // 0: uint64, 1: uint64 2: uint32 + PrepareStatement(CHAR_UPD_GUILD_WEEKLY_BONUS_MONEY, "UPDATE guild SET WeeklyBonusMoney = 0", CONNECTION_ASYNC); // 0: uint8, 1: uint32, 2: uint8, 3: uint32 PrepareStatement(CHAR_UPD_GUILD_BANK_EVENTLOG_TAB, "UPDATE guild_bank_eventlog SET TabId = ? WHERE guildid = ? AND TabId = ? AND LogGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?", CONNECTION_ASYNC); // 0: uint32, 1: uint8, 2: uint32 diff --git a/src/server/database/Database/Implementation/CharacterDatabase.h b/src/server/database/Database/Implementation/CharacterDatabase.h index 8b348bd062..8585fa1370 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.h +++ b/src/server/database/Database/Implementation/CharacterDatabase.h @@ -192,6 +192,7 @@ enum CharacterDatabaseStatements : uint32 CHAR_UPD_GUILD_EMBLEM_INFO, CHAR_UPD_GUILD_BANK_TAB_INFO, CHAR_UPD_GUILD_BANK_MONEY, + CHAR_UPD_GUILD_WEEKLY_BONUS_MONEY, CHAR_UPD_GUILD_BANK_EVENTLOG_TAB, CHAR_UPD_GUILD_RANK_BANK_MONEY, CHAR_UPD_GUILD_BANK_TAB_TEXT, diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index f0ea4c2c5c..6b21d68f33 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1302,6 +1302,7 @@ Guild::Guild(): m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), + _weeklyBonusMoney(0), m_eventLog(nullptr), m_newsLog(nullptr), _level(1), @@ -2194,7 +2195,7 @@ void Guild::HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool sScriptMgr->OnGuildMemberDepositMoney(this, player, amount); CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); - _ModifyBankMoney(trans, amount, true); + _ModifyBankMoney(trans, amount, true, cashFlow); if (!cashFlow) { player->ModifyMoney(-int64(amount)); @@ -2397,8 +2398,9 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const WorldPackets::Guild::GuildBankLogQueryResults packet; packet.Tab = int32(tabId); - //if (tabId == GUILD_BANK_MAX_TABS && hasCashFlow) - // packet.WeeklyBonusMoney.Set(uint64(weeklyBonusMoney)); + // If we have a weekly bonus money value, we can safely assume that Cash Flow has been unlocked. + if (tabId == GUILD_BANK_MAX_TABS && GetWeeklyBonusMoney()) + packet.WeeklyBonusMoney.emplace(GetWeeklyBonusMoney()); packet.Entry.reserve(m_bankEventLog[tabId]->GetSize()); for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr) @@ -2563,7 +2565,7 @@ bool Guild::LoadFromDB(Field* fields) _currChallengeCount[GUILD_CHALLENGE_TYPE_DUNGEON] = uint8(fields[16].GetUInt32()); _currChallengeCount[GUILD_CHALLENGE_TYPE_RAID] = uint8(fields[17].GetUInt32()); _currChallengeCount[GUILD_CHALLENGE_TYPE_RATED_BG] = uint8(fields[18].GetUInt32()); - + _weeklyBonusMoney = fields[19].GetUInt64(); _CreateLogHolders(); return true; @@ -3236,10 +3238,14 @@ void Guild::_DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeIte m_bankTabs.clear(); } -bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add) +bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add, bool fromCashFlow /*= false*/) { if (add) + { m_bankMoney += amount; + if (fromCashFlow) + _weeklyBonusMoney += amount; + } else { // Check if there is enough money in bank. @@ -3250,7 +3256,8 @@ bool Guild::_ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_BANK_MONEY); stmt->setUInt64(0, m_bankMoney); - stmt->setUInt32(1, m_id); + stmt->setUInt64(1, _weeklyBonusMoney); + stmt->setUInt32(2, m_id); trans->Append(stmt); return true; } @@ -3803,7 +3810,7 @@ void Guild::CompleteChallenge(uint8 challengeType, Player* source) SaveToDB(); // Save xp CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); - _ModifyBankMoney(trans, uint64(gold * 10000), true); + _ModifyBankMoney(trans, uint64(gold * 10000), true, false); CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_CHALLENGE); stmt->setUInt32(0, _currChallengeCount[GUILD_CHALLENGE_TYPE_DUNGEON]); @@ -3936,6 +3943,9 @@ void Guild::ResetTimes(bool weekly) CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_RESET_CHALLENGE); stmt->setInt32(0, m_id); CharacterDatabase.Execute(stmt); + + // Reset weekly bonus money from Cash Flow perk + _weeklyBonusMoney = 0; } for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr) diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 5f0c661b2b..f6703dd433 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -794,6 +794,7 @@ public: uint32 GetMemberCount() const { return m_members.size(); } time_t GetCreatedDate() const { return m_createdDate; } uint64 GetBankMoney() const { return m_bankMoney; } + uint64 GetWeeklyBonusMoney() const { return _weeklyBonusMoney; } bool SetName(std::string const& name); @@ -931,6 +932,7 @@ protected: EmblemInfo m_emblemInfo; uint32 m_accountsNumber; uint64 m_bankMoney; + uint64 _weeklyBonusMoney; // Bonus money from the Cash Flow guild perk Ranks m_ranks; Members m_members; @@ -999,7 +1001,7 @@ private: void _UpdateAccountsNumber(); bool _IsLeader(Player* player) const; void _DeleteBankItems(CharacterDatabaseTransaction& trans, bool removeItemsFromDB = false); - bool _ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add); + bool _ModifyBankMoney(CharacterDatabaseTransaction& trans, uint64 amount, bool add, bool fromCashFlow = false); void _SetLeader(CharacterDatabaseTransaction& trans, Member* pLeader); void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay); diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 344fc1ba71..ef4f850ff2 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -135,8 +135,8 @@ void GuildMgr::LoadGuilds() QueryResult result = CharacterDatabase.Query("SELECT g.guildid, g.name, g.leaderguid, g.EmblemStyle, g.EmblemColor, g.BorderStyle, g.BorderColor, " // 7 8 9 10 11 12 13 14 15 "g.BackgroundColor, g.info, g.motd, g.createdate, g.BankMoney, g.level, g.experience, g.todayExperience, COUNT(gbt.guildid), " - // 16 17 18 - "g.completedDungeonChallenges, g.completedRaidChallenges, g.completedRatedBattlegroundChallenges " + // 16 17 18 19 + "g.completedDungeonChallenges, g.completedRaidChallenges, g.completedRatedBattlegroundChallenges, g.WeeklyBonusMoney " "FROM guild g LEFT JOIN guild_bank_tab gbt ON g.guildid = gbt.guildid GROUP BY g.guildid ORDER BY g.guildid ASC"); if (!result) @@ -645,10 +645,12 @@ void GuildMgr::ResetTimes(bool week) stmt->setUInt32(0, uint32(GameTime::GetGameTime() - time_t(30 * DAY))); CharacterDatabase.Execute(stmt); - // Reset week reputation for old guild member + // Reset week reputation for old guild member and reset weekly bonus money from cash flow contributions if (week) + { CharacterDatabase.Execute(CharacterDatabase.GetPreparedStatement(CHAR_RESET_OLD_GUILD_WEEK_REPUTATION)); - + CharacterDatabase.Execute(CharacterDatabase.GetPreparedStatement(CHAR_UPD_GUILD_WEEKLY_BONUS_MONEY)); + } for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr) if (Guild* guild = itr->second) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index b4bd7f5dfa..30171af3d6 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -249,7 +249,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/) player->ModifyMoney(loot->gold); player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold); - if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) + if (Guild* guild = player->GetGuild()) if (uint32 guildGold = CalculatePct(loot->gold, player->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT))) guild->HandleMemberDepositMoney(this, guildGold, true);