/* * Ascent MMORPG Server * Copyright (C) 2005-2007 Ascent Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "StdAfx.h" Guild::~Guild() { std::list::iterator itr = m_rankList.begin(); for(; itr != m_rankList.end(); ++itr) delete (*itr); m_rankList.clear(); } void Guild::SendMessageToGuild(uint64 ExcludePlayer, WorldPacket *data, uint8 Type) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if(Type == G_MSGTYPE_ALLBUTONE) { if((*i)->guid == ExcludePlayer) continue; } Player *pMember = objmgr.GetPlayer( (*i)->guid); if (!pMember || !pMember->IsInWorld() || !pMember->GetSession()) continue; uint32 MemberRank = pMember->GetGuildRank(); if(Type == G_MSGTYPE_OFFICERCHAT) { if(!HasRankRight(MemberRank,GR_RIGHT_OFFCHATLISTEN)) continue; } else if(Type == G_MSGTYPE_PUBLICCHAT) { if(!HasRankRight(MemberRank,GR_RIGHT_GCHATLISTEN)) continue; } pMember->GetSession()->SendPacket(data); } } void Guild::GuildMemberLogoff(Player *pMember) { //set offline info std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if ((*i)->guid == pMember->GetGUID()) { (*i)->lastLevel = pMember->getLevel(); (*i)->lastZone = pMember->GetZoneId(); (*i)->Rank = pMember->GetGuildRank(); (*i)->lastOnline = time(NULL); return; } } } void Guild::AddNewGuildMember(Player *plyr) { PlayerInfo *gMember=objmgr.GetPlayerInfo(plyr->GetGUID()); gMember->Rank = plyr->GetGuildRank(); gMember->lastLevel =plyr->getLevel(); gMember->lastZone =plyr->GetZoneId(); gMember->publicNote = ""; gMember->officerNote = ""; gMember->lastOnline = time(NULL); AddGuildMember(gMember); sHookInterface.OnGuildJoin(plyr, this); } bool Guild::DeleteGuildMember(uint64 guid) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if ((*i)->guid == guid) { m_guildMembers.erase(i); CharacterDatabase.Execute("UPDATE characters SET guildid=0,guildRank=0 WHERE guid=%u AND guildid=%u",GUID_LOPART(guid), m_guildId); return true; } } return false; } bool Guild::DeleteGuildMember(string name) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if (!strcmp((*i)->name.c_str(), name.c_str())) { m_guildMembers.erase(i); CharacterDatabase.Execute("UPDATE characters SET guildid=0,guildRank=0 WHERE name='%s' AND guildid=%u",CharacterDatabase.EscapeString(name).c_str(), m_guildId); return true; } } return false; } void Guild::DeleteGuildMembers() { Player *plyr; std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();) { plyr = objmgr.GetPlayer( (*i)->guid ); if(plyr) { plyr->SetGuildId(0); plyr->SetGuildRank(0); } i++; } m_guildMembers.clear(); } PlayerInfo* Guild::GetGuildMember(uint64 guid) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if ((*i)->guid== guid) { return *i; } } return false; } PlayerInfo* Guild::GetGuildMember(std::string name) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if((*i)->name == name) return *i; } return false; } void Guild::FillGuildRosterData(WorldPacket *data) { Player *pMember; std::list::iterator i; std::list::iterator ritr; data->Initialize(SMSG_GUILD_ROSTER); *data << GetGuildMembersCount(); *data << m_motd; *data << m_guildInfo; *data << (uint32)m_rankList.size(); for (ritr = m_rankList.begin(); ritr != m_rankList.end();ritr++) *data << (*ritr)->rights; for (i = m_guildMembers.begin(); i != m_guildMembers.end(); i++) { pMember = objmgr.GetPlayer((*i)->guid); if (pMember && pMember->GetSession() && pMember->IsInWorld()) { *data << pMember->GetGUID(); *data << (uint8)1; *data << pMember->GetName(); *data << pMember->GetGuildRank(); *data << (uint8)pMember->getLevel(); *data << pMember->getClass(); *data << pMember->GetZoneId(); *data << (*i)->publicNote; *data << (*i)->officerNote; } else { *data << (*i)->guid; *data << (uint8)0; *data << (*i)->name; *data << (*i)->Rank; *data << (uint8)((*i)->lastLevel); *data << (uint8)((*i)->cl); *data << (*i)->lastZone; *data << float((time(NULL)-(*i)->lastOnline)/86400.0); *data << (*i)->publicNote; *data << (*i)->officerNote; } } } void Guild::BroadCastToGuild(WorldSession *session, std::string msg) { if (session) { if(session->GetPlayer()) { uint32 MemberRank = session->GetPlayer()->GetGuildRank(); if(!HasRankRight(MemberRank,GR_RIGHT_GCHATSPEAK)) return; WorldPacket *data; if(session->GetPlayer()->m_modlanguage >=0) data = sChatHandler.FillMessageData( CHAT_MSG_GUILD, session->GetPlayer()->m_modlanguage, msg.c_str(),session->GetPlayer()->GetGUID()); else data = sChatHandler.FillMessageData( CHAT_MSG_GUILD, LANG_UNIVERSAL, msg.c_str(),session->GetPlayer()->GetGUID()); SendMessageToGuild(0, data, G_MSGTYPE_PUBLICCHAT); delete data; } } } void Guild::OfficerChannelChat(WorldSession *session, std::string msg) { if (session) { if(session->GetPlayer()) { uint32 MemberRank = session->GetPlayer()->GetGuildRank(); if(!HasRankRight(MemberRank,GR_RIGHT_OFFCHATSPEAK)) return; WorldPacket *data; if(session->GetPlayer()->m_modlanguage >=0) data = sChatHandler.FillMessageData( CHAT_MSG_OFFICER, session->GetPlayer()->m_modlanguage, msg.c_str(),session->GetPlayer()->GetGUID()); else data = sChatHandler.FillMessageData( CHAT_MSG_OFFICER, LANG_UNIVERSAL, msg.c_str(),session->GetPlayer()->GetGUID()); SendMessageToGuild(0, data, G_MSGTYPE_OFFICERCHAT); delete data; } } } void Guild::SetPublicNote(uint64 guid, std::string publicNote) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if ((*i)->guid == guid) { (*i)->publicNote = publicNote; break; } } } void Guild::SetOfficerNote(uint64 guid, std::string officerNote) { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if ((*i)->guid == guid) { (*i)->officerNote = officerNote; break; } } } /* void Guild::UpdateTabard() { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i;) { Player *pl = objmgr.GetPlayer( i->guid ); if (pl) { uint64 TabardGuid = pl->GetUInt64Value(); } } //UpdateData *data = new UpdateData; //data->BuildPacket()*/ /* CUpdateBlock block; char updateBuf[0x80]; int size; char *ptr; map::iterator i; for(i = Members.begin();i != Members.end();i++) { CPlayer *pPlayer = NULL; if(!DataManager.RetrieveObject((CWoWObject**)&pPlayer, OBJ_PLAYER, i->second)) { #ifdef _DEBUG Debug.Log("CGuild::UpdateTabard() - Unable to retrieve an object found in the member list."); #endif continue; } pPlayer->Data.GuildTimestamp++; if(pPlayer->pClient != NULL) { block.ResetBlock(updateBuf, 0x80); block.AddDataUpdate(PLAYER_MAX_BITS, pPlayer->guid, PLAYERGUID_HIGH); block.Add(PLAYER_GUILD_TIMESTAMP, pPlayer->Data.GuildTimestamp); if(pPlayer->Data.Items[SLOT_TABARD] != 0) block.Add(PLAYER_INV_SLOTS+SLOT_TABARD*2, 0,0); ptr = block.GetCompressedData(size); if(size) { pPlayer->pClient->RegionOutPacket(SMSG_COMPRESSED_UPDATE_OBJECT, ptr, size); } if(pPlayer->Data.Items[SLOT_TABARD] != 0) { block.ResetBlock(updateBuf, 0x80); block.AddDataUpdate(PLAYER_MAX_BITS, pPlayer->guid, PLAYERGUID_HIGH); block.Add(PLAYER_INV_SLOTS+SLOT_TABARD*2, pPlayer->Data.Items[SLOT_TABARD], ITEMGUID_HIGH); ptr = block.GetCompressedData(size); if(size) { pPlayer->pClient->RegionOutPacket(SMSG_COMPRESSED_UPDATE_OBJECT, ptr, size); } } } } } */ void Guild::CreateRank(std::string name,uint32 rights) { if(m_rankList.size() >= MAX_GUILD_RANKS) return; RankInfo *newrank; newrank = new RankInfo; newrank->rankid = m_rankList.size(); newrank->name = name; newrank->rights = rights; m_rankList.push_back(newrank); } std::string Guild::GetRankName(uint32 rankId) { std::list::iterator itr; if(rankId > m_rankList.size()-1) return "Internal Error"; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) { if ((*itr)->rankid == rankId) return (*itr)->name; } return "None"; } uint32 Guild::GetRankRights(uint32 rankId) { std::list::iterator itr; if(rankId > m_rankList.size()-1) return 0; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) { if ((*itr)->rankid == rankId) return (*itr)->rights; } return 0; } void Guild::SetRankName(uint32 rankId, std::string name) { std::list::iterator itr; if(rankId > m_rankList.size()-1) return; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) { if ((*itr)->rankid == rankId) { (*itr)->name = name; break; } } } void Guild::SetRankRights(uint32 rankId, uint32 rights) { std::list::iterator itr; if(rankId > m_rankList.size()-1) return; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) { if ((*itr)->rankid == rankId) { (*itr)->rights = rights; break; } } } void Guild::FillQueryData(WorldPacket *data) { data->Initialize(SMSG_GUILD_QUERY_RESPONSE); *data << GetGuildId(); *data << GetGuildName(); std::list::iterator itr; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) *data << (*itr)->name; for (uint32 r = m_rankList.size(); r < MAX_GUILD_RANKS;++r) *data << uint8(0); *data << GetGuildEmblemStyle(); *data << GetGuildEmblemColor(); *data << GetGuildBorderStyle(); *data << GetGuildBorderColor(); *data << GetGuildBackgroundColor(); } void Guild::SaveToDb() { std::stringstream query; query << "DELETE FROM guilds WHERE guildId = " << m_guildId; CharacterDatabase.Execute( query.str( ).c_str( ) ); query.rdbuf()->str(""); query << "INSERT INTO guilds VALUES ("; query << m_guildId << ",'"; query << CharacterDatabase.EscapeString(m_guildName) << "', "; query << m_leaderGuid << ", "; query << m_emblemStyle << ", "; query << m_emblemColor << ", "; query << m_borderStyle << ", "; query << m_borderColor << ", "; query << m_backgroundColor << ", "; query << "'" << CharacterDatabase.EscapeString(m_guildInfo) << "', "; query << "'" << CharacterDatabase.EscapeString(m_motd) << "', NOW())"; CharacterDatabase.Execute( query.str().c_str() ); } void Guild::UpdateGuildToDb() { std::stringstream query; query << "UPDATE guilds SET leaderGuid = " << m_leaderGuid << ", "; query << "emblemStyle = " << m_emblemStyle << ", "; query << "emblemColor = " << m_emblemColor << ", "; query << "borderStyle = " << m_borderStyle << ", "; query << "borderColor = " << m_borderColor << ", "; query << "backgroundColor = " << m_backgroundColor << ", "; query << "guildInfo = '" << CharacterDatabase.EscapeString(m_guildInfo) << "', "; query << "motd = '" << CharacterDatabase.EscapeString(m_motd) << "' "; query << "WHERE guildId = " << m_guildId; CharacterDatabase.Execute( query.str( ).c_str( ) ); } void Guild::SaveRanksToDb() { std::stringstream query; query << "DELETE FROM guild_ranks WHERE guildId = " << m_guildId; CharacterDatabase.Execute( query.str( ).c_str( ) ); std::list::iterator itr; for (itr = m_rankList.begin(); itr != m_rankList.end();itr++) { query.rdbuf()->str(""); query << "INSERT INTO guild_ranks VALUES ("; query << m_guildId << ", "; query << (*itr)->rankid << ", "; query << "'" << CharacterDatabase.EscapeString((*itr)->name) << "', "; query << (*itr)->rights; query << ")"; CharacterDatabase.Execute( query.str().c_str() ); } } /* void Guild::SaveGuildMemberToDb(uint64 guid) { std::stringstream query; std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) { if((*i)->guid == guid) { query << "DELETE FROM playerguilds WHERE playerId = " << (*i)->guid; sDatabase.Execute( query.str( ).c_str( ) ); query.rdbuf()->str(""); query << "INSERT INTO playerguilds VALUES (" << (*i)->guid << ", " << m_guildId << ", '" << (*i)->memberName << "', " << (*i)->Rank << ", '" << (*i)->publicNote << "', '" << (*i)->officerNote << "', " << (*i)->lastOnline << ")"; sDatabase.Execute( query.str( ).c_str( ) ); break; } } } */ void Guild::UpdateGuildMembersDB(PlayerInfo *Member) { CharacterDatabase.Execute( "UPDATE characters SET publicNote='%s',officerNote='%s',guildid=%u,guildRank=%u WHERE guid=%u", CharacterDatabase.EscapeString(Member->publicNote).c_str(),CharacterDatabase.EscapeString(Member->officerNote).c_str(),m_guildId,Member->Rank, (uint32)Member->guid ); } void Guild::SaveAllGuildMembersToDb() { std::list::iterator i; for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) CharacterDatabase.Execute( "UPDATE characters SET publicNote='%s',officerNote='%s',guildid=%u,guildRank=%u WHERE guid=%u", CharacterDatabase.EscapeString((*i)->publicNote).c_str(),CharacterDatabase.EscapeString((*i)->officerNote).c_str(),m_guildId,(*i)->Rank,(uint32)( (*i)->guid) ); } void Guild::RemoveFromDb() { CharacterDatabase.Execute("DELETE FROM guilds WHERE guildId =%u",m_guildId ); CharacterDatabase.Execute("DELETE FROM guild_ranks WHERE guildId = %u", m_guildId ); CharacterDatabase.Execute("UPDATE characters SET guildid=0,guildRank=0,publicNote='',officerNote='' WHERE guildid=%u",m_guildId); } uint32 Guild::GetFreeGuildIdFromDb() { QueryResult *result = CharacterDatabase.Query( "SELECT MAX(guildId) FROM guilds"); if(result) { uint32 guildId = result->Fetch()->GetUInt32(); delete result; return guildId+1; } return 0; } void Guild::LoadGuildCreationDate() { Field *fields; QueryResult *result1 = CharacterDatabase.Query( "SELECT DATE_FORMAT(createdate,\"%%d\") FROM guilds WHERE guildId =%u", m_guildId ); if(!result1) return; fields = result1->Fetch(); m_createdDay = fields[0].GetUInt32(); delete result1; QueryResult *result2 = CharacterDatabase.Query( "SELECT DATE_FORMAT(createdate,\"%%m\") FROM guilds WHERE guildId =%u", m_guildId ); if(!result2) return; fields = result2->Fetch(); m_createdMonth = fields[0].GetUInt32(); delete result2; QueryResult *result3 = CharacterDatabase.Query( "SELECT DATE_FORMAT(createdate,\"%%Y\") FROM guilds WHERE guildId =%u", m_guildId ); if(!result3) return; fields = result3->Fetch(); m_createdYear = fields[0].GetUInt32(); delete result3; } void Guild::RenameGuild(std::string guildName) { SetGuildName(guildName); CharacterDatabase.Execute("UPDATE guilds SET guildName = '%s' WHERE guildId = %u", CharacterDatabase.EscapeString(guildName), GetGuildId()); uint32 ttime = time(NULL); std::list::iterator itr = m_guildMembers.begin(); for (; itr != m_guildMembers.end(); itr++) { Player * pMember = objmgr.GetPlayer((*itr)->guid); if(!pMember) continue; pMember->SetUInt32Value(PLAYER_GUILD_TIMESTAMP, ttime); } }