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

📄 arenamanager.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
// ArenaManager.cpp: implementation of the CArenaManager class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "ArenaManager.h"

#include "teambattle.h"

extern CColossusStoneMgr g_ColossusStone;

///////////////////////////////////////////////////////////////////////////////
// Static Member
///////////////////////////////////////////////////////////////////////////////

DWORD CArenaManager::s_dwReady = 0;
DWORD CArenaManager::s_dwDelay = 0;

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

CArenaManager::CArenaManager()
{
	m_mpArena.clear();
	m_mpGame.clear();
	m_dwContinueTime = 0;
}

CArenaManager::~CArenaManager()
{
	ClearArena();
	ClearGame();
}

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

bool CArenaManager::AddArena(int nPort, CArenaInfo* pArena)
{
	ITOR_ARENA itor = m_mpArena.find(nPort);

	if (itor != m_mpArena.end())
	{
		MyLog(LOG_NORMAL, "CArenaManager::AddArena : Duplicate %d", nPort);
		return false;
	}

	m_mpArena.insert(PAIR_ARENA(nPort, pArena));
	return true;
}

void CArenaManager::ClearArena()
{
	for (ITOR_ARENA i = m_mpArena.begin(); i != m_mpArena.end(); ++i)
	{
		delete i->second;	
	}

	m_mpArena.clear();
}

bool CArenaManager::AddGame(int nIndex, CBaseArena* pArena)
{
	ITOR_GAME itor = m_mpGame.find(nIndex);

	if (itor != m_mpGame.end())
	{
		MyLog(LOG_NORMAL, "CArenaManager::AddGame : Duplicate %d", nIndex);
		return false;
	}

	m_mpGame.insert(PAIR_GAME(nIndex, pArena));
	return true;
}

void CArenaManager::ClearGame()
{
	for (ITOR_GAME i = m_mpGame.begin(); i != m_mpGame.end(); ++i)
	{
		delete i->second;	
	}

	m_mpGame.clear();
}

void CArenaManager::Ready(DWORD dwSecond)
{
	if (g_curr_time < s_dwReady)
	{
		return;
	}

	CArenaInfo* pArena = GetArenaInfo(g_MapPort);
	
	if (pArena == NULL)
	{
		return;
	}

	for (ITOR_GAME i = m_mpGame.begin(); i != m_mpGame.end(); ++i)
	{
		CBaseArena* pGame = i->second;

		if (!pGame->IsReadyGame())
		{
			continue;
		}

		if (!pGame->ReadyGame(g_curr_time))
		{
			pGame->EndReady();
		}
	}

	s_dwReady = g_curr_time + dwSecond;
}

void CArenaManager::Execute(DWORD dwSecond)
{
	if (g_curr_time < s_dwDelay)
	{
		return;
	}

	CArenaInfo* pArena = GetArenaInfo(g_MapPort);
	
	if (pArena == NULL)
	{
		return;
	}

	for (ITOR_GAME i = m_mpGame.begin(); i != m_mpGame.end(); ++i)
	{
		CBaseArena* pGame = i->second;

		if (!pGame->IsPlayGame())
		{
			continue;
		}

		if (!pGame->PlayGame(g_curr_time))
		{
			pGame->EndGame(pArena);
		}
	}

	s_dwDelay = g_curr_time + dwSecond;
}

void CArenaManager::Remove(WORD idMember)
{
	CHARLIST* pMember = ::CheckServerId(idMember);

	if (pMember == NULL)
	{
		return;
	}

	CBaseArena* pGame = pMember->GetJoinArenaGame();
	
	if (pGame == NULL)
	{
		return;
	}
	
	if (pGame->DelLobby(pMember))
	{
	
	}

	if (pGame->DelTeam(pMember))
	{
		pGame->RequestProbability();
		pGame->RequestChangeLeader(pMember);
	}

	if (pGame->DelGambler(pMember))
	{
		pGame->RequestGambling(pMember);
	}

	if (pGame->DelObserve(pMember))
	{
	
	}

	pMember->SetJoinArenaGame(NULL);
	pMember->SetJoinArenaTeam(NULL);
}

void CArenaManager::RecvEnterLobby(WORD idWaiter, t_arena_enter_lobby* pPacket)
{
	CHARLIST* pMember = ::CheckServerId(idWaiter);

	if (pMember == NULL)
	{
		return;
	}

	const int nGame = pPacket->nArenaGame;
	CBaseArena* pGame = GetGameInfo(nGame);
	
	if (pGame == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 102);
		return;
	}
	
	if (pGame->IsPlayGame())
	{
		pMember->Message(MK_INFORMATION, 1, 103);
		return;
	}

	if (pGame->AddLobby(nGame, pMember))
	{
		pGame->RequestArenaMember(pMember);
		pGame->RequestGambling(pMember);
		pGame->RequestProbability();
	}
}

