aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Guilds
diff options
context:
space:
mode:
authorSovak <Sovak007@gmail.com>2012-09-09 14:39:34 +0200
committerNay <dnpd.dd@gmail.com>2012-09-09 22:43:44 +0100
commit2440a2875567905df48ce9073041a960e9ebd0bd (patch)
treee7dcaeb9d405c77b2de9d11f8c380a720dae1f98 /src/server/game/Guilds
parent271e9cb9e628177d37d45effbd39e7a31f8c9910 (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.cpp129
-rwxr-xr-xsrc/server/game/Guilds/Guild.h59
-rw-r--r--src/server/game/Guilds/GuildMgr.cpp59
-rw-r--r--src/server/game/Guilds/GuildMgr.h2
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()