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

📄 basearena.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BaseArena.cpp: implementation of the CBaseArena class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "BaseArena.h"

#include "CoreArena.h"
#include "StoneArena.h"
#include "MonsterArena.h"

///////////////////////////////////////////////////////////////////////////////
// Static Method
///////////////////////////////////////////////////////////////////////////////

CBaseArena* CBaseArena::CreateArena(int nIndex, int nType)
{
	CBaseArena* pArena = NULL;

	switch (nType)
	{
	case AT_CORE:
		{
			pArena = new CCoreArena(nIndex, nType);
			break;
		}
	case AT_STONE:
		{
			pArena = new CStoneArena(nIndex, nType);
			break;
		}
	case AT_MONSTER:
		{
			pArena = new CMonsterArena(nIndex, nType);
			break;
		}
	}

	return pArena;
}

///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////

CBaseArena::CBaseArena()
{
	Clear();
}

CBaseArena::~CBaseArena()
{
	ClearTeam();
	ClearBonus();
	m_pLeader = NULL;

	SAFE_DELETE(m_pState);
	SAFE_DELETE(m_pGambling);
	SAFE_DELETE(m_pObserve);
	SAFE_DELETE(m_pLobby);
}

///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////

void CBaseArena::Clear()
{
	m_pState = NULL;
	m_pGambling = NULL;
	m_pObserve = NULL;
	m_pLobby = NULL;
	m_ltTeam.clear();
	m_ltBonus.clear();
	m_nIndex = 0;
	m_nArenaType = AT_UNKNOWN;
	m_pLeader = NULL;
}

void CBaseArena::AddTeam(CArenaTeam* pTeam)
{
	m_ltTeam.push_back(pTeam);
}
	
void CBaseArena::DelTeam(CArenaTeam* pTeam)
{
	m_ltTeam.remove(pTeam);
}

void CBaseArena::ClearTeam()
{
	for_each(m_ltTeam.begin(), m_ltTeam.end(), TDelete());
	m_ltTeam.clear();
}

void CBaseArena::AddBonus(CArenaBonus* pBonus)
{
	m_ltBonus.push_back(pBonus);
}
	
void CBaseArena::DelBonus(CArenaBonus* pBonus)
{
	m_ltBonus.remove(pBonus);
}

void CBaseArena::ClearBonus()
{
	for_each(m_ltBonus.begin(), m_ltBonus.end(), TDelete());
	m_ltBonus.clear();
}

bool CBaseArena::AddLobby(int nGame, CHARLIST* pMember)
{
	if (m_pLobby->IsExistMember(pMember))
	{
		pMember->Message(MK_INFORMATION, 1, 104);
		return false;
	}

	pMember->SetJoinArenaGame(this);
	m_pLobby->AddMember(nGame, pMember);
	SendAddLobby(pMember);
	return true;
}

bool CBaseArena::DelLobby(CHARLIST* pMember)
{
	if (!m_pLobby->IsExistMember(pMember))
	{
		return false;
	}

	SendDeleteLobby(pMember);
	m_pLobby->DelMember(pMember);
	return true;
}

bool CBaseArena::AddTeam(int nTeam, CHARLIST* pMember)
{	//< CSD-030930
	for (ITOR_TEAM i = m_ltTeam.begin(); i != m_ltTeam.end(); ++i)
	{
		if ((*i)->IsExistMember(pMember))
		{
			pMember->Message(MK_INFORMATION, 1, 105);
			return false;
		}

		if ((*i)->IsExistObserve(pMember))
		{
			pMember->Message(MK_INFORMATION, 1, 106);
			return false;
		}

		if ((*i)->IsExistGambler(pMember))
		{
			pMember->Message(MK_INFORMATION, 1, 123);
			return false;
		}
	}

	CArenaTeam* pTeam = GetArenaTeam(nTeam);

	if (pTeam == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 107);
		return false;
	}

	if (pTeam->GetMemberCount() >= MAX_TEAM_NUMBER)
	{
		pMember->Message(MK_INFORMATION, 1, 119);
		return false;
	}

	if (m_pLobby->IsExistMember(pMember))
	{
		SendDeleteLobby(pMember);
		m_pLobby->DelMember(pMember);
	}
		
	pMember->SetJoinArenaTeam(pTeam);
	pTeam->AddMember(pMember);
	SendAddTeam(nTeam, pMember);
	return true;
}	//> CSD-030930

bool CBaseArena::DelTeam(CHARLIST* pMember)
{
	CArenaTeam* pTeam = pMember->GetJoinArenaTeam();

	if (pTeam == NULL)
	{
		return false;
	}
		
	if (!pTeam->IsExistMember(pMember))
	{
		return false;
	}
	
	const int nTeam = pTeam->GetTeamNumber();
	SendDeleteTeam(nTeam, pMember);

	pTeam->DelMember(pMember);
	return true;
}

