diff options
| author | Sovak <Sovak007@gmail.com> | 2012-09-09 14:39:34 +0200 |
|---|---|---|
| committer | Nay <dnpd.dd@gmail.com> | 2012-09-09 22:43:44 +0100 |
| commit | 2440a2875567905df48ce9073041a960e9ebd0bd (patch) | |
| tree | e7dcaeb9d405c77b2de9d11f8c380a720dae1f98 /src/server/game/Guilds | |
| parent | 271e9cb9e628177d37d45effbd39e7a31f8c9910 (diff) | |
Core/Guilds: Implemented guild news & guild rewards tab
Signed-off-by: Sovak <Sovak007@gmail.com>
Signed-off-by: Nay <dnpd.dd@gmail.com>
Diffstat (limited to 'src/server/game/Guilds')
| -rw-r--r-- | src/server/game/Guilds/Guild.cpp | 129 | ||||
| -rwxr-xr-x | src/server/game/Guilds/Guild.h | 59 | ||||
| -rw-r--r-- | src/server/game/Guilds/GuildMgr.cpp | 59 | ||||
| -rw-r--r-- | src/server/game/Guilds/GuildMgr.h | 2 |
4 files changed, 246 insertions, 3 deletions
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 322e953be4a..09188843d52 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1061,7 +1061,7 @@ InventoryResult Guild::BankMoveItemData::CanStore(Item* pItem, bool swap) /////////////////////////////////////////////////////////////////////////////// // Guild Guild::Guild() : m_id(0), m_leaderGuid(0), m_createdDate(0), m_accountsNumber(0), m_bankMoney(0), m_eventLog(NULL), - m_achievementMgr(this), _level(1), _experience(0), _todayExperience(0) + m_achievementMgr(this), _level(1), _experience(0), _todayExperience(0), _newsLog(this) { memset(&m_bankEventLog, 0, (GUILD_BANK_MAX_TABS + 1) * sizeof(LogHolder*)); } @@ -3234,6 +3234,7 @@ 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); } @@ -3258,3 +3259,129 @@ void Guild::ResetDailyExperience() if (Player* player = itr->second->FindPlayer()) SendGuildXP(player->GetSession()); } + +void Guild::GuildNewsLog::AddNewEvent(GuildNews eventType, time_t date, uint64 playerGuid, uint32 flags, uint32 data) +{ + 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 pData; + BuildNewsData(id, log, pData); + GetGuild()->BroadcastPacket(&pData); +} + +void Guild::GuildNewsLog::LoadFromDB(PreparedQueryResult result) +{ + if (!result) + return; + do + { + 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()); + } + while (result->NextRow()); +} + +void Guild::GuildNewsLog::BuildNewsData(uint32 id, GuildNewsEntry& guildNew, WorldPacket& data) +{ + data.Initialize(SMSG_GUILD_NEWS_UPDATE); + data.WriteBits(1, 21); + + data.WriteBits(0, 26); // Other Guids NYI + 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(); + + data.WriteByteSeq(guid[5]); + + data << uint32(guildNew.Flags); // 1 sticky + data << uint32(guildNew.Data); + 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(id); + data << uint32(guildNew.EventType); + data << uint32(secsToTimeBitFields(guildNew.Date)); +} + +void Guild::GuildNewsLog::BuildNewsData(WorldPacket& data) +{ + data.Initialize(SMSG_GUILD_NEWS_UPDATE); + data.WriteBits(_newsLog.size(), 21); + + for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++) + { + 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]); + } + + data.FlushBits(); + + for (GuildNewsLogMap::const_iterator it = _newsLog.begin(); it != _newsLog.end(); it++) + { + ObjectGuid guid = it->second.PlayerGuid; + data.WriteByteSeq(guid[5]); + + data << uint32(it->second.Flags); // 1 sticky + data << uint32(it->second.Data); + 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(it->first); + data << uint32(it->second.EventType); + data << uint32(secsToTimeBitFields(it->second.Date)); + } +} diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index b7613957a45..d846e814357 100755 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -24,6 +24,7 @@ #include "WorldPacket.h" #include "ObjectMgr.h" #include "Player.h" +#include "DBCStore.h" class Item; @@ -225,6 +226,38 @@ enum GuildMemberFlags GUILDMEMBER_STATUS_MOBILE = 0x0008, // remote chat from mobile app }; +enum GuildNews +{ + GUILD_NEWS_GUILD_ACHIEVEMENT = 0, + GUILD_NEWS_PLAYER_ACHIEVEMENT = 1, + GUILD_NEWS_DUNGEON_ENCOUNTER = 2, // Todo Implement + GUILD_NEWS_ITEM_LOOTED = 3, + GUILD_NEWS_ITEM_CRAFTED = 4, + GUILD_NEWS_ITEM_PURCHASED = 5, + GUILD_NEWS_LEVEL_UP = 6, +}; + +struct GuildNewsEntry +{ + GuildNews EventType; + time_t Date; + uint64 PlayerGuid; + uint32 Flags; + uint32 Data; +}; + +struct GuildReward +{ + uint32 Entry; + uint8 Standing; + int32 Racemask; + uint64 Price; + uint32 AchievementId; +}; + +uint32 const MinNewsItemLevel[MAX_CONTENT] = { 61, 90, 200, 353 }; + +typedef std::map<uint32, GuildNewsEntry> GuildNewsLogMap; #define GUILD_EXPERIENCE_UNCAPPED_LEVEL 20 ///> Hardcoded in client, starting from this level, guild daily experience gain is unlimited. //////////////////////////////////////////////////////////////////////////////////////////// @@ -347,6 +380,30 @@ private: RemainingValue m_bankRemaining[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* GetNewById(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; + }; + // Base class for event entries class LogEntry { @@ -727,6 +784,7 @@ public: uint64 GetExperience() const { return _experience; } uint64 GetTodayExperience() const { return _todayExperience; } void ResetDailyExperience(); + GuildNewsLog& GetNewsLog() { return _newsLog; } protected: uint32 m_id; @@ -749,6 +807,7 @@ protected: LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1]; AchievementMgr<Guild> m_achievementMgr; + GuildNewsLog _newsLog; uint32 _level; uint64 _experience; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index 726add2cf44..c611732ab48 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -433,8 +433,18 @@ 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)); + } + } - // 10. Validate loaded guild data + // 11. Validate loaded guild data sLog->outInfo(LOG_FILTER_GENERAL, "Validating data of loaded guilds..."); { uint32 oldMSTime = getMSTime(); @@ -507,5 +517,50 @@ void GuildMgr::LoadGuildXpForLevel() void GuildMgr::LoadGuildRewards() { - /// @TODO: Implement + uint32 oldMSTime = getMSTime(); + + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT entry, standing, racemask, price, achievement FROM guild_rewards"); + + if (!result) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, ">> Loaded 0 guild reward definitions. DB table `guild_rewards` is empty."); + return; + } + + uint32 count = 0; + + do + { + GuildReward reward; + Field* fields = result->Fetch(); + reward.Entry = fields[0].GetUInt32(); + reward.Standing = fields[1].GetUInt8(); + reward.Racemask = fields[2].GetInt32(); + reward.Price = fields[3].GetUInt64(); + reward.AchievementId = fields[4].GetUInt32(); + + if (!sObjectMgr->GetItemTemplate(reward.Entry)) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, "Guild rewards constains not existing item entry %u", reward.Entry); + continue; + } + + if (reward.AchievementId != 0 && (!sAchievementStore.LookupEntry(reward.AchievementId))) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, "Guild rewards constains not existing achievement entry %u", reward.AchievementId); + continue; + } + + if (reward.Standing >= MAX_REPUTATION_RANK) + { + sLog->outError(LOG_FILTER_SERVER_LOADING, "Guild rewards contains wrong reputation standing %u, max is %u", uint32(reward.Standing), MAX_REPUTATION_RANK - 1); + continue; + } + + GuildRewards.push_back(reward); + ++count; + } while (result->NextRow()); + + sLog->outInfo(LOG_FILTER_SERVER_LOADING, ">> Loaded %u guild reward definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/Guilds/GuildMgr.h b/src/server/game/Guilds/GuildMgr.h index a2bf6d268b5..24c1a4c0d5d 100644 --- a/src/server/game/Guilds/GuildMgr.h +++ b/src/server/game/Guilds/GuildMgr.h @@ -52,11 +52,13 @@ public: void SetNextGuildId(uint32 Id) { NextGuildId = Id; } uint32 GetXPForGuildLevel(uint8 level) const; + std::vector<GuildReward> const& GetGuildRewards() const { return GuildRewards; } protected: uint32 NextGuildId; GuildContainer GuildStore; std::vector<uint64> GuildXPperLevel; + std::vector<GuildReward> GuildRewards; }; #define sGuildMgr ACE_Singleton<GuildMgr, ACE_Null_Mutex>::instance() |
