/*
* 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"
void WorldSession::HandleGuildQuery(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 4);
WorldPacket data;
Guild *pGuild;
uint32 guildId;
recv_data >> guildId;
pGuild = objmgr.GetGuild( guildId );
if(!pGuild)
return;
pGuild->FillQueryData(&data);
SendPacket(&data);
}
void WorldSession::HandleCreateGuild(WorldPacket & recv_data)
{
sLog.outDebug("GUILD CREATE");
/* std::string guildName;
uint64 count;
int i;
Player * plyr = GetPlayer();
if(!plyr)
return;
recv_data >> guildName;
Guild *pGuild = new Guild;
count = objmgr.GetTotalGuildCount();
pGuild->SetGuildId( (uint32)(count+1) );
pGuild->SetGuildName( guildName );
pGuild->SetGuildRankName("Guild Master", 0);
pGuild->SetGuildRankName("Officer", 1);
pGuild->SetGuildRankName("Veteran", 2);
pGuild->SetGuildRankName("Member", 3);
pGuild->SetGuildRankName("Initiate", 4);
for(i = 5;i < 10;i++)
pGuild->SetGuildRankName("Unused", i);
pGuild->SetGuildEmblemStyle( 0xFFFF );
pGuild->SetGuildEmblemColor( 0xFFFF );
pGuild->SetGuildBorderStyle( 0xFFFF );
pGuild->SetGuildBorderColor( 0xFFFF );
pGuild->SetGuildBackgroundColor( 0xFFFF );
objmgr.AddGuild(pGuild);
plyr->SetGuildId( pGuild->GetGuildId() );
//plyr->SetUInt32Value(PLAYER_GUILDID, pGuild->GetGuildId() );
plyr->SetGuildRank(GUILDRANK_GUILD_MASTER);
//plyr->SetUInt32Value(PLAYER_GUILDRANK,GUILDRANK_GUILD_MASTER);
pGuild->SetGuildLeaderGuid( plyr->GetGUID() );
pGuild->AddNewGuildMember( plyr );
pGuild->SaveToDb();*/
}
void WorldSession::SendGuildCommandResult(uint32 typecmd,const char * str,uint32 cmdresult)
{
WorldPacket data;
data.SetOpcode(SMSG_GUILD_COMMAND_RESULT);
data << typecmd;
data << str;
data << cmdresult;
SendPacket(&data);
}
void WorldSession::HandleInviteToGuild(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data;
std::string inviteeName;
recv_data >> inviteeName;
Player *plyr = objmgr.GetPlayer( inviteeName.c_str() , false);
Player *inviter = GetPlayer();
Guild *pGuild = objmgr.GetGuild( inviter->GetGuildId() );
if(!plyr)
{
SendGuildCommandResult(GUILD_INVITE_S,inviteeName.c_str(),GUILD_PLAYER_NOT_FOUND);
return;
}
else if(!pGuild)
{
SendGuildCommandResult(GUILD_CREATE_S,"",GUILD_PLAYER_NOT_IN_GUILD);
return;
}
if( plyr->GetGuildId() )
{
SendGuildCommandResult(GUILD_INVITE_S,plyr->GetName(),ALREADY_IN_GUILD);
return;
}
else if( plyr->GetGuildInvitersGuid())
{
SendGuildCommandResult(GUILD_INVITE_S,plyr->GetName(),ALREADY_INVITED_TO_GUILD);
return;
}
else if(!pGuild->HasRankRight(inviter->GetGuildRank(),GR_RIGHT_INVITE))
{
SendGuildCommandResult(GUILD_INVITE_S,"",GUILD_PERMISSIONS);
return;
}
else if(plyr->GetTeam()!=_player->GetTeam() && _player->GetSession()->GetPermissionCount() == 0)
{
SendGuildCommandResult(GUILD_INVITE_S,"",GUILD_NOT_ALLIED);
return;
}
SendGuildCommandResult(GUILD_INVITE_S,inviteeName.c_str(),GUILD_U_HAVE_INVITED);
//41
data.Initialize(SMSG_GUILD_INVITE);
data << inviter->GetName();
data << pGuild->GetGuildName();
plyr->GetSession()->SendPacket(&data);
plyr->SetGuildInvitersGuid( inviter->GetGUID() );
}
void WorldSession::HandleGuildAccept(WorldPacket & recv_data)
{
Player *plyr = GetPlayer();
if(!plyr)
return;
Player *inviter = objmgr.GetPlayer( plyr->GetGuildInvitersGuid() );
plyr->UnSetGuildInvitersGuid();
if(!inviter)
{
return;
}
Guild *pGuild = objmgr.GetGuild( inviter->GetGuildId() );
if(!pGuild)
{
return;
}
plyr->SetGuildId( pGuild->GetGuildId() );
plyr->SetGuildRank(GUILDRANK_INITIATE);
pGuild->AddNewGuildMember( plyr );
//plyr->SaveGuild();
WorldPacket data;
data.Initialize(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_JOINED);
data << uint8(1);
data << plyr->GetName();
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildDecline(WorldPacket & recv_data)
{
WorldPacket data;
Player *plyr = GetPlayer();
if(!plyr)
return;
Player *inviter = objmgr.GetPlayer( (uint64)(plyr->GetGuildInvitersGuid()) );
plyr->UnSetGuildInvitersGuid();
if(!inviter)
return;
data.Initialize(SMSG_GUILD_DECLINE);
data << plyr->GetName();
inviter->GetSession()->SendPacket(&data);
}
void WorldSession::HandleSetGuildInformation(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data;
std::string NewGuildInfo;
recv_data >> NewGuildInfo;
Guild *pGuild = objmgr.GetGuild( GetPlayer()->GetGuildId() );
if(!pGuild)
return;
uint32 plyrRank = GetPlayer()->GetGuildRank();
if(!pGuild->HasRankRight(plyrRank,GR_RIGHT_EGUILDINFO))
{
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
pGuild->SetGuildInfo(NewGuildInfo);
pGuild->FillGuildRosterData(&data);
GetPlayer()->GetSession()->SendPacket(&data);
pGuild->UpdateGuildToDb();
}
void WorldSession::HandleGuildInfo(WorldPacket & recv_data)
{
WorldPacket data;
Guild *pGuild = objmgr.GetGuild( GetPlayer()->GetGuildId() );
if(!pGuild)
return;
data.Initialize(SMSG_GUILD_INFO);//not sure
data << pGuild->GetGuildName();
data << pGuild->GetCreatedYear();
data << pGuild->GetCreatedMonth();
data << pGuild->GetCreatedDay();
data << pGuild->GetGuildMembersCount();
data << pGuild->GetGuildMembersCount();//accountcount
SendPacket(&data);
}
void WorldSession::HandleGuildRoster(WorldPacket & recv_data)
{
WorldPacket data;
Guild *pGuild = objmgr.GetGuild( GetPlayer()->GetGuildId() );
if(!pGuild)
return;
pGuild->FillGuildRosterData(&data);
GetPlayer()->GetSession()->SendPacket(&data);
}
void WorldSession::HandleGuildPromote(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
std::string name;
int32 plyrRank;
int32 pTargetRank;
recv_data >> name;
Player *plyr = GetPlayer();
if(!plyr)
return;
Guild *pGuild = objmgr.GetGuild( plyr->GetGuildId() );
if(!pGuild)
return;
PlayerInfo *pGuildMember = pGuild->GetGuildMember(name);
if(!pGuildMember)
{
SendGuildCommandResult(GUILD_FOUNDER_S,name.c_str(),GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
plyrRank = plyr->GetGuildRank();
pTargetRank = pGuildMember->Rank;
if(!pGuild->HasRankRight(plyrRank,GR_RIGHT_PROMOTE))
{
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
if( plyr->GetGUID() == pGuildMember->guid )
{
sChatHandler.SystemMessage(this, "You cant promote yourself!");
return;
}
if( plyrRank >= pTargetRank )
{
sChatHandler.SystemMessage(this, "You must be a higher ranking guild member than the person you are going to promote!");
return;
}
if( (pTargetRank - plyrRank) == 1 )
{
sChatHandler.SystemMessage(this, "You can only promote up to one rank below yours!");
return;
}
pTargetRank--;
if(pTargetRank < GUILDRANK_GUILD_MASTER)
pTargetRank = GUILDRANK_GUILD_MASTER;
pGuildMember->Rank = pTargetRank;
Player *pTarget = objmgr.GetPlayer( name.c_str() );
if(pTarget)
{
//They Online
if(pTarget->GetInstanceID() != _player->GetInstanceID())
{
sEventMgr.AddEvent(pTarget, &Player::SetGuildRank, (uint32)pTargetRank, 1, 1, 1,EVENT_FLAG_DO_NOT_EXECUTE_IN_WORLD_CONTEXT);
}
else
{
pTarget->SetGuildRank(pTargetRank);
}
// pTarget->SetUInt32Value(PLAYER_GUILDRANK, pTargetRank);
}
//Save new Info to DB
pGuild->UpdateGuildMembersDB(pGuildMember);
//check if its unused rank or not
WorldPacket data(SMSG_GUILD_EVENT, 100);
data << uint8(GUILD_EVENT_PROMOTION);
data << uint8(3);
data << plyr->GetName();
data << name.c_str();
data << pGuild->GetRankName( pTargetRank );
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildDemote(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
std::string name;
uint32 plyrRank;
uint32 pTargetRank;
recv_data >> name;
Player *plyr = GetPlayer();
if(!plyr)
return;
Guild *pGuild = objmgr.GetGuild( plyr->GetGuildId() );
if(!pGuild)
return;
PlayerInfo *pGuildMember = pGuild->GetGuildMember(name);
if(!pGuildMember)
{
SendGuildCommandResult(GUILD_FOUNDER_S,name.c_str(),GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
plyrRank = plyr->GetGuildRank();
pTargetRank = pGuildMember->Rank;
if(!pGuild->HasRankRight(plyrRank,GR_RIGHT_DEMOTE))
{
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
if( plyr->GetGUID() == pGuildMember->guid )
{
sChatHandler.SystemMessage(this, "You cant demote yourself!");
return;
}
if( plyrRank >= pTargetRank )
{
sChatHandler.SystemMessage(this, "You must be a higher ranking guild member than the person you are going to demote!");
return;
}
if(pTargetRank == pGuild->GetNrRanks()-1)
{
sChatHandler.SystemMessage(this, "You cannot demote that member any further!");
return;
}
pTargetRank++;
if(pTargetRank > pGuild->GetNrRanks()-1)
pTargetRank = pGuild->GetNrRanks()-1;
pGuildMember->Rank = pTargetRank;
Player *pTarget = objmgr.GetPlayer( name.c_str() );
if(pTarget)
{
//They Online
pTarget->SetGuildRank(pTargetRank);
//pTarget->SetUInt32Value(PLAYER_GUILDRANK, pTargetRank);
}
//Save new Info to DB
pGuild->UpdateGuildMembersDB(pGuildMember);
WorldPacket data(SMSG_GUILD_EVENT, 100);
data << uint8(GUILD_EVENT_DEMOTION);
data << uint8(3);
data << plyr->GetName();
data << name.c_str();
data << pGuild->GetRankName( pTargetRank );
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildLeave(WorldPacket & recv_data)
{
Player *plyr = GetPlayer();
if(!plyr)
return;
Guild *pGuild = objmgr.GetGuild( plyr->GetGuildId() );
if(!pGuild)
return;
if( pGuild->GetGuildLeaderGuid() == plyr->GetGUID() )
return;
plyr->SetGuildId(0);
plyr->SetGuildRank(0);
pGuild->DeleteGuildMember(plyr->GetGUID());
WorldPacket data(100);
data.Initialize(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_LEFT);
data << uint8(1);
data << plyr->GetName();
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildRemove(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data(100);
std::string name;
bool result = false;
recv_data >> name;
Player *plyr = objmgr.GetPlayer( name.c_str() );
Player *pRemover = GetPlayer();
if(!pRemover)
return;
Guild *pGuild = objmgr.GetGuild( pRemover->GetGuildId() );
if(!pGuild)
return;
uint32 RemoverRank = pRemover->GetGuildRank();
if(!pGuild->HasRankRight(RemoverRank,GR_RIGHT_REMOVE))
{
//Players not allowed to remove a guild member
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
if(plyr)
{
plyr->SetGuildId(0);
plyr->SetGuildRank(0);
result = pGuild->DeleteGuildMember(plyr->GetGUID());
}
else
{
result = pGuild->DeleteGuildMember(name);
}
if(result)
{
data.Initialize(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_REMOVED);
data << uint8(2);
data << name.c_str();
data << pRemover->GetName();
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
}
void WorldSession::HandleGuildDisband(WorldPacket & recv_data)
{
Player *pLeader = GetPlayer();
if(!pLeader)
return;
Guild *pGuild = objmgr.GetGuild( pLeader->GetGuildId() );
if(!pGuild)
return;
if(pLeader->GetGUID() != pGuild->GetGuildLeaderGuid())
return;
pGuild->DeleteGuildMembers();
pGuild->RemoveFromDb();
}
void WorldSession::HandleGuildLeader(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
std::string name;
recv_data >> name;
Player *pLeader = GetPlayer();
if(!pLeader)
return;
Guild *pGuild = objmgr.GetGuild( pLeader->GetGuildId() );
if(!pGuild)
return;
PlayerInfo *pGuildMember = pGuild->GetGuildMember(name);
if(!pGuildMember)
return;
if(pLeader->GetGUID() == pGuildMember->guid)
return;
if(pLeader->GetGUID() != pGuild->GetGuildLeaderGuid())
return;
PlayerInfo *pGuildLeader = pGuild->GetGuildMember(pLeader->GetGUID());
if(!pGuildLeader)
return;
pGuildLeader->Rank = GUILDRANK_OFFICER;
pLeader->SetGuildRank(GUILDRANK_OFFICER);
pGuildMember->Rank = GUILDRANK_GUILD_MASTER;
Player *pNewLeader = objmgr.GetPlayer( name.c_str() );
if(pNewLeader)
{
// pNewLeader->SetUInt32Value(PLAYER_GUILDRANK,GUILDRANK_GUILD_MASTER);
pNewLeader->SetGuildRank(GUILDRANK_GUILD_MASTER);
// pNewLeader->SaveGuild();
}
else
{
pGuild->UpdateGuildMembersDB(pGuildMember);
}
pGuild->SetGuildLeaderGuid( pGuildMember->guid );
pGuild->UpdateGuildToDb();
WorldPacket data;
data.Initialize(SMSG_GUILD_EVENT);
data << (uint8)GUILD_EVENT_LEADER_CHANGED;
data << (uint8)2;
data << pLeader->GetName();
data << pGuildMember->name.c_str();
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
/*
//demote old guildleader
data.Initialize(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_DEMOTION);
data << uint8(3);
data << pLeader->GetName();
data << pLeader->GetName();
data << pGuild->GetRankName( GUILDRANK_OFFICER );
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
//promote new guildmaster
data.Initialize(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_PROMOTION);
data << uint8(3);
data << pLeader->GetName();
data << pNewLeader->GetName();
data << pGuild->GetRankName( GUILDRANK_GUILD_MASTER );
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
*/
//data.clear();
//pGuild->FillGuildRosterData(&data);
//pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildMotd(WorldPacket & recv_data)
{
WorldPacket data;
std::string motd;
if(recv_data.size())
recv_data >> motd;
Guild *pGuild = objmgr.GetGuild( GetPlayer()->GetGuildId() );
if(!pGuild)
return;
pGuild->SetGuildMotd(motd);
data.SetOpcode(SMSG_GUILD_EVENT);
data << uint8(GUILD_EVENT_MOTD);
data << uint8(0x01);
data << pGuild->GetGuildMotd();
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
pGuild->UpdateGuildToDb();
}
void WorldSession::HandleGuildRank(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 9);
WorldPacket data;
Guild *pGuild;
std::string rankname;
uint32 rankId;
uint32 rights;
pGuild = objmgr.GetGuild(GetPlayer()->GetGuildId());
if(!pGuild)
{
SendGuildCommandResult(GUILD_CREATE_S,"",GUILD_PLAYER_NOT_IN_GUILD);
return;
}
if(GetPlayer()->GetGUID() != pGuild->GetGuildLeaderGuid())
{
SendGuildCommandResult(GUILD_INVITE_S,"",GUILD_PERMISSIONS);
return;
}
recv_data >> rankId;
recv_data >> rights;
recv_data >> rankname;
sLog.outDebug( "WORLD: Changed RankName to %s , Rights to 0x%.4X",rankname.c_str() ,rights );
pGuild->SetRankName(rankId,rankname);
pGuild->SetRankRights(rankId,rights);
pGuild->FillQueryData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
data.clear();
pGuild->FillGuildRosterData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
pGuild->SaveRanksToDb();
}
void WorldSession::HandleGuildAddRank(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 1);
WorldPacket data;
Guild *pGuild;
std::string rankname;
pGuild = objmgr.GetGuild(GetPlayer()->GetGuildId());
if(!pGuild)
{
//not in Guild
SendGuildCommandResult(GUILD_CREATE_S,"",GUILD_PLAYER_NOT_IN_GUILD);
return;
}
if(GetPlayer()->GetGUID() != pGuild->GetGuildLeaderGuid())
{
//not GuildMaster
SendGuildCommandResult(GUILD_INVITE_S,"",GUILD_PERMISSIONS);
return;
}
recv_data >> rankname;
pGuild->CreateRank(rankname,GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
pGuild->FillQueryData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
data.clear();
//Maybe theres an event for this
pGuild->FillGuildRosterData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
pGuild->SaveRanksToDb();
}
void WorldSession::HandleGuildDelRank(WorldPacket & recv_data)
{
WorldPacket data;
Guild *pGuild;
pGuild = objmgr.GetGuild(GetPlayer()->GetGuildId());
if(!pGuild)
{
SendGuildCommandResult(GUILD_CREATE_S,"",GUILD_PLAYER_NOT_IN_GUILD);
return;
}
if(GetPlayer()->GetGUID() != pGuild->GetGuildLeaderGuid())
{
SendGuildCommandResult(GUILD_INVITE_S,"",GUILD_PERMISSIONS);
return;
}
pGuild->DelRank();
pGuild->FillQueryData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
data.clear();
//Maybe theres an event for this
pGuild->FillGuildRosterData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
pGuild->SaveRanksToDb();
}
void WorldSession::HandleGuildSetPublicNote(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 2);
WorldPacket data;
std::string TargetsName;
std::string publicNote;
recv_data >> TargetsName;
recv_data >> publicNote;
Player *pPlayer = GetPlayer();
if(!pPlayer)
return;
Guild *pGuild = objmgr.GetGuild( pPlayer->GetGuildId() );
if(!pGuild)
return;
PlayerInfo *pGuildMember = pGuild->GetGuildMember(TargetsName);
if(!pGuildMember)
{
SendGuildCommandResult(GUILD_FOUNDER_S,TargetsName.c_str(),GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
uint32 plyrRank = pPlayer->GetGuildRank();
if(!pGuild->HasRankRight(plyrRank,GR_RIGHT_EPNOTE))
{
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
pGuild->SetPublicNote(pGuildMember->guid, publicNote);
//Save new Info to DB
pGuild->UpdateGuildMembersDB(pGuildMember);
//Send Update (this seems to be how blizz does it couldn't find an event for it)
pGuild->FillGuildRosterData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleGuildSetOfficerNote(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 2);
WorldPacket data;
std::string TargetsName;
std::string officerNote;
recv_data >> TargetsName;
recv_data >> officerNote;
Player *pPlayer = GetPlayer();
if(!pPlayer)
return;
Guild *pGuild = objmgr.GetGuild( pPlayer->GetGuildId() );
if(!pGuild)
return;
PlayerInfo *pGuildMember = pGuild->GetGuildMember(TargetsName);
if(!pGuildMember)
{
SendGuildCommandResult(GUILD_FOUNDER_S, TargetsName.c_str(),GUILD_PLAYER_NOT_IN_GUILD_S);
return;
}
uint32 plyrRank = pPlayer->GetGuildRank();
if(!pGuild->HasRankRight(plyrRank,GR_RIGHT_EOFFNOTE))
{
SendGuildCommandResult(3,"",GUILD_PERMISSIONS);
return;
}
pGuild->SetOfficerNote(pGuildMember->guid, officerNote);
//Save new Info to DB
pGuild->UpdateGuildMembersDB(pGuildMember);
//Send Update (this seems to be how blizz does it couldn't find an event for it)
pGuild->FillGuildRosterData(&data);
pGuild->SendMessageToGuild(0, &data, G_MSGTYPE_ALL);
}
void WorldSession::HandleSaveGuildEmblem(WorldPacket & recv_data)
{
CHECK_PACKET_SIZE(recv_data, 20);
WorldPacket data;
Guild *pGuild = objmgr.GetGuild( GetPlayer()->GetGuildId() );
if(!pGuild)
{
data.Initialize(MSG_SAVE_GUILD_EMBLEM);
data << uint32(ERR_GUILDEMBLEM_NOGUILD);
SendPacket(&data);
return;
}
Player *plyr = GetPlayer();
if(!plyr)
return;
if(plyr->GetGuildRank() != GUILDRANK_GUILD_MASTER)
{
data.Initialize(MSG_SAVE_GUILD_EMBLEM);
data << uint32(ERR_GUILDEMBLEM_NOTGUILDMASTER);
SendPacket(&data);
return;
}
uint32 Money = plyr->GetUInt32Value(PLAYER_FIELD_COINAGE);
uint32 Cost = 100000; //10 Gold
if(Money < Cost)
{
data.Initialize(MSG_SAVE_GUILD_EMBLEM);
data << uint32(ERR_GUILDEMBLEM_NOTENOUGHMONEY);
SendPacket(&data);
return;
}
plyr->SetUInt32Value(PLAYER_FIELD_COINAGE,(Money-Cost));
uint64 DesignerGuid;
recv_data >> DesignerGuid;
uint32 emblemPart;
recv_data >> emblemPart;
pGuild->SetGuildEmblemStyle( emblemPart );
recv_data >> emblemPart;
pGuild->SetGuildEmblemColor( emblemPart );
recv_data >> emblemPart;
pGuild->SetGuildBorderStyle( emblemPart );
recv_data >> emblemPart;
pGuild->SetGuildBorderColor( emblemPart );
recv_data >> emblemPart;
pGuild->SetGuildBackgroundColor( emblemPart );
data.Initialize(MSG_SAVE_GUILD_EMBLEM);
data << uint32(ERR_GUILDEMBLEM_SUCCESS);
SendPacket(&data);
data.clear();
pGuild->FillQueryData(&data);
pGuild->SendMessageToGuild(plyr->GetGUID(), &data, G_MSGTYPE_ALL);
//data.Initialize(SMSG_GUILD_EVENT);
//data << uint8(GUILD_EVENT_TABARDCHANGE);
//data << uint8(0x00);
//data << pGuild->GetGuildMotd();
//pGuild->SendMessageToGuild(NULL, &data, G_MSGTYPE_ALL);
pGuild->UpdateGuildToDb();
}
// Charter part
void WorldSession::HandleCharterBuy(WorldPacket & recv_data)
{
/*
{CLIENT} Packet: (0x01BD) CMSG_PETITION_BUY PacketSize = 85
|------------------------------------------------|----------------|
|00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF|
|------------------------------------------------|----------------|
|50 91 00 00 6E 13 01 F0 00 00 00 00 00 00 00 00 |P...n...........|
|00 00 00 00 53 74 6F 72 6D 62 72 69 6E 67 65 72 |....Stormbringer|
|73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |s...............|
|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 |................|
|00 00 00 00 00 |..... |
-------------------------------------------------------------------
*/
uint64 creature_guid;
uint64 crap;
uint32 crap2;
string name;
uint8 error;
recv_data >> creature_guid >> crap >> crap2 >> name;
Creature * crt = _player->GetMapMgr()->GetCreature(creature_guid);
if(!crt)
{
Disconnect();
return;
}
Guild * g = objmgr.GetGuildByGuildName(name);
Charter * c = objmgr.GetCharterByName(name);
if(g != 0 || c != 0)
{
SendNotification("A guild with that name already exists.");
return;
}
ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER);
assert(ip);
SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip);
if(res.Result == 0)
{
_player->GetItemInterface()->BuildInventoryChangeError(0, 0, INV_ERR_INVENTORY_FULL);
return;
}
error = _player->GetItemInterface()->CanReceiveItem(ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER),1);
if(error)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error);
}
else
{
// Meh...
WorldPacket data(SMSG_PLAY_OBJECT_SOUND, 12);
data << uint32(0x000019C2);
data << creature_guid;
SendPacket(&data);
// Create the item and charter
Item * i = objmgr.CreateItem(ITEM_ENTRY_GUILD_CHARTER, _player);
c = objmgr.CreateCharter(_player->GetGUID());
c->GuildName = name;
c->ItemGuid = i->GetGUID();
i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1);
i->SetUInt32Value(ITEM_FIELD_FLAGS, 1);
i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, c->GetID());
i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883);
_player->GetItemInterface()->AddItemToFreeSlot(i);
c->SaveToDB();
data.clear();
data.resize(45);
BuildItemPushResult(&data, _player->GetGUID(), ITEM_PUSH_TYPE_RECEIVE, 1, ITEM_ENTRY_GUILD_CHARTER, 0);
SendPacket(&data);
_player->m_charter = c;
_player->SaveToDB(false);
}
}
void SendShowSignatures(Charter * c, uint64 i, Player * p)
{
WorldPacket data(SMSG_PETITION_SHOW_SIGNATURES, 100);
data << i;
data << (uint64)c->GetLeader();
data << c->GetID();
data << uint8(c->SignatureCount);
for(uint32 i = 0; i < 9; ++i)
{
if(c->Signatures[i] == 0) continue;
data << uint64(c->Signatures[i]) << uint32(1);
}
p->GetSession()->SendPacket(&data);
}
void WorldSession::HandleCharterShowSignatures(WorldPacket & recv_data)
{
if(_player->m_charter == 0)
return;
uint64 item_guid;
recv_data >> item_guid;
SendShowSignatures(_player->m_charter, item_guid, _player);
}
void WorldSession::HandleCharterQuery(WorldPacket & recv_data)
{
/*
{SERVER} Packet: (0x01C7) SMSG_PETITION_QUERY_RESPONSE PacketSize = 77
|------------------------------------------------|----------------|
|00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF|
|------------------------------------------------|----------------|
|20 08 00 00 28 32 01 00 00 00 00 00 53 74 6F 72 | ...(2......Stor|
|6D 62 72 69 6E 67 65 72 73 00 00 09 00 00 00 09 |mbringers.......|
|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
|00 00 00 00 00 00 00 00 00 00 00 00 00 |............. |
-------------------------------------------------------------------
uint32 charter_id
uint64 leader_guid
string guild_name
uint8 0 <-- maybe subname? or some shit.. who knows
uint32 9
uint32 9
uint32[9] signatures
uint8 0
uint8 0
*/
//this is wrong there are 42 bytes after 9 9, 4*9+2=38 not 42,
//moreover it can't signature, blizz uses always fullguid so it must be uin64
//moreover this does not show ppl who signed this, for this purpose there is another opcde
uint32 charter_id;
recv_data >> charter_id;
Charter * c = objmgr.GetCharter(charter_id);
if(c == 0)
return;
WorldPacket data(SMSG_PETITION_QUERY_RESPONSE, 100);
data << charter_id;
data << (uint64)c->LeaderGuid;
data << c->GuildName << uint8(0);
data << uint32(9) << uint32(9);
for(uint32 i = 0; i < 10; ++i)
data << (uint32) 0;//c->Signatures[i];
data << uint16(0);
SendPacket(&data);
}
void WorldSession::HandleCharterOffer( WorldPacket & recv_data )
{
uint32 shit;
uint64 item_guid, target_guid;
recv_data >> shit >> item_guid >> target_guid;
if(!_player->IsInWorld()) return;
Player * pTarget = _player->GetMapMgr()->GetPlayer(target_guid);
if(pTarget == 0 || pTarget->GetTeam() != _player->GetTeam() || pTarget == _player)
{
SendNotification("Target is of the wrong faction.");
return;
}
Charter * c = _player->m_charter;
if(c == 0)
return;
if(!pTarget->CanSignCharter(c, _player))
{
SendNotification("Target player cannot sign your charter for one or more reasons.");
return;
}
SendShowSignatures(c, item_guid, pTarget);
}
void WorldSession::HandleCharterSign( WorldPacket & recv_data )
{
uint64 item_guid;
recv_data >> item_guid;
Charter * c = objmgr.GetCharterByItemGuid(item_guid);
if(c == 0)
return;
for(uint32 i = 0; i < 9; ++i)
{
if(c->Signatures[i] == _player->GetGUID())
{
SendNotification("You have already signed that charter.");
return;
}
}
if(c->IsFull())
return;
c->AddSignature(_player->GetGUID());
c->SaveToDB();
_player->m_charter = c;
_player->SaveToDB(false);
Player * l = _player->GetMapMgr()->GetPlayer(c->GetLeader());
if(l == 0)
return;
WorldPacket data(SMSG_PETITION_SIGN_RESULTS, 100);
data << item_guid << _player->GetGUID() << uint32(0);
l->GetSession()->SendPacket(&data);
data.clear();
data << item_guid << (uint64)c->GetLeader() << uint32(0);
SendPacket(&data);
}
void WorldSession::HandleCharterTurnInCharter(WorldPacket & recv_data)
{
Charter * gc = _player->m_charter;
if(gc == 0)
return;
if(gc->SignatureCount < 9 && Config.MainConfig.GetBoolDefault("Server", "RequireAllSignatures", false))
{
SendNotification("You don't have the required amount of signatures to turn in this petition.");
return;
}
// dont know hacky or not but only solution for now
// If everything is fine create guild
Guild *pGuild = new Guild;
uint32 guildId = pGuild->GetFreeGuildIdFromDb();
if(guildId == 0)
{
printf("Error Getting Free Guild ID");
delete pGuild;
return;
}
//Guild Setup
pGuild->SetGuildId( guildId );
pGuild->SetGuildName( gc->GuildName );
pGuild->CreateRank("Guild Master", GR_RIGHT_ALL);
pGuild->CreateRank("Officer", GR_RIGHT_ALL);
pGuild->CreateRank("Veteran", GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
pGuild->CreateRank("Member", GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
pGuild->CreateRank("Initiate", GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK);
pGuild->SetGuildEmblemStyle( 0xFFFF );
pGuild->SetGuildEmblemColor( 0xFFFF );
pGuild->SetGuildBorderStyle( 0xFFFF );
pGuild->SetGuildBorderColor( 0xFFFF );
pGuild->SetGuildBackgroundColor( 0xFFFF );
objmgr.AddGuild(pGuild);
//Guild Leader Setup
_player->SetGuildId( pGuild->GetGuildId() );
_player->SetGuildRank(GUILDRANK_GUILD_MASTER);
pGuild->SetGuildLeaderGuid( _player->GetGUID() );
pGuild->AddNewGuildMember( _player );
//Other Guild Members Setup
Player *pMember;
for(uint32 x=0;x<9;x++)
{
pMember = objmgr.GetPlayer(gc->Signatures[x]);
if(pMember)//online
{
pMember->SetGuildId( pGuild->GetGuildId() );
pMember->SetGuildRank(GUILDRANK_MEMBER);
//Charters
pMember->m_charter = 0;
pMember->SaveToDB(false);
}
else
{
CharacterDatabase.Execute("UPDATE characters SET guildid = %u WHERE guid = %u", pGuild->GetGuildId(), gc->Signatures[x]);
CharacterDatabase.Execute("UPDATE characters SET guildRank = %u WHERE guid = %u", GUILDRANK_MEMBER, gc->Signatures[x]);
}
PlayerInfo *p=objmgr.GetPlayerInfo(gc->Signatures[x]);
if(!p)continue;//this should not ever happen though
p->Rank = GUILDRANK_MEMBER;
pGuild->AddGuildMember(p);
}
pGuild->SaveToDb();
pGuild->SaveAllGuildMembersToDb();
pGuild->SaveRanksToDb();
WorldPacket data(4);
data.SetOpcode(SMSG_TURN_IN_PETITION_RESULTS);
data << uint32(0);
SendPacket( &data );
// Destroy the charter
_player->m_charter = 0;
gc->Destroy();
_player->GetItemInterface()->RemoveItemAmt(ITEM_ENTRY_GUILD_CHARTER, 1);
sHookInterface.OnGuildCreate(_player, pGuild);
}
void WorldSession::HandleCharterRename(WorldPacket & recv_data)
{
if(_player->m_charter == 0)
return;
uint64 guid;
string name;
recv_data >> guid >> name;
Guild * g = objmgr.GetGuildByGuildName(name);
Charter * c = objmgr.GetCharterByName(name);
if(c || g)
{
SendNotification("That name is in use by another guild.");
return;
}
c = _player->m_charter;
c->GuildName = name;
c->SaveToDB();
WorldPacket data(MSG_PETITION_RENAME, 100);
data << guid << name;
SendPacket(&data);
}