📄 fortress.cpp.svn-base
字号:
#include "StdAfx.h"
static const uint32 CountToId[6] = {
0, // 0
0, // 1
0, // 2
FORTRESS__TYPE_2V2, // 3
FORTRESS__TYPE_3V3, // 4
FORTRESS__TYPE_5V5, // 5
};
static const uint32 IdToCount[6] = {
3,
4,
5,
0,
0,
0,
};
FORTRESS::FORTRESS(uint32 Type, uint32 Id)
{
m_id = Id;
m_type = Type;
AllocateSlots(Type);
m_leader = 0;
m_emblemStyle = 0;
m_emblemColour = 0;
m_borderColour = 0;
m_borderStyle = 0;
m_backgroundColour = 0;
m_stat_rating = 1500;
m_stat_gamesplayedweek = 0;
m_stat_gamesplayedseason = 0;
m_stat_gameswonseason = 0;
m_stat_gameswonweek = 0;
m_stat_ranking = 0;
}
FORTRESS::FORTRESS(Field * f)
{
uint32 z = 0, i, guid;
const char * data;
m_id = f[z++].GetUInt32();
m_type = f[z++].GetUInt32();
m_leader = f[z++].GetUInt32();
m_name = f[z++].GetString();
m_emblemStyle = f[z++].GetUInt32();
m_emblemColour = f[z++].GetUInt32();
m_borderStyle = f[z++].GetUInt32();
m_borderColour = f[z++].GetUInt32();
m_backgroundColour = f[z++].GetUInt32();
m_stat_rating = f[z++].GetUInt32();
AllocateSlots(m_type);
m_stat_gamesplayedweek = 0;
m_stat_gamesplayedseason = 0;
m_stat_gameswonseason = 0;
m_stat_gameswonweek = 0;
sscanf(f[z++].GetString(), "%u %u %u %u", &m_stat_gamesplayedweek, &m_stat_gameswonweek, &m_stat_gamesplayedseason, &m_stat_gameswonseason);
m_stat_ranking = f[z++].GetUInt32();
for(i = 0; i < m_slots; ++i)
{
data = f[z++].GetString();
if(sscanf(data, "%u %u %u %u %u", &guid, &m_members[i].Played_ThisWeek, &m_members[i].Won_ThisWeek,
&m_members[i].Played_ThisSeason, &m_members[i].Won_ThisSeason) == 5)
{
m_members[i].Info = objmgr.GetUSERInfo(guid);
if(m_members[i].Info)
++m_memberCount;
}
else
m_members[i].Info = NULL;
}
}
void FORTRESS::SendPacket(WorldPacket * data)
{
USERInfo * info;
for(uint32 i = 0; i < m_memberCount; ++i)
{
info = m_members[i].Info;
if(info && info->m_loggedInUSER)
info->m_loggedInUSER->GetSession()->SendPacket(data);
}
}
void FORTRESS::Destroy()
{
char buffer[1024];
WorldPacket * data;
vector<USERInfo*> tokill;
uint32 i;
tokill.reserve(m_memberCount);
snprintf(buffer,1024, "The FORTRESS , '%s', disbanded.", m_name.c_str());
data = sChatHandler.FillSystemMessageData(buffer);
SendPacket(data);
delete data;
for(i=0; i < m_memberCount; ++i)
{
if(m_members[i].Info)
tokill.push_back(m_members[i].Info);
}
for(vector<USERInfo*>::iterator itr = tokill.begin(); itr != tokill.end(); ++itr)
{
RemoveMember(*itr);
}
objmgr.RemoveFORTRESS(this);
delete this;
}
void FORTRESS::Stat(WorldPacket & data)
{
data.Initialize(SMSG_FORTRESS__STATS);
data << m_id;
data << m_stat_rating;
data << m_stat_gamesplayedweek;
data << m_stat_gameswonweek;
data << m_stat_gamesplayedseason;
data << m_stat_gameswonseason;
data << m_stat_ranking;
}
void FORTRESS::Query(WorldPacket & data)
{
data.Initialize(SMSG_FORTRESS__QUERY_RESPONSE);
data << m_id;
data << m_name;
data << GetUSERsPer();
data << m_emblemColour;
data << m_emblemStyle;
data << m_borderColour;
data << m_borderStyle;
data << m_backgroundColour;
}
void FORTRESS::Roster(WorldPacket & data)
{
data.Initialize(SMSG_FORTRESS__ROSTER);
data.reserve(m_memberCount * 81 + 9);
data << m_id;
data << m_memberCount;
data << GetUSERsPer();
for(uint32 i = 0; i < m_memberCount; ++i)
{
USERInfo* info = m_members[i].Info;
// TODO : burlex figure out why this became null
if( info != NULL )
{
data << uint64(info->guid);
data << uint8( (info->m_loggedInUSER != NULL) ? 1 : 0 );
data << info->name;
data << uint32( m_members[i].Info->guid == m_leader ? 0 : 1); // Unk
data << uint8( info->lastLevel );
data << uint8( info->cl );
data << m_members[i].Played_ThisWeek;
data << m_members[i].Won_ThisWeek;
data << m_members[i].Played_ThisSeason;
data << m_members[i].Won_ThisSeason;
data << m_stat_rating; // (actually personal rating here /shrug)
}
}
}
void FORTRESS::SaveToDB()
{
std::stringstream ss;
uint32 i;
ss << "REPLACE INTO FORTRESSs VALUES("
<< m_id << ","
<< m_type << ","
<< m_leader << ",'"
<< m_name << "',"
<< m_emblemStyle << ","
<< m_emblemColour << ","
<< m_borderStyle << ","
<< m_borderColour << ","
<< m_backgroundColour << ","
<< m_stat_rating << ",'"
<< m_stat_gamesplayedweek << " " << m_stat_gameswonweek << " "
<< m_stat_gamesplayedseason << " " << m_stat_gameswonseason << "',"
<< m_stat_ranking;
for(i = 0; i < m_memberCount; ++i)
{
if(m_members[i].Info)
{
ss << ",'" << m_members[i].Info->guid << " " << m_members[i].Played_ThisWeek << " "
<< m_members[i].Won_ThisWeek << " " << m_members[i].Played_ThisSeason << " "
<< m_members[i].Won_ThisSeason << "'";
}
else
{
ss << ",'0 0 0 0 0'";
}
}
for(; i < 10; ++i)
{
ss << ",'0 0 0 0 0'";
}
ss << ")";
CharacterDatabase.Execute(ss.str().c_str());
}
bool FORTRESS::HasMember(uint32 guid)
{
for(uint32 i = 0; i < m_memberCount; ++i)
{
if(m_members[i].Info && m_members[i].Info->guid == guid)
return true;
}
return false;
}
void FORTRESS::SetLeader(USERInfo * info)
{
uint32 old_leader = m_leader;
char buffer[1024];
WorldPacket * data;
snprintf(buffer, 1024,"%s is now the captain of the FORTRESS , '%s'.", info->name, m_name.c_str());
data = sChatHandler.FillSystemMessageData(buffer);
m_leader=info->guid;
SendPacket(data);
delete data;
/* set the fields */
for(uint32 i = 0; i < m_memberCount; ++i)
{
if(m_members[i].Info == info) /* new leader */
{
if(m_members[i].Info->m_loggedInUSER)
m_members[i].Info->m_loggedInUSER->SetUInt32Value(USER_FIELD_FORTRESS__INFO_1_1 + (m_type*6) + 1, 0);
}
else if(m_members[i].Info->guid == old_leader)
{
if(m_members[i].Info->m_loggedInUSER)
m_members[i].Info->m_loggedInUSER->SetUInt32Value(USER_FIELD_FORTRESS__INFO_1_1 + (m_type*6) + 1, 1);
}
}
}
FORTRESSMember * FORTRESS::GetMember(USERInfo * info)
{
for(uint32 i = 0; i < m_memberCount; ++i)
{
if(m_members[i].Info == info)
return &m_members[i];
}
return NULL;
}
FORTRESSMember * FORTRESS::GetMemberByGuid(uint32 guid)
{
for(uint32 i = 0; i < m_memberCount; ++i)
{
if(m_members[i].Info && m_members[i].Info->guid == guid)
return &m_members[i];
}
return NULL;
}
void WorldSession::HandleFORTRESSRosterOpcode(WorldPacket & recv_data)
{
uint8 slot;
uint32 Id;
FORTRESS * ;
recv_data >> Id;
= objmgr.GetFORTRESSById(Id);
if()
{
slot = CountToId[->m_type];
WorldPacket data(1000);
->Roster(data);
SendPacket(&data);
}
}
void WorldSession::HandleFORTRESSQueryOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
uint32 _id;
recv_data >> _id;
= objmgr.GetFORTRESSById(_id);
if( != NULL)
{
WorldPacket data(1000);
->Query(data);
SendPacket(&data);
->Stat(data);
SendPacket(&data);
}
}
void WorldSession::HandleFORTRESSAddMemberOpcode(WorldPacket & recv_data)
{
WorldPacket data(SMSG_FORTRESS__INVITE, 40);
string USER_name;
uint32 Id;
recv_data >> Id >> USER_name;
FORTRESS * p = objmgr.GetFORTRESSById(Id);
if( !p )
return;
if(!p->HasMember(GetUSER()->GetLowGUID()))
GetUSER()->SoftDisconnect();
USER * plr = objmgr.GetUSER(USER_name.c_str(), false);
if(plr == NULL)
{
SystemMessage("USER `%s` is non-existent or not online.", USER_name.c_str());
return;
}
if(p->m_leader != _USER->GetLowGUID())
{
SystemMessage("You are not the captain of this FORTRESS .");
return;
}
if(plr->getLevel() < 70)
{
SystemMessage("USER must be level 70 to join an FORTRESS .");
return;
}
if(plr->m_FORTRESSs[p->m_type] != NULL)
{
SystemMessage("That USER is already in an FORTRESS of this type.");
return;
}
if(plr->m_FORTRESSinviteguid != 0)
{
SystemMessage("That USER is already invited to an FORTRESS ");
return;
}
if(plr->Get() != _USER->Get() && !HasGMPermissions())
{
SystemMessage("That USER is a member of a different faction.");
return;
}
plr->m_FORTRESSinviteguid = _USER->m_FORTRESSs[p->m_type]->m_id;
data << _USER->GetName();
data << _USER->m_FORTRESSs[p->m_type]->m_name;
plr->GetSession()->SendPacket(&data);
}
void WorldSession::HandleFORTRESSRemoveMemberOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
uint8 slot;
uint32 Id;
string name;
USERInfo * inf;
recv_data >> Id >> name;
= objmgr.GetFORTRESSById(Id);
if(!)
{
GetUSER()->SoftDisconnect();
return;
}
slot = ->m_type;
if( ( = _USER->m_FORTRESSs[slot]) == NULL )
{
SystemMessage("You are not in an FORTRESS of this type.");
return;
}
if(->m_leader != _USER->GetLowGUID())
{
SystemMessage("You are not the leader of this .");
return;
}
if( (inf = objmgr.GetUSERInfoByName(name.c_str())) == NULL )
{
SystemMessage("That USER cannot be found.");
return;
}
if(!->HasMember(inf->guid))
{
SystemMessage("That USER is not in your FORTRESS .");
return;
}
if(->RemoveMember(inf))
{
char buffer[1024];
WorldPacket * data;
snprintf(buffer,1024,"%s was removed from the FORTRESS '%s'.", inf->name, ->m_name.c_str());
data = sChatHandler.FillSystemMessageData(buffer);
->SendPacket(data);
delete data;
SystemMessage("Removed %s from the FORTRESS '%s'.", inf->name, ->m_name.c_str());
}
}
void WorldSession::HandleFORTRESSInviteAcceptOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
if(_USER->m_FORTRESSinviteguid == 0)
{
SystemMessage("You have not been invited into another FORTRESS .");
return;
}
= objmgr.GetFORTRESSById(_USER->m_FORTRESSinviteguid);
_USER->m_FORTRESSinviteguid=0;
if( == 0)
{
SystemMessage("That FORTRESS no longer exists.");
return;
}
if(->m_memberCount >= ->m_slots)
{
SystemMessage("That is now full.");
return;
}
if(_USER->m_FORTRESSs[->m_type] != NULL) /* shouldn't happen */
{
SystemMessage("You have already been in an FORTRESS of that size.");
return;
}
if(->AddMember(_USER->m_USERInfo))
{
char buffer[1024];
WorldPacket * data;
snprintf(buffer,1024,"%s joined the FORTRESS , '%s'.", _USER->GetName(), ->m_name.c_str());
data = sChatHandler.FillSystemMessageData(buffer);
->SendPacket(data);
delete data;
}
else
{
SendNotification("Internal error.");
}
}
void WorldSession::HandleFORTRESSInviteDenyOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
if(_USER->m_FORTRESSinviteguid == 0)
{
SystemMessage("You were not invited.");
return;
}
= objmgr.GetFORTRESSById(_USER->m_FORTRESSinviteguid);
_USER->m_FORTRESSinviteguid=0;
if( == NULL)
return;
USER * plr = objmgr.GetUSER(->m_leader);
if(plr != NULL)
plr->GetSession()->SystemMessage("%s denied your FORTRESS invitation for %s.", _USER->GetName(), ->m_name.c_str());
}
void WorldSession::HandleFORTRESSLeaveOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
uint32 Id;
recv_data >> Id;
= objmgr.GetFORTRESSById(Id);
if(!)
{
GetUSER()->SoftDisconnect();
return;
}
if( ( = _USER->m_FORTRESSs[->m_type]) == NULL )
{
SystemMessage("You are not in an FORTRESS of this type.");
return;
}
if(->m_leader == _USER->GetLowGUID())
{
SystemMessage("You cannot leave the yet, promote someone else to captain first.");
return;
}
if(->RemoveMember(_USER->m_USERInfo))
{
char buffer[1024];
WorldPacket * data;
snprintf(buffer,1024,"%s left the FORTRESS , '%s'.", _USER->GetName(), ->m_name.c_str());
data = sChatHandler.FillSystemMessageData(buffer);
->SendPacket(data);
delete data;
SystemMessage("You have left the FORTRESS , '%s'.", ->m_name.c_str());
}
}
void WorldSession::HandleFORTRESSDisbandOpcode(WorldPacket & recv_data)
{
FORTRESS * ;
uint32 Id;
recv_data >> Id;
= objmgr.GetFORTRESSById(Id);
if(!)
{
GetUSER()->SoftDisconnect();
return;
}
if( ( = _USER->m_FORTRESSs[->m_type]) == NULL )
{
SystemMessage("You are not in an FORTRESS of this type.");
return;
}
if(->m_leader != _USER->GetLowGUID())
{
SystemMessage("You aren't the captain of this .");
return;
}
->Destroy();
}
void WorldSession::HandleFORTRESSPromoteOpcode(WorldPacket & recv_data)
{
uint32 Id;
uint8 slot;
string name;
FORTRESS * ;
USERInfo * inf;
recv_data >> Id >> name;
= objmgr.GetFORTRESSById(Id);
if(!)
{
GetUSER()->SoftDisconnect();
return;
}
slot = ->m_type;
if( slot >= NUM_FORTRESS__TYPES )
return;
if( ( = _USER->m_FORTRESSs[slot]) == NULL )
{
SystemMessage("You are not in an FORTRESS of this type.");
return;
}
if(->m_leader != _USER->GetLowGUID())
{
SystemMessage("You aren't the captain of this .");
return;
}
if( (inf = objmgr.GetUSERInfoByName(name.c_str())) == NULL )
{
SystemMessage("That USER cannot be found.");
return;
}
if(!->HasMember(inf->guid))
{
SystemMessage("That USER is not a member of your FORTRESS .");
return;
}
->SetLeader(inf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -