⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fortress.cpp.svn-base

📁 絲路server源碼 Silk Road server source
💻 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 + -