void CArenaManager::RecvLeaveLobby(WORD idWaiter)
{
	CHARLIST* pMember = ::CheckServerId(idWaiter);

	if (pMember == NULL)
	{
		return;
	}

	CBaseArena* pGame = pMember->GetJoinArenaGame();

	if (pGame == NULL)
	{
		return;
	}

	if (pGame->DelLobby(pMember))
	{

	}

	if (pGame->DelTeam(pMember))
	{
		pGame->RequestProbability();
		pGame->RequestChangeLeader(pMember);
	}

	if (pGame->DelGambler(pMember))
	{
		pGame->RequestGambling(pMember);
	}

	if (pGame->DelObserve(pMember))
	{
	
	}

	pMember->SetJoinArenaGame(NULL);
	pMember->SetJoinArenaTeam(NULL);
}

void CArenaManager::RecvEnterTeam(WORD idMember, t_arena_enter_team* pPacket)
{
	CHARLIST* pMember = ::CheckServerId(idMember);
	
	if (pMember == NULL)
	{
		return;
	}

	const int nGame = pPacket->nArenaGame;
	CBaseArena* pGame = GetGameInfo(nGame);

	if (pGame == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 102);
		return;
	}

	if (pGame->IsPlayGame())
	{
		pMember->Message(MK_INFORMATION, 1, 103);
		return;
	}
	
	const int nTeam = pPacket->nArenaTeam;
	
	if (pGame->AddTeam(nTeam, pMember))
	{	// 评俊辑 殿废等 荤恩捞 乐澜阑 舅赴促.
		SendTeamBattleMessageAddCharOk((char)nTeam, idMember);
		pGame->RequestRegisterLeader(pMember);
		pGame->RequestProbability();
	}
}

void CArenaManager::RecvLeaveTeam(WORD idMember, t_arena_leave_team* pPacket)
{
	CHARLIST* pMember = ::CheckServerId(idMember);
	
	if (pMember == NULL)
	{
		return;
	}

	const int nGame = pPacket->nArenaGame;
	CBaseArena* pGame = g_pArenaManager->GetGameInfo(nGame);

	if (pGame == NULL)
	{
		return;
	}

	if (pGame->DelTeam(pMember))
	{
		pGame->RequestChangeLeader(pMember);
		pMember->SetJoinArenaTeam(NULL);

		if (pGame->AddLobby(nGame, pMember))
		{
			pGame->RequestProbability();
		}
	}
}

void CArenaManager::RecvReadyGame(WORD idLeader, t_arena_ready_game* pPacket)
{	//< CSD-TW0-030606
	CHARLIST* pLeader = ::CheckServerId(idLeader);
	
	if (pLeader == NULL)
	{
		return;
	}

	if (pLeader->IsCounselor())
	{
		return;
	}

	CBaseArena* pGame = pLeader->GetJoinArenaGame();

	if (pGame == NULL)
	{
		pLeader->Message(MK_INFORMATION, 1, 102);
		return;
	}

	if (pGame->IsPlayGame())
	{
		pLeader->Message(MK_INFORMATION, 1, 103);
		return;
	}

	if (pGame->GetLeader() != pLeader)
	{
		pLeader->Message(MK_INFORMATION, 1, 117);
		return;
	}

	pGame->StartReady(pPacket->dwDelay);
}	//> CSD-TW0-030606

void CArenaManager::RecvStartGame(WORD idLeader)
{
	CHARLIST* pLeader = ::CheckServerId(idLeader);
	
	if (pLeader == NULL)
	{
		return;
	}

	CBaseArena* pGame = pLeader->GetJoinArenaGame();

	if (pGame == NULL)
	{
		pLeader->Message(MK_INFORMATION, 1, 102);
		return;
	}

	if (pGame->IsPlayGame())
	{
		pLeader->Message(MK_INFORMATION, 1, 103);
		return;
	}

	pGame->StartGame(g_curr_time);
}

void CArenaManager::RecvEnterObserve(WORD idMember, t_arena_enter_observe* pPacket)
{
	CHARLIST* pMember = ::CheckServerId(idMember);
	
	if (pMember == NULL)
	{
		return;
	}

	const int nGame = pPacket->nArenaGame;
	CBaseArena* pGame = GetGameInfo(nGame);

	if (pGame == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 102);
		return;
	}

	if (pGame->IsPlayGame())
	{
		pMember->Message(MK_INFORMATION, 1, 103);
		return;
	}

	const int nTeam = pPacket->nArenaTeam;
	pGame->AddObserve(nTeam, pMember);
}

void CArenaManager::RecvEnterGambling(WORD idMember, t_arena_enter_gambling* pPacket)
{
	CHARLIST* pMember = ::CheckServerId(idMember);
	
	if (pMember == NULL)
	{
		return;
	}

	const int nGame = pPacket->nArenaGame;
	CBaseArena* pGame = GetGameInfo(nGame);

	if (pGame == NULL)
	{
		pMember->Message(MK_INFORMATION, 1, 102);
		return;
	}

	if (pGame->IsPlayGame())
	{
		pMember->Message(MK_INFORMATION, 1, 103);
		return;
	}
	
	const int nTeam = pPacket->nArenaTeam;
	const DWORD dwBattingMoney = pPacket->dwBattingMoney;
	
	if (pGame->AddGambler(nTeam, pMember, dwBattingMoney))
	{
		pGame->RequestGambling(pMember);
	}
}

⌨️ 快捷键说明

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