bool CBaseArena::AddObserve(int nTeam, CHARLIST* pMember)
{
	CArenaTeam* pTeam = GetArenaTeam(nTeam);

	if (pTeam == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 107);
		return false;
	}

	if (pTeam->IsEmptyMember())
	{
		pMember->Message(MK_INFORMATION, 1, 108);
		return false;
	}

	if (pTeam->IsExistMember(pMember))
	{
		pMember->Message(MK_INFORMATION, 1, 101);
		return false;
	}

	if (pTeam->IsExistObserve(pMember))
	{
		pTeam->DelObserve(pMember);
	}
	// 包傈丰 拌魂
	if (!m_pObserve->IsEnoughMoney(pMember))
	{
		pMember->Message(MK_INFORMATION, 1, 109);
		return false;
	}

	pMember->SetJoinArenaTeam(pTeam);
	pTeam->AddObserve(pMember);
	SendAddObserve(nTeam, pMember);
	return true;
}

bool CBaseArena::DelObserve(CHARLIST* pMember)
{
	CArenaTeam* pTeam = pMember->GetJoinArenaTeam();

	if (pTeam == NULL)
	{
		return false;
	}
		
	if (!pTeam->IsExistObserve(pMember))
	{
		return false;
	}

	const int nTeam = pTeam->GetTeamNumber();
	SendDeleteObserve(nTeam, pMember);
	pTeam->DelObserve(pMember);
	return true;
}

bool CBaseArena::AddGambler(int nTeam, CHARLIST* pMember, DWORD dwMoney)
{
	for (ITOR_TEAM i = m_ltTeam.begin(); i != m_ltTeam.end(); ++i)
	{
		CArenaTeam* pTeam = *i;

		if (!m_pGambling->IsEnableGamblerCount(pTeam))
		{
			pMember->Message(MK_SHORTAGE, 1, 110);
			return false;
		}
	}

	if (!m_pGambling->IsEnableBattingMoney(dwMoney))
	{
		pMember->Message(MK_SHORTAGE, 1, 111);
		return false;
	}

	if (pMember->GetBankMoney() < dwMoney)
	{
		pMember->Message(MK_SHORTAGE, 1, 112);
		return false;
	}

	CArenaTeam* pTeam = GetArenaTeam(nTeam);

	if (pTeam == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 107);
		return false;
	}

	if (pTeam->IsEmptyMember())
	{
		pMember->Message(MK_INFORMATION, 1, 113);
		return false;
	}

	if (pTeam->IsExistGambler(pMember))
	{
		pTeam->DelGambler(pMember);
	}

	pMember->SetJoinArenaTeam(pTeam);
	pTeam->AddGambler(pMember, dwMoney);
	SendAddGambling(nTeam, pMember);
	return true;
}

bool CBaseArena::DelGambler(CHARLIST* pMember)
{
	CArenaTeam* pTeam = pMember->GetJoinArenaTeam();

	if (pTeam == NULL)
	{
		return false;
	}
		
	if (!pTeam->IsExistGambler(pMember))
	{
		return false;
	}

	const int nTeam = pTeam->GetTeamNumber();
	SendDeleteGambling(nTeam, pMember);
	pTeam->DelGambler(pMember);
	return true;
}

void CBaseArena::SendAddLobby(CHARLIST* pMember)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_ADD_LOBBY;
	packet.h.header.size = sizeof(t_arena_add_lobby);
	packet.u.arena.arena_add_lobby.idMember = pMember->GetServerID();
	SendPacketAll(&packet);
}
	
void CBaseArena::SendDeleteLobby(CHARLIST* pMember)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_DELETE_LOBBY;
	packet.h.header.size = sizeof(t_arena_delete_lobby);
	packet.u.arena.arena_delete_lobby.idMember = pMember->GetServerID();
	SendPacketAll(&packet);
}

void CBaseArena::SendAddTeam(int nTeam, CHARLIST* pMember)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_ADD_TEAM;
	packet.h.header.size = sizeof(t_arena_add_team);
	packet.u.arena.arena_add_team.idMember = pMember->GetServerID();
	packet.u.arena.arena_add_team.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendDeleteTeam(int nTeam, CHARLIST* pMember)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_DELETE_TEAM;
	packet.h.header.size = sizeof(t_arena_delete_team);
	packet.u.arena.arena_delete_team.idMember = pMember->GetServerID();
	packet.u.arena.arena_delete_team.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendAddGambling(int nTeam, CHARLIST* pGambler)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_ADD_GAMBLING;
	packet.h.header.size = sizeof(t_arena_add_gambling);
	packet.u.arena.arena_add_gambling.idGambler = pGambler->GetServerID();
	packet.u.arena.arena_add_gambling.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendDeleteGambling(int nTeam, CHARLIST* pGambler)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_DELETE_GAMBLING;
	packet.h.header.size = sizeof(t_arena_delete_gambling);
	packet.u.arena.arena_delete_gambling.idGambler = pGambler->GetServerID();
	packet.u.arena.arena_delete_gambling.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendAddObserve(int nTeam, CHARLIST* pObserve)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_ADD_OBSERVE;
	packet.h.header.size = sizeof(t_arena_add_observe);
	packet.u.arena.arena_add_observe.idObserve = pObserve->GetServerID();
	packet.u.arena.arena_add_observe.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendDeleteObserve(int nTeam, CHARLIST* pObserve)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_DELETE_OBSERVE;
	packet.h.header.size = sizeof(t_arena_delete_observe);
	packet.u.arena.arena_delete_observe.idObserve = pObserve->GetServerID();
	packet.u.arena.arena_delete_observe.nTeam = nTeam;
	SendPacketAll(&packet);
}

