aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp8
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.cpp4
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.cpp4
-rw-r--r--src/server/game/DungeonFinding/LFGQueue.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp21
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp4
-rw-r--r--src/server/game/Guilds/Guild.cpp454
-rwxr-xr-xsrc/server/game/Guilds/Guild.h153
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp54
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp4
-rwxr-xr-xsrc/server/game/Handlers/BattleGroundHandler.cpp2
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp3
-rwxr-xr-xsrc/server/game/Handlers/GuildHandler.cpp259
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp2
-rw-r--r--src/server/game/Handlers/MailHandler.cpp20
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp2
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h8
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp9
-rw-r--r--src/server/game/World/World.cpp3
-rw-r--r--src/server/game/World/World.h1
-rw-r--r--src/server/scripts/Spells/spell_shaman.cpp2
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp6
-rwxr-xr-xsrc/server/shared/Database/Implementation/CharacterDatabase.h3
-rw-r--r--src/server/worldserver/worldserver.conf.dist10
26 files changed, 577 insertions, 466 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index c5aabff7db6..356be60909d 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -1852,8 +1852,8 @@ void AchievementMgr<Player>::CompletedAchievement(AchievementEntry const* achiev
return;
if (achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS)
- if (Guild* guild = sGuildMgr->GetGuildById(referencePlayer->GetGuildId()))
- guild->GetNewsLog().AddNewEvent(GUILD_NEWS_PLAYER_ACHIEVEMENT, time(NULL), referencePlayer->GetGUID(), achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID);
+ if (Guild* guild = referencePlayer->GetGuild())
+ guild->AddGuildNews(GUILD_NEWS_PLAYER_ACHIEVEMENT, referencePlayer->GetGUID(), achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID);
if (!GetOwner()->GetSession()->PlayerLoading())
SendAchievementEarned(achievement);
@@ -1933,8 +1933,8 @@ void AchievementMgr<Guild>::CompletedAchievement(AchievementEntry const* achieve
return;
if (achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS)
- if (Guild* guild = sGuildMgr->GetGuildById(referencePlayer->GetGuildId()))
- guild->GetNewsLog().AddNewEvent(GUILD_NEWS_GUILD_ACHIEVEMENT, time(NULL), 0, achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID);
+ if (Guild* guild = referencePlayer->GetGuild())
+ guild->AddGuildNews(GUILD_NEWS_GUILD_ACHIEVEMENT, 0, achievement->flags & ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER, achievement->ID);
SendAchievementEarned(achievement);
CompletedAchievementData& ca = m_completedAchievements[achievement->ID];
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 1e252b5b705..389873f7caf 100755
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -914,9 +914,9 @@ void Battleground::EndBattleground(uint32 winner)
if (uint32 guildId = GetBgMap()->GetOwnerGuildId(player->GetTeam()))
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
{
- guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, NULL, player);
+ guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, NULL, player);
if (isArena() && isRated() && winnerArenaTeam && loserArenaTeam && winnerArenaTeam != loserArenaTeam)
- guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max<uint32>(winnerArenaTeam->GetRating(), 1), 0, NULL, player);
+ guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max<uint32>(winnerArenaTeam->GetRating(), 1), 0, NULL, player);
}
}
}
diff --git a/src/server/game/DungeonFinding/LFGQueue.cpp b/src/server/game/DungeonFinding/LFGQueue.cpp
index cf600b0645f..3bcd1ee5643 100644
--- a/src/server/game/DungeonFinding/LFGQueue.cpp
+++ b/src/server/game/DungeonFinding/LFGQueue.cpp
@@ -639,7 +639,7 @@ void LFGQueue::FindBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQueu
std::string sguid = o.str();
for (LfgCompatibleContainer::const_iterator itr = CompatibleMapStore.begin(); itr != CompatibleMapStore.end(); ++itr)
- if (itr->second.compatibility == LFG_COMPATIBLES_WITH_LESS_PLAYERS &&
+ if (itr->second.compatibility == LFG_COMPATIBLES_WITH_LESS_PLAYERS &&
std::string::npos != itr->first.find(sguid))
{
UpdateBestCompatibleInQueue(itrQueue, itr->first, itr->second.roles);
@@ -650,7 +650,7 @@ void LFGQueue::UpdateBestCompatibleInQueue(LfgQueueDataContainer::iterator itrQu
{
LfgQueueData& queueData = itrQueue->second;
- uint8 storedSize = queueData.bestCompatible.empty() ? 0 :
+ uint8 storedSize = queueData.bestCompatible.empty() ? 0 :
std::count(queueData.bestCompatible.begin(), queueData.bestCompatible.end(), '|') + 1;
uint8 size = std::count(key.begin(), key.end(), '|') + 1;
diff --git a/src/server/game/DungeonFinding/LFGQueue.h b/src/server/game/DungeonFinding/LFGQueue.h
index f937ac0d21a..e6ba038a9e6 100644
--- a/src/server/game/DungeonFinding/LFGQueue.h
+++ b/src/server/game/DungeonFinding/LFGQueue.h
@@ -42,7 +42,7 @@ struct LfgCompatibilityData
compatibility(_compatibility), roles(_roles) { }
LfgCompatibility compatibility;
- LfgRolesMap roles;
+ LfgRolesMap roles;
};
/// Stores player or group queue info
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 1de1a453d86..b6974082604 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -515,7 +515,7 @@ inline void KillRewarder::_RewardXP(Player* player, float rate)
// 4.2.3. Calculate expansion penalty
if (_victim->GetTypeId() == TYPEID_UNIT && player->getLevel() >= GetMaxLevelForExpansion(_victim->ToCreature()->GetCreatureTemplate()->expansion))
xp = CalculatePct(xp, 10); // Players get only 10% xp for killing creatures of lower expansion levels than himself
-
+
// 4.2.4. Give XP to player.
player->GiveXP(xp, _victim, _groupRate);
if (Pet* pet = player->GetPet())
@@ -635,7 +635,7 @@ void KillRewarder::Reward()
if (uint32 guildId = victim->GetMap()->GetOwnerGuildId())
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
- guild->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, victim, _killer);
+ guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, victim, _killer);
}
}
@@ -21440,8 +21440,8 @@ bool Player::BuyItemFromVendorSlot(uint64 vendorguid, uint32 vendorslot, uint32
if (crItem->maxcount != 0) // bought
{
if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]))
- if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId()))
- guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_PURCHASED, time(NULL), GetGUID(), 0, item);
+ if (Guild* guild = GetGuild())
+ guild->AddGuildNews(GUILD_NEWS_ITEM_PURCHASED, GetGUID(), 0, item);
return true;
}
@@ -24189,10 +24189,10 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
--loot->unlootedCount;
- if (const ItemTemplate* proto = sObjectMgr->GetItemTemplate(item->itemid))
+ if (ItemTemplate const* proto = sObjectMgr->GetItemTemplate(item->itemid))
if (proto->Quality > ITEM_QUALITY_EPIC || (proto->Quality == ITEM_QUALITY_EPIC && proto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]))
- if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId()))
- guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_LOOTED, time(NULL), GetGUID(), 0, item->itemid);
+ if (Guild* guild = GetGuild())
+ guild->AddGuildNews(GUILD_NEWS_ITEM_LOOTED, GetGUID(), 0, item->itemid);
SendNewItem(newitem, uint32(item->count), false, false, true);
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
@@ -24499,6 +24499,11 @@ void Player::SendRespondInspectAchievements(Player* player) const
m_achievementMgr.SendAchievementInfo(player);
}
+uint32 Player::GetAchievementPoints() const
+{
+ return m_achievementMgr.GetAchievementPoints();
+}
+
bool Player::HasAchieved(uint32 achievementId) const
{
return m_achievementMgr.HasAchieved(achievementId);
@@ -24529,7 +24534,7 @@ void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 mis
return;
if (Guild* guild = sGuildMgr->GetGuildById(GetGuildId()))
- guild->GetAchievementMgr().UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this);
+ guild->UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, this);
}
void Player::CompletedAchievement(AchievementEntry const* entry)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 2bc8aeb9c10..0f1a60c5c79 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2057,7 +2057,7 @@ class Player : public Unit, public GridObject<Player>
uint32 GetGuildLevel() { return GetUInt32Value(PLAYER_GUILDLEVEL); }
void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
uint32 GetGuildId() const { return GetUInt32Value(OBJECT_FIELD_DATA); /* return only lower part */ }
- Guild* GetGuild();
+ Guild* GetGuild();
static uint32 GetGuildIdFromDB(uint64 guid);
static uint8 GetRankFromDB(uint64 guid);
int GetGuildIdInvited() { return m_GuildIdInvited; }
@@ -2701,6 +2701,7 @@ class Player : public Unit, public GridObject<Player>
void InitRunes();
void SendRespondInspectAchievements(Player* player) const;
+ uint32 GetAchievementPoints() const;
bool HasAchieved(uint32 achievementId) const;
void ResetAchievements();
void CheckAllAchievementCriteria();
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 146654d69af..edf5aba1305 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -8652,7 +8652,7 @@ void ObjectMgr::LoadFactionChangeTitles()
}
uint32 count = 0;
-
+
do
{
Field* fields = result->Fetch();
@@ -8666,7 +8666,7 @@ void ObjectMgr::LoadFactionChangeTitles()
sLog->outError(LOG_FILTER_SQL, "Title %u referenced in `player_factionchange_title` does not exist, pair skipped!", horde);
else
FactionChange_Titles[alliance] = horde;
-
+
++count;
}
while (result->NextRow());
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 0a8267652c6..2f9d4d3b8ec 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -267,6 +267,55 @@ void Guild::BankEventLogEntry::WritePacket(WorldPacket& data, ByteBuffer& conten
content << uint8(m_destTabId);
}
+void Guild::NewsLogEntry::SaveToDB(SQLTransaction& trans) const
+{
+ uint8 index = 0;
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_NEWS);
+ stmt->setUInt32( index, m_guildId);
+ stmt->setUInt32(++index, GetGUID());
+ stmt->setUInt8 (++index, GetType());
+ stmt->setUInt32(++index, GetPlayerGuid());
+ stmt->setUInt32(++index, GetFlags());
+ stmt->setUInt32(++index, GetValue());
+ stmt->setUInt64(++index, GetTimestamp());
+ CharacterDatabase.ExecuteOrAppend(trans, stmt);
+}
+
+void Guild::NewsLogEntry::WritePacket(WorldPacket& data, ByteBuffer& /*content*/) const
+{
+ data.WriteBits(0, 26); // Not yet implemented used for guild achievements
+ ObjectGuid guid = GetPlayerGuid();
+
+ data.WriteBit(guid[7]);
+ data.WriteBit(guid[0]);
+ data.WriteBit(guid[6]);
+ data.WriteBit(guid[5]);
+ data.WriteBit(guid[4]);
+ data.WriteBit(guid[3]);
+ data.WriteBit(guid[1]);
+ data.WriteBit(guid[2]);
+
+ data.FlushBits();
+
+ data.WriteByteSeq(guid[5]);
+
+ data << uint32(GetFlags()); // 1 sticky
+ data << uint32(GetValue());
+ data << uint32(0); // always 0
+
+ data.WriteByteSeq(guid[7]);
+ data.WriteByteSeq(guid[6]);
+ data.WriteByteSeq(guid[2]);
+ data.WriteByteSeq(guid[3]);
+ data.WriteByteSeq(guid[0]);
+ data.WriteByteSeq(guid[4]);
+ data.WriteByteSeq(guid[1]);
+
+ data << uint32(GetGUID());
+ data << uint32(GetType());
+ data.AppendPackedTime(GetTimestamp());
+}
+
// RankInfo
void Guild::RankInfo::LoadFromDB(Field* fields)
{
@@ -514,13 +563,13 @@ void Guild::BankTab::SendText(Guild const* guild, WorldSession* session) const
if (session)
{
- sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [%s]: Tabid: %u, Text: %s"
+ sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [%s]: Tabid: %u, Text: %s"
, session->GetPlayerInfo().c_str(), m_tabId, m_text.c_str());
session->SendPacket(&data);
}
else
{
- sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str());
+ sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_QUERY_TEXT_RESULT [Broadcast]: Tabid: %u, Text: %s", m_tabId, m_text.c_str());
guild->BroadcastPacket(&data);
}
}
@@ -533,15 +582,17 @@ void Guild::Member::SetStats(Player* player)
m_class = player->getClass();
m_zoneId = player->GetZoneId();
m_accountId = player->GetSession()->GetAccountId();
+ m_achievementPoints = player->GetAchievementPoints();
}
-void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId)
+void Guild::Member::SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId, uint32 reputation)
{
m_name = name;
m_level = level;
m_class = _class;
m_zoneId = zoneId;
m_accountId = accountId;
+ m_totalReputation = reputation;
}
void Guild::Member::SetPublicNote(std::string const& publicNote)
@@ -610,8 +661,12 @@ bool Guild::Member::LoadFromDB(Field* fields)
fields[15].GetUInt8(), // characters.level
fields[16].GetUInt8(), // characters.class
fields[17].GetUInt16(), // characters.zone
- fields[18].GetUInt32()); // characters.account
+ fields[18].GetUInt32(), // characters.account
+ 0);
m_logoutTime = fields[19].GetUInt32(); // characters.logout_time
+ m_totalActivity = 0;
+ m_weekActivity = 0;
+ m_weekReputation = 0;
if (!CheckStats())
return false;
@@ -660,10 +715,16 @@ void Guild::Member::UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId,
CharacterDatabase.ExecuteOrAppend(trans, stmt);
}
-void Guild::Member::ResetValues(bool /*week*/)
+void Guild::Member::ResetValues(bool weekly /* = false*/)
{
for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
m_bankWithdraw[tabId] = 0;
+
+ if (weekly)
+ {
+ m_weekActivity = 0;
+ m_weekReputation = 0;
+ }
}
// Get amount of money/slots left for today.
@@ -1045,8 +1106,8 @@ Guild::Guild():
m_accountsNumber(0),
m_bankMoney(0),
m_eventLog(NULL),
+ m_newsLog(NULL),
m_achievementMgr(this),
- _newsLog(this),
_level(1),
_experience(0),
_todayExperience(0)
@@ -1062,6 +1123,8 @@ Guild::~Guild()
// Cleanup
delete m_eventLog;
m_eventLog = NULL;
+ delete m_newsLog;
+ m_newsLog = NULL;
for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
{
@@ -1095,6 +1158,8 @@ bool Guild::Create(Player* pLeader, std::string const& name)
m_bankMoney = 0;
m_createdDate = ::time(NULL);
_level = 1;
+ _experience = 0;
+ _todayExperience = 0;
_CreateLogHolders();
sLog->outDebug(LOG_FILTER_GUILD, "GUILD: creating guild [%s] for leader %s (%u)",
@@ -1128,7 +1193,7 @@ bool Guild::Create(Player* pLeader, std::string const& name)
if (ret)
{
- _BroadcastEvent(GE_FOUNDER, m_leaderGuid);
+ _BroadcastEvent(GE_FOUNDER, 0);
sScriptMgr->OnGuildCreate(this, pLeader, name);
}
@@ -1214,6 +1279,9 @@ void Guild::UpdateMemberData(Player* player, uint8 dataid, uint32 value)
case GUILD_MEMBER_DATA_ZONEID:
member->SetZoneId(value);
break;
+ case GUILD_MEMBER_DATA_ACHIEVEMENT_POINTS:
+ member->SetAchievementPoints(value);
+ break;
case GUILD_MEMBER_DATA_LEVEL:
member->SetLevel(value);
break;
@@ -1265,11 +1333,11 @@ void Guild::HandleRoster(WorldSession* session /*= NULL*/)
data.WriteBit(guid[7]);
memberData << uint8(member->GetClass());
- memberData << int32(0); // unk
+ memberData << uint32(member->GetTotalReputation());
memberData.WriteByteSeq(guid[0]);
- memberData << uint64(0); // weekly activity
+ memberData << uint64(member->GetWeekActivity());
memberData << uint32(member->GetRankId());
- memberData << uint32(0); // player->GetAchievementMgr().GetCompletedAchievementsAmount()
+ memberData << uint32(member->GetAchievementPoints());
// for (2 professions)
memberData << uint32(0) << uint32(0) << uint32(0);
@@ -1278,9 +1346,9 @@ void Guild::HandleRoster(WorldSession* session /*= NULL*/)
memberData.WriteByteSeq(guid[2]);
memberData << uint8(member->GetFlags());
memberData << uint32(member->GetZoneId());
- memberData << uint64(0); // Total activity
+ memberData << uint64(member->GetTotalActivity());
memberData.WriteByteSeq(guid[7]);
- memberData << uint32(member->GetRemainingWeeklyReputation());// Remaining guild week Rep
+ memberData << uint32(sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - member->GetWeekReputation());
if (pubNoteLength)
memberData.WriteString(member->GetPublicNote());
@@ -1371,7 +1439,6 @@ void Guild::HandleQuery(WorldSession* session)
void Guild::SendGuildRankInfo(WorldSession* session) const
{
- // perhaps move to guild.cpp.....
ByteBuffer rankData(100);
WorldPacket data(SMSG_GUILD_RANK, 100);
@@ -1385,7 +1452,7 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
data.WriteBits(rankInfo->GetName().length(), 7);
- rankData << uint32(i);
+ rankData << uint32(rankInfo->GetId());
for (uint8 j = 0; j < GUILD_BANK_MAX_TABS; ++j)
{
@@ -1399,12 +1466,13 @@ void Guild::SendGuildRankInfo(WorldSession* session) const
if (rankInfo->GetName().length())
rankData.WriteString(rankInfo->GetName());
- rankData << uint32(rankInfo->GetId());
+ rankData << uint32(i);
}
data.FlushBits();
data.append(rankData);
session->SendPacket(&data);
+ sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_RANK [%s]", session->GetPlayerInfo().c_str());
}
void Guild::HandleSetMOTD(WorldSession* session, std::string const& motd)
@@ -1517,7 +1585,7 @@ void Guild::HandleSetMemberNote(WorldSession* session, std::string const& note,
else
member->SetOfficerNote(note);
- HandleRoster(session); // FIXME - We should send SMSG_GUILD_SET_NOTE
+ HandleRoster(session); // FIXME - We should send SMSG_GUILD_MEMBER_UPDATE_NOTE
}
}
@@ -1539,7 +1607,7 @@ void Guild::HandleSetRankInfo(WorldSession* session, uint8 rankId, std::string c
char aux[2];
sprintf(aux, "%u", rankId);
- _BroadcastEvent(GE_RANK_UPDATED, 0, aux, name.c_str());
+ _BroadcastEvent(GE_RANK_UPDATED, 0, aux);
}
}
@@ -1556,26 +1624,24 @@ void Guild::HandleBuyBankTab(WorldSession* session, uint8 tabId)
if (_GetPurchasedTabsSize() >= GUILD_BANK_MAX_TABS)
return;
- if (tabId != _GetPurchasedTabsSize())
- return;
-
- uint32 tabCost = _GetGuildBankTabPrice(tabId) * GOLD;
- if (!tabCost)
- return;
+ if (tabId != _GetPurchasedTabsSize())
+ return;
+ uint32 tabCost = _GetGuildBankTabPrice(tabId) * GOLD;
+ if (!tabCost)
+ return;
- if (!player->HasEnoughMoney(uint64(tabCost))) // Should not happen, this is checked by client
- return;
+ if (!player->HasEnoughMoney(uint64(tabCost))) // Should not happen, this is checked by client
+ return;
- player->ModifyMoney(-int64(tabCost));
+ player->ModifyMoney(-int64(tabCost));
uint8 rankId = member->GetRankId();
_CreateNewBankTab();
- _SetRankBankMoneyPerDay(rankId, uint32(GUILD_WITHDRAW_MONEY_UNLIMITED));
GuildBankRightsAndSlots rightsAndSlots(tabId);
_SetRankBankTabRightsAndSlots(rankId, rightsAndSlots);
- //HandleRoster(); // Broadcast for tab rights update
- SendBankList(session, tabId, false, true);
+ _BroadcastEvent(GE_BANK_TAB_PURCHASED, 0);
+ SendPermissions(session); /// Hack to force client to update permissions
}
void Guild::HandleInviteMember(WorldSession* session, std::string const& name)
@@ -1749,7 +1815,7 @@ void Guild::HandleRemoveMember(WorldSession* session, uint64 guid)
DeleteMember(guid, false, true);
_LogEvent(GUILD_EVENT_LOG_UNINVITE_PLAYER, player->GetGUIDLow(), GUID_LOPART(guid));
_BroadcastEvent(GE_REMOVED, 0, name.c_str(), player->GetName().c_str());
- SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_COMMAND_SUCCESS, name);
+ SendCommandResult(session, GUILD_COMMAND_REMOVE, ERR_GUILD_COMMAND_SUCCESS, name);
}
}
}
@@ -1847,11 +1913,7 @@ void Guild::HandleAddNewRank(WorldSession* session, std::string const& name)
// Only leader can add new rank
if (_IsLeader(session->GetPlayer()))
if (_CreateRank(name, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK))
- {
- char aux[2];
- sprintf(aux, "%u", size);
- _BroadcastEvent(GE_RANK_CREATED, 0, aux, name.c_str());
- }
+ _BroadcastEvent(GE_RANK_CREATED, 0);
}
void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
@@ -1860,18 +1922,18 @@ void Guild::HandleRemoveRank(WorldSession* session, uint8 rankId)
if (_GetRanksSize() <= GUILD_RANKS_MIN_COUNT || rankId >= _GetRanksSize() || !_IsLeader(session->GetPlayer()))
return;
- // Delete bank rights for rank
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK);
- stmt->setUInt32(0, m_id);
- stmt->setUInt8(1, rankId);
- CharacterDatabase.Execute(stmt);
- // Delete rank
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK);
- stmt->setUInt32(0, m_id);
- stmt->setUInt8(1, rankId);
- CharacterDatabase.Execute(stmt);
+ // Delete bank rights for rank
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK);
+ stmt->setUInt32(0, m_id);
+ stmt->setUInt8(1, rankId);
+ CharacterDatabase.Execute(stmt);
+ // Delete rank
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_RANK);
+ stmt->setUInt32(0, m_id);
+ stmt->setUInt8(1, rankId);
+ CharacterDatabase.Execute(stmt);
- m_ranks.erase(m_ranks.begin() + rankId-1);
+ m_ranks.erase(m_ranks.begin() + rankId);
_BroadcastEvent(GE_RANK_DELETED, rankId);
}
@@ -1994,6 +2056,61 @@ void Guild::SendEventLog(WorldSession* session) const
sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_EVENT_LOG_QUERY_RESULT [%s]", session->GetPlayerInfo().c_str());
}
+void Guild::SendNewsUpdate(WorldSession* session)
+{
+ uint32 size = m_newsLog->GetSize();
+ GuildLog* logs = m_newsLog->GetGuildLog();
+
+ if (!logs)
+ return;
+
+ WorldPacket data(SMSG_GUILD_NEWS_UPDATE, (21 + size * (26 + 8)) / 8 + (8 + 6 * 4) * size);
+ data.WriteBits(size, 21);
+
+ for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
+ {
+ data.WriteBits(0, 26); // Not yet implemented used for guild achievements
+ ObjectGuid guid = ((NewsLogEntry*)(*itr))->GetPlayerGuid();
+
+ data.WriteBit(guid[7]);
+ data.WriteBit(guid[0]);
+ data.WriteBit(guid[6]);
+ data.WriteBit(guid[5]);
+ data.WriteBit(guid[4]);
+ data.WriteBit(guid[3]);
+ data.WriteBit(guid[1]);
+ data.WriteBit(guid[2]);
+ }
+
+ data.FlushBits();
+
+ for (GuildLog::const_iterator itr = logs->begin(); itr != logs->end(); ++itr)
+ {
+ NewsLogEntry* news = (NewsLogEntry*)(*itr);
+ ObjectGuid guid = news->GetPlayerGuid();
+ data.WriteByteSeq(guid[5]);
+
+ data << uint32(news->GetFlags()); // 1 sticky
+ data << uint32(news->GetValue());
+ data << uint32(0);
+
+ data.WriteByteSeq(guid[7]);
+ data.WriteByteSeq(guid[6]);
+ data.WriteByteSeq(guid[2]);
+ data.WriteByteSeq(guid[3]);
+ data.WriteByteSeq(guid[0]);
+ data.WriteByteSeq(guid[4]);
+ data.WriteByteSeq(guid[1]);
+
+ data << uint32(news->GetGUID());
+ data << uint32(news->GetType());
+ data.AppendPackedTime(news->GetTimestamp());
+ }
+
+ session->SendPacket(&data);
+ sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_NEWS_UPDATE [%s]", session->GetPlayerInfo().c_str());
+}
+
void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
{
// GUILD_BANK_MAX_TABS send by client for money log
@@ -2011,8 +2128,6 @@ void Guild::SendBankLog(WorldSession* session, uint8 tabId) const
}
}
-
-
void Guild::SendBankTabText(WorldSession* session, uint8 tabId) const
{
if (BankTab const* tab = GetBankTab(tabId))
@@ -2050,7 +2165,7 @@ void Guild::SendMoneyInfo(WorldSession* session) const
return;
int32 amount = _GetMemberRemainingMoney(member);
- WorldPacket data(SMSG_GUILD_BANK_MONEY_WITHDRAWN, 4);
+ WorldPacket data(SMSG_GUILD_BANK_MONEY_WITHDRAWN, 8);
data << int64(amount);
session->SendPacket(&data);
sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_BANK_MONEY_WITHDRAWN [%s] Money: %u", session->GetPlayerInfo().c_str(), amount);
@@ -2058,6 +2173,11 @@ void Guild::SendMoneyInfo(WorldSession* session) const
void Guild::SendLoginInfo(WorldSession* session)
{
+ Player* player = session->GetPlayer();
+ Member* member = GetMember(player->GetGUID());
+ if (!member)
+ return;
+
/*
Login sequence:
SMSG_GUILD_EVENT - GE_MOTD
@@ -2077,13 +2197,11 @@ void Guild::SendLoginInfo(WorldSession* session)
sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_EVENT [%s] MOTD", session->GetPlayerInfo().c_str());
- Player* player = session->GetPlayer();
-
SendGuildRankInfo(session);
_BroadcastEvent(GE_SIGNED_ON, player->GetGUID(), player->GetName().c_str());
// Send to self separately, player is not in world yet and is not found by _BroadcastEvent
- data.Initialize(SMSG_GUILD_EVENT, 1 + 1 + session->GetPlayer()->GetName().size() + 8);
+ data.Initialize(SMSG_GUILD_EVENT, 1 + 1 + player->GetName().size() + 8);
data << uint8(GE_SIGNED_ON);
data << uint8(1);
data << player->GetName();
@@ -2099,27 +2217,14 @@ void Guild::SendLoginInfo(WorldSession* session)
for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i)
if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i))
if (entry->Level <= GetLevel())
- session->GetPlayer()->learnSpell(entry->SpellId, true);
+ player->learnSpell(entry->SpellId, true);
- SendGuildReputationWeeklyCap(session);
+ SendGuildReputationWeeklyCap(session, member->GetWeekReputation());
- GetAchievementMgr().SendAllAchievementData(player);
+ m_achievementMgr.SendAllAchievementData(player);
- if (Member* member = GetMember(player->GetGUID()))
- {
- member->SetStats(player);
- member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
- }
-}
-
-void Guild::SendGuildReputationWeeklyCap(WorldSession* session) const
-{
- if (Member const* member = GetMember(session->GetPlayer()->GetGUID()))
- {
- WorldPacket data(SMSG_GUILD_REPUTATION_WEEKLY_CAP, 4);
- data << uint32(member->GetRemainingWeeklyReputation());
- session->SendPacket(&data);
- }
+ member->SetStats(player);
+ member->AddFlag(GUILDMEMBER_STATUS_ONLINE);
}
// Loading methods
@@ -2237,6 +2342,21 @@ bool Guild::LoadBankEventLogFromDB(Field* fields)
return true;
}
+void Guild::LoadGuildNewsLogFromDB(Field* fields)
+{
+ if (!m_newsLog->CanInsert())
+ return;
+
+ m_newsLog->LoadEvent(new NewsLogEntry(
+ m_id, // guild id
+ fields[1].GetUInt32(), // guid
+ fields[6].GetUInt32(), // timestamp //64 bits?
+ GuildNews(fields[2].GetUInt8()), // type
+ fields[3].GetUInt32(), // player guid
+ fields[4].GetUInt32(), // Flags
+ fields[5].GetUInt32())); // value
+}
+
void Guild::LoadBankTabFromDB(Field* fields)
{
uint8 tabId = fields[1].GetUInt8();
@@ -2405,11 +2525,11 @@ bool Guild::AddMember(uint64 guid, uint8 rankId)
std::string name;
if (player)
{
+ m_members[lowguid] = member;
player->SetInGuild(m_id);
player->SetGuildIdInvited(0);
player->SetRank(rankId);
player->SetGuildLevel(GetLevel());
- member->SetStats(player);
SendLoginInfo(player->GetSession());
name = player->GetName();
}
@@ -2430,17 +2550,19 @@ bool Guild::AddMember(uint64 guid, uint8 rankId)
fields[1].GetUInt8(),
fields[2].GetUInt8(),
fields[3].GetUInt16(),
- fields[4].GetUInt32());
+ fields[4].GetUInt32(),
+ 0);
ok = member->CheckStats();
}
+
if (!ok)
{
delete member;
return false;
}
+ m_members[lowguid] = member;
}
- m_members[lowguid] = member;
SQLTransaction trans(NULL);
member->SaveToDB(trans);
@@ -2448,7 +2570,7 @@ bool Guild::AddMember(uint64 guid, uint8 rankId)
_UpdateAccountsNumber();
_LogEvent(GUILD_EVENT_LOG_JOIN_GUILD, lowguid);
_BroadcastEvent(GE_JOINED, guid, name.c_str());
- sGuildFinderMgr->RemoveMembershipRequest(player->GetGUIDLow(), GUID_LOPART(this->GetGUID()));
+ sGuildFinderMgr->RemoveMembershipRequest(player->GetGUIDLow(), GUID_LOPART(this->GetGUID()));
// Call scripts if member was succesfully added (and stored to database)
sScriptMgr->OnGuildAddMember(this, player, rankId);
@@ -2507,6 +2629,7 @@ void Guild::DeleteMember(uint64 guid, bool isDisbanding, bool isKicked)
player->SetInGuild(0);
player->SetRank(0);
player->SetGuildLevel(0);
+
for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i)
if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i))
if (entry->Level <= GetLevel())
@@ -2529,7 +2652,7 @@ bool Guild::ChangeMemberRank(uint64 guid, uint8 newRank)
return false;
}
-bool Guild::IsMember(uint64 guid)
+bool Guild::IsMember(uint64 guid) const
{
Members::const_iterator itr = m_members.find(GUID_LOPART(guid));
return itr != m_members.end();
@@ -2577,6 +2700,7 @@ void Guild::SetBankTabText(uint8 tabId, std::string const& text)
void Guild::_CreateLogHolders()
{
m_eventLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
+ m_newsLog = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT));
for (uint8 tabId = 0; tabId <= GUILD_BANK_MAX_TABS; ++tabId)
m_bankEventLog[tabId] = new LogHolder(m_id, sWorld->getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
}
@@ -3222,7 +3346,8 @@ void Guild::SendGuildRanksUpdate(uint64 setterGuid, uint64 targetGuid, uint32 ra
member->ChangeRank(rank);
- sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Sent SMSG_GUILD_RANKS_UPDATE");
+ sLog->outDebug(LOG_FILTER_NETWORKIO, "SMSG_GUILD_RANKS_UPDATE [Broadcast] Target: %u, Issuer: %u, RankId: %u",
+ GUID_LOPART(targetGuid), GUID_LOPART(setterGuid), rank);
}
void Guild::GiveXP(uint32 xp, Player* source)
@@ -3275,11 +3400,11 @@ void Guild::GiveXP(uint32 xp, Player* source)
}
}
- GetNewsLog().AddNewEvent(GUILD_NEWS_LEVEL_UP, time(NULL), 0, 0, _level);
- GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL, GetLevel(), 0, NULL, source);
+ AddGuildNews(GUILD_NEWS_LEVEL_UP, 0, 0, _level);
+ UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL, GetLevel(), 0, NULL, source);
}
-void Guild::SendGuildXP(WorldSession* session) const
+void Guild::SendGuildXP(WorldSession* session /* = NULL */) const
{
//Member const* member = GetMember(session->GetGuidLow());
@@ -3292,144 +3417,81 @@ void Guild::SendGuildXP(WorldSession* session) const
session->SendPacket(&data);
}
-void Guild::GuildNewsLog::AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data)
+void Guild::SendGuildReputationWeeklyCap(WorldSession* session, uint32 reputation) const
{
- uint32 id = _newsLog.size();
-
- GuildNewsEntry& log = _newsLog[id];
- log.EventType = eventType;
- log.PlayerGuid = playerGuid;
- log.Data = data;
- log.Flags = flags;
- log.Date = date;
-
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SAVE_GUILD_NEWS);
- stmt->setUInt32(0, GetGuild()->GetId());
- stmt->setUInt32(1, id);
- stmt->setUInt32(2, log.EventType);
- stmt->setUInt64(3, log.PlayerGuid);
- stmt->setUInt32(4, log.Data);
- stmt->setUInt32(5, log.Flags);
- stmt->setUInt32(6, uint32(log.Date));
- CharacterDatabase.Execute(stmt);
-
- WorldPacket packet;
- BuildNewsData(id, log, packet);
- GetGuild()->BroadcastPacket(&packet);
+ uint32 cap = sWorld->getIntConfig(CONFIG_GUILD_WEEKLY_REP_CAP) - reputation;
+ WorldPacket data(SMSG_GUILD_REPUTATION_WEEKLY_CAP, 4);
+ data << uint32(cap);
+ session->SendPacket(&data);
+ sLog->outDebug(LOG_FILTER_GUILD, "SMSG_GUILD_REPUTATION_WEEKLY_CAP [%s]: Left: %u",
+ session->GetPlayerInfo().c_str(), cap);
}
-void Guild::GuildNewsLog::LoadFromDB(PreparedQueryResult result)
+void Guild::ResetTimes(bool weekly)
{
- if (!result)
- return;
- do
+ _todayExperience = 0;
+ for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
{
- Field* fields = result->Fetch();
- uint32 id = fields[0].GetInt32();
- GuildNewsEntry& log = _newsLog[id];
- log.EventType = GuildNews(fields[1].GetInt32());
- log.PlayerGuid = fields[2].GetInt64();
- log.Data = fields[3].GetInt32();
- log.Flags = fields[4].GetInt32();
- log.Date = time_t(fields[5].GetInt32());
+ itr->second->ResetValues(weekly);
+ if (Player* player = itr->second->FindPlayer())
+ {
+ //SendGuildXP(player->GetSession());
+ WorldPacket data(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit
+ player->GetSession()->SendPacket(&data);
+ }
}
- while (result->NextRow());
}
-void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data)
+void Guild::AddGuildNews(uint8 type, uint64 guid, uint32 flags, uint32 value)
{
- data.Initialize(SMSG_GUILD_NEWS_UPDATE, 7 + 32);
- data.WriteBits(1, 21); // size, we are only sending 1 news here
+ uint32 lowGuid = GUID_LOPART(guid);
+ NewsLogEntry* news = new NewsLogEntry(m_id, m_newsLog->GetNextGUID(), GuildNews(type), lowGuid, flags, value);
- data.WriteBits(0, 26); // Not yet implemented used for guild achievements
- ObjectGuid guid = guildNew.PlayerGuid;
-
- data.WriteBit(guid[7]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
-
- data.FlushBits();
+ SQLTransaction trans = CharacterDatabase.BeginTransaction();
+ m_newsLog->AddEvent(trans, news);
+ CharacterDatabase.CommitTransaction(trans);
- data.WriteByteSeq(guid[5]);
+ WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32);
+ data.WriteBits(1, 21); // size, we are only sending 1 news here
+ ByteBuffer buffer;
+ news->WritePacket(data, buffer);
- data << uint32(guildNew.Flags); // 1 sticky
- data << uint32(guildNew.Data);
- data << uint32(0); // always 0
+ BroadcastPacket(&data);
+}
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
+bool Guild::HasAchieved(uint32 achievementId) const
+{
+ return m_achievementMgr.HasAchieved(achievementId);
+}
- data << uint32(id);
- data << uint32(guildNew.EventType);
- data.AppendPackedTime(guildNew.Date);
+void Guild::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2, Unit* unit, Player* player)
+{
+ m_achievementMgr.UpdateAchievementCriteria(type, miscValue1, miscValue2, unit, player);
}
-void Guild::GuildNewsLog::BuildNewsData(WorldPacket& data)
+void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky)
{
- data.Initialize(SMSG_GUILD_NEWS_UPDATE, (21 + _newsLog.size() * (26 + 8)) / 8 + (8 + 6 * 4) * _newsLog.size());
- data.WriteBits(_newsLog.size(), 21);
+ GuildLog* logs = m_newsLog->GetGuildLog();
+ GuildLog::iterator itr = logs->begin();
+ while (itr != logs->end() && (*itr)->GetGUID() != newsId)
+ ++itr;
- for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++)
+ if (itr == logs->end())
{
- data.WriteBits(0, 26); // Not yet implemented used for guild achievements
- ObjectGuid guid = it->second.PlayerGuid;
-
- data.WriteBit(guid[7]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
+ sLog->outDebug(LOG_FILTER_GUILD, "HandleNewsSetSticky: [%s] requested unknown newsId %u - Sticky: %u",
+ session->GetPlayerInfo().c_str(), newsId, sticky);
+ return;
}
- data.FlushBits();
-
- for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++)
- {
- ObjectGuid guid = it->second.PlayerGuid;
- data.WriteByteSeq(guid[5]);
+ NewsLogEntry* news = (NewsLogEntry*)(*itr);
+ news->SetSticky(sticky);
- data << uint32(it->second.Flags); // 1 sticky
- data << uint32(it->second.Data);
- data << uint32(0);
+ sLog->outDebug(LOG_FILTER_GUILD, "HandleNewsSetSticky: [%s] chenged newsId %u sticky to %u",
+ session->GetPlayerInfo().c_str(), newsId, sticky);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
-
- data << uint32(it->first);
- data << uint32(it->second.EventType);
- data.AppendPackedTime(it->second.Date);
- }
-}
-
-void Guild::ResetTimes(bool week)
-{
- _todayExperience = 0;
- for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
- {
- itr->second->ResetValues(week);
- if (Player* player = itr->second->FindPlayer())
- {
- //SendGuildXP(player->GetSession());
- WorldPacket data(SMSG_GUILD_MEMBER_DAILY_RESET, 0); // tells the client to request bank withdrawal limit
- player->GetSession()->SendPacket(&data);
- }
- }
+ WorldPacket data(SMSG_GUILD_NEWS_UPDATE, 7 + 32);
+ data.WriteBits(1, 21);
+ ByteBuffer buffer;
+ news->WritePacket(data, buffer);
+ session->SendPacket(&data);
}
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 9a0b9e682e4..796d8359dea 100755
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -33,7 +33,7 @@ enum GuildMisc
GUILD_BANK_MAX_TABS = 8, // send by client for money log also
GUILD_BANK_MAX_SLOTS = 98,
GUILD_BANK_MONEY_LOGS_TAB = 100, // used for money log in DB
- GUILD_RANKS_MIN_COUNT = 5,
+ GUILD_RANKS_MIN_COUNT = 2,
GUILD_RANKS_MAX_COUNT = 10,
GUILD_RANK_NONE = 0xFF,
GUILD_WITHDRAW_MONEY_UNLIMITED = 0xFFFFFFFF,
@@ -46,6 +46,7 @@ enum GuildMisc
enum GuildMemberData
{
GUILD_MEMBER_DATA_ZONEID,
+ GUILD_MEMBER_DATA_ACHIEVEMENT_POINTS,
GUILD_MEMBER_DATA_LEVEL,
};
@@ -255,15 +256,6 @@ enum GuildNews
GUILD_NEWS_LEVEL_UP = 6,
};
-struct GuildNewsEntry
-{
- GuildNews EventType;
- time_t Date;
- uint64 PlayerGuid;
- uint32 Flags;
- uint32 Data;
-};
-
struct GuildReward
{
uint32 Entry;
@@ -275,8 +267,6 @@ struct GuildReward
uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 };
-typedef std::map<uint32, GuildNewsEntry> GuildNewsLogMap;
-
// Emblem info
class EmblemInfo
{
@@ -347,29 +337,35 @@ private:
m_zoneId(0),
m_level(0),
m_class(0),
+ m_flags(GUILDMEMBER_STATUS_NONE),
m_logoutTime(::time(NULL)),
m_accountId(0),
- m_rankId(rankId)
+ m_rankId(rankId),
+ m_achievementPoints(0),
+ m_totalActivity(0),
+ m_weekActivity(0),
+ m_totalReputation(0),
+ m_weekReputation(0)
{
memset(m_bankWithdraw, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(int32));
}
void SetStats(Player* player);
- void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId);
+ void SetStats(std::string const& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId, uint32 reputation);
bool CheckStats() const;
void SetPublicNote(std::string const& publicNote);
void SetOfficerNote(std::string const& officerNote);
void SetZoneId(uint32 id) { m_zoneId = id; }
+ void SetAchievementPoints(uint32 val) { m_achievementPoints = val; }
void SetLevel(uint8 var) { m_level = var; }
+ void AddReputation(uint32& reputation);
+ void AddActivity(uint64 activity);
void AddFlag(uint8 var) { m_flags |= var; }
void RemFlag(uint8 var) { m_flags &= ~var; }
void ResetFlags() { m_flags = GUILDMEMBER_STATUS_NONE; }
- std::string GetPublicNote() { return m_publicNote; };
- std::string GetOfficerNote() { return m_officerNote; };
-
bool LoadFromDB(Field* fields);
void SaveToDB(SQLTransaction& trans) const;
@@ -384,6 +380,12 @@ private:
uint8 GetLevel() const { return m_level; }
uint8 GetFlags() const { return m_flags; }
uint32 GetZoneId() const { return m_zoneId; }
+ uint32 GetAchievementPoints() const { return m_achievementPoints; }
+ uint64 GetTotalActivity() const { return m_totalActivity; }
+ uint64 GetWeekActivity() const { return m_weekActivity; }
+ uint32 GetTotalReputation() const { return m_totalReputation; }
+ uint32 GetWeekReputation() const { return m_weekReputation; }
+
bool IsOnline() { return (m_flags & GUILDMEMBER_STATUS_ONLINE); }
void ChangeRank(uint8 newRank);
@@ -395,12 +397,10 @@ private:
void UpdateBankWithdrawValue(SQLTransaction& trans, uint8 tabId, uint32 amount);
int32 GetBankWithdrawValue(uint8 tabId) const;
- void ResetValues(bool week);
+ void ResetValues(bool weekly = false);
inline Player* FindPlayer() const { return ObjectAccessor::FindPlayer(m_guid); }
- uint32 GetRemainingWeeklyReputation() const { return 0; }
-
private:
uint32 m_guildId;
// Fields from characters table
@@ -418,30 +418,11 @@ private:
std::string m_officerNote;
int32 m_bankWithdraw[GUILD_BANK_MAX_TABS + 1];
- };
-
- // News Log class
- class GuildNewsLog
- {
- public:
- GuildNewsLog(Guild* guild) : _guild(guild) { }
-
- void LoadFromDB(PreparedQueryResult result);
- void BuildNewsData(WorldPacket& data);
- void BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data);
- void AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data);
- GuildNewsEntry* GetNewsById(uint32 id)
- {
- GuildNewsLogMap::iterator itr = _newsLog.find(id);
- if (itr != _newsLog.end())
- return &itr->second;
- return NULL;
- }
- Guild* GetGuild() const { return _guild; }
-
- private:
- Guild* _guild;
- GuildNewsLogMap _newsLog;
+ uint32 m_achievementPoints;
+ uint64 m_totalActivity;
+ uint64 m_weekActivity;
+ uint32 m_totalReputation;
+ uint32 m_weekReputation;
};
// Base class for event entries
@@ -504,11 +485,11 @@ private:
return IsMoneyEvent(m_eventType);
}
- BankEventLogEntry(uint32 guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) :
+ BankEventLogEntry(uint32 guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId) :
LogEntry(guildId, guid), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
- BankEventLogEntry(uint32 guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId) :
+ BankEventLogEntry(uint32 guildId, uint32 guid, time_t timestamp, uint8 tabId, GuildBankEventLogTypes eventType, uint32 playerGuid, uint64 itemOrMoney, uint16 itemStackCount, uint8 destTabId) :
LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
@@ -521,18 +502,52 @@ private:
GuildBankEventLogTypes m_eventType;
uint8 m_bankTabId;
uint32 m_playerGuid;
- uint32 m_itemOrMoney;
+ uint64 m_itemOrMoney;
uint16 m_itemStackCount;
uint8 m_destTabId;
};
+ // News log entry
+ class NewsLogEntry : public LogEntry
+ {
+ public:
+ NewsLogEntry(uint32 guildId, uint32 guid, GuildNews type, uint32 playerGuid, uint32 flags, uint32 value) :
+ LogEntry(guildId, guid), m_type(type), m_playerGuid(playerGuid), m_flags(flags), m_value(value) { }
+
+ NewsLogEntry(uint32 guildId, uint32 guid, time_t timestamp, GuildNews type, uint32 playerGuid, uint32 flags, uint32 value) :
+ LogEntry(guildId, guid, timestamp), m_type(type), m_playerGuid(playerGuid), m_flags(flags), m_value(value) { }
+
+ ~NewsLogEntry() { }
+
+ GuildNews GetType() const { return m_type; }
+ uint64 GetPlayerGuid() const { return m_playerGuid ? MAKE_NEW_GUID(m_playerGuid, 0, HIGHGUID_PLAYER) : 0; }
+ uint32 GetValue() const { return m_value; }
+ uint32 GetFlags() const { return m_flags; }
+ void SetSticky(bool sticky)
+ {
+ if (sticky)
+ m_flags |= 1;
+ else
+ m_flags &= ~1;
+ }
+
+ void SaveToDB(SQLTransaction& trans) const;
+ void WritePacket(WorldPacket& data, ByteBuffer& content) const;
+
+ private:
+ GuildNews m_type;
+ uint32 m_playerGuid;
+ uint32 m_flags;
+ uint32 m_value;
+ };
+
// Class encapsulating work with events collection
typedef std::list<LogEntry*> GuildLog;
class LogHolder
{
public:
- LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(uint32(GUILD_EVENT_LOG_GUID_UNDEFINED)) { }
+ LogHolder(uint32 guildId, uint32 maxRecords) : m_guildId(guildId), m_maxRecords(maxRecords), m_nextGUID(GUILD_EVENT_LOG_GUID_UNDEFINED) { }
~LogHolder();
uint8 GetSize() const { return uint8(m_log.size()); }
@@ -545,6 +560,7 @@ private:
// Writes information about all events to packet
void WritePacket(WorldPacket& data) const;
uint32 GetNextGUID();
+ GuildLog* GetGuildLog() { return &m_log; } // Hack needed for news as WritePacket can't be used
private:
GuildLog m_log;
@@ -559,13 +575,13 @@ private:
public:
RankInfo(): m_guildId(0), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
RankInfo(uint32 guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
- RankInfo(uint32 guildId, uint32 rankId, std::string const& name, uint32 rights, uint32 money) :
+ RankInfo(uint32 guildId, uint8 rankId, std::string const& name, uint32 rights, uint32 money) :
m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { }
void LoadFromDB(Field* fields);
void SaveToDB(SQLTransaction& trans) const;
- uint32 GetId() const { return m_rankId; }
+ uint8 GetId() const { return m_rankId; }
std::string const& GetName() const { return m_name; }
void SetName(std::string const& name);
@@ -592,7 +608,7 @@ private:
private:
uint32 m_guildId;
- uint32 m_rankId;
+ uint8 m_rankId;
std::string m_name;
uint32 m_rights;
uint32 m_bankMoneyPerDay;
@@ -752,7 +768,7 @@ public:
std::string const& GetInfo() const { return m_info; }
// Handle client commands
- void HandleRoster(WorldSession* session = NULL); // NULL = broadcast
+ void HandleRoster(WorldSession* session = NULL);
void HandleQuery(WorldSession* session);
void HandleSetMOTD(WorldSession* session, std::string const& motd);
void HandleSetInfo(WorldSession* session, std::string const& info);
@@ -766,8 +782,8 @@ public:
void HandleAcceptMember(WorldSession* session);
void HandleLeaveMember(WorldSession* session);
void HandleRemoveMember(WorldSession* session, uint64 guid);
- void HandleUpdateMemberRank(WorldSession* session, uint64 targetGuid, bool demote);
- void HandleSetMemberRank(WorldSession* session, uint64 targetGuid, uint64 setterGuid, uint32 rank);
+ void HandleUpdateMemberRank(WorldSession* session, uint64 guid, bool demote);
+ void HandleSetMemberRank(WorldSession* session, uint64 guid, uint64 setterGuid, uint32 rank);
void HandleAddNewRank(WorldSession* session, std::string const& name);
void HandleRemoveRank(WorldSession* session, uint8 rankId);
void HandleMemberDepositMoney(WorldSession* session, uint64 amount, bool cashFlow = false);
@@ -775,6 +791,7 @@ public:
void HandleMemberLogout(WorldSession* session);
void HandleDisband(WorldSession* session);
void HandleGuildPartyRequest(WorldSession* session);
+ void HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky);
void UpdateMemberData(Player* player, uint8 dataid, uint32 value);
void OnPlayerStatusChange(Player* player, uint32 flag, bool state);
@@ -784,15 +801,16 @@ public:
void SendEventLog(WorldSession* session) const;
void SendBankLog(WorldSession* session, uint8 tabId) const;
void SendBankList(WorldSession* session, uint8 tabId, bool withContent, bool withTabInfo) const;
- void SendGuildReputationWeeklyCap(WorldSession* session) const;
- void SendGuildXP(WorldSession* session) const;
+ void SendGuildXP(WorldSession* session = NULL) const;
void SendBankTabText(WorldSession* session, uint8 tabId) const;
void SendPermissions(WorldSession* session) const;
void SendMoneyInfo(WorldSession* session) const;
void SendLoginInfo(WorldSession* session);
+ void SendNewsUpdate(WorldSession* session);
// Load from DB
bool LoadFromDB(Field* fields);
+ void LoadGuildNewsLogFromDB(Field* fields);
void LoadRankFromDB(Field* fields);
bool LoadMemberFromDB(Field* fields);
bool LoadEventLogFromDB(Field* fields);
@@ -822,7 +840,7 @@ public:
bool AddMember(uint64 guid, uint8 rankId = GUILD_RANK_NONE);
void DeleteMember(uint64 guid, bool isDisbanding = false, bool isKicked = false);
bool ChangeMemberRank(uint64 guid, uint8 newRank);
- bool IsMember(uint64 guid);
+ bool IsMember(uint64 guid) const;
uint32 GetMembersCount() { return m_members.size(); }
// Bank
@@ -836,15 +854,18 @@ public:
AchievementMgr<Guild> const& GetAchievementMgr() const { return m_achievementMgr; }
// Guild leveling
- uint32 GetLevel() const { return _level; }
+ uint8 GetLevel() const { return _level; }
void GiveXP(uint32 xp, Player* source);
uint64 GetExperience() const { return _experience; }
uint64 GetTodayExperience() const { return _todayExperience; }
- void ResetDailyExperience();
- GuildNewsLog& GetNewsLog() { return _newsLog; }
+
+ void AddGuildNews(uint8 type, uint64 guid, uint32 flags, uint32 value);
EmblemInfo const& GetEmblemInfo() const { return m_emblemInfo; }
- void ResetTimes(bool week);
+ void ResetTimes(bool weekly);
+
+ bool HasAchieved(uint32 achievementId) const;
+ void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1, uint32 miscValue2, Unit* unit, Player* player);
protected:
uint32 m_id;
@@ -865,11 +886,10 @@ protected:
// These are actually ordered lists. The first element is the oldest entry.
LogHolder* m_eventLog;
LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1];
-
+ LogHolder* m_newsLog;
AchievementMgr<Guild> m_achievementMgr;
- GuildNewsLog _newsLog;
- uint32 _level;
+ uint8 _level;
uint64 _experience;
uint64 _todayExperience;
@@ -877,7 +897,7 @@ private:
inline uint8 _GetRanksSize() const { return uint8(m_ranks.size()); }
inline const RankInfo* GetRankInfo(uint8 rankId) const { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; }
inline RankInfo* GetRankInfo(uint8 rankId) { return rankId < _GetRanksSize() ? &m_ranks[rankId] : NULL; }
- inline bool _HasRankRight(Player* player, uint32 right) const
+ inline bool _HasRankRight(Player const* player, uint32 right) const
{
if (player)
if (Member const* member = GetMember(player->GetGUID()))
@@ -957,8 +977,7 @@ private:
void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const;
void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const;
- void _SendBankList(WorldSession* session = NULL, uint8 tabId = 0, bool sendFullSlots = false, SlotIds *slots = NULL) const;
-
+ void SendGuildReputationWeeklyCap(WorldSession* session, uint32 reputation) const;
void SendGuildRanksUpdate(uint64 setterGuid, uint64 targetGuid, uint32 rank);
void _BroadcastEvent(GuildEvents guildEvent, uint64 guid, const char* param1 = NULL, const char* param2 = NULL, const char* param3 = NULL) const;
diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp
index 38a5699510e..1cb8419be7c 100644
--- a/src/server/game/Guilds/GuildMgr.cpp
+++ b/src/server/game/Guilds/GuildMgr.cpp
@@ -197,13 +197,13 @@ void GuildMgr::LoadGuilds()
CharacterDatabase.DirectExecute("DELETE gm FROM guild_member gm LEFT JOIN guild g ON gm.guildId = g.guildId WHERE g.guildId IS NULL");
CharacterDatabase.DirectExecute("DELETE gm FROM guild_member_withdraw gm LEFT JOIN guild_member g ON gm.guid = g.guid WHERE g.guid IS NULL");
- // 0 1 2 3 4 5 6 7 8 9 10
- QueryResult result = CharacterDatabase.Query("SELECT guildid, gm.guid, rank, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, "
+ // 0 1 2 3 4 5 6 7 8 9 10
+ QueryResult result = CharacterDatabase.Query("SELECT gm.guildid, gm.guid, rank, pnote, offnote, w.tab0, w.tab1, w.tab2, w.tab3, w.tab4, w.tab5, "
// 11 12 13 14 15 16 17 18 19
"w.tab6, w.tab7, w.money, c.name, c.level, c.class, c.zone, c.account, c.logout_time "
"FROM guild_member gm "
"LEFT JOIN guild_member_withdraw w ON gm.guid = w.guid "
- "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY guildid ASC");
+ "LEFT JOIN characters c ON c.guid = gm.guid ORDER BY gm.guildid ASC");
if (!result)
sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild members. DB table `guild_member` is empty.");
@@ -328,7 +328,39 @@ void GuildMgr::LoadGuilds()
}
}
- // 7. Load all guild bank tabs
+ // 7. Load all news event logs
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading Guild News...");
+ {
+ uint32 oldMSTime = getMSTime();
+
+ CharacterDatabase.DirectPExecute("DELETE FROM guild_newslog WHERE LogGuid > %u", sWorld->getIntConfig(CONFIG_GUILD_NEWS_LOG_COUNT));
+
+ // 0 1 2 3 4 5 6
+ QueryResult result = CharacterDatabase.Query("SELECT guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp FROM guild_newslog ORDER BY TimeStamp DESC, LogGuid DESC");
+
+ if (!result)
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild event logs. DB table `guild_newslog` is empty.");
+ else
+ {
+ uint32 count = 0;
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 guildId = fields[0].GetUInt32();
+
+ if (Guild* guild = GetGuildById(guildId))
+ guild->LoadGuildNewsLogFromDB(fields);
+
+ ++count;
+ }
+ while (result->NextRow());
+
+ sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild new logs in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ }
+ }
+
+
+ // 8. Load all guild bank tabs
sLog->outInfo(LOG_FILTER_SERVER_LOADING, "Loading guild bank tabs...");
{
uint32 oldMSTime = getMSTime();
@@ -362,7 +394,7 @@ void GuildMgr::LoadGuilds()
}
}
- // 8. Fill all guild bank tabs
+ // 9. Fill all guild bank tabs
sLog->outInfo(LOG_FILTER_GUILD, "Filling bank tabs with items...");
{
uint32 oldMSTime = getMSTime();
@@ -398,7 +430,7 @@ void GuildMgr::LoadGuilds()
}
}
- // 9. Load guild achievements
+ // 10. Load guild achievements
{
PreparedQueryResult achievementResult;
PreparedQueryResult criteriaResult;
@@ -414,16 +446,6 @@ void GuildMgr::LoadGuilds()
itr->second->GetAchievementMgr().LoadFromDB(achievementResult, criteriaResult);
}
}
- // 10. Loading Guild news
- sLog->outInfo(LOG_FILTER_GENERAL, "Loading Guild News");
- {
- for (GuildContainer::const_iterator itr = GuildStore.begin(); itr != GuildStore.end(); ++itr)
- {
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_NEWS);
- stmt->setInt32(0, itr->first);
- itr->second->GetNewsLog().LoadFromDB(CharacterDatabase.Query(stmt));
- }
- }
// 11. Validate loaded guild data
sLog->outInfo(LOG_FILTER_GENERAL, "Validating data of loaded guilds...");
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index ac440b23d65..17d84295bd7 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -336,8 +336,8 @@ void WorldSession::HandleAuctionSellItem(WorldPacket & recvData)
AH->auctionHouseEntry = auctionHouseEntry;
sLog->outInfo(LOG_FILTER_NETWORKIO, "CMSG_AUCTION_SELL_ITEM: Player %s (guid %d) is selling item %s entry %u (guid %d) to "
- "auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u",
- _player->GetName().c_str(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(),
+ "auctioneer %u with count %u with initial bid " UI64FMTD " with buyout " UI64FMTD " and with time %u (in sec) in auctionhouse %u",
+ _player->GetName().c_str(), _player->GetGUIDLow(), newItem->GetTemplate()->Name1.c_str(), newItem->GetEntry(),
newItem->GetGUIDLow(), AH->auctioneer, newItem->GetCount(), bid, buyout, auctionTime, AH->GetHouseId());
sAuctionMgr->AddAItem(newItem);
auctionHouse->AddAuction(AH);
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index e2537d84149..6ad0c7c0b2b 100755
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -219,7 +219,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recvData)
if (grp->GetLeaderGUID() != _player->GetGUID())
return;
-
+
err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0);
isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index a82496c1335..4b830505467 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -137,7 +137,6 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
}
}
-<<<<<<< HEAD
if (lang == LANG_ADDON)
{
// LANG_ADDON is only valid for the following message types
@@ -164,7 +163,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recvData)
return;
break;
default:
- sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination",
+ sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (GUID: %u) sent a chatmessage with an invalid language/message type combination",
GetPlayer()->GetName().c_str(), GetPlayer()->GetGUIDLow());
recvData.rfinish();
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index e27118db6ac..f97216f2169 100755
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -33,8 +33,8 @@ void WorldSession::HandleGuildQueryOpcode(WorldPacket& recvPacket)
uint64 guildGuid, playerGuid;
recvPacket >> guildGuid >> playerGuid;
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY [%s]: Guild: " UI64FMTD " Target: ",
- GetPlayerInfo().c_str(), guildGuid, playerGuid);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY [%s]: Guild: %u Target: %u",
+ GetPlayerInfo().c_str(), GUID_LOPART(guildGuid), GUID_LOPART(playerGuid));
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
if (guild->IsMember(playerGuid))
@@ -74,7 +74,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(playerGuid[3]);
recvPacket.ReadByteSeq(playerGuid[0]);
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_REMOVE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), playerGuid);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_REMOVE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(playerGuid));
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleRemoveMember(this, playerGuid);
@@ -82,7 +82,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
void WorldSession::HandleGuildAcceptOpcode(WorldPacket& /*recvPacket*/)
{
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ACCEPT [%s]", GetPlayer()->GetName().c_str());
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ACCEPT [%s]", GetPlayerInfo().c_str());
if (!GetPlayer()->GetGuildId())
if (Guild* guild = sGuildMgr->GetGuildById(GetPlayer()->GetGuildIdInvited()))
@@ -130,7 +130,7 @@ void WorldSession::HandleGuildPromoteOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(targetGuid[1]);
recvPacket.ReadByteSeq(targetGuid[7]);
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PROMOTE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), targetGuid);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PROMOTE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(targetGuid));
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleUpdateMemberRank(this, targetGuid, false);
@@ -158,7 +158,7 @@ void WorldSession::HandleGuildDemoteOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(targetGuid[4]);
recvPacket.ReadByteSeq(targetGuid[3]);
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_DEMOTE [%s]: Target: " UI64FMTD, GetPlayerInfo().c_str(), targetGuid);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_DEMOTE [%s]: Target: %u", GetPlayerInfo().c_str(), GUID_LOPART(targetGuid));
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleUpdateMemberRank(this, targetGuid, true);
@@ -206,8 +206,8 @@ void WorldSession::HandleGuildAssignRankOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(targetGuid[6]);
recvPacket.ReadByteSeq(setterGuid[7]);
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ASSIGN_MEMBER_RANK [%s]: Target: " UI64FMTD " Rank: %u, Issuer " UI64FMTD,
- GetPlayerInfo().c_str(), targetGuid, rankId, setterGuid);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_ASSIGN_MEMBER_RANK [%s]: Target: %u Rank: %u, Issuer: %u",
+ GetPlayerInfo().c_str(), GUID_LOPART(targetGuid), rankId, GUID_LOPART(setterGuid));
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleSetMemberRank(this, targetGuid, setterGuid, rankId);
@@ -261,7 +261,7 @@ void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket)
playerGuid[3] = recvPacket.ReadBit();
playerGuid[0] = recvPacket.ReadBit();
playerGuid[7] = recvPacket.ReadBit();
- bool type = recvPacket.ReadBit(); // 0 == Officer, 1 == Public
+ bool ispublic = recvPacket.ReadBit(); // 0 == Officer, 1 == Public
playerGuid[6] = recvPacket.ReadBit();
uint32 noteLength = recvPacket.ReadBits(8);
playerGuid[2] = recvPacket.ReadBit();
@@ -276,37 +276,37 @@ void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket)
std::string note = recvPacket.ReadString(noteLength);
recvPacket.ReadByteSeq(playerGuid[2]);
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_NOTE [%s]: Target: " UI64FMTD ", Note: %s, Public: %u",
- GetPlayerInfo().c_str(), playerGuid, note.c_str(), type);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_NOTE [%s]: Target: %u, Note: %s, Public: %u",
+ GetPlayerInfo().c_str(), GUID_LOPART(playerGuid), note.c_str(), ispublic);
if (Guild* guild = GetPlayer()->GetGuild())
- guild->HandleSetMemberNote(this, note, playerGuid, type);
+ guild->HandleSetMemberNote(this, note, playerGuid, ispublic);
}
-void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvData)
+void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvPacket)
{
ObjectGuid guildGuid;
- guildGuid[2] = recvData.ReadBit();
- guildGuid[3] = recvData.ReadBit();
- guildGuid[0] = recvData.ReadBit();
- guildGuid[6] = recvData.ReadBit();
- guildGuid[4] = recvData.ReadBit();
- guildGuid[7] = recvData.ReadBit();
- guildGuid[5] = recvData.ReadBit();
- guildGuid[1] = recvData.ReadBit();
-
- recvData.ReadByteSeq(guildGuid[3]);
- recvData.ReadByteSeq(guildGuid[4]);
- recvData.ReadByteSeq(guildGuid[5]);
- recvData.ReadByteSeq(guildGuid[7]);
- recvData.ReadByteSeq(guildGuid[1]);
- recvData.ReadByteSeq(guildGuid[0]);
- recvData.ReadByteSeq(guildGuid[6]);
- recvData.ReadByteSeq(guildGuid[2]);
-
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_RANKS [%s]: Guild: " UI64FMTD,
- GetPlayerInfo().c_str(), guildGuid);
+ guildGuid[2] = recvPacket.ReadBit();
+ guildGuid[3] = recvPacket.ReadBit();
+ guildGuid[0] = recvPacket.ReadBit();
+ guildGuid[6] = recvPacket.ReadBit();
+ guildGuid[4] = recvPacket.ReadBit();
+ guildGuid[7] = recvPacket.ReadBit();
+ guildGuid[5] = recvPacket.ReadBit();
+ guildGuid[1] = recvPacket.ReadBit();
+
+ recvPacket.ReadByteSeq(guildGuid[3]);
+ recvPacket.ReadByteSeq(guildGuid[4]);
+ recvPacket.ReadByteSeq(guildGuid[5]);
+ recvPacket.ReadByteSeq(guildGuid[7]);
+ recvPacket.ReadByteSeq(guildGuid[1]);
+ recvPacket.ReadByteSeq(guildGuid[0]);
+ recvPacket.ReadByteSeq(guildGuid[6]);
+ recvPacket.ReadByteSeq(guildGuid[2]);
+
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_RANKS [%s]: Guild: %u",
+ GetPlayerInfo().c_str(), GUID_LOPART(guildGuid));
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
if (guild->IsMember(_player->GetGUID()))
@@ -386,7 +386,7 @@ void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
guild->SendEventLog(this);
}
-void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recvData */)
+void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket& /* recvPacket */)
{
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_MONEY_WITHDRAWN [%s]", GetPlayerInfo().c_str());
@@ -394,7 +394,7 @@ void WorldSession::HandleGuildBankMoneyWithdrawn(WorldPacket & /* recvData */)
guild->SendMoneyInfo(this);
}
-void WorldSession::HandleGuildPermissions(WorldPacket& /* recvData */)
+void WorldSession::HandleGuildPermissions(WorldPacket& /* recvPacket */)
{
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_PERMISSIONS [%s]", GetPlayerInfo().c_str());
@@ -403,46 +403,51 @@ void WorldSession::HandleGuildPermissions(WorldPacket& /* recvData */)
}
// Called when clicking on Guild bank gameobject
-void WorldSession::HandleGuildBankerActivate(WorldPacket& recvData)
+void WorldSession::HandleGuildBankerActivate(WorldPacket& recvPacket)
{
uint64 guid;
bool sendAllSlots;
- recvData >> guid >> sendAllSlots;
+ recvPacket >> guid >> sendAllSlots;
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANKER_ACTIVATE [%s]: Go: [" UI64FMTD "] AllSlots: %u"
, GetPlayerInfo().c_str(), guid, sendAllSlots);
- if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
+ GameObject const * const go = GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK);
+ if (!go)
+ return;
+
+ Guild * const guild = GetPlayer()->GetGuild();
+ if (!guild)
{
- if (Guild* guild = GetPlayer()->GetGuild())
- guild->SendBankList(this, 0, true, true);
- else
- Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+ Guild::SendCommandResult(this, GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+ return;
}
+
+ guild->SendBankList(this, 0, true, true);
}
// Called when opening guild bank tab only (first one)
-void WorldSession::HandleGuildBankQueryTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankQueryTab(WorldPacket& recvPacket)
{
uint64 guid;
uint8 tabId;
- bool full;
+ bool sendAllSlots;
- recvData >> guid >> tabId >> full;
+ recvPacket >> guid >> tabId >> sendAllSlots;
- sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_QUERY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, ShowTabs: %u"
- , GetPlayerInfo().c_str(), guid, tabId, full);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_QUERY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, AllSlots: %u"
+ , GetPlayerInfo().c_str(), guid, tabId, sendAllSlots);
if (GetPlayer()->GetGameObjectIfCanInteractWith(guid, GAMEOBJECT_TYPE_GUILD_BANK))
if (Guild* guild = GetPlayer()->GetGuild())
guild->SendBankList(this, tabId, true, false);
}
-void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvData)
+void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvPacket)
{
uint64 guid;
uint64 money;
- recvData >> guid >> money;
+ recvPacket >> guid >> money;
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_DEPOSIT_MONEY [%s]: Go: [" UI64FMTD "], money: " UI64FMTD,
GetPlayerInfo().c_str(), guid, money);
@@ -453,11 +458,11 @@ void WorldSession::HandleGuildBankDepositMoney(WorldPacket& recvData)
guild->HandleMemberDepositMoney(this, money);
}
-void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvData)
+void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvPacket)
{
uint64 guid;
uint64 money;
- recvData >> guid >> money;
+ recvPacket >> guid >> money;
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_WITHDRAW_MONEY [%s]: Go: [" UI64FMTD "], money: " UI64FMTD,
GetPlayerInfo().c_str(), guid, money);
@@ -467,28 +472,28 @@ void WorldSession::HandleGuildBankWithdrawMoney(WorldPacket& recvData)
guild->HandleMemberWithdrawMoney(this, money);
}
-void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
+void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvPacket)
{
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_SWAP_ITEMS [%s]", GetPlayerInfo().c_str());
uint64 GoGuid;
- recvData >> GoGuid;
+ recvPacket >> GoGuid;
if (!GetPlayer()->GetGameObjectIfCanInteractWith(GoGuid, GAMEOBJECT_TYPE_GUILD_BANK))
{
- recvData.rfinish(); // Prevent additional spam at rejected packet
+ recvPacket.rfinish(); // Prevent additional spam at rejected packet
return;
}
Guild* guild = GetPlayer()->GetGuild();
if (!guild)
{
- recvData.rfinish(); // Prevent additional spam at rejected packet
+ recvPacket.rfinish(); // Prevent additional spam at rejected packet
return;
}
uint8 bankToBank;
- recvData >> bankToBank;
+ recvPacket >> bankToBank;
uint8 tabId;
uint8 slotId;
@@ -498,19 +503,19 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
if (bankToBank)
{
uint8 destTabId;
- recvData >> destTabId;
+ recvPacket >> destTabId;
uint8 destSlotId;
- recvData >> destSlotId;
+ recvPacket >> destSlotId;
uint32 destItemEntry;
- recvData >> destItemEntry;
+ recvPacket >> destItemEntry;
- recvData >> tabId;
- recvData >> slotId;
- recvData >> itemEntry;
- recvData.read_skip<uint8>(); // Always 0
- recvData >> splitedAmount;
+ recvPacket >> tabId;
+ recvPacket >> slotId;
+ recvPacket >> itemEntry;
+ recvPacket.read_skip<uint8>(); // Always 0
+ recvPacket >> splitedAmount;
guild->SwapItems(GetPlayer(), tabId, slotId, destTabId, destSlotId, splitedAmount);
}
@@ -520,24 +525,24 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
uint8 playerSlotId = NULL_SLOT;
uint8 toChar = 1;
- recvData >> tabId;
- recvData >> slotId;
- recvData >> itemEntry;
+ recvPacket >> tabId;
+ recvPacket >> slotId;
+ recvPacket >> itemEntry;
uint8 autoStore;
- recvData >> autoStore;
+ recvPacket >> autoStore;
if (autoStore)
{
- recvData.read_skip<uint32>(); // autoStoreCount
- recvData.read_skip<uint8>(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char)
- recvData.read_skip<uint32>(); // Always 0
+ recvPacket.read_skip<uint32>(); // autoStoreCount
+ recvPacket.read_skip<uint8>(); // ToChar (?), always and expected to be 1 (autostore only triggered in Bank -> Char)
+ recvPacket.read_skip<uint32>(); // Always 0
}
else
{
- recvData >> playerBag;
- recvData >> playerSlotId;
- recvData >> toChar;
- recvData >> splitedAmount;
+ recvPacket >> playerBag;
+ recvPacket >> playerSlotId;
+ recvPacket >> toChar;
+ recvPacket >> splitedAmount;
}
// Player <-> Bank
@@ -549,13 +554,13 @@ void WorldSession::HandleGuildBankSwapItems(WorldPacket& recvData)
}
}
-void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvPacket)
{
uint64 guid;
- recvData >> guid;
+ recvPacket >> guid;
uint8 tabId;
- recvData >> tabId;
+ recvPacket >> tabId;
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_BUY_TAB [%s]: Go: [" UI64FMTD "], TabId: %u", GetPlayerInfo().c_str(), guid, tabId);
@@ -564,13 +569,13 @@ void WorldSession::HandleGuildBankBuyTab(WorldPacket& recvData)
guild->HandleBuyBankTab(this, tabId);
}
-void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvData)
+void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvPacket)
{
uint64 guid;
uint8 tabId;
std::string name, icon;
- recvData >> guid >> tabId >> name >> icon;
+ recvPacket >> guid >> tabId >> name >> icon;
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_BANK_UPDATE_TAB [%s]: Go: [" UI64FMTD "], TabId: %u, Name: %s, Icon: %s"
, GetPlayerInfo().c_str(), guid, tabId, name.c_str(), icon.c_str());
@@ -580,10 +585,10 @@ void WorldSession::HandleGuildBankUpdateTab(WorldPacket& recvData)
guild->HandleSetBankTabInfo(this, tabId, name, icon);
}
-void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvData)
+void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvPacket)
{
uint32 tabId;
- recvData >> tabId;
+ recvPacket >> tabId;
sLog->outDebug(LOG_FILTER_GUILD, "MSG_GUILD_BANK_LOG_QUERY [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId);
@@ -591,10 +596,10 @@ void WorldSession::HandleGuildBankLogQuery(WorldPacket& recvData)
guild->SendBankLog(this, tabId);
}
-void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvData)
+void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvPacket)
{
uint8 tabId;
- recvData >> tabId;
+ recvPacket >> tabId;
sLog->outDebug(LOG_FILTER_GUILD, "MSG_QUERY_GUILD_BANK_TEXT [%s]: TabId: %u", GetPlayerInfo().c_str(), tabId);
@@ -602,13 +607,13 @@ void WorldSession::HandleQueryGuildBankTabText(WorldPacket &recvData)
guild->SendBankTabText(this, tabId);
}
-void WorldSession::HandleSetGuildBankTabText(WorldPacket& recvData)
+void WorldSession::HandleSetGuildBankTabText(WorldPacket& recvPacket)
{
uint32 tabId;
- recvData >> tabId;
+ recvPacket >> tabId;
- uint32 textLen = recvData.ReadBits(14);
- std::string text = recvData.ReadString(textLen);
+ uint32 textLen = recvPacket.ReadBits(14);
+ std::string text = recvPacket.ReadString(textLen);
sLog->outDebug(LOG_FILTER_GUILD, "CMSG_SET_GUILD_BANK_TEXT [%s]: TabId: %u, Text: %s", GetPlayerInfo().c_str(), tabId, text.c_str());
@@ -640,6 +645,8 @@ void WorldSession::HandleGuildQueryXPOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(guildGuid[0]);
recvPacket.ReadByteSeq(guildGuid[4]);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_QUERY_GUILD_XP [%s]: Guild: %u", GetPlayerInfo().c_str(), GUID_LOPART(guildGuid));
+
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
if (guild->IsMember(_player->GetGUID()))
guild->SendGuildXP(this);
@@ -647,8 +654,6 @@ void WorldSession::HandleGuildQueryXPOpcode(WorldPacket& recvPacket)
void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket)
{
- sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_SET_RANK_PERMISSIONS");
-
Guild* guild = GetPlayer()->GetGuild();
if (!guild)
{
@@ -656,13 +661,13 @@ void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket)
return;
}
- uint32 unk;
- uint32 rankId;
+ uint32 oldRankId;
+ uint32 newRankId;
uint32 oldRights;
uint32 newRights;
uint32 moneyPerDay;
- recvPacket >> unk;
+ recvPacket >> oldRankId;
recvPacket >> oldRights;
recvPacket >> newRights;
@@ -679,36 +684,38 @@ void WorldSession::HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket)
}
recvPacket >> moneyPerDay;
- recvPacket >> rankId;
+ recvPacket >> newRankId;
uint32 nameLength = recvPacket.ReadBits(7);
std::string rankName = recvPacket.ReadString(nameLength);
- guild->HandleSetRankInfo(this, rankId, rankName, newRights, moneyPerDay, rightsAndSlots);
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_SET_RANK_PERMISSIONS [%s]: Rank: %s (%u)", GetPlayerInfo().c_str(), rankName.c_str(), newRankId);
+
+ guild->HandleSetRankInfo(this, newRankId, rankName, newRights, moneyPerDay, rightsAndSlots);
}
-void WorldSession::HandleGuildRequestPartyState(WorldPacket& recvData)
+void WorldSession::HandleGuildRequestPartyState(WorldPacket& recvPacket)
{
sLog->outDebug(LOG_FILTER_NETWORKIO, "WORLD: Received CMSG_GUILD_REQUEST_PARTY_STATE");
ObjectGuid guildGuid;
- guildGuid[0] = recvData.ReadBit();
- guildGuid[6] = recvData.ReadBit();
- guildGuid[7] = recvData.ReadBit();
- guildGuid[3] = recvData.ReadBit();
- guildGuid[5] = recvData.ReadBit();
- guildGuid[1] = recvData.ReadBit();
- guildGuid[2] = recvData.ReadBit();
- guildGuid[4] = recvData.ReadBit();
-
- recvData.ReadByteSeq(guildGuid[6]);
- recvData.ReadByteSeq(guildGuid[3]);
- recvData.ReadByteSeq(guildGuid[2]);
- recvData.ReadByteSeq(guildGuid[1]);
- recvData.ReadByteSeq(guildGuid[5]);
- recvData.ReadByteSeq(guildGuid[0]);
- recvData.ReadByteSeq(guildGuid[7]);
- recvData.ReadByteSeq(guildGuid[4]);
+ guildGuid[0] = recvPacket.ReadBit();
+ guildGuid[6] = recvPacket.ReadBit();
+ guildGuid[7] = recvPacket.ReadBit();
+ guildGuid[3] = recvPacket.ReadBit();
+ guildGuid[5] = recvPacket.ReadBit();
+ guildGuid[1] = recvPacket.ReadBit();
+ guildGuid[2] = recvPacket.ReadBit();
+ guildGuid[4] = recvPacket.ReadBit();
+
+ recvPacket.ReadByteSeq(guildGuid[6]);
+ recvPacket.ReadByteSeq(guildGuid[3]);
+ recvPacket.ReadByteSeq(guildGuid[2]);
+ recvPacket.ReadByteSeq(guildGuid[1]);
+ recvPacket.ReadByteSeq(guildGuid[5]);
+ recvPacket.ReadByteSeq(guildGuid[0]);
+ recvPacket.ReadByteSeq(guildGuid[7]);
+ recvPacket.ReadByteSeq(guildGuid[4]);
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
guild->HandleGuildPartyRequest(this);
@@ -783,13 +790,9 @@ void WorldSession::HandleGuildRewardsQueryOpcode(WorldPacket& recvPacket)
void WorldSession::HandleGuildQueryNewsOpcode(WorldPacket& recvPacket)
{
recvPacket.read_skip<uint32>();
-
- if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId()))
- {
- WorldPacket data;
- guild->GetNewsLog().BuildNewsData(data);
- SendPacket(&data);
- }
+ sLog->outDebug(LOG_FILTER_GUILD, "CMSG_GUILD_QUERY_NEWS [%s]", GetPlayerInfo().c_str());
+ if (Guild* guild = GetPlayer()->GetGuild())
+ guild->SendNewsUpdate(this);
}
void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket)
@@ -819,18 +822,6 @@ void WorldSession::HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(guid[7]);
recvPacket.ReadByteSeq(guid[4]);
- if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId()))
- {
- if (GuildNewsEntry* newsEntry = guild->GetNewsLog().GetNewsById(newsId))
- {
- if (sticky)
- newsEntry->Flags |= 1;
- else
- newsEntry->Flags &= ~1;
-
- WorldPacket data;
- guild->GetNewsLog().BuildNewsData(newsId, *newsEntry, data);
- SendPacket(&data);
- }
- }
+ if (Guild* guild = GetPlayer()->GetGuild())
+ guild->HandleNewsSetSticky(this, newsId, sticky);
}
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 5e568a90d85..ea96f4051a7 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -814,7 +814,7 @@ void WorldSession::SendListInventory(uint64 vendorGuid)
uint32 precision = (currencyTemplate->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? 100 : 1;
++count;
- itemsData << uint32(slot + 1); // client expects counting to start at 1
+ itemsData << uint32(slot + 1); // client expects counting to start at 1
itemsData << uint32(0); // max durability
if (vendorItem->ExtendedCost != 0)
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index d7798f18f99..5df7b20b596 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -412,8 +412,7 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recvData)
player->SendMailResult(mailId, MAIL_RETURNED_TO_SENDER, MAIL_ERR_INTERNAL_ERROR);
return;
}
- //we can return mail now
- //so firstly delete the old one
+ //we can return mail now, so firstly delete the old one
SQLTransaction trans = CharacterDatabase.BeginTransaction();
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_BY_ID);
@@ -437,14 +436,8 @@ void WorldSession::HandleMailReturnToSender(WorldPacket & recvData)
{
for (MailItemInfoVec::iterator itr2 = m->items.begin(); itr2 != m->items.end(); ++itr2)
{
- Item* item = player->GetMItem(itr2->item_guid);
- if (item)
+ if (Item * const item = player->GetMItem(itr2->item_guid))
draft.AddItem(item);
- else
- {
- //WTF?
- }
-
player->RemoveMItem(itr2->item_guid);
}
}
@@ -652,10 +645,10 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData)
case MAIL_CREATURE:
case MAIL_GAMEOBJECT:
case MAIL_AUCTION:
- data << uint32((*itr)->sender); // creature/gameobject entry, auction id
+ data << uint32((*itr)->sender); // creature/gameobject entry, auction id
break;
- case MAIL_ITEM: // item entry (?) sender = "Unknown", NYI
- data << uint32(0); // item entry
+ case MAIL_ITEM: // item entry (?) sender = "Unknown", NYI
+ data << uint32(0); // item entry
break;
}
@@ -685,6 +678,7 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData)
data << uint32((item ? item->GetEnchantmentDuration((EnchantmentSlot)j) : 0));
data << uint32((item ? item->GetEnchantmentCharges((EnchantmentSlot)j) : 0));
}
+
// can be negative
data << int32((item ? item->GetItemRandomPropertyId() : 0));
// unk
@@ -780,7 +774,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket& recvData)
}
//TODO Fix me! ... this void has probably bad condition, but good data are sent
-void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recvData*/)
+void WorldSession::HandleQueryNextMailTime(WorldPacket& /*recvData*/)
{
WorldPacket data(MSG_QUERY_NEXT_MAIL_TIME, 8);
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 73232320d43..2b9cf4a9b6d 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -398,7 +398,7 @@ void WorldSession::HandleMovementOpcodes(WorldPacket& recvPacket)
if (plrMover) // nothing is charmed, or player charmed
{
plrMover->UpdateFallInformationIfNeed(movementInfo, opcode);
-
+
AreaTableEntry const* zone = GetAreaEntryByAreaID(plrMover->GetAreaId());
float depth = zone ? zone->MaxDepth : -500.0f;
if (movementInfo.pos.GetPositionZ() < depth)
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 93a911459c9..4159b58554c 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -3355,8 +3355,12 @@ enum PetDiet
#define CHAIN_SPELL_JUMP_RADIUS 8
-#define GUILD_BANKLOG_MAX_RECORDS 25
-#define GUILD_EVENTLOG_MAX_RECORDS 100
+enum GuildLogs
+{
+ GUILD_BANKLOG_MAX_RECORDS = 25,
+ GUILD_EVENTLOG_MAX_RECORDS = 100,
+ GUILD_NEWSLOG_MAX_RECORDS = 250
+};
enum AiReaction
{
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 1a565dacad9..89c698744a3 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3488,7 +3488,7 @@ void Spell::_handle_finish_phase()
// Real add combo points from effects
if (m_comboPointGain)
m_caster->m_movedPlayer->GainSpellComboPoints(m_comboPointGain);
-
+
if (m_spellInfo->PowerType == POWER_HOLY_POWER && m_caster->m_movedPlayer->getClass() == CLASS_PALADIN)
HandleHolyPower(m_caster->m_movedPlayer);
}
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 27abe8ebc6e..56aa88852a9 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1577,10 +1577,6 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype)
// create the new item and store it
Item* pItem = player->StoreNewItem(dest, newitemid, true, Item::GenerateItemRandomPropertyId(newitemid));
- if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]))
- if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId()))
- guild->GetNewsLog().AddNewEvent(GUILD_NEWS_ITEM_CRAFTED, time(NULL), player->GetGUID(), 0, pProto->ItemId);
-
// was it successful? return error if not
if (!pItem)
{
@@ -1595,6 +1591,11 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype)
// send info to the client
player->SendNewItem(pItem, num_to_add, true, bgType == 0);
+ if (pProto->Quality > ITEM_QUALITY_EPIC || (pProto->Quality == ITEM_QUALITY_EPIC && pProto->ItemLevel >= MinNewsItemLevel[sWorld->getIntConfig(CONFIG_EXPANSION)]))
+ if (Guild* guild = player->GetGuild())
+ guild->AddGuildNews(GUILD_NEWS_ITEM_CRAFTED, player->GetGUID(), 0, pProto->ItemId);
+
+
// we succeeded in creating at least one item, so a levelup is possible
if (bgType == 0)
player->UpdateCraftSkill(m_spellInfo->Id);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 75f5dd1c807..39512aa155e 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1054,6 +1054,9 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_INSTANT_LOGOUT] = ConfigMgr::GetIntDefault("InstantLogout", SEC_MODERATOR);
+ m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] = ConfigMgr::GetIntDefault("Guild.NewsLogRecordsCount", GUILD_NEWSLOG_MAX_RECORDS);
+ if (m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] > GUILD_NEWSLOG_MAX_RECORDS)
+ m_int_configs[CONFIG_GUILD_NEWS_LOG_COUNT] = GUILD_NEWSLOG_MAX_RECORDS;
m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = ConfigMgr::GetIntDefault("Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS);
if (m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] > GUILD_EVENTLOG_MAX_RECORDS)
m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = GUILD_EVENTLOG_MAX_RECORDS;
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 1f90c169fa6..230f96e4997 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -308,6 +308,7 @@ enum WorldIntConfigs
CONFIG_LOGDB_CLEARINTERVAL,
CONFIG_LOGDB_CLEARTIME,
CONFIG_CLIENTCACHE_VERSION,
+ CONFIG_GUILD_NEWS_LOG_COUNT,
CONFIG_GUILD_EVENT_LOG_COUNT,
CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
CONFIG_MIN_LEVEL_STAT_SAVE,
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp
index 5ddfe1f4dc5..af508dd1fca 100644
--- a/src/server/scripts/Spells/spell_shaman.cpp
+++ b/src/server/scripts/Spells/spell_shaman.cpp
@@ -49,7 +49,7 @@ enum ShamanSpells
SHAMAN_LAVA_FLOWS_R1 = 51480,
SHAMAN_LAVA_FLOWS_TRIGGERED_R1 = 65264,
SHAMAN_SPELL_ANCESTRAL_AWAKENING_PROC = 52752,
-
+
ICON_ID_SOOTHING_RAIN = 2011,
SPELL_HEALING_STREAM_TOTEM_HEAL = 52042,
};
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 96a282d9c85..91941a02df6 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -201,7 +201,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_UPD_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?", CONNECTION_ASYNC) // 0: string, 1: uint32, 2: uint8
PREPARE_STATEMENT(CHAR_INS_GUILD_MEMBER_WITHDRAW,
- "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?) "
+ "INSERT INTO guild_member_withdraw (guid, tab0, tab1, tab2, tab3, tab4, tab5, tab6, tab7, money) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) "
"ON DUPLICATE KEY UPDATE tab0 = VALUES (tab0), tab1 = VALUES (tab1), tab2 = VALUES (tab2), tab3 = VALUES (tab3), tab4 = VALUES (tab4), tab5 = VALUES (tab5), tab6 = VALUES (tab6), tab7 = VALUES (tab7)", CONNECTION_ASYNC)
PREPARE_STATEMENT(CHAR_DEL_GUILD_MEMBER_WITHDRAW, "TRUNCATE guild_member_withdraw", CONNECTION_ASYNC)
@@ -217,8 +217,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PREPARE_STATEMENT(CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA, "SELECT criteria, counter, date, completedGuid FROM guild_achievement_progress WHERE guildId = ?", CONNECTION_SYNCH)
PREPARE_STATEMENT(CHAR_UPD_GUILD_EXPERIENCE, "UPDATE guild SET level = ?, experience = ?, todayExperience = ? WHERE guildId = ?", CONNECTION_ASYNC);
PREPARE_STATEMENT(CHAR_UPD_GUILD_RESET_TODAY_EXPERIENCE, "UPDATE guild SET todayExperience = 0", CONNECTION_ASYNC);
- PREPARE_STATEMENT(CHAR_LOAD_GUILD_NEWS, "SELECT id, eventType, playerGuid, data, flags, date FROM guild_news_log WHERE guild = ? ORDER BY guild ASC, id ASC", CONNECTION_SYNCH);
- PREPARE_STATEMENT(CHAR_SAVE_GUILD_NEWS, "INSERT INTO guild_news_log (guild, id, eventType, playerGuid, data, flags, date) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PREPARE_STATEMENT(CHAR_INS_GUILD_NEWS, "INSERT INTO guild_newslog (guildid, LogGuid, EventType, PlayerGuid, Flags, Value, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?)"
+ " ON DUPLICATE KEY UPDATE LogGuid = VALUES (LogGuid), EventType = VALUES (EventType), PlayerGuid = VALUES (PlayerGuid), Flags = VALUES (Flags), Value = VALUES (Value), Timestamp = VALUES (Timestamp)", CONNECTION_ASYNC);
// Chat channel handling
PREPARE_STATEMENT(CHAR_SEL_CHANNEL, "SELECT announce, ownership, password, bannedList FROM channels WHERE name = ? AND team = ?", CONNECTION_SYNCH)
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 80c41122e7c..5a03ee4767c 100755
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -209,8 +209,7 @@ enum CharacterDatabaseStatements
CHAR_SEL_GUILD_ACHIEVEMENT_CRITERIA,
CHAR_UPD_GUILD_EXPERIENCE,
CHAR_UPD_GUILD_RESET_TODAY_EXPERIENCE,
- CHAR_LOAD_GUILD_NEWS,
- CHAR_SAVE_GUILD_NEWS,
+ CHAR_INS_GUILD_NEWS,
CHAR_SEL_CHANNEL,
CHAR_INS_CHANNEL,
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index e257198745d..0cb6072c244 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -985,6 +985,16 @@ Guild.ResetHour = 6
Guild.BankEventLogRecordsCount = 25
#
+# Guild.Guild.NewsLogRecordsCount
+# Description: Number of log entries for guild news that are stored per guild. Old
+# entries will be overwritten if the number of log entries exceed the
+# configured value. High numbers prevent this behavior but may have performance
+# impacts.
+# Default: 250
+
+Guild.Guild.NewsLogRecordsCount = 250
+
+#
# MaxPrimaryTradeSkill
# Description: Maximum number of primary professions a character can learn.
# Range: 0-10