All pastes #778764 Raw Edit

Something

public cpp v1 · immutable
·published 2007-11-17 21:54 UTC
rendered paste body
/* * Ascent MMORPG Server * Copyright (C) 2005-2007 Ascent Team <http://www.ascentemu.com/> * * 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 <http://www.gnu.org/licenses/>. * */#include "StdAfx.h"Guild::~Guild(){	std::list<RankInfo*>::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<PlayerInfo*>::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<PlayerInfo*>::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 = UNIXTIME;			return;		}	}}void Guild::AddNewGuildMember(Player *plyr){	PlayerInfo *gMember=objmgr.GetPlayerInfo(plyr->GetGUIDLow());	gMember->Rank = plyr->GetGuildRank();	gMember->lastLevel =plyr->getLevel();	gMember->lastZone =plyr->GetZoneId();	gMember->publicNote = NULL;	gMember->officerNote = NULL;	gMember->lastOnline = UNIXTIME;	AddGuildMember(gMember);	sHookInterface.OnGuildJoin(plyr, this);}Guild* Guild::Create(){	return new Guild;}bool Guild::DeleteGuildMember(uint64 guid){	std::list<PlayerInfo*>::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<PlayerInfo*>::iterator i;	for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) 	{		if (!strcmp((*i)->name, 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<PlayerInfo*>::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<PlayerInfo*>::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<PlayerInfo*>::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<PlayerInfo*>::iterator i;	std::list<RankInfo*>::iterator ritr;	data->Initialize(SMSG_GUILD_ROSTER);	*data << uint32(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;		*data << (*ritr)->rights_1;		*data << (*ritr)->rights_2;		*data << (*ritr)->rights_3;		*data << (*ritr)->rights_4;		*data << (*ritr)->rights_5;		*data << (*ritr)->rights_6;		*data << (*ritr)->rights_7;		*data << (*ritr)->rights_8;		*data << (*ritr)->rights_9;		*data << (*ritr)->rights_10;		*data << (*ritr)->rights_11;		*data << (*ritr)->rights_12;		*data << (*ritr)->rights_13;	}	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();			if((*i)->publicNote)                *data << (*i)->publicNote;			else				*data << uint8(0);			if((*i)->officerNote)                *data << (*i)->officerNote;			else				*data << uint8(0);		}		else		{			*data << (*i)->guid;			*data << uint32(0);		// highguid			*data << (uint8)0; 			*data << (*i)->name;			*data << (*i)->Rank;			*data << (uint8)((*i)->lastLevel);			*data << (uint8)((*i)->cl);			*data << (*i)->lastZone;			*data << float((UNIXTIME-(*i)->lastOnline)/86400.0);			if((*i)->publicNote)                *data << (*i)->publicNote;			else				*data << uint8(0);			if((*i)->officerNote)				*data << (*i)->officerNote;			else				*data << uint8(0);		}	}}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<PlayerInfo*>::iterator i;	for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) 	{		if ((*i)->guid == guid)		{			if((*i)->publicNote)				free((*i)->publicNote);			(*i)->publicNote = strdup(publicNote.c_str());			break;		}	}}void Guild::SetOfficerNote(uint64 guid, std::string officerNote){	std::list<PlayerInfo*>::iterator i;	for (i = m_guildMembers.begin(); i != m_guildMembers.end();++i) 	{		if ((*i)->guid == guid)		{			if((*i)->officerNote)				free((*i)->officerNote);			(*i)->officerNote = strdup(officerNote.c_str());			break;		}	}}/*void Guild::UpdateTabard(){std::list<PlayerInfo*>::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<string, unsigned long>::iterator i;for(i = Members.begin();i != Members.end();i++){CPlayer *pPlayer = NULL;if(!DataManager.RetrieveObject((CWoWObject**)&pPlayer, OBJ_PLAYER, i->second)){#ifdef _DEBUGDebug.Log("CGuild::UpdateTabard() - Unable to retrieve an object found in the member list.");#endifcontinue;}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);}}}}}*/RankInfo * Guild::CreateRank(RankInfo * s0rs){	if(m_rankList.size() >= MAX_GUILD_RANKS)		return NULL;	RankInfo *newrank;	newrank = new RankInfo;	newrank->rankid=(uint32)m_rankList.size();	memcpy(newrank,s0rs,sizeof(RankInfo));	m_rankList.push_back(newrank);	return newrank;}RankInfo * Guild::CreateRank(string name, uint32 perms){	if(m_rankList.size() >= MAX_GUILD_RANKS)		return NULL;	RankInfo *newrank;	newrank = new RankInfo;	newrank->rankid=(uint32)m_rankList.size();	newrank->name=name;	newrank->rights=perms;	newrank->rights_1=0;	newrank->rights_2=0;	newrank->rights_3=0;	newrank->rights_4=0;	newrank->rights_5=0;	newrank->rights_6=0;	newrank->rights_7=0;	newrank->rights_8=0;	newrank->rights_9=0;	newrank->rights_10=0;	newrank->rights_11=0;	newrank->rights_12=0;	newrank->rights_13=0;	m_rankList.push_back(newrank);	return newrank;}RankInfo * Guild::GetRank(uint32 rankId){	std::list<RankInfo*>::iterator itr;	if(rankId > m_rankList.size()-1) return NULL;	for (itr = m_rankList.begin(); itr != m_rankList.end();itr++)	{		if ((*itr)->rankid == rankId)			return (*itr);	}	return NULL;}std::string Guild::GetRankName(uint32 rankId){	std::list<RankInfo*>::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<RankInfo*>::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<RankInfo*>::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<RankInfo*>::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<RankInfo*>::iterator itr;	for (itr = m_rankList.begin(); itr != m_rankList.end();itr++)		*data << (*itr)->name;	for (uint32 r = (uint32)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<RankInfo*>::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 << (*itr)->rights_1 << ",";		query << (*itr)->rights_2 << ",";		query << (*itr)->rights_3 << ",";		query << (*itr)->rights_4 << ",";		query << (*itr)->rights_5 << ",";		query << (*itr)->rights_6 << ",";		query << (*itr)->rights_7 << ",";		query << (*itr)->rights_8 << ",";		query << (*itr)->rights_9 << ",";		query << (*itr)->rights_10 << ",";		query << (*itr)->rights_11 << ",";		query << (*itr)->rights_12 << ",";		query << (*itr)->rights_13;		query << ")";		CharacterDatabase.Execute( query.str().c_str() );	}}/*void Guild::SaveGuildMemberToDb(uint64 guid){std::stringstream query;std::list<PlayerInfo*>::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",		Member->publicNote ? CharacterDatabase.EscapeString(Member->publicNote).c_str() : "",		Member->officerNote ? CharacterDatabase.EscapeString(Member->officerNote).c_str() : "",		m_guildId,Member->Rank, (uint32)Member->guid );}void Guild::SaveAllGuildMembersToDb(){	std::list<PlayerInfo*>::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",		(*i)->publicNote ? CharacterDatabase.EscapeString((*i)->publicNote).c_str() : "",		(*i)->officerNote ? 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).c_str(), GetGuildId());	uint32 ttime = (uint32)UNIXTIME;	std::list<PlayerInfo*>::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);	}}