Core/Guilds: guild code was completely refactored and rewritten.
* OOP desing and implementation; * all the queries are moved to prepared statements; * guild loading is optimized; * all the possible interaction with guild's data is done inside the guild class; * added more hooks to GuildScript class; WARNING: Make sure you backup your characters database before applying this change (just in case). Known problems with guilds: * when new member is added to the guild, MOTD is not displayed for him in guild tab of social window; * if you add item with random property to guild bank visual representation of item below it becomes wrong (it displays wrong stack number); * packets order differs from official: currently guild bank packet traffic is twice as more than on offy. --HG-- branch : trunk
This commit is contained in:
@@ -340,7 +340,7 @@ void AuctionHouseMgr::LoadAuctionItems()
|
||||
|
||||
Item *item = NewItemOrBag(proto);
|
||||
|
||||
if (!item->LoadFromDB(item_guid, 0, result, item_template))
|
||||
if (!item->LoadFromDB(item_guid, 0, fields, item_template))
|
||||
{
|
||||
delete item;
|
||||
continue;
|
||||
|
||||
@@ -3996,10 +3996,7 @@ bool ChatHandler::HandleGuildInviteCommand(const char *args)
|
||||
return false;
|
||||
|
||||
// player's guild membership checked in AddMember before add
|
||||
if (!targetGuild->AddMember (target_guid,targetGuild->GetLowestRank ()))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return targetGuild->AddMember(target_guid);
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleGuildUninviteCommand(const char *args)
|
||||
@@ -4018,7 +4015,7 @@ bool ChatHandler::HandleGuildUninviteCommand(const char *args)
|
||||
if (!targetGuild)
|
||||
return false;
|
||||
|
||||
targetGuild->DelMember (target_guid, false, true);
|
||||
targetGuild->DeleteMember(target_guid, false, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -4045,11 +4042,7 @@ bool ChatHandler::HandleGuildRankCommand(const char *args)
|
||||
return false;
|
||||
|
||||
uint32 newrank = uint32 (atoi (rankStr));
|
||||
if (newrank > targetGuild->GetLowestRank ())
|
||||
return false;
|
||||
|
||||
targetGuild->ChangeRank (target_guid,newrank);
|
||||
return true;
|
||||
return targetGuild->ChangeMemberRank(target_guid, newrank);
|
||||
}
|
||||
|
||||
bool ChatHandler::HandleGuildDeleteCommand(const char *args)
|
||||
|
||||
@@ -105,9 +105,9 @@ void Bag::SaveToDB(SQLTransaction& trans)
|
||||
Item::SaveToDB(trans);
|
||||
}
|
||||
|
||||
bool Bag::LoadFromDB(uint32 guid, uint64 owner_guid, PreparedQueryResult result, uint32 entry)
|
||||
bool Bag::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entry)
|
||||
{
|
||||
if (!Item::LoadFromDB(guid, owner_guid, result, entry))
|
||||
if (!Item::LoadFromDB(guid, owner_guid, fields, entry))
|
||||
return false;
|
||||
|
||||
ItemPrototype const* itemProto = GetProto(); // checked in Item::LoadFromDB
|
||||
|
||||
@@ -54,7 +54,7 @@ class Bag : public Item
|
||||
// overwrite virtual Item::SaveToDB
|
||||
void SaveToDB(SQLTransaction& trans);
|
||||
// overwrite virtual Item::LoadFromDB
|
||||
bool LoadFromDB(uint32 guid, uint64 owner_guid, PreparedQueryResult result, uint32 entry);
|
||||
bool LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entry);
|
||||
// overwrite virtual Item::DeleteFromDB
|
||||
void DeleteFromDB(SQLTransaction& trans);
|
||||
|
||||
|
||||
@@ -383,7 +383,7 @@ void Item::SaveToDB(SQLTransaction& trans)
|
||||
SetState(ITEM_UNCHANGED);
|
||||
}
|
||||
|
||||
bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, PreparedQueryResult result, uint32 entry)
|
||||
bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entry)
|
||||
{
|
||||
// 0 1 2 3 4 5 6 7 8 9 10
|
||||
//result = CharacterDatabase.PQuery("SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text FROM item_instance WHERE guid = '%u'", guid);
|
||||
@@ -400,14 +400,6 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, PreparedQueryResult result
|
||||
if (!proto)
|
||||
return false;
|
||||
|
||||
if (!result)
|
||||
{
|
||||
sLog.outError("Item (GUID: %u owner: %u) not found in table `item_instance`, can't load. ", guid, GUID_LOPART(owner_guid));
|
||||
return false;
|
||||
}
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
// set owner (not if item is only loaded for gbank/auction/mail
|
||||
if (owner_guid != 0)
|
||||
SetOwnerGUID(owner_guid);
|
||||
|
||||
@@ -245,7 +245,7 @@ class Item : public Object
|
||||
bool IsBindedNotWith(Player const* player) const;
|
||||
bool IsBoundByEnchant() const;
|
||||
virtual void SaveToDB(SQLTransaction& trans);
|
||||
virtual bool LoadFromDB(uint32 guid, uint64 owner_guid, PreparedQueryResult result, uint32 entry);
|
||||
virtual bool LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entry);
|
||||
virtual void DeleteFromDB(SQLTransaction& trans);
|
||||
void DeleteFromInventoryDB(SQLTransaction& trans);
|
||||
void SaveRefundDataToDB();
|
||||
|
||||
@@ -4458,8 +4458,8 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
|
||||
sObjectAccessor.ConvertCorpseForPlayer(playerguid);
|
||||
|
||||
if (uint32 guildId = GetGuildIdFromDB(playerguid))
|
||||
if (Guild* guild = sObjectMgr.GetGuildById(guildId))
|
||||
guild->DelMember(guid);
|
||||
if (Guild* pGuild = sObjectMgr.GetGuildById(guildId))
|
||||
pGuild->DeleteMember(guid);
|
||||
|
||||
// remove from arena teams
|
||||
LeaveAllArenaTeams(playerguid);
|
||||
@@ -4522,8 +4522,9 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
|
||||
{
|
||||
do
|
||||
{
|
||||
uint32 item_guidlow = (*resultItems)[11].GetUInt32();
|
||||
uint32 item_template = (*resultItems)[12].GetUInt32();
|
||||
Field* fields = resultItems->Fetch();
|
||||
uint32 item_guidlow = fields[11].GetUInt32();
|
||||
uint32 item_template = fields[12].GetUInt32();
|
||||
|
||||
ItemPrototype const* itemProto = sObjectMgr.GetItemPrototype(item_template);
|
||||
if (!itemProto)
|
||||
@@ -4535,7 +4536,7 @@ void Player::DeleteFromDB(uint64 playerguid, uint32 accountId, bool updateRealmC
|
||||
}
|
||||
|
||||
Item *pItem = NewItemOrBag(itemProto);
|
||||
if (!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER), resultItems, item_template))
|
||||
if (!pItem->LoadFromDB(item_guidlow, MAKE_NEW_GUID(guid, 0, HIGHGUID_PLAYER), fields, item_template))
|
||||
{
|
||||
pItem->FSetState(ITEM_REMOVED);
|
||||
pItem->SaveToDB(trans); // it also deletes item object!
|
||||
@@ -5117,28 +5118,8 @@ uint32 Player::DurabilityRepair(uint16 pos, bool cost, float discountMod, bool g
|
||||
if (!pGuild)
|
||||
return TotalCost;
|
||||
|
||||
if (!pGuild->HasRankRight(GetRank(), GR_RIGHT_WITHDRAW_REPAIR))
|
||||
{
|
||||
sLog.outStaticDebug("You do not have rights to withdraw for repairs");
|
||||
if (!pGuild->HandleMemberWithdrawMoney(GetSession(), costs, true))
|
||||
return TotalCost;
|
||||
}
|
||||
|
||||
if (pGuild->GetMemberMoneyWithdrawRem(GetGUIDLow()) < costs)
|
||||
{
|
||||
sLog.outStaticDebug("You do not have enough money withdraw amount remaining");
|
||||
return TotalCost;
|
||||
}
|
||||
|
||||
if (pGuild->GetGuildBankMoney() < costs)
|
||||
{
|
||||
sLog.outStaticDebug("There is not enough money in bank");
|
||||
return TotalCost;
|
||||
}
|
||||
|
||||
//- TODO: Fix bad function call design
|
||||
SQLTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
pGuild->MemberMoneyWithdraw(costs, GetGUIDLow(), trans);
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
|
||||
TotalCost = costs;
|
||||
}
|
||||
@@ -7004,12 +6985,12 @@ uint32 Player::GetGuildIdFromDB(uint64 guid)
|
||||
return id;
|
||||
}
|
||||
|
||||
uint32 Player::GetRankFromDB(uint64 guid)
|
||||
uint8 Player::GetRankFromDB(uint64 guid)
|
||||
{
|
||||
QueryResult result = CharacterDatabase.PQuery("SELECT rank FROM guild_member WHERE guid='%u'", GUID_LOPART(guid));
|
||||
if (result)
|
||||
{
|
||||
uint32 v = result->Fetch()[0].GetUInt32();
|
||||
uint32 v = result->Fetch()[0].GetUInt8();
|
||||
return v;
|
||||
}
|
||||
else
|
||||
@@ -16896,7 +16877,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timediff)
|
||||
|
||||
Item *item = NewItemOrBag(proto);
|
||||
|
||||
if (!item->LoadFromDB(item_guid, GetGUID(), result, item_id))
|
||||
if (!item->LoadFromDB(item_guid, GetGUID(), fields, item_id))
|
||||
{
|
||||
sLog.outError("Player::_LoadInventory: Player %s has broken item (id: #%u) in inventory, deleted.", GetName(),item_id);
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_INVENTORY_ITEM);
|
||||
@@ -17115,7 +17096,7 @@ void Player::_LoadMailedItems(Mail *mail)
|
||||
|
||||
Item *item = NewItemOrBag(proto);
|
||||
|
||||
if (!item->LoadFromDB(item_guid_low, MAKE_NEW_GUID(fields[13].GetUInt32(), 0, HIGHGUID_PLAYER), result, item_template))
|
||||
if (!item->LoadFromDB(item_guid_low, MAKE_NEW_GUID(fields[13].GetUInt32(), 0, HIGHGUID_PLAYER), fields, item_template))
|
||||
{
|
||||
sLog.outError("Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: %u, deleted from mail", mail->messageID, item_guid_low);
|
||||
CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid = '%u'", item_guid_low);
|
||||
|
||||
@@ -1715,12 +1715,12 @@ class Player : public Unit, public GridObject<Player>
|
||||
void SendUpdateToOutOfRangeGroupMembers();
|
||||
|
||||
void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); }
|
||||
void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); }
|
||||
void SetRank(uint8 rankId) { SetUInt32Value(PLAYER_GUILDRANK, rankId); }
|
||||
uint8 GetRank() { return uint8(GetUInt32Value(PLAYER_GUILDRANK)); }
|
||||
void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
|
||||
uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); }
|
||||
static uint32 GetGuildIdFromDB(uint64 guid);
|
||||
uint32 GetRank(){ return GetUInt32Value(PLAYER_GUILDRANK); }
|
||||
static uint32 GetRankFromDB(uint64 guid);
|
||||
static uint8 GetRankFromDB(uint64 guid);
|
||||
int GetGuildIdInvited() { return m_GuildIdInvited; }
|
||||
static void RemovePetitionsAndSigns(uint64 guid, uint32 type);
|
||||
|
||||
|
||||
@@ -346,7 +346,7 @@ std::string ObjectMgr::GetGuildNameById(uint32 GuildId) const
|
||||
Guild* ObjectMgr::GetGuildByLeader(const uint64 &guid) const
|
||||
{
|
||||
for (GuildMap::const_iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
|
||||
if (itr->second->GetLeader() == guid)
|
||||
if (itr->second->GetLeaderGUID() == guid)
|
||||
return itr->second;
|
||||
|
||||
return NULL;
|
||||
@@ -3488,288 +3488,282 @@ void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, Play
|
||||
|
||||
void ObjectMgr::LoadGuilds()
|
||||
{
|
||||
Guild *newGuild;
|
||||
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult result = CharacterDatabase.Query("SELECT guild.guildid,guild.name,leaderguid,EmblemStyle,EmblemColor,BorderStyle,BorderColor,"
|
||||
// 7 8 9 10 11 12
|
||||
"BackgroundColor,info,motd,createdate,BankMoney,COUNT(guild_bank_tab.guildid) "
|
||||
"FROM guild LEFT JOIN guild_bank_tab ON guild.guildid = guild_bank_tab.guildid GROUP BY guild.guildid ORDER BY guildid ASC");
|
||||
PreparedStatement* stmt = NULL;
|
||||
PreparedQueryResult result;
|
||||
|
||||
sLog.outString("Loading Guilds...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILDS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (!result)
|
||||
{
|
||||
barGoLink bar(1);
|
||||
|
||||
bar.step();
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded 0 guild definitions");
|
||||
sLog.outString();
|
||||
return;
|
||||
}
|
||||
|
||||
// load guild ranks
|
||||
// 0 1 2 3 4
|
||||
QueryResult guildRanksResult = CharacterDatabase.Query("SELECT guildid,rid,rname,rights,BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
|
||||
|
||||
// load guild members
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult guildMembersResult = CharacterDatabase.Query("SELECT guildid,guild_member.guid,rank,pnote,offnote,BankResetTimeMoney,BankRemMoney,"
|
||||
// 7 8 9 10 11 12
|
||||
"BankResetTimeTab0,BankRemSlotsTab0,BankResetTimeTab1,BankRemSlotsTab1,BankResetTimeTab2,BankRemSlotsTab2,"
|
||||
// 13 14 15 16 17 18
|
||||
"BankResetTimeTab3,BankRemSlotsTab3,BankResetTimeTab4,BankRemSlotsTab4,BankResetTimeTab5,BankRemSlotsTab5,"
|
||||
// 19 20 21 22 23 24
|
||||
"characters.name, characters.level, characters.class, characters.zone, characters.logout_time, characters.account "
|
||||
"FROM guild_member LEFT JOIN characters ON characters.guid = guild_member.guid ORDER BY guildid ASC");
|
||||
|
||||
// load guild bank tab rights
|
||||
// 0 1 2 3 4
|
||||
QueryResult guildBankTabRightsResult = CharacterDatabase.Query("SELECT guildid,TabId,rid,gbright,SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
|
||||
|
||||
|
||||
// 1. Load all guilds
|
||||
barGoLink bar(result->GetRowCount());
|
||||
|
||||
uint32 maxid = 0;
|
||||
do
|
||||
{
|
||||
//Field *fields = result->Fetch();
|
||||
|
||||
bar.step();
|
||||
|
||||
newGuild = new Guild;
|
||||
if (!newGuild->LoadGuildFromDB(result) ||
|
||||
!newGuild->LoadRanksFromDB(guildRanksResult) ||
|
||||
!newGuild->LoadMembersFromDB(guildMembersResult) ||
|
||||
!newGuild->LoadBankRightsFromDB(guildBankTabRightsResult) ||
|
||||
!newGuild->CheckGuildStructure()
|
||||
)
|
||||
Field* fields = result->Fetch();
|
||||
Guild* pNewGuild = new Guild();
|
||||
if (!pNewGuild->LoadFromDB(fields))
|
||||
{
|
||||
newGuild->Disband();
|
||||
delete newGuild;
|
||||
delete pNewGuild;
|
||||
continue;
|
||||
}
|
||||
|
||||
AddGuild(newGuild);
|
||||
|
||||
if (maxid < newGuild->GetId())
|
||||
maxid = newGuild->GetId();
|
||||
|
||||
AddGuild(pNewGuild);
|
||||
}
|
||||
while (result->NextRow());
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded " UI64FMTD " guilds definitions", result->GetRowCount());
|
||||
sLog.outString();
|
||||
|
||||
std::vector<Guild*> GuildVector(maxid + 1);
|
||||
uint64 rowCount = 0;
|
||||
// 2. Load all guild ranks
|
||||
sLog.outString("Loading guild ranks...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_RANKS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); ++itr)
|
||||
GuildVector[itr->second->GetId()] = (*itr).second;
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadRankFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " ranks for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
// 0 1 2 3 4 5 6
|
||||
QueryResult guildEventResult = CharacterDatabase.Query("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp, guildid FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
|
||||
// 3. Load all guild members
|
||||
sLog.outString("Loading guild members...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_MEMBERS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
QueryResult guildBankEventResult = CharacterDatabase.Query("SELECT LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp, guildid, TabId FROM guild_bank_eventlog ORDER BY TimeStamp DESC,LogGuid DESC");
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadMemberFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " members from all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
// 0 1 2 3 4
|
||||
QueryResult guildBankTabResult = CharacterDatabase.Query("SELECT TabId, TabName, TabIcon, TabText, guildid FROM guild_bank_tab");
|
||||
// 4. Load all guild bank tab rights
|
||||
sLog.outString("Loading bank tab rights...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_BANK_RIGHTS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
PreparedStatement* guildBankItemStmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_BANK_ITEMS);
|
||||
PreparedQueryResult guildBankItemResult = CharacterDatabase.Query(guildBankItemStmt);
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadBankRightFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " bank tab rights for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
LoadGuildEvents(GuildVector, guildEventResult);
|
||||
LoadGuildBankEvents(GuildVector, guildBankEventResult);
|
||||
LoadGuildBanks(GuildVector, guildBankTabResult, guildBankItemResult);
|
||||
// 5. Load all event logs
|
||||
sLog.outString("Loading guild event logs...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_EVENTLOGS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
//delete unused LogGuid records in guild_eventlog and guild_bank_eventlog table
|
||||
//you can comment these lines if you don't plan to change CONFIG_GUILD_EVENT_LOG_COUNT and CONFIG_GUILD_BANK_EVENT_LOG_COUNT
|
||||
PreparedStatement *guildEventLogStmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_GUILD_EVENT_LOGS);
|
||||
guildEventLogStmt->setUInt32(0, sWorld.getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
|
||||
CharacterDatabase.Execute(guildEventLogStmt);
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadEventLogFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " event logs for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
PreparedStatement *guildBankEventLogStmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_GUILD_BANK_EVENT_LOGS);
|
||||
guildBankEventLogStmt->setUInt32(0, sWorld.getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
|
||||
CharacterDatabase.Execute(guildBankEventLogStmt);
|
||||
// 6. Load all bank event logs
|
||||
sLog.outString("Loading guild bank event logs...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_BANK_EVENTLOGS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadBankEventLogFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " bank event logs for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
// 7. Load all guild bank tabs
|
||||
sLog.outString("Loading guild bank tabs...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_BANK_TABS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[0].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadBankTabFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Loaded " UI64FMTD " bank tabs for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
// 8. Fill all guild bank tabs
|
||||
sLog.outString("Filling bank tabs with items...");
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_LOAD_GUILD_BANK_ITEMS);
|
||||
result = CharacterDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
rowCount = result->GetRowCount();
|
||||
barGoLink bar(rowCount);
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
Field* fields = result->Fetch();
|
||||
uint32 guildId = fields[11].GetUInt32();
|
||||
if (Guild* pGuild = GetGuildById(guildId))
|
||||
pGuild->LoadBankItemFromDB(fields);
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
else
|
||||
{
|
||||
rowCount = 0;
|
||||
barGoLink bar(1);
|
||||
bar.step();
|
||||
}
|
||||
sLog.outString(">> Filled bank tabs with " UI64FMTD " items for all the guilds", rowCount);
|
||||
sLog.outString();
|
||||
|
||||
// 9. Validate loaded guild data
|
||||
sLog.outString("Validating data of loaded guilds...");
|
||||
barGoLink barGuilds(mGuildMap.size());
|
||||
for (GuildMap::iterator itr = mGuildMap.begin(); itr != mGuildMap.end(); )
|
||||
{
|
||||
barGuilds.step();
|
||||
Guild* pGuild = itr->second;
|
||||
if (!pGuild->Validate())
|
||||
{
|
||||
++itr;
|
||||
mGuildMap.erase(pGuild->GetId());
|
||||
delete pGuild;
|
||||
}
|
||||
else
|
||||
++itr;
|
||||
}
|
||||
// Cleanup
|
||||
// Delete orphan guild ranks
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_CLEAN_GUILD_RANKS);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
// Delete orphan guild members
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_CLEAN_GUILD_MEMBERS);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
// Delete orphan guild bank rights
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_CLEAN_GUILD_BANK_RIGHTS);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
// Delete orphan guild bank tabs
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_CLEAN_GUILD_BANK_TABS);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
// Delete orphan guild bank items
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_CLEAN_GUILD_BANK_ITEMS);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
// Delete unused LogGuid records in guild_eventlog and guild_bank_eventlog table.
|
||||
// You can comment these lines if you don't plan to change CONFIG_GUILD_EVENT_LOG_COUNT and CONFIG_GUILD_BANK_EVENT_LOG_COUNT
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_GUILD_EVENT_LOGS);
|
||||
stmt->setUInt32(0, sWorld.getIntConfig(CONFIG_GUILD_EVENT_LOG_COUNT));
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_OLD_GUILD_BANK_EVENT_LOGS);
|
||||
stmt->setUInt32(0, sWorld.getIntConfig(CONFIG_GUILD_BANK_EVENT_LOG_COUNT));
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString(">> Loaded %u guild definitions", mGuildMap.size());
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildEvents(std::vector<Guild*>& GuildVector, QueryResult& result)
|
||||
{
|
||||
if (result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint32 guildid = fields[6].GetUInt32();
|
||||
if (guildid >= GuildVector.size() || GuildVector[guildid] == NULL)
|
||||
continue;
|
||||
|
||||
if (!GuildVector[guildid]->m_GuildEventLogNextGuid)
|
||||
GuildVector[guildid]->m_GuildEventLogNextGuid = fields[0].GetUInt32();
|
||||
|
||||
if (GuildVector[guildid]->m_GuildEventLog.size() < GUILD_EVENTLOG_MAX_RECORDS)
|
||||
{
|
||||
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();
|
||||
|
||||
GuildVector[guildid]->m_GuildEventLog.push_front(NewEvent);
|
||||
}
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildBankEvents(std::vector<Guild*>& GuildVector, QueryResult& result)
|
||||
{
|
||||
if (result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint32 logGuid = fields[0].GetUInt32();
|
||||
uint32 guildid = fields[7].GetUInt32();
|
||||
if (guildid >= GuildVector.size() || GuildVector[guildid] == NULL)
|
||||
continue;
|
||||
|
||||
uint8 TabId = fields[8].GetUInt8();
|
||||
|
||||
if (TabId < GuildVector[guildid]->GetPurchasedTabs() || TabId == GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
bool canInsert;
|
||||
|
||||
if (TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
if (!GuildVector[guildid]->m_GuildBankEventLogNextGuid_Item[TabId])
|
||||
GuildVector[guildid]->m_GuildBankEventLogNextGuid_Item[TabId] = logGuid;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!GuildVector[guildid]->m_GuildBankEventLogNextGuid_Money)
|
||||
GuildVector[guildid]->m_GuildBankEventLogNextGuid_Money = logGuid;
|
||||
}
|
||||
|
||||
if (TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
canInsert = GuildVector[guildid]->m_GuildBankEventLog_Item[TabId].size() < GUILD_BANK_MAX_LOGS;
|
||||
else
|
||||
canInsert = GuildVector[guildid]->m_GuildBankEventLog_Money.size() < GUILD_BANK_MAX_LOGS;
|
||||
|
||||
if (canInsert)
|
||||
{
|
||||
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 (TabId != GUILD_BANK_MONEY_LOGS_TAB)
|
||||
{
|
||||
if (NewEvent.isMoneyEvent())
|
||||
{
|
||||
CharacterDatabase.PExecute("UPDATE guild_bank_eventlog SET TabId='%u' WHERE guildid='%u' AND TabId='%u' AND LogGuid='%u'", GUILD_BANK_MONEY_LOGS_TAB, guildid, 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, guildid, TabId, GUILD_BANK_MONEY_LOGS_TAB);
|
||||
continue;
|
||||
}
|
||||
else
|
||||
GuildVector[guildid]->m_GuildBankEventLog_Item[TabId].push_front(NewEvent);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!NewEvent.isMoneyEvent())
|
||||
sLog.outError("GuildBankEventLog ERROR: MoneyEvent LogGuid %u for Guild %u is not MoneyEvent - ignoring...", logGuid, guildid);
|
||||
else
|
||||
GuildVector[guildid]->m_GuildBankEventLog_Money.push_front(NewEvent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGuildBanks(std::vector<Guild*>& GuildVector, QueryResult& result, PreparedQueryResult& itemResult)
|
||||
{
|
||||
if (result)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
uint8 TabId = fields[0].GetUInt8();
|
||||
uint32 guildid = fields[4].GetUInt32();
|
||||
|
||||
if (guildid >= GuildVector.size() || GuildVector[guildid] == NULL)
|
||||
continue;
|
||||
|
||||
if (TabId < GuildVector[guildid]->GetPurchasedTabs())
|
||||
{
|
||||
GuildBankTab *NewTab = new GuildBankTab;
|
||||
|
||||
NewTab->Name = fields[1].GetString();
|
||||
NewTab->Icon = fields[2].GetString();
|
||||
NewTab->Text = fields[3].GetString();
|
||||
|
||||
GuildVector[guildid]->m_TabListMap[TabId] = NewTab;
|
||||
}
|
||||
}
|
||||
while (result->NextRow());
|
||||
}
|
||||
|
||||
if (itemResult)
|
||||
{
|
||||
do
|
||||
{
|
||||
Field *fields = itemResult->Fetch();
|
||||
uint8 TabId = fields[11].GetUInt8();
|
||||
uint8 SlotId = fields[12].GetUInt8();
|
||||
uint32 ItemGuid = fields[13].GetUInt32();
|
||||
uint32 ItemId = fields[14].GetUInt32();
|
||||
uint32 guildid = fields[15].GetUInt32();
|
||||
if (guildid >= GuildVector.size() || GuildVector[guildid] == NULL)
|
||||
continue;
|
||||
|
||||
if (TabId >= GuildVector[guildid]->GetPurchasedTabs())
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid tab for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid, ItemId);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (SlotId >= GUILD_BANK_MAX_SLOTS)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Invalid slot for item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid, ItemId);
|
||||
continue;
|
||||
}
|
||||
|
||||
ItemPrototype const *proto = sObjectMgr.GetItemPrototype(ItemId);
|
||||
|
||||
if (!proto)
|
||||
{
|
||||
sLog.outError("Guild::LoadGuildBankFromDB: Unknown item (GUID: %u id: #%u) in guild bank, skipped.", ItemGuid, ItemId);
|
||||
continue;
|
||||
}
|
||||
|
||||
Item *pItem = NewItemOrBag(proto);
|
||||
if (!pItem->LoadFromDB(ItemGuid, 0, itemResult, ItemId))
|
||||
{
|
||||
PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_NONEXISTENT_GUILD_BANK_ITEM);
|
||||
stmt->setUInt32(0, guildid);
|
||||
stmt->setUInt32(1, uint32(TabId));
|
||||
stmt->setUInt32(2, uint32(SlotId));
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
sLog.outError("Item GUID %u not found in item_instance, deleting from Guild Bank!", ItemGuid);
|
||||
delete pItem;
|
||||
continue;
|
||||
}
|
||||
|
||||
pItem->AddToWorld();
|
||||
GuildVector[guildid]->m_TabListMap[TabId]->Slots[SlotId] = pItem;
|
||||
}
|
||||
while (itemResult->NextRow());
|
||||
}
|
||||
sLog.outString(">> Successfully loaded %u guilds", uint32(mGuildMap.size()));
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadArenaTeams()
|
||||
|
||||
@@ -797,9 +797,6 @@ class ObjectMgr
|
||||
}
|
||||
|
||||
void LoadGuilds();
|
||||
void LoadGuildEvents(std::vector<Guild*>& GuildVector, QueryResult& result);
|
||||
void LoadGuildBankEvents(std::vector<Guild*>& GuildVector, QueryResult& result);
|
||||
void LoadGuildBanks(std::vector<Guild*>& GuildVector, QueryResult& result, PreparedQueryResult& itemResult);
|
||||
void LoadArenaTeams();
|
||||
void LoadGroups();
|
||||
void LoadQuests();
|
||||
|
||||
+2489
-1923
File diff suppressed because it is too large
Load Diff
+592
-304
@@ -19,52 +19,63 @@
|
||||
#ifndef TRINITYCORE_GUILD_H
|
||||
#define TRINITYCORE_GUILD_H
|
||||
|
||||
#define WITHDRAW_MONEY_UNLIMITED 0xFFFFFFFF
|
||||
#define WITHDRAW_SLOT_UNLIMITED 0xFFFFFFFF
|
||||
|
||||
#include "World.h"
|
||||
#include "Item.h"
|
||||
#include "WorldPacket.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "Player.h"
|
||||
|
||||
class Item;
|
||||
|
||||
#define GUILD_RANKS_MIN_COUNT 5
|
||||
#define GUILD_RANKS_MAX_COUNT 10
|
||||
enum GuildMisc
|
||||
{
|
||||
GUILD_BANK_MAX_TABS = 6, // 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_MAX_COUNT = 10,
|
||||
GUILD_RANK_NONE = 0xFF,
|
||||
GUILD_WITHDRAW_MONEY_UNLIMITED = 0xFFFFFFFF,
|
||||
GUILD_WITHDRAW_SLOT_UNLIMITED = 0xFFFFFFFF,
|
||||
GUILD_EVENT_LOG_GUID_UNDEFINED = 0xFFFFFFFF,
|
||||
};
|
||||
|
||||
enum GuildDefaultRanks
|
||||
{
|
||||
//these ranks can be modified, but they cannot be deleted
|
||||
// These ranks can be modified, but they cannot be deleted
|
||||
GR_GUILDMASTER = 0,
|
||||
GR_OFFICER = 1,
|
||||
GR_VETERAN = 2,
|
||||
GR_MEMBER = 3,
|
||||
GR_INITIATE = 4,
|
||||
//When promoting member server does: rank--;!
|
||||
//When demoting member server does: rank++;!
|
||||
// When promoting member server does: rank--
|
||||
// When demoting member server does: rank++
|
||||
};
|
||||
|
||||
enum GuildRankRights
|
||||
{
|
||||
GR_RIGHT_EMPTY = 0x00000040,
|
||||
GR_RIGHT_GCHATLISTEN = 0x00000041,
|
||||
GR_RIGHT_GCHATSPEAK = 0x00000042,
|
||||
GR_RIGHT_OFFCHATLISTEN = 0x00000044,
|
||||
GR_RIGHT_OFFCHATSPEAK = 0x00000048,
|
||||
GR_RIGHT_PROMOTE = 0x000000C0,
|
||||
GR_RIGHT_DEMOTE = 0x00000140,
|
||||
GR_RIGHT_INVITE = 0x00000050,
|
||||
GR_RIGHT_REMOVE = 0x00000060,
|
||||
GR_RIGHT_SETMOTD = 0x00001040,
|
||||
GR_RIGHT_EPNOTE = 0x00002040,
|
||||
GR_RIGHT_VIEWOFFNOTE = 0x00004040,
|
||||
GR_RIGHT_EOFFNOTE = 0x00008040,
|
||||
GR_RIGHT_MODIFY_GUILD_INFO = 0x00010040,
|
||||
GR_RIGHT_WITHDRAW_GOLD_LOCK = 0x00020000, // remove money withdraw capacity
|
||||
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
|
||||
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
|
||||
GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
|
||||
GR_RIGHT_GCHATLISTEN = GR_RIGHT_EMPTY | 0x00000001,
|
||||
GR_RIGHT_GCHATSPEAK = GR_RIGHT_EMPTY | 0x00000002,
|
||||
GR_RIGHT_OFFCHATLISTEN = GR_RIGHT_EMPTY | 0x00000004,
|
||||
GR_RIGHT_OFFCHATSPEAK = GR_RIGHT_EMPTY | 0x00000008,
|
||||
GR_RIGHT_INVITE = GR_RIGHT_EMPTY | 0x00000010,
|
||||
GR_RIGHT_REMOVE = GR_RIGHT_EMPTY | 0x00000020,
|
||||
GR_RIGHT_PROMOTE = GR_RIGHT_EMPTY | 0x00000080,
|
||||
GR_RIGHT_DEMOTE = GR_RIGHT_EMPTY | 0x00000100,
|
||||
GR_RIGHT_SETMOTD = GR_RIGHT_EMPTY | 0x00001000,
|
||||
GR_RIGHT_EPNOTE = GR_RIGHT_EMPTY | 0x00002000,
|
||||
GR_RIGHT_VIEWOFFNOTE = GR_RIGHT_EMPTY | 0x00004000,
|
||||
GR_RIGHT_EOFFNOTE = GR_RIGHT_EMPTY | 0x00008000,
|
||||
GR_RIGHT_MODIFY_GUILD_INFO = GR_RIGHT_EMPTY | 0x00010000,
|
||||
GR_RIGHT_WITHDRAW_GOLD_LOCK = 0x00020000, // remove money withdraw capacity
|
||||
GR_RIGHT_WITHDRAW_REPAIR = 0x00040000, // withdraw for repair
|
||||
GR_RIGHT_WITHDRAW_GOLD = 0x00080000, // withdraw gold
|
||||
GR_RIGHT_CREATE_GUILD_EVENT = 0x00100000, // wotlk
|
||||
GR_RIGHT_ALL = 0x001DF1FF
|
||||
};
|
||||
|
||||
enum Typecommand
|
||||
enum GuildCommandType
|
||||
{
|
||||
GUILD_CREATE_S = 0x00,
|
||||
GUILD_INVITE_S = 0x01,
|
||||
@@ -74,7 +85,7 @@ enum Typecommand
|
||||
GUILD_UNK2 = 0x14
|
||||
};
|
||||
|
||||
enum CommandErrors
|
||||
enum GuildCommandError
|
||||
{
|
||||
ERR_PLAYER_NO_MORE_IN_GUILD = 0x00,
|
||||
ERR_GUILD_INTERNAL = 0x01,
|
||||
@@ -118,11 +129,11 @@ enum GuildEvents
|
||||
GE_UNK2 = 0x0B, // EVENT_GUILD_ROSTER_UPDATE
|
||||
GE_SIGNED_ON = 0x0C, // ERR_FRIEND_ONLINE_SS
|
||||
GE_SIGNED_OFF = 0x0D, // ERR_FRIEND_OFFLINE_S
|
||||
GE_GUILDBANKBAGSLOTS_CHANGED = 0x0E, // EVENT_GUILDBANKBAGSLOTS_CHANGED
|
||||
GE_BANKTAB_PURCHASED = 0x0F, // EVENT_GUILDBANK_UPDATE_TABS
|
||||
GE_GUILDBANK_BAGSLOTS_CHANGED = 0x0E, // EVENT_GUILDBANK_BAGSLOTS_CHANGED
|
||||
GE_GUILDBANK_TAB_PURCHASED = 0x0F, // EVENT_GUILDBANK_UPDATE_TABS
|
||||
GE_UNK5 = 0x10, // EVENT_GUILDBANK_UPDATE_TABS
|
||||
GE_GUILDBANK_UPDATE_MONEY = 0x11, // EVENT_GUILDBANK_UPDATE_MONEY, string 0000000000002710 is 1 gold
|
||||
GE_GUILD_BANK_MONEY_WITHDRAWN = 0x12, // MSG_GUILD_BANK_MONEY_WITHDRAWN
|
||||
GE_GUILDBANK_MONEY_UPDATE = 0x11, // EVENT_GUILDBANK_UPDATE_MONEY, string 0000000000002710 is 1 gold
|
||||
GE_GUILDBANK_MONEY_WITHDRAWN = 0x12, // MSG_GUILD_BANK_MONEY_WITHDRAWN
|
||||
GE_GUILDBANK_TEXT_CHANGED = 0x13 // EVENT_GUILDBANK_TEXT_CHANGED
|
||||
};
|
||||
|
||||
@@ -175,7 +186,7 @@ enum GuildEventLogTypes
|
||||
GUILD_EVENT_LOG_LEAVE_GUILD = 6,
|
||||
};
|
||||
|
||||
enum GuildEmblem
|
||||
enum GuildEmblemError
|
||||
{
|
||||
ERR_GUILDEMBLEM_SUCCESS = 0,
|
||||
ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 1,
|
||||
@@ -185,298 +196,575 @@ enum GuildEmblem
|
||||
ERR_GUILDEMBLEM_INVALIDVENDOR = 5
|
||||
};
|
||||
|
||||
inline uint32 GetGuildBankTabPrice(uint8 Index)
|
||||
////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Emblem info
|
||||
class EmblemInfo
|
||||
{
|
||||
switch(Index)
|
||||
public:
|
||||
EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { }
|
||||
|
||||
void LoadFromDB(Field* fields);
|
||||
void SaveToDB(uint32 guildId) const;
|
||||
void ReadPacket(WorldPacket& recv) { recv >> m_style >> m_color >> m_borderStyle >> m_borderColor >> m_backgroundColor; }
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
|
||||
uint32 GetStyle() const { return m_style; }
|
||||
uint32 GetColor() const { return m_color; }
|
||||
uint32 GetBorderStyle() const { return m_borderStyle; }
|
||||
uint32 GetBorderColor() const { return m_borderColor; }
|
||||
uint32 GetBackgroundColor() const { return m_backgroundColor; }
|
||||
|
||||
private:
|
||||
uint32 m_style;
|
||||
uint32 m_color;
|
||||
uint32 m_borderStyle;
|
||||
uint32 m_borderColor;
|
||||
uint32 m_backgroundColor;
|
||||
};
|
||||
|
||||
// Structure for storing guild bank rights and remaining slots together.
|
||||
struct GuildBankRightsAndSlots
|
||||
{
|
||||
GuildBankRightsAndSlots() : rights(0), slots(0) { }
|
||||
GuildBankRightsAndSlots(uint8 _rights, uint32 _slots) : rights(_rights), slots(_slots) { }
|
||||
|
||||
inline bool IsEqual(const GuildBankRightsAndSlots& rhs) const { return rights == rhs.rights && slots == rhs.slots; }
|
||||
void SetGuildMasterValues()
|
||||
{
|
||||
case 0: return 100;
|
||||
case 1: return 250;
|
||||
case 2: return 500;
|
||||
case 3: return 1000;
|
||||
case 4: return 2500;
|
||||
case 5: return 5000;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
struct GuildEventLogEntry
|
||||
{
|
||||
uint8 EventType;
|
||||
uint32 PlayerGuid1;
|
||||
uint32 PlayerGuid2;
|
||||
uint8 NewRank;
|
||||
uint64 TimeStamp;
|
||||
};
|
||||
|
||||
struct GuildBankEventLogEntry
|
||||
{
|
||||
uint8 EventType;
|
||||
uint32 PlayerGuid;
|
||||
uint32 ItemOrMoney;
|
||||
uint16 ItemStackCount;
|
||||
uint8 DestTabId;
|
||||
uint64 TimeStamp;
|
||||
|
||||
bool isMoneyEvent()
|
||||
{
|
||||
return EventType == GUILD_BANK_LOG_DEPOSIT_MONEY ||
|
||||
EventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
|
||||
EventType == GUILD_BANK_LOG_REPAIR_MONEY;
|
||||
}
|
||||
};
|
||||
|
||||
struct GuildBankTab
|
||||
{
|
||||
GuildBankTab() { memset(Slots, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*)); }
|
||||
|
||||
Item* Slots[GUILD_BANK_MAX_SLOTS];
|
||||
std::string Name;
|
||||
std::string Icon;
|
||||
std::string Text;
|
||||
};
|
||||
|
||||
struct GuildItemPosCount
|
||||
{
|
||||
GuildItemPosCount(uint8 _slot, uint32 _count) : Slot(_slot), Count(_count) {}
|
||||
|
||||
bool isContainedIn(std::vector<GuildItemPosCount> const& vec) const;
|
||||
|
||||
uint8 Slot;
|
||||
uint32 Count;
|
||||
};
|
||||
typedef std::vector<GuildItemPosCount> GuildItemPosCountVec;
|
||||
|
||||
struct MemberSlot
|
||||
{
|
||||
uint64 LogoutTime;
|
||||
uint32 accountId;
|
||||
std::string Name;
|
||||
std::string Pnote;
|
||||
std::string OFFnote;
|
||||
uint32 RankId;
|
||||
uint32 ZoneId;
|
||||
uint8 Level;
|
||||
uint8 Class;
|
||||
uint32 BankResetTimeMoney;
|
||||
uint32 BankRemMoney;
|
||||
uint32 BankResetTimeTab[GUILD_BANK_MAX_TABS];
|
||||
uint32 BankRemSlotsTab[GUILD_BANK_MAX_TABS];
|
||||
};
|
||||
|
||||
struct RankInfo
|
||||
{
|
||||
RankInfo(const std::string& _name, uint32 _rights, uint32 _money) : Name(_name), Rights(_rights), BankMoneyPerDay(_money)
|
||||
{
|
||||
for (uint8 i = 0; i < GUILD_BANK_MAX_TABS; ++i)
|
||||
{
|
||||
TabRight[i] = 0;
|
||||
TabSlotPerDay[i] = 0;
|
||||
}
|
||||
rights = GUILD_BANK_RIGHT_FULL;
|
||||
slots = GUILD_WITHDRAW_SLOT_UNLIMITED;
|
||||
}
|
||||
|
||||
std::string Name;
|
||||
uint32 Rights;
|
||||
uint32 BankMoneyPerDay;
|
||||
uint32 TabRight[GUILD_BANK_MAX_TABS];
|
||||
uint32 TabSlotPerDay[GUILD_BANK_MAX_TABS];
|
||||
uint8 rights;
|
||||
uint32 slots;
|
||||
};
|
||||
typedef std::vector <GuildBankRightsAndSlots> GuildBankRightsAndSlotsVec;
|
||||
|
||||
typedef std::set <uint8> SlotIds;
|
||||
|
||||
class Guild
|
||||
{
|
||||
friend class ObjectMgr;
|
||||
private:
|
||||
// Class representing guild member
|
||||
class Member
|
||||
{
|
||||
struct RemainingValue
|
||||
{
|
||||
RemainingValue() : value(0), resetTime(0) { }
|
||||
|
||||
uint32 value;
|
||||
uint32 resetTime;
|
||||
};
|
||||
|
||||
public:
|
||||
Guild();
|
||||
~Guild();
|
||||
Member(uint32 guildId, const uint64& guid, uint8 rankId) : m_guildId(guildId), m_guid(guid), m_logoutTime(::time(NULL)), m_rankId(rankId) { }
|
||||
|
||||
bool Create(Player* leader, std::string gname);
|
||||
void CreateDefaultGuildRanks(LocaleConstant locale_idx);
|
||||
void Disband();
|
||||
void SetStats(Player* player);
|
||||
void SetStats(const std::string& name, uint8 level, uint8 _class, uint32 zoneId, uint32 accountId);
|
||||
bool CheckStats() const;
|
||||
|
||||
void DeleteGuildBankItems(SQLTransaction& trans, bool alsoInDB = false);
|
||||
typedef std::map<uint32, MemberSlot> MemberList;
|
||||
typedef std::vector<RankInfo> RankList;
|
||||
void SetPublicNote(const std::string& publicNote);
|
||||
void SetOfficerNote(const std::string& officerNote);
|
||||
|
||||
uint32 GetId(){ return m_Id; }
|
||||
const uint64& GetLeader(){ return m_LeaderGuid; }
|
||||
std::string const& GetName() const { return m_Name; }
|
||||
std::string const& GetMOTD() const { return MOTD; }
|
||||
std::string const& GetGINFO() const { return GINFO; }
|
||||
bool LoadFromDB(Field* fields);
|
||||
void SaveToDB(SQLTransaction& trans) const;
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
|
||||
time_t GetCreatedDate() const { return m_CreatedDate; }
|
||||
const uint64& GetGUID() const { return m_guid; }
|
||||
std::string GetName() const { return m_name; }
|
||||
uint32 GetAccountId() const { return m_accountId; }
|
||||
uint8 GetRankId() const { return m_rankId; }
|
||||
|
||||
uint32 GetEmblemStyle() const { return m_EmblemStyle; }
|
||||
uint32 GetEmblemColor() const { return m_EmblemColor; }
|
||||
uint32 GetBorderStyle() const { return m_BorderStyle; }
|
||||
uint32 GetBorderColor() const { return m_BorderColor; }
|
||||
uint32 GetBackgroundColor() const { return m_BackgroundColor; }
|
||||
void ChangeRank(uint8 newRank);
|
||||
|
||||
void SetLeader(uint64 guid);
|
||||
bool AddMember(uint64 plGuid, uint32 plRank);
|
||||
void ChangeRank(uint64 guid, uint32 newRank);
|
||||
void DelMember(uint64 guid, bool isDisbanding = false, bool isKicked = false);
|
||||
//lowest rank is the count of ranks - 1 (the highest rank_id in table)
|
||||
uint32 GetLowestRank() const { return m_Ranks.size() - 1; }
|
||||
inline void UpdateLogoutTime() { m_logoutTime = ::time(NULL); }
|
||||
inline bool IsRank(uint8 rankId) const { return m_rankId == rankId; }
|
||||
inline bool IsRankNotLower(uint8 rankId) const { return m_rankId <= rankId; }
|
||||
inline bool IsSamePlayer(const uint64& guid) const { return m_guid == guid; }
|
||||
|
||||
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 SetEmblem(uint32 emblemStyle, uint32 emblemColor, uint32 borderStyle, uint32 borderColor, uint32 backgroundColor);
|
||||
void DecreaseBankRemainingValue(SQLTransaction& trans, uint8 tabId, uint32 amount);
|
||||
uint32 GetBankRemainingValue(uint8 tabId, const Guild* guild) const;
|
||||
|
||||
uint32 GetMemberSize() const { return members.size(); }
|
||||
uint32 GetAccountsNumber() const { return m_accountsNumber; }
|
||||
void ResetTabTimes();
|
||||
void ResetMoneyTime();
|
||||
|
||||
bool LoadGuildFromDB(QueryResult guildDataResult);
|
||||
bool CheckGuildStructure();
|
||||
bool LoadRanksFromDB(QueryResult guildRanksResult);
|
||||
bool LoadMembersFromDB(QueryResult guildMembersResult);
|
||||
|
||||
void SetMemberStats(uint64 guid);
|
||||
|
||||
void BroadcastToGuild(WorldSession *session, const std::string& msg, uint32 language = LANG_UNIVERSAL);
|
||||
void BroadcastToOfficers(WorldSession *session, const std::string& msg, uint32 language = LANG_UNIVERSAL);
|
||||
void BroadcastPacketToRank(WorldPacket *packet, uint32 rankId);
|
||||
void BroadcastPacket(WorldPacket *packet);
|
||||
void BroadcastEvent(GuildEvents event, uint64 guid, uint8 strCount, std::string str1, std::string str2, std::string str3);
|
||||
|
||||
template<class Do>
|
||||
void BroadcastWorker(Do& _do, Player* except = NULL)
|
||||
{
|
||||
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
|
||||
if (Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)))
|
||||
if (player != except)
|
||||
_do(player);
|
||||
}
|
||||
|
||||
void CreateRank(std::string name,uint32 rights);
|
||||
void DelRank();
|
||||
std::string GetRankName(uint32 rankId);
|
||||
uint32 GetRankRights(uint32 rankId);
|
||||
uint32 GetRanksSize() const { return m_Ranks.size(); }
|
||||
|
||||
void SetRankName(uint32 rankId, std::string name);
|
||||
void SetRankRights(uint32 rankId, uint32 rights);
|
||||
bool HasRankRight(uint32 rankId, uint32 right)
|
||||
{
|
||||
return ((GetRankRights(rankId) & right) != GR_RIGHT_EMPTY) ? true : false;
|
||||
}
|
||||
int32 GetRank(uint32 LowGuid);
|
||||
bool IsMember(uint32 LowGuid)
|
||||
{
|
||||
return (members.find(LowGuid) != members.end());
|
||||
}
|
||||
MemberSlot* GetMemberSlot(const std::string& name, uint64& guid)
|
||||
{
|
||||
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
|
||||
{
|
||||
if (itr->second.Name == name)
|
||||
{
|
||||
guid = itr->first;
|
||||
return &itr->second;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Roster(WorldSession *session = NULL); // NULL = broadcast
|
||||
void Query(WorldSession *session);
|
||||
|
||||
void UpdateLogoutTime(uint64 guid);
|
||||
// Guild EventLog
|
||||
void DisplayGuildEventLog(WorldSession *session);
|
||||
void LogGuildEvent(uint8 EventType, uint32 PlayerGuid1, uint32 PlayerGuid2, uint8 NewRank);
|
||||
|
||||
// ** Guild bank **
|
||||
// Content & item deposit/withdraw
|
||||
void DisplayGuildBankContent(WorldSession *session, uint8 TabId);
|
||||
void DisplayGuildBankMoneyUpdate(WorldSession *session);
|
||||
|
||||
void SwapItems(Player * pl, uint8 BankTab, uint8 BankTabSlot, uint8 BankTabDst, uint8 BankTabSlotDst, uint32 SplitedAmount);
|
||||
void MoveFromBankToChar(Player * pl, uint8 BankTab, uint8 BankTabSlot, uint8 PlayerBag, uint8 PlayerSlot, uint32 SplitedAmount);
|
||||
void MoveFromCharToBank(Player * pl, uint8 PlayerBag, uint8 PlayerSlot, uint8 BankTab, uint8 BankTabSlot, uint32 SplitedAmount);
|
||||
|
||||
// Tabs
|
||||
void DisplayGuildBankTabsInfo(WorldSession *session);
|
||||
void CreateNewBankTab();
|
||||
void SetGuildBankTabText(uint8 TabId, std::string text);
|
||||
void SendGuildBankTabText(WorldSession *session, uint8 TabId);
|
||||
void SetGuildBankTabInfo(uint8 TabId, std::string name, std::string icon);
|
||||
uint8 GetPurchasedTabs() const { return m_TabListMap.size(); }
|
||||
uint32 GetBankRights(uint32 rankId, uint8 TabId) const;
|
||||
bool IsMemberHaveRights(uint32 LowGuid, uint8 TabId,uint32 rights) const;
|
||||
bool CanMemberViewTab(uint32 LowGuid, uint8 TabId) const;
|
||||
// Money deposit/withdraw
|
||||
void SendMoneyInfo(WorldSession *session, uint32 LowGuid);
|
||||
bool MemberMoneyWithdraw(uint32 amount, uint32 LowGuid, SQLTransaction& trans);
|
||||
uint64 GetGuildBankMoney() { return m_GuildBankMoney; }
|
||||
void SetBankMoney(int64 money, SQLTransaction& trans);
|
||||
// per days
|
||||
bool MemberItemWithdraw(uint8 TabId, uint32 LowGuid, SQLTransaction& trans);
|
||||
uint32 GetMemberSlotWithdrawRem(uint32 LowGuid, uint8 TabId);
|
||||
uint32 GetMemberMoneyWithdrawRem(uint32 LowGuid);
|
||||
void SetBankMoneyPerDay(uint32 rankId, uint32 money);
|
||||
void SetBankRightsAndSlots(uint32 rankId, uint8 TabId, uint32 right, uint32 SlotPerDay, bool db);
|
||||
uint32 GetBankMoneyPerDay(uint32 rankId);
|
||||
uint32 GetBankSlotPerDay(uint32 rankId, uint8 TabId);
|
||||
// rights per day
|
||||
bool LoadBankRightsFromDB(QueryResult guildBankTabRightsResult);
|
||||
// Guild Bank Event Logs
|
||||
void DisplayGuildBankLogs(WorldSession *session, uint8 TabId);
|
||||
void LogBankEvent(SQLTransaction& trans, uint8 EventType, uint8 TabId, uint32 PlayerGuidLow, uint32 ItemOrMoney, uint16 ItemStackCount=0, uint8 DestTabId=0);
|
||||
bool AddGBankItemToDB(uint32 GuildId, uint32 BankTab , uint32 BankTabSlot , uint32 GUIDLow, uint32 Entry, SQLTransaction& trans);
|
||||
|
||||
protected:
|
||||
void AddRank(const std::string& name,uint32 rights,uint32 money);
|
||||
|
||||
uint32 m_Id;
|
||||
std::string m_Name;
|
||||
uint64 m_LeaderGuid;
|
||||
std::string MOTD;
|
||||
std::string GINFO;
|
||||
time_t m_CreatedDate;
|
||||
|
||||
uint32 m_EmblemStyle;
|
||||
uint32 m_EmblemColor;
|
||||
uint32 m_BorderStyle;
|
||||
uint32 m_BorderColor;
|
||||
uint32 m_BackgroundColor;
|
||||
uint32 m_accountsNumber;
|
||||
|
||||
RankList m_Ranks;
|
||||
|
||||
MemberList members;
|
||||
|
||||
typedef std::vector<GuildBankTab*> TabListMap;
|
||||
TabListMap m_TabListMap;
|
||||
|
||||
/** These are actually ordered lists. The first element is the oldest entry.*/
|
||||
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];
|
||||
|
||||
uint32 m_GuildEventLogNextGuid;
|
||||
uint32 m_GuildBankEventLogNextGuid_Money;
|
||||
uint32 m_GuildBankEventLogNextGuid_Item[GUILD_BANK_MAX_TABS];
|
||||
|
||||
uint64 m_GuildBankMoney;
|
||||
inline Player* FindPlayer() const { return sObjectMgr.GetPlayer(m_guid); }
|
||||
|
||||
private:
|
||||
void UpdateAccountsNumber();
|
||||
// used only from high level Swap/Move functions
|
||||
Item* GetItem(uint8 TabId, uint8 SlotId);
|
||||
uint8 CanStoreItem(uint8 tab, uint8 slot, GuildItemPosCountVec& dest, uint32 count, Item *pItem, bool swap = false) const;
|
||||
Item* StoreItem(uint8 tab, GuildItemPosCountVec const& pos, Item *pItem, SQLTransaction& trans);
|
||||
void RemoveItem(uint8 tab, uint8 slot, SQLTransaction& trans);
|
||||
void DisplayGuildBankContentUpdate(uint8 TabId, int32 slot1, int32 slot2 = -1);
|
||||
void DisplayGuildBankContentUpdate(uint8 TabId, GuildItemPosCountVec const& slots);
|
||||
uint32 m_guildId;
|
||||
// Fields from characters table
|
||||
uint64 m_guid;
|
||||
std::string m_name;
|
||||
uint32 m_zoneId;
|
||||
uint8 m_level;
|
||||
uint8 m_class;
|
||||
uint64 m_logoutTime;
|
||||
uint32 m_accountId;
|
||||
// Fields from guild_member table
|
||||
uint8 m_rankId;
|
||||
std::string m_publicNote;
|
||||
std::string m_officerNote;
|
||||
|
||||
// internal common parts for CanStore/StoreItem functions
|
||||
void AppendDisplayGuildBankSlot(WorldPacket& data, GuildBankTab const *tab, int32 slot);
|
||||
uint8 _CanStoreItem_InSpecificSlot(uint8 tab, uint8 slot, GuildItemPosCountVec& dest, uint32& count, bool swap, Item *pSrcItem) const;
|
||||
uint8 _CanStoreItem_InTab(uint8 tab, GuildItemPosCountVec& dest, uint32& count, bool merge, Item *pSrcItem, uint8 skip_slot) const;
|
||||
Item* _StoreItem(uint8 tab, uint8 slot, Item *pItem, uint32 count, bool clone, SQLTransaction& trans);
|
||||
RemainingValue m_bankRemaining[GUILD_BANK_MAX_TABS + 1];
|
||||
};
|
||||
|
||||
// Base class for event entries
|
||||
class LogEntry
|
||||
{
|
||||
public:
|
||||
LogEntry(uint32 guildId, uint32 guid) : m_guildId(guildId), m_guid(guid), m_timestamp(::time(NULL)) { }
|
||||
LogEntry(uint32 guildId, uint32 guid, time_t timestamp) : m_guildId(guildId), m_guid(guid), m_timestamp(timestamp) { }
|
||||
virtual ~LogEntry() { }
|
||||
|
||||
uint32 GetGUID() const { return m_guid; }
|
||||
|
||||
virtual void SaveToDB(SQLTransaction& trans) const = 0;
|
||||
virtual void WritePacket(WorldPacket& data) const = 0;
|
||||
|
||||
protected:
|
||||
uint32 m_guildId;
|
||||
uint32 m_guid;
|
||||
uint64 m_timestamp;
|
||||
};
|
||||
|
||||
// Event log entry
|
||||
class EventLogEntry : public LogEntry
|
||||
{
|
||||
public:
|
||||
EventLogEntry(uint32 guildId, uint32 guid, GuildEventLogTypes eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank) :
|
||||
LogEntry(guildId, guid), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { }
|
||||
|
||||
EventLogEntry(uint32 guildId, uint32 guid, time_t timestamp, GuildEventLogTypes eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank) :
|
||||
LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_playerGuid1(playerGuid1), m_playerGuid2(playerGuid2), m_newRank(newRank) { }
|
||||
|
||||
~EventLogEntry() { }
|
||||
|
||||
void SaveToDB(SQLTransaction& trans) const;
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
|
||||
private:
|
||||
GuildEventLogTypes m_eventType;
|
||||
uint32 m_playerGuid1;
|
||||
uint32 m_playerGuid2;
|
||||
uint8 m_newRank;
|
||||
};
|
||||
|
||||
// Bank event log entry
|
||||
class BankEventLogEntry : public LogEntry
|
||||
{
|
||||
public:
|
||||
static bool IsMoneyEvent(GuildBankEventLogTypes eventType)
|
||||
{
|
||||
return
|
||||
eventType == GUILD_BANK_LOG_DEPOSIT_MONEY ||
|
||||
eventType == GUILD_BANK_LOG_WITHDRAW_MONEY ||
|
||||
eventType == GUILD_BANK_LOG_REPAIR_MONEY;
|
||||
}
|
||||
|
||||
BankEventLogEntry(uint32 guildId, uint32 guid, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint32 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) :
|
||||
LogEntry(guildId, guid, timestamp), m_eventType(eventType), m_bankTabId(tabId), m_playerGuid(playerGuid),
|
||||
m_itemOrMoney(itemOrMoney), m_itemStackCount(itemStackCount), m_destTabId(destTabId) { }
|
||||
|
||||
~BankEventLogEntry() { }
|
||||
|
||||
void SaveToDB(SQLTransaction& trans) const;
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
|
||||
private:
|
||||
GuildBankEventLogTypes m_eventType;
|
||||
uint8 m_bankTabId;
|
||||
uint32 m_playerGuid;
|
||||
uint32 m_itemOrMoney;
|
||||
uint16 m_itemStackCount;
|
||||
uint8 m_destTabId;
|
||||
};
|
||||
|
||||
// Class encapsulating work with events collection
|
||||
class LogHolder
|
||||
{
|
||||
public:
|
||||
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()); }
|
||||
// Checks if new log entry can be added to holder when loading from DB
|
||||
inline bool CanInsert() const { return m_log.size() < m_maxRecords; }
|
||||
// Adds event from DB to collection
|
||||
void LoadEvent(LogEntry* entry);
|
||||
// Adds new event to collection and saves it to DB
|
||||
void AddEvent(SQLTransaction& trans, LogEntry* entry);
|
||||
// Writes information about all events to packet
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
uint32 GetNextGUID();
|
||||
|
||||
private:
|
||||
typedef std::list<LogEntry*> GuildLog;
|
||||
GuildLog m_log;
|
||||
uint32 m_guildId;
|
||||
uint32 m_maxRecords;
|
||||
uint32 m_nextGUID;
|
||||
};
|
||||
|
||||
// Class incapsulating guild rank data
|
||||
class RankInfo
|
||||
{
|
||||
public:
|
||||
RankInfo(uint32 guildId) : m_guildId(guildId), m_rankId(GUILD_RANK_NONE), m_rights(GR_RIGHT_EMPTY), m_bankMoneyPerDay(0) { }
|
||||
RankInfo(uint32 guildId, uint8 rankId, const std::string& name, uint32 rights, uint32 money) :
|
||||
m_guildId(guildId), m_rankId(rankId), m_name(name), m_rights(rights), m_bankMoneyPerDay(money) { }
|
||||
|
||||
bool LoadFromDB(Field* fields);
|
||||
void SaveToDB(SQLTransaction& trans) const;
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
|
||||
uint8 GetId() const { return m_rankId; }
|
||||
|
||||
std::string GetName() const { return m_name; }
|
||||
void SetName(const std::string& name);
|
||||
|
||||
uint32 GetRights() const { return m_rights; }
|
||||
void SetRights(uint32 rights);
|
||||
|
||||
uint32 GetBankMoneyPerDay() const { return m_rankId == GR_GUILDMASTER ? GUILD_WITHDRAW_MONEY_UNLIMITED : m_bankMoneyPerDay; }
|
||||
void SetBankMoneyPerDay(uint32 money);
|
||||
|
||||
inline uint8 GetBankTabRights(uint8 tabId) const { return tabId < GUILD_BANK_MAX_TABS ? m_bankTabRightsAndSlots[tabId].rights : 0; }
|
||||
inline uint32 GetBankTabSlotsPerDay(uint8 tabId) const
|
||||
{
|
||||
if (tabId < GUILD_BANK_MAX_TABS)
|
||||
return m_rankId == GR_GUILDMASTER ? GUILD_WITHDRAW_SLOT_UNLIMITED : m_bankTabRightsAndSlots[tabId].slots;
|
||||
return 0;
|
||||
}
|
||||
void SetBankTabSlotsAndRights(uint8 tabId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB);
|
||||
|
||||
private:
|
||||
uint32 m_guildId;
|
||||
|
||||
uint8 m_rankId;
|
||||
std::string m_name;
|
||||
uint32 m_rights;
|
||||
uint32 m_bankMoneyPerDay;
|
||||
GuildBankRightsAndSlots m_bankTabRightsAndSlots[GUILD_BANK_MAX_TABS];
|
||||
};
|
||||
|
||||
class BankTab
|
||||
{
|
||||
public:
|
||||
BankTab(uint32 guildId, uint8 tabId) : m_guildId(guildId), m_tabId(tabId)
|
||||
{
|
||||
memset(m_items, 0, GUILD_BANK_MAX_SLOTS * sizeof(Item*));
|
||||
}
|
||||
|
||||
bool LoadFromDB(Field* fields);
|
||||
bool LoadItemFromDB(Field* fields);
|
||||
void Delete(SQLTransaction& trans, bool removeItemsFromDB = false);
|
||||
|
||||
void WritePacket(WorldPacket& data) const;
|
||||
void WriteSlotPacket(WorldPacket& data, uint8 slotId) const;
|
||||
void WriteInfoPacket(WorldPacket& data) const
|
||||
{
|
||||
data << m_name;
|
||||
data << m_icon;
|
||||
}
|
||||
|
||||
void SetInfo(const std::string& name, const std::string& icon);
|
||||
void SetText(const std::string& text);
|
||||
void SendText(const Guild* pGuild, WorldSession* session) const;
|
||||
|
||||
inline Item* GetItem(uint8 slotId) const { return slotId < GUILD_BANK_MAX_SLOTS ? m_items[slotId] : NULL; }
|
||||
bool SetItem(SQLTransaction& trans, uint8 slotId, Item* pItem);
|
||||
|
||||
private:
|
||||
uint32 m_guildId;
|
||||
uint8 m_tabId;
|
||||
|
||||
Item* m_items[GUILD_BANK_MAX_SLOTS];
|
||||
std::string m_name;
|
||||
std::string m_icon;
|
||||
std::string m_text;
|
||||
};
|
||||
|
||||
// Movement data
|
||||
class MoveItemData
|
||||
{
|
||||
public:
|
||||
MoveItemData(Guild* pGuild, Player* player, uint8 container, uint8 slotId) : m_pGuild(pGuild), m_pPlayer(player),
|
||||
m_container(container), m_slotId(slotId), m_pItem(NULL), m_pClonedItem(NULL) { }
|
||||
virtual ~MoveItemData() { }
|
||||
|
||||
virtual bool IsBank() const = 0;
|
||||
// Initializes item pointer. Returns true, if item exists, false otherwise.
|
||||
virtual bool InitItem() = 0;
|
||||
// Checks splited amount against item. Splited amount cannot be more that number of items in stack.
|
||||
virtual bool CheckItem(uint32& splitedAmount);
|
||||
// Defines if player has rights to save item in container
|
||||
virtual bool HasStoreRights(MoveItemData* /*pOther*/) const { return true; }
|
||||
// Defines if player has rights to withdraw item from container
|
||||
virtual bool HasWithdrawRights(MoveItemData* /*pOther*/) const { return true; }
|
||||
// Checks if container can store specified item
|
||||
uint8 CanStore(Item* pItem, bool swap, bool sendError);
|
||||
// Clones stored item
|
||||
bool CloneItem(uint32 count);
|
||||
// Remove item from container (if splited update items fields)
|
||||
virtual void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0) = 0;
|
||||
// Saves item to container
|
||||
virtual Item* StoreItem(SQLTransaction& trans, Item* pItem) = 0;
|
||||
// Log bank event
|
||||
virtual void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const = 0;
|
||||
// Log GM action
|
||||
virtual void LogAction(MoveItemData* pFrom) const;
|
||||
// Copy slots id from position vector
|
||||
void CopySlots(SlotIds& ids) const;
|
||||
|
||||
Item* GetItem(bool isCloned = false) const { return isCloned ? m_pClonedItem : m_pItem; }
|
||||
uint8 GetContainer() const { return m_container; }
|
||||
uint8 GetSlotId() const { return m_slotId; }
|
||||
protected:
|
||||
virtual uint8 _CanStore(Item* pItem, bool swap) = 0;
|
||||
|
||||
Guild* m_pGuild;
|
||||
Player *m_pPlayer;
|
||||
uint8 m_container;
|
||||
uint8 m_slotId;
|
||||
Item* m_pItem;
|
||||
Item* m_pClonedItem;
|
||||
ItemPosCountVec m_vec;
|
||||
};
|
||||
|
||||
class PlayerMoveItemData : public MoveItemData
|
||||
{
|
||||
public:
|
||||
PlayerMoveItemData(Guild* pGuild, Player* player, uint8 container, uint8 slotId) :
|
||||
MoveItemData(pGuild, player, container, slotId) { }
|
||||
|
||||
bool IsBank() const { return false; }
|
||||
bool InitItem();
|
||||
void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount = 0);
|
||||
Item* StoreItem(SQLTransaction& trans, Item* pItem);
|
||||
void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const;
|
||||
protected:
|
||||
uint8 _CanStore(Item* pItem, bool swap);
|
||||
};
|
||||
|
||||
class BankMoveItemData : public MoveItemData
|
||||
{
|
||||
public:
|
||||
BankMoveItemData(Guild* pGuild, Player* player, uint8 container, uint8 slotId) :
|
||||
MoveItemData(pGuild, player, container, slotId) { }
|
||||
|
||||
bool IsBank() const { return true; }
|
||||
bool InitItem();
|
||||
bool HasStoreRights(MoveItemData* pOther) const;
|
||||
bool HasWithdrawRights(MoveItemData* pOther) const;
|
||||
void RemoveItem(SQLTransaction& trans, MoveItemData* pOther, uint32 splitedAmount);
|
||||
Item* StoreItem(SQLTransaction& trans, Item* pItem);
|
||||
void LogBankEvent(SQLTransaction& trans, MoveItemData* pFrom, uint32 count) const;
|
||||
void LogAction(MoveItemData* pFrom) const;
|
||||
|
||||
protected:
|
||||
uint8 _CanStore(Item* pItem, bool swap);
|
||||
|
||||
private:
|
||||
Item* _StoreItem(SQLTransaction& trans, BankTab* pTab, Item *pItem, ItemPosCount& pos, bool clone) const;
|
||||
bool _ReserveSpace(uint8 slotId, Item* pItem, Item* pItemDest, uint32& count);
|
||||
void _CanStoreItemInTab(Item* pItem, uint8 skipSlotId, bool merge, uint32& count);
|
||||
};
|
||||
|
||||
typedef UNORDERED_MAP<uint32, Member*> Members;
|
||||
typedef std::vector<RankInfo> Ranks;
|
||||
typedef std::vector<BankTab*> BankTabs;
|
||||
|
||||
public:
|
||||
static void SendCommandResult(WorldSession* session, GuildCommandType type, GuildCommandError errCode, const std::string& param = "");
|
||||
static void SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode);
|
||||
|
||||
Guild();
|
||||
~Guild();
|
||||
|
||||
bool Create(Player* pLeader, const std::string& name);
|
||||
void Disband();
|
||||
|
||||
// Getters
|
||||
uint32 GetId() const { return m_id; }
|
||||
const uint64& GetLeaderGUID() const { return m_leaderGuid; }
|
||||
const std::string& GetName() const { return m_name; }
|
||||
const std::string& GetMOTD() const { return m_motd; }
|
||||
const std::string& GetInfo() const { return m_info; }
|
||||
|
||||
// Handle client commands
|
||||
void HandleRoster(WorldSession *session = NULL); // NULL = broadcast
|
||||
void HandleQuery(WorldSession *session);
|
||||
void HandleSetMOTD(WorldSession* session, const std::string& motd);
|
||||
void HandleSetInfo(WorldSession* session, const std::string& info);
|
||||
void HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo);
|
||||
void HandleSetLeader(WorldSession* session, const std::string& name);
|
||||
void HandleSetBankTabInfo(WorldSession* session, uint8 tabId, const std::string& name, const std::string& icon);
|
||||
void HandleSetMemberNote(WorldSession* session, const std::string& name, const std::string& note, bool officer);
|
||||
void HandleSetRankInfo(WorldSession* session, uint8 rankId, const std::string& name, uint32 rights, uint32 moneyPerDay, GuildBankRightsAndSlotsVec rightsAndSlots);
|
||||
void HandleBuyBankTab(WorldSession* session, uint8 tabId);
|
||||
void HandleInviteMember(WorldSession* session, const std::string& name);
|
||||
void HandleAcceptMember(WorldSession* session);
|
||||
void HandleLeaveMember(WorldSession* session);
|
||||
void HandleRemoveMember(WorldSession* session, const std::string& name);
|
||||
void HandleUpdateMemberRank(WorldSession* session, const std::string& name, bool demote);
|
||||
void HandleAddNewRank(WorldSession* session, const std::string& name);
|
||||
void HandleRemoveLowestRank(WorldSession* session);
|
||||
void HandleMemberDepositMoney(WorldSession* session, uint32 amount);
|
||||
bool HandleMemberWithdrawMoney(WorldSession* session, uint32 amount, bool repair = false);
|
||||
void HandleMemberLogout(WorldSession* session);
|
||||
void HandleDisband(WorldSession* session);
|
||||
|
||||
// Send info to client
|
||||
void SendInfo(WorldSession* session) const;
|
||||
void SendEventLog(WorldSession *session) const;
|
||||
void SendBankLog(WorldSession *session, uint8 tabId) const;
|
||||
void SendBankTabsInfo(WorldSession *session) const;
|
||||
void SendBankTabData(WorldSession* session, uint8 tabId) const;
|
||||
void SendBankTabText(WorldSession *session, uint8 tabId) const;
|
||||
void SendPermissions(WorldSession *session) const;
|
||||
void SendMoneyInfo(WorldSession *session) const;
|
||||
void SendLoginInfo(WorldSession* session) const;
|
||||
|
||||
// Load from DB
|
||||
bool LoadFromDB(Field* fields);
|
||||
bool LoadRankFromDB(Field* fields);
|
||||
bool LoadMemberFromDB(Field* fields);
|
||||
bool LoadEventLogFromDB(Field* fields);
|
||||
bool LoadBankRightFromDB(Field* fields);
|
||||
bool LoadBankTabFromDB(Field* fields);
|
||||
bool LoadBankEventLogFromDB(Field* fields);
|
||||
bool LoadBankItemFromDB(Field* fields);
|
||||
bool Validate();
|
||||
|
||||
// Broadcasts
|
||||
void BroadcastToGuild(WorldSession *session, bool officerOnly, const std::string& msg, uint32 language = LANG_UNIVERSAL) const;
|
||||
void BroadcastPacketToRank(WorldPacket *packet, uint8 rankId) const;
|
||||
void BroadcastPacket(WorldPacket *packet) const;
|
||||
|
||||
template<class Do>
|
||||
void BroadcastWorker(Do& _do, Player* except = NULL)
|
||||
{
|
||||
for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
|
||||
if (Player *player = itr->second->FindPlayer())
|
||||
if (player != except)
|
||||
_do(player);
|
||||
}
|
||||
|
||||
// Members
|
||||
// Adds member to guild. If rankId == GUILD_RANK_NONE, lowest rank is assigned.
|
||||
bool AddMember(const uint64& guid, uint8 rankId = GUILD_RANK_NONE);
|
||||
void DeleteMember(const uint64& guid, bool isDisbanding = false, bool isKicked = false);
|
||||
bool ChangeMemberRank(const uint64& guid, uint8 newRank);
|
||||
|
||||
// Bank
|
||||
void SwapItems(Player* player, uint8 tabId, uint8 slotId, uint8 destTabId, uint8 destSlotId, uint32 splitedAmount);
|
||||
void SwapItemsWithInventory(Player* player, bool toChar, uint8 tabId, uint8 slotId, uint8 playerBag, uint8 playerSlotId, uint32 splitedAmount);
|
||||
|
||||
// Bank tabs
|
||||
void SetBankTabText(uint8 tabId, const std::string& text);
|
||||
|
||||
protected:
|
||||
uint32 m_id;
|
||||
std::string m_name;
|
||||
uint64 m_leaderGuid;
|
||||
std::string m_motd;
|
||||
std::string m_info;
|
||||
time_t m_createdDate;
|
||||
|
||||
EmblemInfo m_emblemInfo;
|
||||
uint32 m_accountsNumber;
|
||||
uint64 m_bankMoney;
|
||||
|
||||
Ranks m_ranks;
|
||||
Members m_members;
|
||||
BankTabs m_bankTabs;
|
||||
|
||||
// These are actually ordered lists. The first element is the oldest entry.
|
||||
LogHolder* m_eventLog;
|
||||
LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1];
|
||||
|
||||
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 { return (_GetRankRights(player->GetRank()) & right) != GR_RIGHT_EMPTY; }
|
||||
inline uint8 _GetLowestRankId() const { return uint8(m_ranks.size() - 1); }
|
||||
|
||||
inline uint8 _GetPurchasedTabsSize() const { return uint8(m_bankTabs.size()); }
|
||||
inline BankTab* GetBankTab(uint8 tabId) { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; }
|
||||
inline const BankTab* GetBankTab(uint8 tabId) const { return tabId < m_bankTabs.size() ? m_bankTabs[tabId] : NULL; }
|
||||
|
||||
inline const Member* GetMember(const uint64& guid) const
|
||||
{
|
||||
Members::const_iterator itr = m_members.find(GUID_LOPART(guid));
|
||||
return itr != m_members.end() ? itr->second : NULL;
|
||||
}
|
||||
inline Member* GetMember(const uint64& guid)
|
||||
{
|
||||
Members::iterator itr = m_members.find(GUID_LOPART(guid));
|
||||
return itr != m_members.end() ? itr->second : NULL;
|
||||
}
|
||||
inline Member* GetMember(WorldSession* session, const std::string& name)
|
||||
{
|
||||
for (Members::iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
|
||||
if (itr->second->GetName() == name)
|
||||
return itr->second;
|
||||
|
||||
SendCommandResult(session, GUILD_INVITE_S, ERR_GUILD_PLAYER_NOT_IN_GUILD_S, name);
|
||||
return NULL;
|
||||
}
|
||||
inline void _DeleteMemberFromDB(uint32 lowguid) const
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_MEMBER);
|
||||
stmt->setUInt32(0, lowguid);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
// Creates log holders (either when loading or when creating guild)
|
||||
void _CreateLogHolders();
|
||||
// Tries to create new bank tab
|
||||
bool _CreateNewBankTab();
|
||||
// Creates default guild ranks with names in given locale
|
||||
void _CreateDefaultGuildRanks(LocaleConstant loc);
|
||||
// Creates new rank
|
||||
void _CreateRank(const std::string& name, uint32 rights);
|
||||
// Update account number when member added/removed from guild
|
||||
void _UpdateAccountsNumber();
|
||||
bool _IsLeader(Player* player) const;
|
||||
void _DeleteBankItems(SQLTransaction& trans, bool removeItemsFromDB = false);
|
||||
bool _ModifyBankMoney(SQLTransaction& trans, const uint64& amount, bool add);
|
||||
void _SetLeaderGUID(Member* pLeader);
|
||||
|
||||
void _SetRankBankMoneyPerDay(uint8 rankId, uint32 moneyPerDay);
|
||||
void _SetRankBankTabRightsAndSlots(uint8 rankId, uint8 tabId, GuildBankRightsAndSlots rightsAndSlots, bool saveToDB = true);
|
||||
uint8 _GetRankBankTabRights(uint8 rankId, uint8 tabId) const;
|
||||
uint32 _GetRankRights(uint8 rankId) const;
|
||||
uint32 _GetRankBankMoneyPerDay(uint8 rankId) const;
|
||||
uint32 _GetRankBankTabSlotsPerDay(uint8 rankId, uint8 tabId) const;
|
||||
std::string _GetRankName(uint8 rankId) const;
|
||||
|
||||
uint32 _GetMemberRemainingSlots(const uint64& guid, uint8 tabId) const;
|
||||
uint32 _GetMemberRemainingMoney(const uint64& guid) const;
|
||||
void _DecreaseMemberRemainingSlots(SQLTransaction& trans, const uint64& guid, uint8 tabId);
|
||||
bool _MemberHasTabRights(const uint64& guid, uint8 tabId, uint32 rights) const;
|
||||
|
||||
void _LogEvent(GuildEventLogTypes eventType, uint32 playerGuid1, uint32 playerGuid2 = 0, uint8 newRank = 0);
|
||||
void _LogBankEvent(SQLTransaction& trans, GuildBankEventLogTypes eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount = 0, uint8 destTabId = 0);
|
||||
|
||||
Item* _GetItem(uint8 tabId, uint8 slotId) const;
|
||||
void _RemoveItem(SQLTransaction& trans, uint8 tabId, uint8 slotId);
|
||||
void _MoveItems(MoveItemData* pSrc, MoveItemData* pDest, uint32 splitedAmount);
|
||||
bool _DoItemsMove(MoveItemData* pSrc, MoveItemData* pDest, bool sendError, uint32 splitedAmount = 0);
|
||||
|
||||
void _SendBankContent(WorldSession *session, uint8 tabId) const;
|
||||
void _SendBankMoneyUpdate(WorldSession *session) const;
|
||||
void _SendBankContentUpdate(MoveItemData* pSrc, MoveItemData* pDest) const;
|
||||
void _SendBankContentUpdate(uint8 tabId, SlotIds slots) const;
|
||||
|
||||
void _BroadcastEvent(GuildEvents guildEvent, const uint64& guid, const char* param1 = NULL, const char* param2 = NULL, const char* param3 = NULL) const;
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -2505,14 +2505,8 @@ enum PetDiet
|
||||
|
||||
#define CHAIN_SPELL_JUMP_RADIUS 10
|
||||
|
||||
// Max values for Guild & Guild Bank
|
||||
#define GUILD_BANK_MAX_TABS 6 // send by client for money log also
|
||||
#define GUILD_BANK_MAX_SLOTS 98
|
||||
#define GUILD_BANK_MAX_LOGS 25
|
||||
#define GUILD_BANK_MONEY_LOGS_TAB 100 // used for money log in DB
|
||||
#define GUILD_BANKLOG_MAX_RECORDS 25
|
||||
#define GUILD_EVENTLOG_MAX_RECORDS 100
|
||||
#define GUILD_RANKS_MIN_COUNT 5
|
||||
#define GUILD_RANKS_MAX_COUNT 10
|
||||
|
||||
enum AiReaction
|
||||
{
|
||||
|
||||
@@ -1076,6 +1076,7 @@ bool ScriptMgr::OnCriteriaCheck(AchievementCriteriaData const* data, Player* sou
|
||||
return tmpscript->OnCheck(source, target);
|
||||
}
|
||||
|
||||
// Player
|
||||
void ScriptMgr::OnPVPKill(Player *killer, Player *killed)
|
||||
{
|
||||
FOREACH_SCRIPT(PlayerScript)->OnPVPKill(killer, killed);
|
||||
@@ -1196,7 +1197,8 @@ void ScriptMgr::OnPlayerDelete(uint64 guid)
|
||||
FOREACH_SCRIPT(PlayerScript)->OnDelete(guid);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildAddMember(Guild *guild, Player *player, uint32& plRank)
|
||||
// Guild
|
||||
void ScriptMgr::OnGuildAddMember(Guild *guild, Player *player, uint8& plRank)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnAddMember(guild, player, plRank);
|
||||
}
|
||||
@@ -1206,14 +1208,19 @@ void ScriptMgr::OnGuildRemoveMember(Guild *guild, Player *player, bool isDisband
|
||||
FOREACH_SCRIPT(GuildScript)->OnRemoveMember(guild, player, isDisbanding, isKicked);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildMOTDChanged(Guild *guild, std::string newMotd)
|
||||
void ScriptMgr::OnGuildMOTDChanged(Guild *guild, const std::string& newMotd)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnMOTDChanged(guild, newMotd);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildInfoChanged(Guild *guild, std::string newGInfo)
|
||||
void ScriptMgr::OnGuildInfoChanged(Guild *guild, const std::string& newInfo)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnGInfoChanged(guild, newGInfo);
|
||||
FOREACH_SCRIPT(GuildScript)->OnInfoChanged(guild, newInfo);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildCreate(Guild *guild, Player* leader, const std::string& name)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnCreate(guild, leader, name);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildDisband(Guild *guild)
|
||||
@@ -1221,6 +1228,33 @@ void ScriptMgr::OnGuildDisband(Guild *guild)
|
||||
FOREACH_SCRIPT(GuildScript)->OnDisband(guild);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint32 &amount, bool isRepair)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnMemberWitdrawMoney(guild, player, amount, isRepair);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildMemberDepositMoney(Guild* guild, Player* player, uint32 &amount)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnMemberDepositMoney(guild, player, amount);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
|
||||
bool isDestBank, uint8 destContainer, uint8 destSlotId)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnItemMove(guild, player, pItem, isSrcBank, srcContainer, srcSlotId, isDestBank, destContainer, destSlotId);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildEvent(Guild* guild, uint8 eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnEvent(guild, eventType, playerGuid1, playerGuid2, newRank);
|
||||
}
|
||||
|
||||
void ScriptMgr::OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId)
|
||||
{
|
||||
FOREACH_SCRIPT(GuildScript)->OnBankEvent(guild, eventType, tabId, playerGuid, itemOrMoney, itemStackCount, destTabId);
|
||||
}
|
||||
|
||||
// Group
|
||||
void ScriptMgr::OnGroupAddMember(Group* group, uint64 guid)
|
||||
{
|
||||
ASSERT(group);
|
||||
|
||||
@@ -725,11 +725,18 @@ class GuildScript : public ScriptObject
|
||||
|
||||
bool IsDatabaseBound() const { return false; }
|
||||
|
||||
virtual void OnAddMember(Guild* /*guild*/, Player* /*player*/, uint32& /*plRank*/) { }
|
||||
virtual void OnAddMember(Guild* /*guild*/, Player* /*player*/, uint8& /*plRank*/) { }
|
||||
virtual void OnRemoveMember(Guild* /*guild*/, Player* /*player*/, bool /*isDisbanding*/, bool /*isKicked*/) { }
|
||||
virtual void OnMOTDChanged(Guild* /*guild*/, std::string /*newMotd*/) { }
|
||||
virtual void OnGInfoChanged(Guild* /*guild*/, std::string /*newGInfo*/) { }
|
||||
virtual void OnMOTDChanged(Guild* /*guild*/, const std::string& /*newMotd*/) { }
|
||||
virtual void OnInfoChanged(Guild* /*guild*/, const std::string& /*newInfo*/) { }
|
||||
virtual void OnCreate(Guild* /*guild*/, Player* /*leader*/, const std::string& /*name*/) { }
|
||||
virtual void OnDisband(Guild* /*guild*/) { }
|
||||
virtual void OnMemberWitdrawMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/, bool /*isRepair*/) { }
|
||||
virtual void OnMemberDepositMoney(Guild* /*guild*/, Player* /*player*/, uint32& /*amount*/) { }
|
||||
virtual void OnItemMove(Guild* /*guild*/, Player* /*player*/, Item* /*pItem*/, bool /*isSrcBank*/, uint8 /*srcContainer*/, uint8 /*srcSlotId*/,
|
||||
bool /*isDestBank*/, uint8 /*destContainer*/, uint8 /*destSlotId*/) { }
|
||||
virtual void OnEvent(Guild* /*guild*/, uint8 /*eventType*/, uint32 /*playerGuid1*/, uint32 /*playerGuid2*/, uint8 /*newRank*/) { }
|
||||
virtual void OnBankEvent(Guild* /*guild*/, uint8 /*eventType*/, uint8 /*tabId*/, uint32 /*playerGuid*/, uint32 /*itemOrMoney*/, uint16 /*itemStackCount*/, uint8 /*destTabId*/) { }
|
||||
};
|
||||
|
||||
class GroupScript : public ScriptObject
|
||||
@@ -943,11 +950,18 @@ class ScriptMgr
|
||||
void OnPlayerDelete(uint64 guid);
|
||||
|
||||
public: /* GuildScript */
|
||||
void OnGuildAddMember(Guild *guild, Player *player, uint32& plRank);
|
||||
void OnGuildAddMember(Guild *guild, Player *player, uint8& plRank);
|
||||
void OnGuildRemoveMember(Guild *guild, Player *player, bool isDisbanding, bool isKicked);
|
||||
void OnGuildMOTDChanged(Guild *guild, std::string newMotd);
|
||||
void OnGuildInfoChanged(Guild *guild, std::string newGInfo);
|
||||
void OnGuildMOTDChanged(Guild *guild, const std::string& newMotd);
|
||||
void OnGuildInfoChanged(Guild *guild, const std::string& newInfo);
|
||||
void OnGuildCreate(Guild *guild, Player* leader, const std::string& name);
|
||||
void OnGuildDisband(Guild *guild);
|
||||
void OnGuildMemberWitdrawMoney(Guild* guild, Player* player, uint32 &amount, bool isRepair);
|
||||
void OnGuildMemberDepositMoney(Guild* guild, Player* player, uint32 &amount);
|
||||
void OnGuildItemMove(Guild* guild, Player* player, Item* pItem, bool isSrcBank, uint8 srcContainer, uint8 srcSlotId,
|
||||
bool isDestBank, uint8 destContainer, uint8 destSlotId);
|
||||
void OnGuildEvent(Guild* guild, uint8 eventType, uint32 playerGuid1, uint32 playerGuid2, uint8 newRank);
|
||||
void OnGuildBankEvent(Guild* guild, uint8 eventType, uint8 tabId, uint32 playerGuid, uint32 itemOrMoney, uint16 itemStackCount, uint8 destTabId);
|
||||
|
||||
public: /* GroupScript */
|
||||
void OnGroupAddMember(Group* group, uint64 guid);
|
||||
|
||||
@@ -751,24 +751,12 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
|
||||
|
||||
if (pCurrChar->GetGuildId() != 0)
|
||||
{
|
||||
Guild* guild = sObjectMgr.GetGuildById(pCurrChar->GetGuildId());
|
||||
if (guild)
|
||||
{
|
||||
data.Initialize(SMSG_GUILD_EVENT, (1+1+guild->GetMOTD().size()+1));
|
||||
data << uint8(GE_MOTD);
|
||||
data << uint8(1);
|
||||
data << guild->GetMOTD();
|
||||
SendPacket(&data);
|
||||
sLog.outStaticDebug("WORLD: Sent guild-motd (SMSG_GUILD_EVENT)");
|
||||
|
||||
guild->DisplayGuildBankTabsInfo(this);
|
||||
|
||||
guild->BroadcastEvent(GE_SIGNED_ON, pCurrChar->GetGUID(), 1, pCurrChar->GetName(), "", "");
|
||||
}
|
||||
if (Guild* pGuild = sObjectMgr.GetGuildById(pCurrChar->GetGuildId()))
|
||||
pGuild->SendLoginInfo(this);
|
||||
else
|
||||
{
|
||||
// remove wrong guild data
|
||||
sLog.outError("Player %s (GUID: %u) marked as member not existed guild (id: %u), removing guild membership for player.",pCurrChar->GetName(),pCurrChar->GetGUIDLow(),pCurrChar->GetGuildId());
|
||||
sLog.outError("Player %s (GUID: %u) marked as member of not existing guild (id: %u), removing guild membership for player.",pCurrChar->GetName(),pCurrChar->GetGUIDLow(),pCurrChar->GetGuildId());
|
||||
pCurrChar->SetInGuild(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,7 +331,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, guild);
|
||||
|
||||
guild->BroadcastToGuild(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
guild->BroadcastToGuild(this, false, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
sScriptMgr.OnPlayerChat(GetPlayer(), type, lang, msg, guild);
|
||||
|
||||
guild->BroadcastToOfficers(this, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
guild->BroadcastToGuild(this, true, msg, lang == LANG_ADDON ? LANG_ADDON : LANG_UNIVERSAL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,7 +33,6 @@
|
||||
#include "Pet.h"
|
||||
#include "BattlegroundMgr.h"
|
||||
#include "Battleground.h"
|
||||
#include "Guild.h"
|
||||
#include "ScriptMgr.h"
|
||||
|
||||
enum StableResultCode
|
||||
@@ -880,31 +879,13 @@ void WorldSession::HandleRepairItemOpcode(WorldPacket & recv_data)
|
||||
sLog.outDebug("ITEM: Repair item, itemGUID = %u, npcGUID = %u", GUID_LOPART(itemGUID), GUID_LOPART(npcGUID));
|
||||
|
||||
Item* item = _player->GetItemByGuid(itemGUID);
|
||||
|
||||
if (item)
|
||||
TotalCost= _player->DurabilityRepair(item->GetPos(),true,discountMod,guildBank>0?true:false);
|
||||
TotalCost = _player->DurabilityRepair(item->GetPos(), true, discountMod, guildBank);
|
||||
}
|
||||
else
|
||||
{
|
||||
sLog.outDebug("ITEM: Repair all items, npcGUID = %u", GUID_LOPART(npcGUID));
|
||||
|
||||
TotalCost = _player->DurabilityRepairAll(true,discountMod,guildBank>0?true:false);
|
||||
}
|
||||
if (guildBank)
|
||||
{
|
||||
uint32 GuildId = _player->GetGuildId();
|
||||
if (!GuildId)
|
||||
return;
|
||||
Guild *pGuild = sObjectMgr.GetGuildById(GuildId);
|
||||
if (!pGuild)
|
||||
return;
|
||||
|
||||
//- TODO: Fix poor function call design
|
||||
SQLTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
pGuild->LogBankEvent(trans, GUILD_BANK_LOG_REPAIR_MONEY, 0, _player->GetGUIDLow(), TotalCost);
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
|
||||
pGuild->SendMoneyInfo(this, _player->GetGUIDLow());
|
||||
TotalCost = _player->DurabilityRepairAll(true, discountMod, guildBank);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,14 +46,6 @@ enum CharterItemIDs
|
||||
ARENA_TEAM_CHARTER_5v5 = 23562
|
||||
};
|
||||
|
||||
enum CharterTypes
|
||||
{
|
||||
GUILD_CHARTER_TYPE = 9,
|
||||
ARENA_TEAM_CHARTER_2v2_TYPE = 2,
|
||||
ARENA_TEAM_CHARTER_3v3_TYPE = 3,
|
||||
ARENA_TEAM_CHARTER_5v5_TYPE = 5
|
||||
};
|
||||
|
||||
enum CharterCosts
|
||||
{
|
||||
GUILD_CHARTER_COST = 1000,
|
||||
@@ -164,12 +156,12 @@ void WorldSession::HandlePetitionBuyOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
if (sObjectMgr.GetGuildByName(name))
|
||||
{
|
||||
SendGuildCommandResult(GUILD_CREATE_S, name, ERR_GUILD_NAME_EXISTS_S);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name);
|
||||
return;
|
||||
}
|
||||
if (sObjectMgr.IsReservedName(name) || !ObjectMgr::IsValidCharterName(name))
|
||||
{
|
||||
SendGuildCommandResult(GUILD_CREATE_S, name, ERR_GUILD_NAME_INVALID);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_INVALID, name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -414,12 +406,12 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
if (sObjectMgr.GetGuildByName(newname))
|
||||
{
|
||||
SendGuildCommandResult(GUILD_CREATE_S, newname, ERR_GUILD_NAME_EXISTS_S);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, newname);
|
||||
return;
|
||||
}
|
||||
if (sObjectMgr.IsReservedName(newname) || !ObjectMgr::IsValidCharterName(newname))
|
||||
{
|
||||
SendGuildCommandResult(GUILD_CREATE_S, newname, ERR_GUILD_NAME_INVALID);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_INVALID, newname);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -484,14 +476,14 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
|
||||
// not let enemies sign guild charter
|
||||
if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != sObjectMgr.GetPlayerTeamByGUID(ownerguid))
|
||||
{
|
||||
if (type != 9)
|
||||
if (type != GUILD_CHARTER_TYPE)
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", "", ERR_ARENA_TEAM_NOT_ALLIED);
|
||||
else
|
||||
SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_NOT_ALLIED);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NOT_ALLIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (type != 9)
|
||||
if (type != GUILD_CHARTER_TYPE)
|
||||
{
|
||||
if (_player->getLevel() < sWorld.getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
|
||||
{
|
||||
@@ -519,12 +511,12 @@ void WorldSession::HandlePetitionSignOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
if (_player->GetGuildId())
|
||||
{
|
||||
SendGuildCommandResult(GUILD_INVITE_S, _player->GetName(), ERR_ALREADY_IN_GUILD_S);
|
||||
Guild::SendCommandResult(this, GUILD_INVITE_S, ERR_ALREADY_IN_GUILD_S, _player->GetName());
|
||||
return;
|
||||
}
|
||||
if (_player->GetGuildIdInvited())
|
||||
{
|
||||
SendGuildCommandResult(GUILD_INVITE_S, _player->GetName(), ERR_ALREADY_INVITED_TO_GUILD_S);
|
||||
Guild::SendCommandResult(this, GUILD_INVITE_S, ERR_ALREADY_INVITED_TO_GUILD_S, _player->GetName());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -628,14 +620,14 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data)
|
||||
|
||||
if (!sWorld.getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GUILD) && GetPlayer()->GetTeam() != player->GetTeam())
|
||||
{
|
||||
if (type != 9)
|
||||
if (type != GUILD_CHARTER_TYPE)
|
||||
SendArenaTeamCommandResult(ERR_ARENA_TEAM_INVITE_SS, "", "", ERR_ARENA_TEAM_NOT_ALLIED);
|
||||
else
|
||||
SendGuildCommandResult(GUILD_CREATE_S, "", ERR_GUILD_NOT_ALLIED);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NOT_ALLIED);
|
||||
return;
|
||||
}
|
||||
|
||||
if (type != 9)
|
||||
if (type != GUILD_CHARTER_TYPE)
|
||||
{
|
||||
if (player->getLevel() < sWorld.getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
|
||||
{
|
||||
@@ -665,13 +657,13 @@ void WorldSession::HandleOfferPetitionOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
if (player->GetGuildId())
|
||||
{
|
||||
SendGuildCommandResult(GUILD_INVITE_S, _player->GetName(), ERR_ALREADY_IN_GUILD_S);
|
||||
Guild::SendCommandResult(this, GUILD_INVITE_S, ERR_ALREADY_IN_GUILD_S, _player->GetName());
|
||||
return;
|
||||
}
|
||||
|
||||
if (player->GetGuildIdInvited())
|
||||
{
|
||||
SendGuildCommandResult(GUILD_INVITE_S, _player->GetName(), ERR_ALREADY_INVITED_TO_GUILD_S);
|
||||
Guild::SendCommandResult(this, GUILD_INVITE_S, ERR_ALREADY_INVITED_TO_GUILD_S, _player->GetName());
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -787,7 +779,7 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
|
||||
{
|
||||
if (sObjectMgr.GetGuildByName(name))
|
||||
{
|
||||
SendGuildCommandResult(GUILD_CREATE_S, name, ERR_GUILD_NAME_EXISTS_S);
|
||||
Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -826,7 +818,7 @@ void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data)
|
||||
for (uint8 i = 0; i < signs; ++i)
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
guild->AddMember(fields[0].GetUInt64(), guild->GetLowestRank());
|
||||
guild->AddMember(fields[0].GetUInt64());
|
||||
result->NextRow();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -410,14 +410,8 @@ void WorldSession::LogoutPlayer(bool Save)
|
||||
HandleMoveWorldportAckOpcode();
|
||||
|
||||
///- If the player is in a guild, update the guild roster and broadcast a logout message to other guild members
|
||||
Guild *guild = sObjectMgr.GetGuildById(_player->GetGuildId());
|
||||
if (guild)
|
||||
{
|
||||
guild->SetMemberStats(_player->GetGUID());
|
||||
guild->UpdateLogoutTime(_player->GetGUID());
|
||||
|
||||
guild->BroadcastEvent(GE_SIGNED_OFF, _player->GetGUID(), 1, _player->GetName(), "", "");
|
||||
}
|
||||
if (Guild *pGuild = sObjectMgr.GetGuildById(_player->GetGuildId()))
|
||||
pGuild->HandleMemberLogout(this);
|
||||
|
||||
///- Remove pet
|
||||
_player->RemovePet(NULL,PET_SAVE_AS_CURRENT, true);
|
||||
|
||||
@@ -129,6 +129,14 @@ enum ChatRestrictionType
|
||||
ERR_YELL_RESTRICTED = 3
|
||||
};
|
||||
|
||||
enum CharterTypes
|
||||
{
|
||||
GUILD_CHARTER_TYPE = 9,
|
||||
ARENA_TEAM_CHARTER_2v2_TYPE = 2,
|
||||
ARENA_TEAM_CHARTER_3v3_TYPE = 3,
|
||||
ARENA_TEAM_CHARTER_5v5_TYPE = 5
|
||||
};
|
||||
|
||||
/// Player session in the World
|
||||
class WorldSession
|
||||
{
|
||||
@@ -272,11 +280,9 @@ class WorldSession
|
||||
void SendDiscoverNewTaxiNode(uint32 nodeid);
|
||||
|
||||
// Guild/Arena Team
|
||||
void SendGuildCommandResult(uint32 typecmd, const std::string& str, uint32 cmdresult);
|
||||
void SendArenaTeamCommandResult(uint32 team_action, const std::string& team, const std::string& player, uint32 error_id);
|
||||
void SendNotInArenaTeamPacket(uint8 type);
|
||||
void SendPetitionShowList(uint64 guid);
|
||||
void SendSaveGuildEmblem(uint32 msg);
|
||||
|
||||
void BuildPartyMemberStatsChangedPacket(Player *player, WorldPacket *data);
|
||||
|
||||
|
||||
@@ -1052,9 +1052,9 @@ void World::LoadConfigSettings(bool reload)
|
||||
m_int_configs[CONFIG_GUILD_EVENT_LOG_COUNT] = sConfig.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;
|
||||
m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = sConfig.GetIntDefault("Guild.BankEventLogRecordsCount", GUILD_BANK_MAX_LOGS);
|
||||
if (m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] < GUILD_BANK_MAX_LOGS)
|
||||
m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = GUILD_BANK_MAX_LOGS;
|
||||
m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = sConfig.GetIntDefault("Guild.BankEventLogRecordsCount", GUILD_BANKLOG_MAX_RECORDS);
|
||||
if (m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] < GUILD_BANKLOG_MAX_RECORDS)
|
||||
m_int_configs[CONFIG_GUILD_BANK_EVENT_LOG_COUNT] = GUILD_BANKLOG_MAX_RECORDS;
|
||||
|
||||
m_VisibleUnitGreyDistance = sConfig.GetFloatDefault("Visibility.Distance.Grey.Unit", 1);
|
||||
if (m_VisibleUnitGreyDistance > MAX_VISIBILITY_DISTANCE)
|
||||
@@ -1530,7 +1530,7 @@ void World::SetInitialWorldSettings()
|
||||
sLog.outString("Loading Auctions...");
|
||||
sAuctionMgr.LoadAuctions();
|
||||
|
||||
sLog.outString("Loading Guilds...");
|
||||
sLog.outString("***** GUILDS *****");
|
||||
sObjectMgr.LoadGuilds();
|
||||
|
||||
sLog.outString("Loading ArenaTeams...");
|
||||
|
||||
@@ -88,7 +88,6 @@ bool CharacterDatabaseConnection::Open()
|
||||
PrepareStatement(CHAR_LOAD_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE account = ?");
|
||||
PrepareStatement(CHAR_LOAD_PLAYER_MAILITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, item_guid, item_template, owner_guid FROM mail_items JOIN item_instance ON item_guid = guid WHERE mail_id = ?");
|
||||
PrepareStatement(CHAR_LOAD_AUCTION_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, itemguid, item_template FROM auctionhouse JOIN item_instance ON itemguid = guid");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_BANK_ITEMS, "SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, TabId, SlotId, item_guid, item_entry, guildid FROM guild_bank_item JOIN item_instance ON item_guid = guid");
|
||||
PrepareStatement(CHAR_LOAD_ITEM_REFUNDS, "SELECT player_guid, paidMoney, paidExtendedCost FROM item_refund_instance WHERE item_guid = ? AND player_guid = ? LIMIT 1");
|
||||
PrepareStatement(CHAR_LOAD_ITEM_BOP_TRADE, "SELECT allowedPlayers FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
|
||||
PrepareStatement(CHAR_DEL_ITEM_BOP_TRADE, "DELETE FROM item_soulbound_trade_data WHERE itemGuid = ? LIMIT 1");
|
||||
@@ -97,5 +96,120 @@ bool CharacterDatabaseConnection::Open()
|
||||
PrepareStatement(CHAR_DEL_ITEM_INSTANCE, "DELETE FROM item_instance WHERE guid = ?");
|
||||
PrepareStatement(CHAR_GET_ACCOUNT_BY_NAME, "SELECT account FROM characters WHERE name = ?");
|
||||
|
||||
// Guild handling
|
||||
// 0: uint32, 1: string, 2: uint32, 3: string, 4: string, 5: uint64, 6-10: uint32, 11: uint64
|
||||
PrepareStatement(CHAR_ADD_GUILD, "INSERT INTO guild (guildid, name, leaderguid, info, motd, createdate, EmblemStyle, EmblemColor, BorderStyle, BorderColor, BackgroundColor, BankMoney) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD, "DELETE FROM guild WHERE guildid = ?"); // 0: uint32
|
||||
// 0: uint32, 1: uint32, 2: uint8, 4: string, 5: string
|
||||
PrepareStatement(CHAR_ADD_GUILD_MEMBER, "INSERT INTO guild_member (guildid, guid, rank, pnote, offnote) VALUES (?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_MEMBER, "DELETE FROM guild_member WHERE guid = ?"); // 0: uint32
|
||||
PrepareStatement(CHAR_DEL_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildid = ?"); // 0: uint32
|
||||
// 0: uint32, 1: uint8, 3: string, 4: uint32
|
||||
PrepareStatement(CHAR_ADD_GUILD_RANK, "INSERT INTO guild_rank (guildid, rid, rname, rights) VALUES (?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildid = ?"); // 0: uint32
|
||||
PrepareStatement(CHAR_DEL_GUILD_LOWEST_RANK, "DELETE FROM guild_rank WHERE guildid = ? AND rid >= ?"); // 0: uint32, 1: uint8
|
||||
PrepareStatement(CHAR_ADD_GUILD_BANK_TAB, "INSERT INTO guild_bank_tab (guildid, TabId) VALUES (?, ?)"); // 0: uint32, 1: uint8
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_TAB, "DELETE FROM guild_bank_tab WHERE guildid = ? AND TabId = ?"); // 0: uint32, 1: uint8
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildid = ?"); // 0: uint32
|
||||
// 0: uint32, 1: uint8, 2: uint8, 3: uint32, 4: uint32
|
||||
PrepareStatement(CHAR_ADD_GUILD_BANK_ITEM, "INSERT INTO guild_bank_item (guildid, TabId, SlotId, item_guid, item_entry) VALUES (?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_ITEM, "DELETE FROM guild_bank_item WHERE guildid = ? AND TabId = ? AND SlotId = ?"); // 0: uint32, 1: uint8, 2: uint8
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildid = ?"); // 0: uint32
|
||||
PrepareStatement(CHAR_ADD_GUILD_BANK_RIGHT_DEFAULT, "INSERT INTO guild_bank_right (guildid, TabId, rid) VALUES (?, ?, ?)"); // 0: uint32, 1: uint8, 2: uint8
|
||||
// 0: uint32, 1: uint8, 2: uint8, 3: uint8, 4: uint32
|
||||
PrepareStatement(CHAR_ADD_GUILD_BANK_RIGHT, "INSERT INTO guild_bank_right (guildid, TabId, rid, gbright, SlotPerDay) VALUES (?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHT, "DELETE FROM guild_bank_right WHERE guildid = ? AND TabId = ? AND rid = ?"); // 0: uint32, 1: uint8, 2: uint8
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildid = ?"); // 0: uint32
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK, "DELETE FROM guild_bank_right WHERE guildid = ? AND rid = ?"); // 0: uint32, 1: uint8
|
||||
// 0-1: uint32, 2-3: uint8, 4-5: uint32, 6: uint16, 7: uint8, 8: uint64
|
||||
PrepareStatement(CHAR_ADD_GUILD_BANK_EVENTLOG, "INSERT INTO guild_bank_eventlog (guildid, LogGuid, TabId, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOG, "DELETE FROM guild_bank_eventlog WHERE guildid = ? AND LogGuid = ? AND TabId = ?"); // 0: uint32, 1: uint32, 2: uint8
|
||||
PrepareStatement(CHAR_DEL_GUILD_BANK_EVENTLOGS, "DELETE FROM guild_bank_eventlog WHERE guildid = ?"); // 0: uint32
|
||||
// 0-1: uint32, 2: uint8, 3-4: uint32, 5: uint8, 6: uint64
|
||||
PrepareStatement(CHAR_ADD_GUILD_EVENTLOG, "INSERT INTO guild_eventlog (guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp) VALUES (?, ?, ?, ?, ?, ?, ?)");
|
||||
PrepareStatement(CHAR_DEL_GUILD_EVENTLOG, "DELETE FROM guild_eventlog WHERE guildid = ? AND LogGuid = ?"); // 0: uint32, 1: uint32
|
||||
PrepareStatement(CHAR_DEL_GUILD_EVENTLOGS, "DELETE FROM guild_eventlog WHERE guildid = ?"); // 0: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_PNOTE, "UPDATE guild_member SET pnote = ? WHERE guid = ?"); // 0: string, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_OFFNOTE, "UPDATE guild_member SET offnote = ? WHERE guid = ?"); // 0: string, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_RANK, "UPDATE guild_member SET rank = ? WHERE guid = ?"); // 0: uint8, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MOTD, "UPDATE guild SET motd = ? WHERE guildid = ?"); // 0: string, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_INFO, "UPDATE guild SET info = ? WHERE guildid = ?"); // 0: string, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_LEADER, "UPDATE guild SET leaderguid = ? WHERE guildid = ?"); // 0: uint32, 1: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_RANK_NAME, "UPDATE guild_rank SET rname = ? WHERE rid = ? AND guildid = ?"); // 0: string, 1: uint8, 2: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_RANK_RIGHTS, "UPDATE guild_rank SET rights = ? WHERE rid = ? AND guildid = ?"); // 0: uint32, 1: uint8, 2: uint32
|
||||
// 0-5: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_EMBLEM_INFO, "UPDATE guild SET EmblemStyle = ?, EmblemColor = ?, BorderStyle = ?, BorderColor = ?, BackgroundColor = ? WHERE guildid = ?");
|
||||
// 0: string, 1: string, 2: uint32, 3: uint8
|
||||
PrepareStatement(CHAR_SET_GUILD_BANK_TAB_INFO, "UPDATE guild_bank_tab SET TabName = ?,TabIcon = ? WHERE guildid = ? AND TabId = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_BANK_MONEY, "UPDATE guild SET BankMoney = ? WHERE guildid = ?"); // 0: uint64, 1: uint32
|
||||
// 0: uint8, 1: uint32, 2: uint8, 3: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_BANK_EVENTLOG_TAB, "UPDATE guild_bank_eventlog SET TabId = ? WHERE guildid = ? AND TabId = ? AND LogGuid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_MONEY, "UPDATE guild_member SET BankRemMoney = ? WHERE guildid = ? AND guid = ?"); // 0: uint32, 1: uint32, 2: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_MONEY, "UPDATE guild_member SET BankResetTimeMoney = ?, BankRemMoney = ? WHERE guildid = ? AND guid = ?"); // 0: uint32, 1: uint32, 2: uint32, 3: uint32
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_RESET_TIME, "UPDATE guild_member SET BankResetTimeMoney = 0 WHERE guildid = ? AND rank = ?"); // 0: uint32, 1: uint8
|
||||
PrepareStatement(CHAR_SET_GUILD_RANK_BANK_MONEY, "UPDATE guild_rank SET BankMoneyPerDay = ? WHERE rid = ? AND guildid = ?"); // 0: uint32, 1: uint8, 2: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_BANK_TAB_TEXT, "UPDATE guild_bank_tab SET TabText = ? WHERE guildid = ? AND TabId = ?"); // 0: string, 1: uint32, 2: uint8
|
||||
// 0: uint32, 1: uint32, 2: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS0, "UPDATE guild_member SET BankRemSlotsTab0 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS1, "UPDATE guild_member SET BankRemSlotsTab1 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS2, "UPDATE guild_member SET BankRemSlotsTab2 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS3, "UPDATE guild_member SET BankRemSlotsTab3 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS4, "UPDATE guild_member SET BankRemSlotsTab4 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS5, "UPDATE guild_member SET BankRemSlotsTab5 = ? WHERE guildid = ? AND guid = ?");
|
||||
// 0: uint32, 1: uint32, 2: uint32, 3: uint32
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS0, "UPDATE guild_member SET BankResetTimeTab0 = ?, BankRemSlotsTab0 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS1, "UPDATE guild_member SET BankResetTimeTab1 = ?, BankRemSlotsTab1 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS2, "UPDATE guild_member SET BankResetTimeTab2 = ?, BankRemSlotsTab2 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS3, "UPDATE guild_member SET BankResetTimeTab3 = ?, BankRemSlotsTab3 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS4, "UPDATE guild_member SET BankResetTimeTab4 = ?, BankRemSlotsTab4 = ? WHERE guildid = ? AND guid = ?");
|
||||
PrepareStatement(CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS5, "UPDATE guild_member SET BankResetTimeTab5 = ?, BankRemSlotsTab5 = ? WHERE guildid = ? AND guid = ?");
|
||||
// 0: uint32, 1: uint8
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME0, "UPDATE guild_member SET BankResetTimeTab0 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME1, "UPDATE guild_member SET BankResetTimeTab1 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME2, "UPDATE guild_member SET BankResetTimeTab2 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME3, "UPDATE guild_member SET BankResetTimeTab3 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME4, "UPDATE guild_member SET BankResetTimeTab4 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_RESET_GUILD_RANK_BANK_TIME5, "UPDATE guild_member SET BankResetTimeTab5 = 0 WHERE guildid = ? AND rank = ?");
|
||||
PrepareStatement(CHAR_LOAD_GUILDS,
|
||||
// 0 1 2 3 4 5 6
|
||||
"SELECT g.guildid, g.name, g.leaderguid, g.EmblemStyle, g.EmblemColor, g.BorderStyle, g.BorderColor,"
|
||||
// 7 8 9 10 11 12
|
||||
"g.BackgroundColor, g.info, g.motd, g.createdate, g.BankMoney, COUNT(gbt.guildid) "
|
||||
"FROM guild g LEFT JOIN guild_bank_tab gbt ON g.guildid = gbt.guildid GROUP BY g.guildid ORDER BY g.guildid ASC");
|
||||
// 0 1 2 3 4
|
||||
PrepareStatement(CHAR_LOAD_GUILD_RANKS, "SELECT guildid, rid, rname, rights, BankMoneyPerDay FROM guild_rank ORDER BY guildid ASC, rid ASC");
|
||||
PrepareStatement(CHAR_LOAD_CHAR_DATA_FOR_GUILD, "SELECT name, level, class, zone, account FROM characters WHERE guid = ?");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_MEMBERS,
|
||||
// 0 1 2 3 4 5 6
|
||||
"SELECT guildid, gm.guid, rank, pnote, offnote, BankResetTimeMoney, BankRemMoney,"
|
||||
// 7 8 9 10 11 12
|
||||
"BankResetTimeTab0, BankRemSlotsTab0, BankResetTimeTab1, BankRemSlotsTab1, BankResetTimeTab2, BankRemSlotsTab2,"
|
||||
// 13 14 15 16 17 18
|
||||
"BankResetTimeTab3, BankRemSlotsTab3, BankResetTimeTab4, BankRemSlotsTab4, BankResetTimeTab5, BankRemSlotsTab5,"
|
||||
// 19 20 21 22 23 24
|
||||
"c.name, c.level, c.class, c.zone, c.account, c.logout_time "
|
||||
"FROM guild_member gm LEFT JOIN characters c ON c.guid = gm.guid ORDER BY guildid ASC");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_BANK_RIGHTS,
|
||||
// 0 1 2 3 4
|
||||
"SELECT guildid, TabId, rid, gbright, SlotPerDay FROM guild_bank_right ORDER BY guildid ASC, TabId ASC");
|
||||
// 0 1 2 3 4
|
||||
PrepareStatement(CHAR_LOAD_GUILD_BANK_TABS, "SELECT guildid, TabId, TabName, TabIcon, TabText FROM guild_bank_tab ORDER BY guildid ASC, TabId ASC");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_EVENTLOGS,
|
||||
// 0 1 2 3 4 5 6
|
||||
"SELECT guildid, LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_BANK_EVENTLOGS,
|
||||
// 0 1 2 3 4 5 6 7 8
|
||||
"SELECT guildid, TabId, LogGuid, EventType, PlayerGuid, ItemOrMoney, ItemStackCount, DestTabId, TimeStamp FROM guild_bank_eventlog ORDER BY TimeStamp DESC, LogGuid DESC");
|
||||
PrepareStatement(CHAR_LOAD_GUILD_BANK_ITEMS,
|
||||
// 0 1 2 3 4 5 6 7 8 9 10
|
||||
"SELECT creatorGuid, giftCreatorGuid, count, duration, charges, flags, enchantments, randomPropertyId, durability, playedTime, text, "
|
||||
// 11 12 13 14 15
|
||||
"guildid, TabId, SlotId, item_guid, item_entry FROM guild_bank_item INNER JOIN item_instance ON item_guid = guid");
|
||||
|
||||
PrepareStatement(CHAR_CLEAN_GUILD_RANKS, "DELETE FROM guild_rank WHERE guildId NOT IN (SELECT guildid FROM guild)");
|
||||
PrepareStatement(CHAR_CLEAN_GUILD_MEMBERS, "DELETE FROM guild_member WHERE guildId NOT IN (SELECT guildid FROM guild)");
|
||||
PrepareStatement(CHAR_CLEAN_GUILD_BANK_TABS, "DELETE FROM guild_bank_tab WHERE guildId NOT IN (SELECT guildid FROM guild)");
|
||||
PrepareStatement(CHAR_CLEAN_GUILD_BANK_RIGHTS, "DELETE FROM guild_bank_right WHERE guildId NOT IN (SELECT guildid FROM guild)");
|
||||
PrepareStatement(CHAR_CLEAN_GUILD_BANK_ITEMS, "DELETE FROM guild_bank_item WHERE guildId NOT IN (SELECT guildid FROM guild)");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,81 @@ enum CharacterDatabaseStatements
|
||||
CHAR_DEL_INVENTORY_ITEM,
|
||||
CHAR_DEL_ITEM_INSTANCE,
|
||||
CHAR_GET_ACCOUNT_BY_NAME,
|
||||
|
||||
CHAR_ADD_GUILD,
|
||||
CHAR_DEL_GUILD,
|
||||
CHAR_ADD_GUILD_MEMBER,
|
||||
CHAR_DEL_GUILD_MEMBER,
|
||||
CHAR_DEL_GUILD_MEMBERS,
|
||||
CHAR_ADD_GUILD_RANK,
|
||||
CHAR_DEL_GUILD_RANKS,
|
||||
CHAR_DEL_GUILD_LOWEST_RANK,
|
||||
CHAR_ADD_GUILD_BANK_TAB,
|
||||
CHAR_DEL_GUILD_BANK_TAB,
|
||||
CHAR_DEL_GUILD_BANK_TABS,
|
||||
CHAR_ADD_GUILD_BANK_ITEM,
|
||||
CHAR_DEL_GUILD_BANK_ITEM,
|
||||
CHAR_DEL_GUILD_BANK_ITEMS,
|
||||
CHAR_ADD_GUILD_BANK_RIGHT_DEFAULT,
|
||||
CHAR_ADD_GUILD_BANK_RIGHT,
|
||||
CHAR_DEL_GUILD_BANK_RIGHT,
|
||||
CHAR_DEL_GUILD_BANK_RIGHTS,
|
||||
CHAR_DEL_GUILD_BANK_RIGHTS_FOR_RANK,
|
||||
CHAR_ADD_GUILD_BANK_EVENTLOG,
|
||||
CHAR_DEL_GUILD_BANK_EVENTLOG,
|
||||
CHAR_DEL_GUILD_BANK_EVENTLOGS,
|
||||
CHAR_ADD_GUILD_EVENTLOG,
|
||||
CHAR_DEL_GUILD_EVENTLOG,
|
||||
CHAR_DEL_GUILD_EVENTLOGS,
|
||||
CHAR_SET_GUILD_MEMBER_PNOTE,
|
||||
CHAR_SET_GUILD_MEMBER_OFFNOTE,
|
||||
CHAR_SET_GUILD_MEMBER_RANK,
|
||||
CHAR_SET_GUILD_MOTD,
|
||||
CHAR_SET_GUILD_INFO,
|
||||
CHAR_SET_GUILD_LEADER,
|
||||
CHAR_SET_GUILD_RANK_NAME,
|
||||
CHAR_SET_GUILD_RANK_RIGHTS,
|
||||
CHAR_SET_GUILD_EMBLEM_INFO,
|
||||
CHAR_SET_GUILD_BANK_TAB_INFO,
|
||||
CHAR_SET_GUILD_BANK_MONEY,
|
||||
CHAR_SET_GUILD_BANK_EVENTLOG_TAB,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_MONEY,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_MONEY,
|
||||
CHAR_RESET_GUILD_RANK_BANK_RESET_TIME,
|
||||
CHAR_SET_GUILD_RANK_BANK_MONEY,
|
||||
CHAR_SET_GUILD_BANK_TAB_TEXT,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS0,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS1,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS2,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS3,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS4,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_TIME_REM_SLOTS5,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS0,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS1,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS2,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS3,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS4,
|
||||
CHAR_SET_GUILD_MEMBER_BANK_REM_SLOTS5,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME0,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME1,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME2,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME3,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME4,
|
||||
CHAR_RESET_GUILD_RANK_BANK_TIME5,
|
||||
CHAR_LOAD_GUILDS,
|
||||
CHAR_LOAD_GUILD_RANKS,
|
||||
CHAR_LOAD_CHAR_DATA_FOR_GUILD,
|
||||
CHAR_LOAD_GUILD_MEMBERS,
|
||||
CHAR_LOAD_GUILD_BANK_RIGHTS,
|
||||
CHAR_LOAD_GUILD_BANK_TABS,
|
||||
CHAR_LOAD_GUILD_EVENTLOGS,
|
||||
CHAR_LOAD_GUILD_BANK_EVENTLOGS,
|
||||
CHAR_CLEAN_GUILD_RANKS,
|
||||
CHAR_CLEAN_GUILD_MEMBERS,
|
||||
CHAR_CLEAN_GUILD_BANK_TABS,
|
||||
CHAR_CLEAN_GUILD_BANK_RIGHTS,
|
||||
CHAR_CLEAN_GUILD_BANK_ITEMS,
|
||||
|
||||
MAX_CHARACTERDATABASE_STATEMENTS,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user