aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/characters.sql21
-rw-r--r--sql/updates/5354_8402_characters_guild_bank_eventlog.sql23
-rw-r--r--sql/updates/5354_8402_characters_guild_eventlog.sql20
-rw-r--r--src/game/Guild.cpp591
-rw-r--r--src/game/Guild.h131
-rw-r--r--src/game/GuildHandler.cpp6
-rw-r--r--src/game/Level3.cpp2
-rw-r--r--src/game/PetitionsHandler.cpp2
-rw-r--r--src/game/Player.cpp3
-rw-r--r--src/game/SharedDefines.h5
-rw-r--r--src/game/World.cpp7
-rw-r--r--src/game/World.h2
-rw-r--r--src/trinitycore/trinitycore.conf.dist14
13 files changed, 459 insertions, 368 deletions
diff --git a/sql/characters.sql b/sql/characters.sql
index ac92557d07d..870545cc065 100644
--- a/sql/characters.sql
+++ b/sql/characters.sql
@@ -23,7 +23,7 @@
DROP TABLE IF EXISTS `character_db_version`;
CREATE TABLE `character_db_version` (
- `required_8397_03_characters_character_spell` bit(1) default NULL
+ `required_8402_02_characters_guild_bank_eventlog` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
--
@@ -1137,16 +1137,16 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `guild_bank_eventlog`;
CREATE TABLE `guild_bank_eventlog` (
- `guildid` int(11) unsigned NOT NULL default '0',
- `LogGuid` int(11) unsigned NOT NULL default '0',
- `LogEntry` tinyint(1) unsigned NOT NULL default '0',
- `TabId` tinyint(1) unsigned NOT NULL default '0',
+ `guildid` int(11) unsigned NOT NULL default '0' COMMENT 'Guild Identificator',
+ `LogGuid` int(11) unsigned NOT NULL default '0' COMMENT 'Log record identificator - auxiliary column',
+ `TabId` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Guild bank TabId',
+ `EventType` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Event type',
`PlayerGuid` int(11) unsigned NOT NULL default '0',
`ItemOrMoney` int(11) unsigned NOT NULL default '0',
`ItemStackCount` tinyint(3) unsigned NOT NULL default '0',
- `DestTabId` tinyint(1) unsigned NOT NULL default '0',
- `TimeStamp` bigint(20) unsigned NOT NULL default '0',
- PRIMARY KEY (`guildid`,`LogGuid`),
+ `DestTabId` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Destination Tab Id',
+ `TimeStamp` bigint(20) unsigned NOT NULL default '0' COMMENT 'Event UNIX time',
+ PRIMARY KEY (`guildid`,`LogGuid`,`TabId`),
KEY `guildid_key` (`guildid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@@ -1238,12 +1238,13 @@ UNLOCK TABLES;
DROP TABLE IF EXISTS `guild_eventlog`;
CREATE TABLE `guild_eventlog` (
`guildid` int(11) NOT NULL COMMENT 'Guild Identificator',
- `LogGuid` int(11) NOT NULL COMMENT 'Log entry identificator',
+ `LogGuid` int(11) NOT NULL COMMENT 'Log record identificator - auxiliary column',
`EventType` tinyint(1) NOT NULL COMMENT 'Event type',
`PlayerGuid1` int(11) NOT NULL COMMENT 'Player 1',
`PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
`NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
- `TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time'
+ `TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time',
+ PRIMARY KEY (`guildid`, `LogGuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog';
--
diff --git a/sql/updates/5354_8402_characters_guild_bank_eventlog.sql b/sql/updates/5354_8402_characters_guild_bank_eventlog.sql
new file mode 100644
index 00000000000..deda8036003
--- /dev/null
+++ b/sql/updates/5354_8402_characters_guild_bank_eventlog.sql
@@ -0,0 +1,23 @@
+-- ALTER TABLE character_db_version CHANGE COLUMN required_8402_01_characters_guild_eventlog required_8402_02_characters_guild_bank_eventlog bit;
+
+
+-- THIS SCRIPT DELETES table `guild_bank_eventlog` - MAKE BACKUP, if you need it.
+
+DROP TABLE IF EXISTS `guild_bank_eventlog`;
+CREATE TABLE `guild_bank_eventlog` (
+ `guildid` int(11) unsigned NOT NULL default '0' COMMENT 'Guild Identificator',
+ `LogGuid` int(11) unsigned NOT NULL default '0' COMMENT 'Log record identificator - auxiliary column',
+ `TabId` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Guild bank TabId',
+ `EventType` tinyint(3) unsigned NOT NULL default '0' COMMENT 'Event type',
+ `PlayerGuid` int(11) unsigned NOT NULL default '0',
+ `ItemOrMoney` int(11) unsigned NOT NULL default '0',
+ `ItemStackCount` tinyint(3) unsigned NOT NULL default '0',
+ `DestTabId` tinyint(1) unsigned NOT NULL default '0' COMMENT 'Destination Tab Id',
+ `TimeStamp` bigint(20) unsigned NOT NULL default '0' COMMENT 'Event UNIX time',
+ PRIMARY KEY (`guildid`,`LogGuid`,`TabId`),
+ KEY `guildid_key` (`guildid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+-- The reason i decided for such dramatic change is that old guild_bank_eventlog table used `TabId` = 0 for Money events and
+-- used `LogGuid` from 0 to infinity
+-- New system uses `LogGuid` from 0 to number defined in config. \ No newline at end of file
diff --git a/sql/updates/5354_8402_characters_guild_eventlog.sql b/sql/updates/5354_8402_characters_guild_eventlog.sql
new file mode 100644
index 00000000000..71030c5a609
--- /dev/null
+++ b/sql/updates/5354_8402_characters_guild_eventlog.sql
@@ -0,0 +1,20 @@
+-- ALTER TABLE character_db_version CHANGE COLUMN required_8397_03_characters_character_spell required_8402_01_characters_guild_eventlog bit;
+
+
+-- THIS SCRIPT DELETES table `guild_eventlog` - MAKE BACKUP, if you need it.
+
+DROP TABLE IF EXISTS `guild_eventlog`;
+CREATE TABLE `guild_eventlog` (
+ `guildid` int(11) NOT NULL COMMENT 'Guild Identificator',
+ `LogGuid` int(11) NOT NULL COMMENT 'Log record identificator - auxiliary column',
+ `EventType` tinyint(1) NOT NULL COMMENT 'Event type',
+ `PlayerGuid1` int(11) NOT NULL COMMENT 'Player 1',
+ `PlayerGuid2` int(11) NOT NULL COMMENT 'Player 2',
+ `NewRank` tinyint(2) NOT NULL COMMENT 'New rank(in case promotion/demotion)',
+ `TimeStamp` bigint(20) NOT NULL COMMENT 'Event UNIX time',
+ PRIMARY KEY (`guildid`, `LogGuid`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'Guild Eventlog';
+
+-- The reason i decided for such dramatic change is that old guild_eventlog table didn't have Primary key and
+-- used LogGuids from 0 to infinity
+-- New system uses LogGuids from 0 to number defined in config. \ No newline at end of file
diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp
index 6f627c4f986..37d5db941f7 100644
--- a/src/game/Guild.cpp
+++ b/src/game/Guild.cpp
@@ -29,22 +29,34 @@
#include "SocialMgr.h"
#include "Util.h"
#include "Language.h"
+#include "World.h"
Guild::Guild()
{
- Id = 0;
- name = "";
- leaderGuid = 0;
+ m_Id = 0;
+ m_Name = "";
+ m_LeaderGuid = 0;
GINFO = MOTD = "";
- EmblemStyle = 0;
- EmblemColor = 0;
- BorderStyle = 0;
- BorderColor = 0;
- BackgroundColor = 0;
+ m_EmblemStyle = 0;
+ m_EmblemColor = 0;
+ m_BorderStyle = 0;
+ m_BorderColor = 0;
+ m_BackgroundColor = 0;
- CreatedYear = 0;
- CreatedMonth = 0;
- CreatedDay = 0;
+ m_CreatedYear = 0;
+ m_CreatedMonth = 0;
+ m_CreatedDay = 0;
+
+ m_EventLogLoaded = false;
+ m_GuildBankLoaded = false;
+ m_OnlineMembers = 0;
+ m_GuildBankMoney = 0;
+ m_PurchasedTabs = 0;
+
+ m_GuildEventLogNextGuid = 0;
+ m_GuildBankEventLogNextGuid_Money = 0;
+ for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; i++)
+ m_GuildBankEventLogNextGuid_Item[i] = 0;
}
Guild::~Guild()
@@ -52,7 +64,7 @@ Guild::~Guild()
}
-bool Guild::create(Player* leader, std::string gname)
+bool Guild::Create(Player* leader, std::string gname)
{
if(objmgr.GetGuildByName(gname))
return false;
@@ -61,15 +73,15 @@ bool Guild::create(Player* leader, std::string gname)
if(!lSession)
return false;
- leaderGuid = leader->GetGUID();
- name = gname;
+ m_LeaderGuid = leader->GetGUID();
+ m_Name = gname;
GINFO = "";
MOTD = "No message set.";
- guildbank_money = 0;
- purchased_tabs = 0;
- Id = objmgr.GenerateGuildId();
+ m_GuildBankMoney = 0;
+ m_PurchasedTabs = 0;
+ m_Id = objmgr.GenerateGuildId();
- sLog.outDebug("GUILD: creating guild %s to leader: %u", gname.c_str(), GUID_LOPART(leaderGuid));
+ sLog.outDebug("GUILD: creating guild %s to leader: %u", gname.c_str(), GUID_LOPART(m_LeaderGuid));
// gname already assigned to Guild::name, use it to encode string for DB
CharacterDatabase.escape_string(gname);
@@ -81,11 +93,11 @@ bool Guild::create(Player* leader, std::string gname)
CharacterDatabase.BeginTransaction();
// CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid='%u'", Id); - MAX(guildid)+1 not exist
- CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", Id);
- CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", m_Id);
CharacterDatabase.PExecute("INSERT INTO guild (guildid,name,leaderguid,info,motd,createdate,EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor,BankMoney) "
"VALUES('%u','%s','%u', '%s', '%s', NOW(),'%u','%u','%u','%u','%u','" UI64FMTD "')",
- Id, gname.c_str(), GUID_LOPART(leaderGuid), dbGINFO.c_str(), dbMOTD.c_str(), EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, guildbank_money);
+ m_Id, gname.c_str(), GUID_LOPART(m_LeaderGuid), dbGINFO.c_str(), dbMOTD.c_str(), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_GuildBankMoney);
CharacterDatabase.CommitTransaction();
CreateRank(lSession->GetMangosString(LANG_GUILD_MASTER), GR_RIGHT_ALL);
@@ -94,7 +106,7 @@ bool Guild::create(Player* leader, std::string gname)
CreateRank(lSession->GetMangosString(LANG_GUILD_MEMBER), GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
CreateRank(lSession->GetMangosString(LANG_GUILD_INITIATE),GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
- return AddMember(leaderGuid, (uint32)GR_GUILDMASTER);
+ return AddMember(m_LeaderGuid, (uint32)GR_GUILDMASTER);
}
bool Guild::AddMember(uint64 plGuid, uint32 plRank)
@@ -136,12 +148,12 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank)
CharacterDatabase.escape_string(dbOFFnote);
CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')",
- Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str());
+ m_Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str());
// If player not in game data in data field will be loaded from guild tables, no need to update it!!
if(pl)
{
- pl->SetInGuild(Id);
+ pl->SetInGuild(m_Id);
pl->SetRank(newmember.RankId);
pl->SetGuildIdInvited(0);
}
@@ -154,7 +166,7 @@ void Guild::SetMOTD(std::string motd)
// motd now can be used for encoding to DB
CharacterDatabase.escape_string(motd);
- CharacterDatabase.PExecute("UPDATE guild SET motd='%s' WHERE guildid='%u'", motd.c_str(), Id);
+ CharacterDatabase.PExecute("UPDATE guild SET motd='%s' WHERE guildid='%u'", motd.c_str(), m_Id);
}
void Guild::SetGINFO(std::string ginfo)
@@ -163,7 +175,7 @@ void Guild::SetGINFO(std::string ginfo)
// ginfo now can be used for encoding to DB
CharacterDatabase.escape_string(ginfo);
- CharacterDatabase.PExecute("UPDATE guild SET info='%s' WHERE guildid='%u'", ginfo.c_str(), Id);
+ CharacterDatabase.PExecute("UPDATE guild SET info='%s' WHERE guildid='%u'", ginfo.c_str(), m_Id);
}
bool Guild::LoadGuildFromDB(uint32 GuildId)
@@ -178,11 +190,11 @@ bool Guild::LoadGuildFromDB(uint32 GuildId)
if(result)
{
Field *fields = result->Fetch();
- purchased_tabs = fields[0].GetUInt8()+1; // Because TabId begins at 0
+ m_PurchasedTabs = fields[0].GetUInt8()+1; // Because TabId begins at 0
delete result;
}
else
- purchased_tabs = 0;
+ m_PurchasedTabs = 0;
LoadBankRightsFromDB(GuildId); // Must be after LoadRanksFromDB because it populates rank struct
@@ -196,43 +208,39 @@ bool Guild::LoadGuildFromDB(uint32 GuildId)
Field *fields = result->Fetch();
- Id = fields[0].GetUInt32();
- name = fields[1].GetCppString();
- leaderGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
+ m_Id = fields[0].GetUInt32();
+ m_Name = fields[1].GetCppString();
+ m_LeaderGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER);
- EmblemStyle = fields[3].GetUInt32();
- EmblemColor = fields[4].GetUInt32();
- BorderStyle = fields[5].GetUInt32();
- BorderColor = fields[6].GetUInt32();
- BackgroundColor = fields[7].GetUInt32();
+ m_EmblemStyle = fields[3].GetUInt32();
+ m_EmblemColor = fields[4].GetUInt32();
+ m_BorderStyle = fields[5].GetUInt32();
+ m_BorderColor = fields[6].GetUInt32();
+ m_BackgroundColor = fields[7].GetUInt32();
GINFO = fields[8].GetCppString();
MOTD = fields[9].GetCppString();
uint64 time = fields[10].GetUInt64(); //datetime is uint64 type ... YYYYmmdd:hh:mm:ss
- guildbank_money = fields[11].GetUInt64();
+ m_GuildBankMoney = fields[11].GetUInt64();
delete result;
uint64 dTime = time /1000000;
- CreatedDay = dTime%100;
- CreatedMonth = (dTime/100)%100;
- CreatedYear = (dTime/10000)%10000;
+ m_CreatedDay = dTime%100;
+ m_CreatedMonth = (dTime/100)%100;
+ m_CreatedYear = (dTime/10000)%10000;
// If the leader does not exist attempt to promote another member
- if(!objmgr.GetPlayerAccountIdByGUID(leaderGuid ))
+ if(!objmgr.GetPlayerAccountIdByGUID(m_LeaderGuid ))
{
- DelMember(leaderGuid);
+ DelMember(m_LeaderGuid);
// check no members case (disbanded)
if(members.empty())
return false;
}
- sLog.outDebug("Guild %u Creation time Loaded day: %u, month: %u, year: %u", GuildId, CreatedDay, CreatedMonth, CreatedYear);
- m_bankloaded = false;
- m_eventlogloaded = false;
- m_onlinemembers = 0;
- RenumBankLogs();
- RenumGuildEventlog();
+ sLog.outDebug("Guild %u Creation time Loaded day: %u, month: %u, year: %u", GuildId, m_CreatedDay, m_CreatedMonth, m_CreatedYear);
+
return true;
}
@@ -255,17 +263,17 @@ bool Guild::LoadRanksFromDB(uint32 GuildId)
uint32 rankMoney = fields[2].GetUInt32();
uint32 rankRID = fields[3].GetUInt32();
- if(rankRID != m_ranks.size()+1) // guild_rank.rid always store rank+1
+ if(rankRID != m_Ranks.size()+1) // guild_rank.rid always store rank+1
broken_ranks = true;
- if(m_ranks.size()==GR_GUILDMASTER) // prevent loss leader rights
+ if(m_Ranks.size() == GR_GUILDMASTER) // prevent loss leader rights
rankRights |= GR_RIGHT_ALL;
AddRank(rankName,rankRights,rankMoney);
}while( result->NextRow() );
delete result;
- if(m_ranks.size()==0) // empty rank table?
+ if(m_Ranks.size()==0) // empty rank table?
{
AddRank("Guild Master",GR_RIGHT_ALL,0);
broken_ranks = true;
@@ -277,11 +285,11 @@ bool Guild::LoadRanksFromDB(uint32 GuildId)
sLog.outError("Guild %u have broken `guild_rank` data, repairing...",GuildId);
CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid='%u'", GuildId);
- for(size_t i =0; i < m_ranks.size(); ++i)
+ for(size_t i =0; i < m_Ranks.size(); ++i)
{
// guild_rank.rid always store rank+1
- std::string name = m_ranks[i].name;
- uint32 rights = m_ranks[i].rights;
+ std::string name = m_Ranks[i].name;
+ uint32 rights = m_Ranks[i].rights;
CharacterDatabase.escape_string(name);
CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", GuildId, uint32(i+1), name.c_str(), rights);
}
@@ -428,15 +436,15 @@ void Guild::LoadPlayerStatsByGuid(uint64 guid)
void Guild::SetLeader(uint64 guid)
{
- leaderGuid = guid;
+ m_LeaderGuid = guid;
ChangeRank(guid, GR_GUILDMASTER);
- CharacterDatabase.PExecute("UPDATE guild SET leaderguid='%u' WHERE guildid='%u'", GUID_LOPART(guid), Id);
+ CharacterDatabase.PExecute("UPDATE guild SET leaderguid='%u' WHERE guildid='%u'", GUID_LOPART(guid), m_Id);
}
void Guild::DelMember(uint64 guid, bool isDisbanding)
{
- if(leaderGuid == guid && !isDisbanding)
+ if(m_LeaderGuid == guid && !isDisbanding)
{
MemberSlot* oldLeader = NULL;
MemberSlot* best = NULL;
@@ -597,76 +605,76 @@ void Guild::BroadcastPacketToRank(WorldPacket *packet, uint32 rankId)
void Guild::CreateRank(std::string name_,uint32 rights)
{
- if(m_ranks.size() >= GUILD_MAX_RANKS)
+ if(m_Ranks.size() >= GUILD_MAX_RANKS)
return;
AddRank(name_,rights,0);
- for (uint8 i = 0; i < purchased_tabs; ++i)
+ for (int i = 0; i < m_PurchasedTabs; ++i)
{
- CreateBankRightForTab(m_ranks.size()-1, uint8(i));
+ CreateBankRightForTab(m_Ranks.size()-1, uint8(i));
}
// guild_rank.rid always store rank+1 value
// name now can be used for encoding to DB
CharacterDatabase.escape_string(name_);
- CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", Id, (unsigned int)m_ranks.size(), name_.c_str(), rights );
+ CharacterDatabase.PExecute( "INSERT INTO guild_rank (guildid,rid,rname,rights) VALUES ('%u', '%u', '%s', '%u')", m_Id, (unsigned int)m_Ranks.size(), name_.c_str(), rights );
}
void Guild::AddRank(const std::string& name_,uint32 rights, uint32 money)
{
- m_ranks.push_back(RankInfo(name_,rights,money));
+ m_Ranks.push_back(RankInfo(name_,rights,money));
}
void Guild::DelRank()
{
- if(m_ranks.empty())
+ if(m_Ranks.empty())
return;
// guild_rank.rid always store rank+1 value
- uint32 rank = m_ranks.size()-1;
- CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE rid>='%u' AND guildid='%u'", (rank+1), Id);
+ uint32 rank = m_Ranks.size()-1;
+ CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE rid>='%u' AND guildid='%u'", (rank+1), m_Id);
- m_ranks.pop_back();
+ m_Ranks.pop_back();
}
std::string Guild::GetRankName(uint32 rankId)
{
- if(rankId >= m_ranks.size())
+ if(rankId >= m_Ranks.size())
return "<unknown>";
- return m_ranks[rankId].name;
+ return m_Ranks[rankId].name;
}
uint32 Guild::GetRankRights(uint32 rankId)
{
- if(rankId >= m_ranks.size())
+ if(rankId >= m_Ranks.size())
return 0;
- return m_ranks[rankId].rights;
+ return m_Ranks[rankId].rights;
}
void Guild::SetRankName(uint32 rankId, std::string name_)
{
- if(rankId >= m_ranks.size())
+ if(rankId >= m_Ranks.size())
return;
- m_ranks[rankId].name = name_;
+ m_Ranks[rankId].name = name_;
// name now can be used for encoding to DB
CharacterDatabase.escape_string(name_);
- CharacterDatabase.PExecute("UPDATE guild_rank SET rname='%s' WHERE rid='%u' AND guildid='%u'", name_.c_str(), (rankId+1), Id);
+ CharacterDatabase.PExecute("UPDATE guild_rank SET rname='%s' WHERE rid='%u' AND guildid='%u'", name_.c_str(), (rankId+1), m_Id);
}
void Guild::SetRankRights(uint32 rankId, uint32 rights)
{
- if(rankId >= m_ranks.size())
+ if(rankId >= m_Ranks.size())
return;
- m_ranks[rankId].rights = rights;
+ m_Ranks[rankId].rights = rights;
- CharacterDatabase.PExecute("UPDATE guild_rank SET rights='%u' WHERE rid='%u' AND guildid='%u'", rights, (rankId+1), Id);
+ CharacterDatabase.PExecute("UPDATE guild_rank SET rights='%u' WHERE rid='%u' AND guildid='%u'", rights, (rankId+1), m_Id);
}
int32 Guild::GetRank(uint32 LowGuid)
@@ -691,27 +699,27 @@ void Guild::Disband()
}
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_bank_tab WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid = '%u'",Id);
- CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid = '%u'",Id);
+ CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_rank WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_tab WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid = '%u'", m_Id);
+ CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid = '%u'", m_Id);
CharacterDatabase.CommitTransaction();
- objmgr.RemoveGuild(Id);
+ objmgr.RemoveGuild(m_Id);
}
void Guild::Roster(WorldSession *session)
{
// we can only guess size
- WorldPacket data(SMSG_GUILD_ROSTER, (4+MOTD.length()+1+GINFO.length()+1+4+m_ranks.size()*(4+4+GUILD_BANK_MAX_TABS*(4+4))+members.size()*50));
+ WorldPacket data(SMSG_GUILD_ROSTER, (4+MOTD.length()+1+GINFO.length()+1+4+m_Ranks.size()*(4+4+GUILD_BANK_MAX_TABS*(4+4))+members.size()*50));
data << (uint32)members.size();
data << MOTD;
data << GINFO;
- data << (uint32)m_ranks.size();
- for (RankList::const_iterator ritr = m_ranks.begin(); ritr != m_ranks.end(); ++ritr)
+ data << (uint32)m_Ranks.size();
+ for (RankList::const_iterator ritr = m_Ranks.begin(); ritr != m_Ranks.end(); ++ritr)
{
data << uint32(ritr->rights);
data << uint32(ritr->BankMoneyPerDay); // count of: withdraw gold(gold/day) Note: in game set gold, in packet set bronze.
@@ -759,22 +767,22 @@ void Guild::Query(WorldSession *session)
{
WorldPacket data(SMSG_GUILD_QUERY_RESPONSE, (8*32+200));// we can only guess size
- data << Id;
- data << name;
+ data << m_Id;
+ data << m_Name;
for (size_t i = 0 ; i < 10; ++i) // show always 10 ranks
{
- if(i < m_ranks.size())
- data << m_ranks[i].name;
+ if(i < m_Ranks.size())
+ data << m_Ranks[i].name;
else
data << (uint8)0; // null string
}
- data << uint32(EmblemStyle);
- data << uint32(EmblemColor);
- data << uint32(BorderStyle);
- data << uint32(BorderColor);
- data << uint32(BackgroundColor);
+ data << uint32(m_EmblemStyle);
+ data << uint32(m_EmblemColor);
+ data << uint32(m_BorderStyle);
+ data << uint32(m_BorderColor);
+ data << uint32(m_BackgroundColor);
data << uint32(0); // something new in WotLK
session->SendPacket( &data );
@@ -783,13 +791,13 @@ void Guild::Query(WorldSession *session)
void Guild::SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor)
{
- EmblemStyle = emblemStyle;
- EmblemColor = emblemColor;
- BorderStyle = borderStyle;
- BorderColor = borderColor;
- BackgroundColor = backgroundColor;
+ m_EmblemStyle = emblemStyle;
+ m_EmblemColor = emblemColor;
+ m_BorderStyle = borderStyle;
+ m_BorderColor = borderColor;
+ m_BackgroundColor = backgroundColor;
- CharacterDatabase.PExecute("UPDATE guild SET EmblemStyle=%u, EmblemColor=%u, BorderStyle=%u, BorderColor=%u, BackgroundColor=%u WHERE guildid = %u", EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, Id);
+ CharacterDatabase.PExecute("UPDATE guild SET EmblemStyle=%u, EmblemColor=%u, BorderStyle=%u, BorderColor=%u, BackgroundColor=%u WHERE guildid = %u", m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_Id);
}
void Guild::UpdateLogoutTime(uint64 guid)
@@ -800,12 +808,12 @@ void Guild::UpdateLogoutTime(uint64 guid)
itr->second.logout_time = time(NULL);
- if (m_onlinemembers > 0)
- --m_onlinemembers;
+ if (m_OnlineMembers > 0)
+ --m_OnlineMembers;
else
{
UnloadGuildBank();
- UnloadGuildEventlog();
+ UnloadGuildEventLog();
}
}
@@ -813,17 +821,17 @@ void Guild::UpdateLogoutTime(uint64 guid)
// Guild Eventlog part
// *************************************************
// Display guild eventlog
-void Guild::DisplayGuildEventlog(WorldSession *session)
+void Guild::DisplayGuildEventLog(WorldSession *session)
{
// Load guild eventlog, if not already done
- if (!m_eventlogloaded)
+ if (!m_EventLogLoaded)
LoadGuildEventLogFromDB();
// Sending result
WorldPacket data(MSG_GUILD_EVENT_LOG_QUERY, 0);
// count, max count == 100
- data << uint8(m_GuildEventlog.size());
- for (GuildEventlog::const_iterator itr = m_GuildEventlog.begin(); itr != m_GuildEventlog.end(); ++itr)
+ data << uint8(m_GuildEventLog.size());
+ for (GuildEventLog::const_iterator itr = m_GuildEventLog.begin(); itr != m_GuildEventLog.end(); ++itr)
{
// Event type
data << uint8(itr->EventType);
@@ -846,82 +854,76 @@ void Guild::DisplayGuildEventlog(WorldSession *session)
void Guild::LoadGuildEventLogFromDB()
{
// Return if already loaded
- if (m_eventlogloaded)
+ if (m_EventLogLoaded)
return;
- QueryResult *result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog WHERE guildid=%u ORDER BY LogGuid DESC LIMIT %u", Id, GUILD_EVENTLOG_MAX_ENTRIES);
+ // 0 1 2 3 4 5
+ QueryResult *result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog WHERE guildid=%u ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_EVENTLOG_MAX_RECORDS);
if(!result)
return;
+ bool isNextLogGuidSet = false;
+ //uint32 configCount = sWorld.getConfig(CONFIG_GUILD_EVENT_LOG_COUNT);
+ // First event in list will be the oldest and the latest event is last event in list
do
{
Field *fields = result->Fetch();
- GuildEventlogEntry NewEvent;
+ if (!isNextLogGuidSet)
+ {
+ m_GuildEventLogNextGuid = fields[0].GetUInt32();
+ isNextLogGuidSet = true;
+ }
// Fill entry
- NewEvent.LogGuid = fields[0].GetUInt32();
+ GuildEventLogEntry NewEvent;
NewEvent.EventType = fields[1].GetUInt8();
NewEvent.PlayerGuid1 = fields[2].GetUInt32();
NewEvent.PlayerGuid2 = fields[3].GetUInt32();
NewEvent.NewRank = fields[4].GetUInt8();
NewEvent.TimeStamp = fields[5].GetUInt64();
- // Add entry to map
- m_GuildEventlog.push_front(NewEvent);
+
+ // There can be a problem if more events have same TimeStamp the ORDER can be broken when fields[0].GetUInt32() == configCount, but
+ // events with same timestamp can appear when there is lag, and we naivly suppose that mangos isn't laggy
+ // but if problem appears, player will see set of guild events that have same timestamp in bad order
+
+ // Add entry to list
+ m_GuildEventLog.push_front(NewEvent);
} while( result->NextRow() );
delete result;
- // Check lists size in case to many event entries in db
- // This cases can happen only if a crash occured somewhere and table has too many log entries
- if (!m_GuildEventlog.empty())
- CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid=%u AND LogGuid < %u", Id, m_GuildEventlog.front().LogGuid);
-
- m_eventlogloaded = true;
+ m_EventLogLoaded = true;
}
// Unload guild eventlog
-void Guild::UnloadGuildEventlog()
+void Guild::UnloadGuildEventLog()
{
- if (!m_eventlogloaded)
+ if (!m_EventLogLoaded)
return;
- m_GuildEventlog.clear();
- m_eventlogloaded = false;
-}
-
-// This will renum guids used at load to prevent always going up until infinit
-void Guild::RenumGuildEventlog()
-{
- QueryResult *result = CharacterDatabase.PQuery("SELECT Min(LogGuid), Max(LogGuid) FROM guild_eventlog WHERE guildid = %u", Id);
- if(!result)
- return;
-
- Field *fields = result->Fetch();
- CharacterDatabase.PExecute("UPDATE guild_eventlog SET LogGuid=LogGuid-%u+1 WHERE guildid=%u ORDER BY LogGuid %s",fields[0].GetUInt32(), Id, fields[0].GetUInt32()?"ASC":"DESC");
- GuildEventlogMaxGuid = fields[1].GetUInt32()+1;
- delete result;
+ m_GuildEventLog.clear();
+ m_EventLogLoaded = false;
}
// Add entry to guild eventlog
void Guild::LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank)
{
- GuildEventlogEntry NewEvent;
- // Fill entry
- NewEvent.LogGuid = GuildEventlogMaxGuid++;
+ GuildEventLogEntry NewEvent;
+ // Create event
NewEvent.EventType = EventType;
NewEvent.PlayerGuid1 = PlayerGuid1;
NewEvent.PlayerGuid2 = PlayerGuid2;
NewEvent.NewRank = NewRank;
NewEvent.TimeStamp = uint32(time(NULL));
- // Check max entry limit and delete from db if needed
- if (m_GuildEventlog.size() > GUILD_EVENTLOG_MAX_ENTRIES)
- {
- CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid='%u' AND LogGuid='%u'", Id, m_GuildEventlog.front().LogGuid);
- m_GuildEventlog.pop_front();
- }
- // Add entry to map
- m_GuildEventlog.push_back(NewEvent);
- // Add new eventlog entry into DB
+ // Count new LogGuid
+ m_GuildEventLogNextGuid = (m_GuildEventLogNextGuid + 1) % sWorld.getConfig(CONFIG_GUILD_EVENT_LOG_COUNT);
+ // Check max records limit
+ if (m_GuildEventLog.size() >= GUILD_EVENTLOG_MAX_RECORDS)
+ m_GuildEventLog.pop_front();
+ // Add event to list
+ m_GuildEventLog.push_back(NewEvent);
+ // Save event to DB
+ CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE guildid='%u' AND LogGuid='%u'", m_Id, m_GuildEventLogNextGuid);
CharacterDatabase.PExecute("INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES ('%u','%u','%u','%u','%u','%u','" UI64FMTD "')",
- Id, NewEvent.LogGuid, uint32(NewEvent.EventType), NewEvent.PlayerGuid1, NewEvent.PlayerGuid2, uint32(NewEvent.NewRank), NewEvent.TimeStamp);
+ m_Id, m_GuildEventLogNextGuid, uint32(NewEvent.EventType), NewEvent.PlayerGuid1, NewEvent.PlayerGuid2, uint32(NewEvent.NewRank), NewEvent.TimeStamp);
}
// *************************************************
@@ -1070,7 +1072,7 @@ Item* Guild::GetItem(uint8 TabId, uint8 SlotId)
void Guild::DisplayGuildBankTabsInfo(WorldSession *session)
{
// Time to load bank if not already done
- if (!m_bankloaded)
+ if (!m_GuildBankLoaded)
LoadGuildBankFromDB();
WorldPacket data(SMSG_GUILD_BANK_LIST, 500);
@@ -1080,9 +1082,9 @@ void Guild::DisplayGuildBankTabsInfo(WorldSession *session)
data << uint32(0xFFFFFFFF); // bit 9 must be set for this packet to work
data << uint8(1); // Tell Client this is a TabInfo packet
- data << uint8(purchased_tabs); // here is the number of tabs
+ data << uint8(m_PurchasedTabs); // here is the number of tabs
- for(uint8 i = 0; i < purchased_tabs; ++i)
+ for(int i = 0; i < m_PurchasedTabs; ++i)
{
data << m_TabListMap[i]->Name.c_str();
data << m_TabListMap[i]->Icon.c_str();
@@ -1095,19 +1097,19 @@ void Guild::DisplayGuildBankTabsInfo(WorldSession *session)
void Guild::CreateNewBankTab()
{
- if (purchased_tabs >= GUILD_BANK_MAX_TABS)
+ if (m_PurchasedTabs >= GUILD_BANK_MAX_TABS)
return;
- ++purchased_tabs;
+ ++m_PurchasedTabs;
GuildBankTab* AnotherTab = new GuildBankTab;
memset(AnotherTab->Slots, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*));
- m_TabListMap.resize(purchased_tabs);
- m_TabListMap[purchased_tabs-1] = AnotherTab;
+ m_TabListMap.resize(m_PurchasedTabs);
+ m_TabListMap[m_PurchasedTabs-1] = AnotherTab;
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("DELETE FROM guild_bank_tab WHERE guildid='%u' AND TabId='%u'", Id, uint32(purchased_tabs-1));
- CharacterDatabase.PExecute("INSERT INTO guild_bank_tab (guildid,TabId) VALUES ('%u','%u')", Id, uint32(purchased_tabs-1));
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_tab WHERE guildid='%u' AND TabId='%u'", m_Id, uint32(m_PurchasedTabs-1));
+ CharacterDatabase.PExecute("INSERT INTO guild_bank_tab (guildid,TabId) VALUES ('%u','%u')", m_Id, uint32(m_PurchasedTabs-1));
CharacterDatabase.CommitTransaction();
}
@@ -1129,29 +1131,29 @@ void Guild::SetGuildBankTabInfo(uint8 TabId, std::string Name, std::string Icon)
CharacterDatabase.escape_string(Name);
CharacterDatabase.escape_string(Icon);
- CharacterDatabase.PExecute("UPDATE guild_bank_tab SET TabName='%s',TabIcon='%s' WHERE guildid='%u' AND TabId='%u'", Name.c_str(), Icon.c_str(), Id, uint32(TabId));
+ CharacterDatabase.PExecute("UPDATE guild_bank_tab SET TabName='%s',TabIcon='%s' WHERE guildid='%u' AND TabId='%u'", Name.c_str(), Icon.c_str(), m_Id, uint32(TabId));
}
void Guild::CreateBankRightForTab(uint32 rankId, uint8 TabId)
{
sLog.outDebug("CreateBankRightForTab. rank: %u, TabId: %u", rankId, uint32(TabId));
- if (rankId >= m_ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
+ if (rankId >= m_Ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
return;
- m_ranks[rankId].TabRight[TabId]=0;
- m_ranks[rankId].TabSlotPerDay[TabId]=0;
+ m_Ranks[rankId].TabRight[TabId]=0;
+ m_Ranks[rankId].TabSlotPerDay[TabId]=0;
CharacterDatabase.BeginTransaction();
- CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid = '%u' AND TabId = '%u' AND rid = '%u'", Id, uint32(TabId), rankId);
- CharacterDatabase.PExecute("INSERT INTO guild_bank_right (guildid,TabId,rid) VALUES ('%u','%u','%u')", Id, uint32(TabId), rankId);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid = '%u' AND TabId = '%u' AND rid = '%u'", m_Id, uint32(TabId), rankId);
+ CharacterDatabase.PExecute("INSERT INTO guild_bank_right (guildid,TabId,rid) VALUES ('%u','%u','%u')", m_Id, uint32(TabId), rankId);
CharacterDatabase.CommitTransaction();
}
uint32 Guild::GetBankRights(uint32 rankId, uint8 TabId) const
{
- if(rankId >= m_ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
+ if(rankId >= m_Ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
return 0;
- return m_ranks[rankId].TabRight[TabId];
+ return m_Ranks[rankId].TabRight[TabId];
}
// *************************************************
@@ -1160,21 +1162,21 @@ uint32 Guild::GetBankRights(uint32 rankId, uint8 TabId) const
// This load should be called when the bank is first accessed by a guild member
void Guild::LoadGuildBankFromDB()
{
- if (m_bankloaded)
+ if (m_GuildBankLoaded)
return;
- m_bankloaded = true;
+ m_GuildBankLoaded = true;
LoadGuildBankEventLogFromDB();
// 0 1 2 3
- QueryResult *result = CharacterDatabase.PQuery("SELECT TabId, TabName, TabIcon, TabText FROM guild_bank_tab WHERE guildid='%u' ORDER BY TabId", Id);
+ QueryResult *result = CharacterDatabase.PQuery("SELECT TabId, TabName, TabIcon, TabText FROM guild_bank_tab WHERE guildid='%u' ORDER BY TabId", m_Id);
if(!result)
{
- purchased_tabs = 0;
+ m_PurchasedTabs = 0;
return;
}
- m_TabListMap.resize(purchased_tabs);
+ m_TabListMap.resize(m_PurchasedTabs);
do
{
Field *fields = result->Fetch();
@@ -1194,7 +1196,7 @@ void Guild::LoadGuildBankFromDB()
// data needs to be at first place for Item::LoadFromDB
// 0 1 2 3 4
- result = CharacterDatabase.PQuery("SELECT data, TabId, SlotId, item_guid, item_entry FROM guild_bank_item JOIN item_instance ON item_guid = guid WHERE guildid='%u' ORDER BY TabId", Id);
+ result = CharacterDatabase.PQuery("SELECT data, TabId, SlotId, item_guid, item_entry FROM guild_bank_item JOIN item_instance ON item_guid = guid WHERE guildid='%u' ORDER BY TabId", m_Id);
if(!result)
return;
@@ -1206,7 +1208,7 @@ void Guild::LoadGuildBankFromDB()
uint32 ItemGuid = fields[3].GetUInt32();
uint32 ItemEntry = fields[4].GetUInt32();
- if (TabId >= purchased_tabs || TabId >= GUILD_BANK_MAX_TABS)
+ if (TabId >= m_PurchasedTabs || TabId >= GUILD_BANK_MAX_TABS)
{
sLog.outError( "Guild::LoadGuildBankFromDB: Invalid tab for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid,ItemEntry);
continue;
@@ -1229,7 +1231,7 @@ void Guild::LoadGuildBankFromDB()
Item *pItem = NewItemOrBag(proto);
if(!pItem->LoadFromDB(ItemGuid, 0, result))
{
- CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", Id, uint32(TabId), uint32(SlotId));
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_item WHERE guildid='%u' AND TabId='%u' AND SlotId='%u'", m_Id, uint32(TabId), uint32(SlotId));
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);
delete pItem;
continue;
@@ -1245,9 +1247,9 @@ void Guild::LoadGuildBankFromDB()
// This unload should be called when the last member of the guild gets offline
void Guild::UnloadGuildBank()
{
- if (!m_bankloaded)
+ if (!m_GuildBankLoaded)
return;
- for (uint8 i = 0 ; i < purchased_tabs ; ++i )
+ for (uint8 i = 0 ; i < m_PurchasedTabs ; ++i )
{
for (uint8 j = 0 ; j < GUILD_BANK_MAX_SLOTS ; ++j)
{
@@ -1262,7 +1264,7 @@ void Guild::UnloadGuildBank()
m_TabListMap.clear();
UnloadGuildBankEventLog();
- m_bankloaded = false;
+ m_GuildBankLoaded = false;
}
// *************************************************
@@ -1292,7 +1294,7 @@ bool Guild::MemberMoneyWithdraw(uint32 amount, uint32 LowGuid)
return false;
itr->second.BankRemMoney -= amount;
CharacterDatabase.PExecute("UPDATE guild_member SET BankRemMoney='%u' WHERE guildid='%u' AND guid='%u'",
- itr->second.BankRemMoney, Id, LowGuid);
+ itr->second.BankRemMoney, m_Id, LowGuid);
}
return true;
}
@@ -1301,9 +1303,9 @@ void Guild::SetBankMoney(int64 money)
{
if (money < 0) // I don't know how this happens, it does!!
money = 0;
- guildbank_money = money;
+ m_GuildBankMoney = money;
- CharacterDatabase.PExecute("UPDATE guild SET BankMoney='" UI64FMTD "' WHERE guildid='%u'", money, Id);
+ CharacterDatabase.PExecute("UPDATE guild SET BankMoney='" UI64FMTD "' WHERE guildid='%u'", money, m_Id);
}
// *************************************************
@@ -1323,7 +1325,7 @@ bool Guild::MemberItemWithdraw(uint8 TabId, uint32 LowGuid)
return false;
--itr->second.BankRemSlotsTab[TabId];
CharacterDatabase.PExecute("UPDATE guild_member SET BankRemSlotsTab%u='%u' WHERE guildid='%u' AND guid='%u'",
- uint32(TabId), itr->second.BankRemSlotsTab[TabId], Id, LowGuid);
+ uint32(TabId), itr->second.BankRemSlotsTab[TabId], m_Id, LowGuid);
}
return true;
}
@@ -1358,7 +1360,7 @@ uint32 Guild::GetMemberSlotWithdrawRem(uint32 LowGuid, uint8 TabId)
itr->second.BankResetTimeTab[TabId] = curTime;
itr->second.BankRemSlotsTab[TabId] = GetBankSlotPerDay(itr->second.RankId, TabId);
CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeTab%u='%u',BankRemSlotsTab%u='%u' WHERE guildid='%u' AND guid='%u'",
- uint32(TabId), itr->second.BankResetTimeTab[TabId], uint32(TabId), itr->second.BankRemSlotsTab[TabId], Id, LowGuid);
+ uint32(TabId), itr->second.BankResetTimeTab[TabId], uint32(TabId), itr->second.BankRemSlotsTab[TabId], m_Id, LowGuid);
}
return itr->second.BankRemSlotsTab[TabId];
}
@@ -1379,34 +1381,34 @@ uint32 Guild::GetMemberMoneyWithdrawRem(uint32 LowGuid)
itr->second.BankResetTimeMoney = curTime;
itr->second.BankRemMoney = GetBankMoneyPerDay(itr->second.RankId);
CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeMoney='%u',BankRemMoney='%u' WHERE guildid='%u' AND guid='%u'",
- itr->second.BankResetTimeMoney, itr->second.BankRemMoney, Id, LowGuid);
+ itr->second.BankResetTimeMoney, itr->second.BankRemMoney, m_Id, LowGuid);
}
return itr->second.BankRemMoney;
}
void Guild::SetBankMoneyPerDay(uint32 rankId, uint32 money)
{
- if (rankId >= m_ranks.size())
+ if (rankId >= m_Ranks.size())
return;
if (rankId == GR_GUILDMASTER)
money = WITHDRAW_MONEY_UNLIMITED;
- m_ranks[rankId].BankMoneyPerDay = money;
+ m_Ranks[rankId].BankMoneyPerDay = money;
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
if (itr->second.RankId == rankId)
itr->second.BankResetTimeMoney = 0;
- CharacterDatabase.PExecute("UPDATE guild_rank SET BankMoneyPerDay='%u' WHERE rid='%u' AND guildid='%u'", money, (rankId+1), Id);
- CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeMoney='0' WHERE guildid='%u' AND rank='%u'", Id, rankId);
+ CharacterDatabase.PExecute("UPDATE guild_rank SET BankMoneyPerDay='%u' WHERE rid='%u' AND guildid='%u'", money, (rankId+1), m_Id);
+ CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeMoney='0' WHERE guildid='%u' AND rank='%u'", m_Id, rankId);
}
void Guild::SetBankRightsAndSlots(uint32 rankId, uint8 TabId, uint32 right, uint32 nbSlots, bool db)
{
- if(rankId >= m_ranks.size() ||
+ if(rankId >= m_Ranks.size() ||
TabId >= GUILD_BANK_MAX_TABS ||
- TabId >= purchased_tabs)
+ TabId >= m_PurchasedTabs)
return;
if (rankId == GR_GUILDMASTER)
@@ -1415,8 +1417,8 @@ void Guild::SetBankRightsAndSlots(uint32 rankId, uint8 TabId, uint32 right, uint
right = GUILD_BANK_RIGHT_FULL;
}
- m_ranks[rankId].TabSlotPerDay[TabId]=nbSlots;
- m_ranks[rankId].TabRight[TabId]=right;
+ m_Ranks[rankId].TabSlotPerDay[TabId]=nbSlots;
+ m_Ranks[rankId].TabRight[TabId]=right;
if (db)
{
@@ -1425,31 +1427,31 @@ void Guild::SetBankRightsAndSlots(uint32 rankId, uint8 TabId, uint32 right, uint
for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
itr->second.BankResetTimeTab[i] = 0;
- CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid='%u' AND TabId='%u' AND rid='%u'", Id, uint32(TabId), rankId);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_right WHERE guildid='%u' AND TabId='%u' AND rid='%u'", m_Id, uint32(TabId), rankId);
CharacterDatabase.PExecute("INSERT INTO guild_bank_right (guildid,TabId,rid,gbright,SlotPerDay) VALUES "
- "('%u','%u','%u','%u','%u')", Id, uint32(TabId), rankId, m_ranks[rankId].TabRight[TabId], m_ranks[rankId].TabSlotPerDay[TabId]);
- CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeTab%u='0' WHERE guildid='%u' AND rank='%u'", uint32(TabId), Id, rankId);
+ "('%u','%u','%u','%u','%u')", m_Id, uint32(TabId), rankId, m_Ranks[rankId].TabRight[TabId], m_Ranks[rankId].TabSlotPerDay[TabId]);
+ CharacterDatabase.PExecute("UPDATE guild_member SET BankResetTimeTab%u='0' WHERE guildid='%u' AND rank='%u'", uint32(TabId), m_Id, rankId);
}
}
uint32 Guild::GetBankMoneyPerDay(uint32 rankId)
{
- if(rankId >= m_ranks.size())
+ if(rankId >= m_Ranks.size())
return 0;
if (rankId == GR_GUILDMASTER)
return WITHDRAW_MONEY_UNLIMITED;
- return m_ranks[rankId].BankMoneyPerDay;
+ return m_Ranks[rankId].BankMoneyPerDay;
}
uint32 Guild::GetBankSlotPerDay(uint32 rankId, uint8 TabId)
{
- if(rankId >= m_ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
+ if(rankId >= m_Ranks.size() || TabId >= GUILD_BANK_MAX_TABS)
return 0;
if (rankId == GR_GUILDMASTER)
return WITHDRAW_SLOT_UNLIMITED;
- return m_ranks[rankId].TabSlotPerDay[TabId];
+ return m_Ranks[rankId].TabSlotPerDay[TabId];
}
// *************************************************
@@ -1484,59 +1486,88 @@ void Guild::LoadBankRightsFromDB(uint32 GuildId)
void Guild::LoadGuildBankEventLogFromDB()
{
- // We can't add a limit as in Guild::LoadGuildEventLogFromDB since we fetch both money and bank log and know nothing about the composition
- // 0 1 2 3 4 5 6 7
- QueryResult *result = CharacterDatabase.PQuery("SELECT LogGuid, LogEntry, TabId, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog WHERE guildid='%u' ORDER BY TimeStamp DESC", Id);
+ // Money log is in TabId = GUILD_BANK_MONEY_LOGS_TAB
+
+ //uint32 configCount = sWorld.getConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT);
+ //cycle through all purchased guild bank item tabs
+ for (uint32 tabId = 0; tabId < m_PurchasedTabs; tabId++)
+ {
+ // 0 1 2 3 4 5 6
+ QueryResult *result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog WHERE guildid='%u' AND TabId='%u' ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, tabId, GUILD_BANK_MAX_LOGS);
+ if(!result)
+ continue;
+
+ bool isNextLogGuidSet = false;
+ do
+ {
+ Field *fields = result->Fetch();
+
+ GuildBankEventLogEntry NewEvent;
+ NewEvent.EventType = fields[1].GetUInt8();
+ NewEvent.PlayerGuid = fields[2].GetUInt32();
+ NewEvent.ItemOrMoney = fields[3].GetUInt32();
+ NewEvent.ItemStackCount = fields[4].GetUInt8();
+ NewEvent.DestTabId = fields[5].GetUInt8();
+ NewEvent.TimeStamp = fields[6].GetUInt64();
+
+ //if newEvent is moneyEvent, move it to moneyEventTab in DB and report error
+ if (NewEvent.isMoneyEvent())
+ {
+ uint32 logGuid = fields[0].GetUInt32();
+ CharacterDatabase.PExecute("UPDATE guild_bank_eventlog SET TabId='%u' WHERE guildid='%u' AND TabId='%u' AND LogGuid='%u'", GUILD_BANK_MONEY_LOGS_TAB, m_Id, tabId, logGuid);
+ sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u had incorrectly set its TabId to %u, correcting it to %u TabId", logGuid, m_Id, tabId, GUILD_BANK_MONEY_LOGS_TAB);
+ continue;
+ }
+ else
+ //add event to list
+ //events are ordered from oldest (in beginning) to latest (in the end)
+ m_GuildBankEventLog_Item[tabId].push_front(NewEvent);
+
+ if (!isNextLogGuidSet)
+ {
+ m_GuildBankEventLogNextGuid_Item[tabId] = fields[0].GetUInt32();
+ //we don't have to do m_GuildBankEventLogNextGuid_Item[tabId] %= configCount; - it will be done when creating new record
+ isNextLogGuidSet = true;
+ }
+ } while( result->NextRow() );
+ delete result;
+ }
+
+ //special handle for guild bank money log
+ // 0 1 2 3 4 5 6
+ QueryResult *result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog WHERE guildid='%u' AND TabId='%u' ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_BANK_MONEY_LOGS_TAB, GUILD_BANK_MAX_LOGS);
if(!result)
return;
+ bool isNextMoneyLogGuidSet = false;
do
{
Field *fields = result->Fetch();
- GuildBankEvent NewEvent;
-
- NewEvent.LogGuid = fields[0].GetUInt32();
- NewEvent.LogEntry = fields[1].GetUInt8();
- uint8 TabId = fields[2].GetUInt8();
- NewEvent.PlayerGuid = fields[3].GetUInt32();
- NewEvent.ItemOrMoney = fields[4].GetUInt32();
- NewEvent.ItemStackCount = fields[5].GetUInt8();
- NewEvent.DestTabId = fields[6].GetUInt8();
- NewEvent.TimeStamp = fields[7].GetUInt64();
-
- if (TabId >= GUILD_BANK_MAX_TABS)
+ if (!isNextMoneyLogGuidSet)
{
- sLog.outError( "Guild::LoadGuildBankEventLogFromDB: Invalid tabid '%u' for guild bank log entry (guild: '%s', LogGuid: %u), skipped.", TabId, GetName().c_str(), NewEvent.LogGuid);
- continue;
+ m_GuildBankEventLogNextGuid_Money = fields[0].GetUInt32();
+ //we don't have to do m_GuildBankEventLogNextGuid_Money %= configCount; - it will be done when creating new record
+ isNextMoneyLogGuidSet = true;
}
+ GuildBankEventLogEntry NewEvent;
- if (NewEvent.isMoneyEvent() && m_GuildBankEventLog_Money.size() >= GUILD_BANK_MAX_LOGS ||
- m_GuildBankEventLog_Item[TabId].size() >= GUILD_BANK_MAX_LOGS)
- continue;
-
- if (NewEvent.isMoneyEvent())
- m_GuildBankEventLog_Money.push_front(NewEvent);
+ NewEvent.EventType = fields[1].GetUInt8();
+ NewEvent.PlayerGuid = fields[2].GetUInt32();
+ NewEvent.ItemOrMoney = fields[3].GetUInt32();
+ NewEvent.ItemStackCount = fields[4].GetUInt8();
+ NewEvent.DestTabId = fields[5].GetUInt8();
+ NewEvent.TimeStamp = fields[6].GetUInt64();
+
+ //if newEvent is not moneyEvent, then report error
+ if (!NewEvent.isMoneyEvent())
+ sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u is not MoneyEvent - ignoring...", fields[0].GetUInt32(), m_Id);
else
- m_GuildBankEventLog_Item[TabId].push_front(NewEvent);
+ //add event to list
+ //events are ordered from oldest (in beginning) to latest (in the end)
+ m_GuildBankEventLog_Money.push_front(NewEvent);
- }while( result->NextRow() );
+ } while( result->NextRow() );
delete result;
-
- // Check lists size in case to many event entries in db for a tab or for money
- // This cases can happen only if a crash occured somewhere and table has too many log entries
- if (!m_GuildBankEventLog_Money.empty())
- {
- CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid=%u AND LogGuid < %u",
- Id, m_GuildBankEventLog_Money.front().LogGuid);
- }
- for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
- {
- if (!m_GuildBankEventLog_Item[i].empty())
- {
- CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid=%u AND LogGuid < %u",
- Id, m_GuildBankEventLog_Item[i].front().LogGuid);
- }
- }
}
void Guild::UnloadGuildBankEventLog()
@@ -1560,13 +1591,13 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
data << uint8(m_GuildBankEventLog_Money.size()); // number of log entries
for (GuildBankEventLog::const_iterator itr = m_GuildBankEventLog_Money.begin(); itr != m_GuildBankEventLog_Money.end(); ++itr)
{
- data << uint8(itr->LogEntry);
+ data << uint8(itr->EventType);
data << uint64(MAKE_NEW_GUID(itr->PlayerGuid,0,HIGHGUID_PLAYER));
- if (itr->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_UNK1 ||
- itr->LogEntry == GUILD_BANK_LOG_UNK2)
+ if (itr->EventType == GUILD_BANK_LOG_DEPOSIT_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_REPAIR_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_UNK1 ||
+ itr->EventType == GUILD_BANK_LOG_UNK2)
{
data << uint32(itr->ItemOrMoney);
}
@@ -1574,7 +1605,7 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint32(itr->ItemOrMoney);
data << uint32(itr->ItemStackCount);
- if (itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
+ if (itr->EventType == GUILD_BANK_LOG_MOVE_ITEM || itr->EventType == GUILD_BANK_LOG_MOVE_ITEM2)
data << uint8(itr->DestTabId); // moved tab
}
data << uint32(time(NULL) - itr->TimeStamp);
@@ -1590,13 +1621,13 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
data << uint8(m_GuildBankEventLog_Item[TabId].size());
for (GuildBankEventLog::const_iterator itr = m_GuildBankEventLog_Item[TabId].begin(); itr != m_GuildBankEventLog_Item[TabId].end(); ++itr)
{
- data << uint8(itr->LogEntry);
+ data << uint8(itr->EventType);
data << uint64(MAKE_NEW_GUID(itr->PlayerGuid,0,HIGHGUID_PLAYER));
- if (itr->LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_REPAIR_MONEY ||
- itr->LogEntry == GUILD_BANK_LOG_UNK1 ||
- itr->LogEntry == GUILD_BANK_LOG_UNK2)
+ if (itr->EventType == GUILD_BANK_LOG_DEPOSIT_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_REPAIR_MONEY ||
+ itr->EventType == GUILD_BANK_LOG_UNK1 ||
+ itr->EventType == GUILD_BANK_LOG_UNK2)
{
data << uint32(itr->ItemOrMoney);
}
@@ -1604,7 +1635,7 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
{
data << uint32(itr->ItemOrMoney);
data << uint32(itr->ItemStackCount);
- if (itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM || itr->LogEntry == GUILD_BANK_LOG_MOVE_ITEM2)
+ if (itr->EventType == GUILD_BANK_LOG_MOVE_ITEM || itr->EventType == GUILD_BANK_LOG_MOVE_ITEM2)
data << uint8(itr->DestTabId); // moved tab
}
data << uint32(time(NULL) - itr->TimeStamp);
@@ -1614,53 +1645,45 @@ void Guild::DisplayGuildBankLogs(WorldSession *session, uint8 TabId)
sLog.outDebug("WORLD: Sent (MSG_GUILD_BANK_LOG_QUERY)");
}
-void Guild::LogBankEvent(uint8 LogEntry, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint8 ItemStackCount, uint8 DestTabId)
+void Guild::LogBankEvent(uint8 EventType, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint8 ItemStackCount, uint8 DestTabId)
{
- GuildBankEvent NewEvent;
-
- NewEvent.LogGuid = LogMaxGuid++;
- NewEvent.LogEntry = LogEntry;
+ //create Event
+ GuildBankEventLogEntry NewEvent;
+ NewEvent.EventType = EventType;
NewEvent.PlayerGuid = PlayerGuidLow;
NewEvent.ItemOrMoney = ItemOrMoney;
NewEvent.ItemStackCount = ItemStackCount;
NewEvent.DestTabId = DestTabId;
NewEvent.TimeStamp = uint32(time(NULL));
+ //add new event to the end of event list
+ uint32 currentTabId = TabId;
+ uint32 currentLogGuid = 0;
if (NewEvent.isMoneyEvent())
{
- if (m_GuildBankEventLog_Money.size() > GUILD_BANK_MAX_LOGS)
- {
- CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid='%u' AND LogGuid='%u'",
- Id, m_GuildBankEventLog_Money.front().LogGuid);
+ m_GuildBankEventLogNextGuid_Money = (m_GuildBankEventLogNextGuid_Money + 1) % sWorld.getConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT);
+ currentLogGuid = m_GuildBankEventLogNextGuid_Money;
+ currentTabId = GUILD_BANK_MONEY_LOGS_TAB;
+ if (m_GuildBankEventLog_Money.size() >= GUILD_BANK_MAX_LOGS)
m_GuildBankEventLog_Money.pop_front();
- }
+
m_GuildBankEventLog_Money.push_back(NewEvent);
}
else
{
- if (m_GuildBankEventLog_Item[TabId].size() > GUILD_BANK_MAX_LOGS)
- {
- CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid='%u' AND LogGuid='%u'",
- Id, m_GuildBankEventLog_Item[TabId].front().LogGuid);
+ m_GuildBankEventLogNextGuid_Item[TabId] = ((m_GuildBankEventLogNextGuid_Item[TabId]) + 1) % sWorld.getConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT);
+ currentLogGuid = m_GuildBankEventLogNextGuid_Item[TabId];
+ if (m_GuildBankEventLog_Item[TabId].size() >= GUILD_BANK_MAX_LOGS)
m_GuildBankEventLog_Item[TabId].pop_front();
- }
+
m_GuildBankEventLog_Item[TabId].push_back(NewEvent);
}
- CharacterDatabase.PExecute("INSERT INTO guild_bank_eventlog (guildid,LogGuid,LogEntry,TabId,PlayerGuid,ItemOrMoney,ItemStackCount,DestTabId,TimeStamp) VALUES ('%u','%u','%u','%u','%u','%u','%u','%u','" UI64FMTD "')",
- Id, NewEvent.LogGuid, uint32(NewEvent.LogEntry), uint32(TabId), NewEvent.PlayerGuid, NewEvent.ItemOrMoney, uint32(NewEvent.ItemStackCount), uint32(NewEvent.DestTabId), NewEvent.TimeStamp);
-}
-// This will renum guids used at load to prevent always going up until infinit
-void Guild::RenumBankLogs()
-{
- QueryResult *result = CharacterDatabase.PQuery("SELECT Min(LogGuid), Max(LogGuid) FROM guild_bank_eventlog WHERE guildid = %u", Id);
- if(!result)
- return;
+ //save event to database
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE guildid='%u' AND LogGuid='%u' AND TabId='%u'", m_Id, currentLogGuid, currentTabId);
- Field *fields = result->Fetch();
- CharacterDatabase.PExecute("UPDATE guild_bank_eventlog SET LogGuid=LogGuid-%u+1 WHERE guildid=%u ORDER BY LogGuid %s",fields[0].GetUInt32(), Id, fields[0].GetUInt32()?"ASC":"DESC");
- LogMaxGuid = fields[1].GetUInt32()+1;
- delete result;
+ CharacterDatabase.PExecute("INSERT INTO guild_bank_eventlog (guildid,LogGuid,TabId,EventType,PlayerGuid,ItemOrMoney,ItemStackCount,DestTabId,TimeStamp) VALUES ('%u','%u','%u','%u','%u','%u','%u','%u','" UI64FMTD "')",
+ m_Id, currentLogGuid, currentTabId, uint32(NewEvent.EventType), NewEvent.PlayerGuid, NewEvent.ItemOrMoney, uint32(NewEvent.ItemStackCount), uint32(NewEvent.DestTabId), NewEvent.TimeStamp);
}
bool Guild::AddGBankItemToDB(uint32 GuildId, uint32 BankTab , uint32 BankTabSlot , uint32 GUIDLow, uint32 Entry )
@@ -1940,7 +1963,7 @@ void Guild::SetGuildBankTabText(uint8 TabId, std::string text)
m_TabListMap[TabId]->Text = text;
CharacterDatabase.escape_string(text);
- CharacterDatabase.PExecute("UPDATE guild_bank_tab SET TabText='%s' WHERE guildid='%u' AND TabId='%u'", text.c_str(), Id, uint32(TabId));
+ CharacterDatabase.PExecute("UPDATE guild_bank_tab SET TabText='%s' WHERE guildid='%u' AND TabId='%u'", text.c_str(), m_Id, uint32(TabId));
// announce
SendGuildBankTabText(NULL,TabId);
diff --git a/src/game/Guild.h b/src/game/Guild.h
index 6e2441416c6..4d66ad10b4a 100644
--- a/src/game/Guild.h
+++ b/src/game/Guild.h
@@ -148,7 +148,7 @@ enum GuildBankRights
GUILD_BANK_RIGHT_FULL = 0xFF,
};
-enum GuildBankLogEntries
+enum GuildBankEventLogTypes
{
GUILD_BANK_LOG_DEPOSIT_ITEM = 1,
GUILD_BANK_LOG_WITHDRAW_ITEM = 2,
@@ -161,7 +161,7 @@ enum GuildBankLogEntries
GUILD_BANK_LOG_UNK2 = 9,
};
-enum GuildEventLogEntryTypes
+enum GuildEventLogTypes
{
GUILD_EVENT_LOG_INVITE_PLAYER = 1,
GUILD_EVENT_LOG_JOIN_GUILD = 2,
@@ -171,16 +171,6 @@ enum GuildEventLogEntryTypes
GUILD_EVENT_LOG_LEAVE_GUILD = 6,
};
-struct GuildEventlogEntry
-{
- uint32 LogGuid;
- uint8 EventType;
- uint32 PlayerGuid1;
- uint32 PlayerGuid2;
- uint8 NewRank;
- uint64 TimeStamp;
-};
-
enum GuildEmblem
{
ERR_GUILDEMBLEM_SUCCESS = 0,
@@ -207,11 +197,18 @@ inline uint32 GetGuildBankTabPrice(uint8 Index)
return 0;
}
-struct GuildBankEvent
+struct GuildEventLogEntry
+{
+ uint8 EventType;
+ uint32 PlayerGuid1;
+ uint32 PlayerGuid2;
+ uint8 NewRank;
+ uint64 TimeStamp;
+};
+
+struct GuildBankEventLogEntry
{
- uint32 LogGuid;
- uint8 LogEntry;
- uint8 TabId;
+ uint8 EventType;
uint32 PlayerGuid;
uint32 ItemOrMoney;
uint8 ItemStackCount;
@@ -220,9 +217,9 @@ struct GuildBankEvent
const bool isMoneyEvent()
{
- return LogEntry == GUILD_BANK_LOG_DEPOSIT_MONEY ||
- LogEntry == GUILD_BANK_LOG_WITHDRAW_MONEY ||
- LogEntry == GUILD_BANK_LOG_REPAIR_MONEY;
+ return EventType == GUILD_BANK_LOG_DEPOSIT_MONEY ||
+ EventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
+ EventType == GUILD_BANK_LOG_REPAIR_MONEY;
}
};
@@ -285,27 +282,27 @@ class Guild
Guild();
~Guild();
- bool create(Player* leader, std::string gname);
+ bool Create(Player* leader, std::string gname);
void Disband();
typedef std::map<uint32, MemberSlot> MemberList;
typedef std::vector<RankInfo> RankList;
- uint32 GetId(){ return Id; }
- const uint64& GetLeader(){ return leaderGuid; }
- std::string GetName(){ return name; }
+ uint32 GetId(){ return m_Id; }
+ const uint64& GetLeader(){ return m_LeaderGuid; }
+ std::string GetName(){ return m_Name; }
std::string GetMOTD(){ return MOTD; }
std::string GetGINFO(){ return GINFO; }
- uint32 GetCreatedYear(){ return CreatedYear; }
- uint32 GetCreatedMonth(){ return CreatedMonth; }
- uint32 GetCreatedDay(){ return CreatedDay; }
+ uint32 GetCreatedYear(){ return m_CreatedYear; }
+ uint32 GetCreatedMonth(){ return m_CreatedMonth; }
+ uint32 GetCreatedDay(){ return m_CreatedDay; }
- uint32 GetEmblemStyle(){ return EmblemStyle; }
- uint32 GetEmblemColor(){ return EmblemColor; }
- uint32 GetBorderStyle(){ return BorderStyle; }
- uint32 GetBorderColor(){ return BorderColor; }
- uint32 GetBackgroundColor(){ return BackgroundColor; }
+ uint32 GetEmblemStyle(){ return m_EmblemStyle; }
+ uint32 GetEmblemColor(){ return m_EmblemColor; }
+ uint32 GetBorderStyle(){ return m_BorderStyle; }
+ uint32 GetBorderColor(){ return m_BorderColor; }
+ uint32 GetBackgroundColor(){ return m_BackgroundColor; }
void SetLeader(uint64 guid);
bool AddMember(uint64 plGuid, uint32 plRank);
@@ -315,8 +312,8 @@ class Guild
void SetMOTD(std::string motd);
void SetGINFO(std::string ginfo);
- void SetPNOTE(uint64 guid,std::string pnote);
- void SetOFFNOTE(uint64 guid,std::string offnote);
+ void SetPNOTE(uint64 guid, std::string pnote);
+ void SetOFFNOTE(uint64 guid, std::string offnote);
void SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor);
uint32 GetMemberSize() const { return members.size(); }
@@ -346,7 +343,7 @@ class Guild
void DelRank();
std::string GetRankName(uint32 rankId);
uint32 GetRankRights(uint32 rankId);
- uint32 GetNrRanks() const { return m_ranks.size(); }
+ uint32 GetNrRanks() const { return m_Ranks.size(); }
void SetRankName(uint32 rankId, std::string name);
void SetRankRights(uint32 rankId, uint32 rights);
@@ -375,13 +372,12 @@ class Guild
void Roster(WorldSession *session);
void Query(WorldSession *session);
- void UpdateLogoutTime(uint64 guid);
- // Guild eventlog
+ void UpdateLogoutTime(uint64 guid);
+ // Guild EventLog
void LoadGuildEventLogFromDB();
- void UnloadGuildEventlog();
- void DisplayGuildEventlog(WorldSession *session);
+ void UnloadGuildEventLog();
+ void DisplayGuildEventLog(WorldSession *session);
void LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank);
- void RenumGuildEventlog();
// ** Guild bank **
// Content & item deposit/withdraw
@@ -403,18 +399,18 @@ class Guild
void SetGuildBankTabInfo(uint8 TabId, std::string name, std::string icon);
void CreateBankRightForTab(uint32 rankid, uint8 TabId);
const GuildBankTab *GetBankTab(uint8 index) { if(index >= m_TabListMap.size()) return NULL; return m_TabListMap[index]; }
- const uint8 GetPurchasedTabs() const { return purchased_tabs; }
+ const uint8 GetPurchasedTabs() const { return m_PurchasedTabs; }
uint32 GetBankRights(uint32 rankId, uint8 TabId) const;
bool IsMemberHaveRights(uint32 LowGuid, uint8 TabId,uint32 rights) const;
bool CanMemberViewTab(uint32 LowGuid, uint8 TabId) const;
// Load/unload
void LoadGuildBankFromDB();
void UnloadGuildBank();
- void IncOnlineMemberCount() { ++m_onlinemembers; }
+ void IncOnlineMemberCount() { ++m_OnlineMembers; }
// Money deposit/withdraw
void SendMoneyInfo(WorldSession *session, uint32 LowGuid);
bool MemberMoneyWithdraw(uint32 amount, uint32 LowGuid);
- uint64 GetGuildBankMoney() { return guildbank_money; }
+ uint64 GetGuildBankMoney() { return m_GuildBankMoney; }
void SetBankMoney(int64 money);
// per days
bool MemberItemWithdraw(uint8 TabId, uint32 LowGuid);
@@ -426,33 +422,32 @@ class Guild
uint32 GetBankSlotPerDay(uint32 rankId, uint8 TabId);
// rights per day
void LoadBankRightsFromDB(uint32 GuildId);
- // logs
+ // Guild Bank Event Logs
void LoadGuildBankEventLogFromDB();
void UnloadGuildBankEventLog();
void DisplayGuildBankLogs(WorldSession *session, uint8 TabId);
- void LogBankEvent(uint8 LogEntry, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint8 ItemStackCount=0, uint8 DestTabId=0);
- void RenumBankLogs();
+ void LogBankEvent(uint8 EventType, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint8 ItemStackCount=0, uint8 DestTabId=0);
bool AddGBankItemToDB(uint32 GuildId, uint32 BankTab , uint32 BankTabSlot , uint32 GUIDLow, uint32 Entry );
protected:
void AddRank(const std::string& name,uint32 rights,uint32 money);
- uint32 Id;
- std::string name;
- uint64 leaderGuid;
+ uint32 m_Id;
+ std::string m_Name;
+ uint64 m_LeaderGuid;
std::string MOTD;
std::string GINFO;
- uint32 CreatedYear;
- uint32 CreatedMonth;
- uint32 CreatedDay;
+ uint32 m_CreatedYear;
+ uint32 m_CreatedMonth;
+ uint32 m_CreatedDay;
- uint32 EmblemStyle;
- uint32 EmblemColor;
- uint32 BorderStyle;
- uint32 BorderColor;
- uint32 BackgroundColor;
+ uint32 m_EmblemStyle;
+ uint32 m_EmblemColor;
+ uint32 m_BorderStyle;
+ uint32 m_BorderColor;
+ uint32 m_BackgroundColor;
- RankList m_ranks;
+ RankList m_Ranks;
MemberList members;
@@ -460,20 +455,22 @@ class Guild
TabListMap m_TabListMap;
/** These are actually ordered lists. The first element is the oldest entry.*/
- typedef std::list<GuildEventlogEntry> GuildEventlog;
- typedef std::list<GuildBankEvent> GuildBankEventLog;
- GuildEventlog m_GuildEventlog;
+ typedef std::list<GuildEventLogEntry> GuildEventLog;
+ typedef std::list<GuildBankEventLogEntry> GuildBankEventLog;
+ GuildEventLog m_GuildEventLog;
GuildBankEventLog m_GuildBankEventLog_Money;
GuildBankEventLog m_GuildBankEventLog_Item[GUILD_BANK_MAX_TABS];
- bool m_bankloaded;
- bool m_eventlogloaded;
- uint32 m_onlinemembers;
- uint64 guildbank_money;
- uint8 purchased_tabs;
+ uint32 m_GuildEventLogNextGuid;
+ uint32 m_GuildBankEventLogNextGuid_Money;
+ uint32 m_GuildBankEventLogNextGuid_Item[GUILD_BANK_MAX_TABS];
+
+ bool m_GuildBankLoaded;
+ bool m_EventLogLoaded;
+ uint32 m_OnlineMembers;
+ uint64 m_GuildBankMoney;
+ uint8 m_PurchasedTabs;
- uint32 LogMaxGuid;
- uint32 GuildEventlogMaxGuid;
private:
// internal common parts for CanStore/StoreItem functions
void AppendDisplayGuildBankSlot( WorldPacket& data, GuildBankTab const *tab, int32 slot );
diff --git a/src/game/GuildHandler.cpp b/src/game/GuildHandler.cpp
index c6ae1fe19c0..3894dc7adef 100644
--- a/src/game/GuildHandler.cpp
+++ b/src/game/GuildHandler.cpp
@@ -60,7 +60,7 @@ void WorldSession::HandleGuildCreateOpcode(WorldPacket& recvPacket)
return;
Guild *guild = new Guild;
- if(!guild->create(GetPlayer(),gname))
+ if(!guild->Create(GetPlayer(),gname))
{
delete guild;
return;
@@ -825,7 +825,7 @@ void WorldSession::HandleGuildEventLogQueryOpcode(WorldPacket& /* recvPacket */)
if(!pGuild)
return;
- pGuild->DisplayGuildEventlog(this);
+ pGuild->DisplayGuildEventLog(this);
}
/****** GUILD BANK *******/
@@ -1546,7 +1546,7 @@ void WorldSession::HandleGuildBankBuyTab( WorldPacket & recv_data )
if (pGuild->GetPurchasedTabs() >= GUILD_BANK_MAX_TABS)
return;
- if (TabId != pGuild->GetPurchasedTabs()) // purchased_tabs = 0 when buying Tab 0, that is why this check can be made
+ if (TabId != pGuild->GetPurchasedTabs()) // m_PurchasedTabs = 0 when buying Tab 0, that is why this check can be made
{
sLog.outError("Error: trying to buy a tab non contigous to owned ones");
return;
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index cd3a8118c88..7b69d03da38 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -4059,7 +4059,7 @@ bool ChatHandler::HandleGuildCreateCommand(const char* args)
}
Guild *guild = new Guild;
- if (!guild->create (target,guildname))
+ if (!guild->Create (target,guildname))
{
delete guild;
SendSysMessage (LANG_GUILD_NOT_CREATED);
diff --git a/src/game/PetitionsHandler.cpp b/src/game/PetitionsHandler.cpp
index 1fec73b1a28..fe719b1b671 100644
--- a/src/game/PetitionsHandler.cpp
+++ b/src/game/PetitionsHandler.cpp
@@ -807,7 +807,7 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
if(type == 9) // create guild
{
Guild* guild = new Guild;
- if(!guild->create(_player, name))
+ if(!guild->Create(_player, name))
{
delete guild;
delete result;
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index f3270e640bd..6e362a8571e 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -4246,6 +4246,9 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
CharacterDatabase.PExecute("DELETE FROM character_achievement WHERE guid = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_achievement_progress WHERE guid = '%u'",guid);
CharacterDatabase.PExecute("DELETE FROM character_equipmentsets WHERE guid = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE PlayerGuid1 = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM guild_eventlog WHERE PlayerGuid2 = '%u'",guid);
+ CharacterDatabase.PExecute("DELETE FROM guild_bank_eventlog WHERE PlayerGuid = '%u'",guid);
CharacterDatabase.CommitTransaction();
//loginDatabase.PExecute("UPDATE realmcharacters SET numchars = numchars - 1 WHERE acctid = %d AND realmid = %d", accountId, realmID);
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index 4a97f397e00..521223ec09d 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -2418,8 +2418,9 @@ enum PetDiet
// Max values for Guild & Guild Bank
#define GUILD_BANK_MAX_TABS 6
#define GUILD_BANK_MAX_SLOTS 98
-#define GUILD_BANK_MAX_LOGS 24
-#define GUILD_EVENTLOG_MAX_ENTRIES 100
+#define GUILD_BANK_MAX_LOGS 25
+#define GUILD_BANK_MONEY_LOGS_TAB 100
+#define GUILD_EVENTLOG_MAX_RECORDS 100
#define GUILD_MAX_RANKS 10
enum AiReaction
diff --git a/src/game/World.cpp b/src/game/World.cpp
index c2975be9b94..ecc90e2ced0 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1033,6 +1033,13 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_INSTANT_LOGOUT] = sConfig.GetIntDefault("InstantLogout", SEC_MODERATOR);
+ m_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = sConfig.GetIntDefault("Guild.EventLogRecordsCount", GUILD_EVENTLOG_MAX_RECORDS);
+ if (m_configs[CONFIG_GUILD_EVENT_LOG_COUNT] < GUILD_EVENTLOG_MAX_RECORDS)
+ m_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = GUILD_EVENTLOG_MAX_RECORDS;
+ m_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = sConfig.GetIntDefault("Guild.BankEventLogRecordsCount", GUILD_BANK_MAX_LOGS);
+ if (m_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] < GUILD_BANK_MAX_LOGS)
+ m_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = GUILD_BANK_MAX_LOGS;
+
m_VisibleUnitGreyDistance = sConfig.GetFloatDefault("Visibility.Distance.Grey.Unit", 1);
if(m_VisibleUnitGreyDistance > MAX_VISIBILITY_DISTANCE)
{
diff --git a/src/game/World.h b/src/game/World.h
index af91bcb0233..1a7eded0535 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -258,6 +258,8 @@ enum WorldConfigs
CONFIG_LOGDB_CLEARINTERVAL,
CONFIG_LOGDB_CLEARTIME,
CONFIG_CLIENTCACHE_VERSION,
+ CONFIG_GUILD_EVENT_LOG_COUNT,
+ CONFIG_GUILD_BANK_EVENT_LOG_COUNT,
CONFIG_VALUE_COUNT
};
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index bd39a70f6ef..fcf34b97b01 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -685,6 +685,18 @@ ChatLogTimestamp = 0
# Default: 7
# -1 (show all available quests marks)
#
+# Guild.EventLogRecordsCount
+# Count of guild event log records stored in guild_eventlog table
+# Increase to store more guild events in table, minimum is 100
+# You can set it to very high value to prevent oldest guild events to be rewritten by latest guild events - but it can slow down performance
+# Default: 100
+#
+# Guild.BankEventLogRecordsCount
+# Count of guild_bank event log records stored in guild_bank_eventlog table
+# Increase to store more guild_bank events in table - minimum is 25 (GUILD_BANK_MAX_LOGS) for each guild_bank tab
+# Useful when you don't want old log events to be overwritten by new, but increasing can slow down performance
+# Default: 25
+#
# MaxPrimaryTradeSkill
# Max count that player can learn the primary trade skill.
# Default: 2
@@ -779,6 +791,8 @@ Instance.ResetTimeHour = 4
Instance.UnloadDelay = 1800000
Quests.LowLevelHideDiff = 4
Quests.HighLevelHideDiff = 7
+Guild.EventLogRecordsCount = 100
+Guild.BankEventLogRecordsCount = 25
MaxPrimaryTradeSkill = 2
MinPetitionSigns = 9
MaxGroupXPDistance = 74