void CBaseArena::SendLeaderInfo(CHARLIST* pMember)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_LEADER_INFO;
	packet.h.header.size = sizeof(t_arena_leader_info);
	packet.u.arena.arena_leader_info.idLeader = pMember->GetServerID();
	SendPacketAll(&packet);
	// 府歹肺 汲沥
	m_pLeader = pMember;
}

void CBaseArena::SendGameInfo(CHARLIST* pTarget, WORD wPort)
{	//< CSD-TW-030701
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_info);
	packet.h.header.type = CMD_ARENA_GAME_INFO;
	packet.u.arena.arena_game_info.wPort = wPort;
	packet.u.arena.arena_game_info.wMemberCount = GetGameMemberCount();

	if (m_pLeader != NULL)
	{
		strcpy(packet.u.arena.arena_game_info.szLeader, m_pLeader->Name);
	}
	else
	{
		strcpy(packet.u.arena.arena_game_info.szLeader, " ");
	}

	::QueuePacket(connections, pTarget->GetServerID(), &packet, 1);
}	//> CSD-TW-030701

void CBaseArena::SendStartGame(CHARLIST* pLeader)
{
	t_packet packet;
	packet.h.header.type = CMD_ARENA_START_GAME;
	packet.h.header.size = sizeof(t_arena_start_game);
	packet.u.arena.arena_start_game.idLeader = pLeader->GetServerID();
	::QueuePacket(connections, pLeader->GetServerID(), &packet, 1);
}

void CBaseArena::SendRemainCount(int nTeam, int nCount)
{	//< CSD-031106
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_message1);
	packet.h.header.type = CMD_ARENA_GAME_MESSAGE1;
	packet.u.arena.arena_game_message1.nTeamNumber = nTeam;
	packet.u.arena.arena_game_message1.nMsgType = 6;
	packet.u.arena.arena_game_message1.nGameData = nCount;
	SendPacketTeam(&packet);
}	//> CSD-031106

void CBaseArena::SendRemainTime(CHARLIST* pTarget, DWORD dwTime)
{	//< CSD-TW-030627
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_message4);
	packet.h.header.type = CMD_ARENA_GAME_MESSAGE4;
	packet.u.arena.arena_game_message4.dwRemainMinute = m_pState->GetRemainTime(dwTime)/60;
	::QueuePacket(connections, pTarget->GetServerID(), &packet, 1);
}	//> CSD-TW-030627

void CBaseArena::SendKillCount(int nTeam, int nCount)
{	//< CSD-031106
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_message1);
	packet.h.header.type = CMD_ARENA_GAME_MESSAGE1;
	packet.u.arena.arena_game_message1.nTeamNumber = nTeam;
	packet.u.arena.arena_game_message1.nMsgType = 6;
	packet.u.arena.arena_game_message1.nGameData = nCount;
	SendPacketTeam(&packet);
}	//> CSD-031106

void CBaseArena::SendOccupyStone(int nTeam, int nCount)
{	//< CSD-031106
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_message1);
	packet.h.header.type = CMD_ARENA_GAME_MESSAGE1;
	packet.u.arena.arena_game_message1.nTeamNumber = nTeam;
	packet.u.arena.arena_game_message1.nMsgType = 6;
	packet.u.arena.arena_game_message1.nGameData = nCount;
	SendPacketTeam(&packet);
}	//> CSD-031106

void CBaseArena::SendGameMessage(int nTeam, int nType, int nData)
{	//< CSD-031106
	t_packet packet;
	packet.h.header.size = sizeof(t_arena_game_message1);
	packet.h.header.type = CMD_ARENA_GAME_MESSAGE1;
	packet.u.arena.arena_game_message1.nTeamNumber = nTeam;
	packet.u.arena.arena_game_message1.nMsgType = nType;
	packet.u.arena.arena_game_message1.nGameData = nData;
	SendPacketTeam(&packet);
}	//> CSD-031106

void CBaseArena::SendGameMessage(CHARLIST* pCaster, CHARLIST* pTarget)
{
	if (pCaster->GetJoinArenaGame() != this)
	{
		return;
	}

	if (pTarget->GetJoinArenaGame() != this)
	{
		return;
	}

	CArenaTeam* pTeam1 = pCaster->GetJoinArenaTeam();
	
	if (pTeam1 == NULL) 
	{
		return;
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -