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

📄 npcworld.cpp

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 CPP
字号:
// NpcWorld.cpp: implementation of the CNpcWorld class.
//
//////////////////////////////////////////////////////////////////////

#include "windows.h"
#include "define.h"
#include "UserManager.h"
#include "NpcManager.h"
#include "MapManager.h"
#include "NpcWorld.h"
#include "AllMsg.h"
#include "Protocol.h"
#include "I_Shell.h"
#include "inifile.h"
#include "I_mydb.h"

//////////////////////////////////////////////////////////////////////
// interface
//////////////////////////////////////////////////////////////////////
IKernel*	CreateNewKernel()
{
	return new CNpcWorld;
}

//////////////////////////////////////////////////////////////////////
// kernel static
//////////////////////////////////////////////////////////////////////
CNpcWorld*	CNpcWorld::m_pNpcWorld;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNpcWorld::CNpcWorld()
{
	m_pNpcManager		= NULL;
	m_pUserManager		= NULL;
	m_pMapManager		= NULL;
	m_pSynManager		= NULL;

	m_pDatabase			= NULL;

	SetLoginState(STATE_NONE);
}

//////////////////////////////////////////////////////////////////////
CNpcWorld::~CNpcWorld()
{
	if(m_pSynManager)
		SAFE_DELETE(m_pSynManager);
	if(m_pNpcManager)
		SAFE_DELETE(m_pNpcManager);
	if(m_pUserManager)
		SAFE_DELETE(m_pUserManager);
	if(m_pMapManager)
		SAFE_DELETE(m_pMapManager);

	if(m_pDatabase)
		m_pDatabase->Release();
}

//////////////////////////////////////////////////////////////////////
// IKernel
//////////////////////////////////////////////////////////////////////
bool CNpcWorld::Create(IShell* pShell)
{
	CHECKF(pShell);
#ifdef	DUMP_DEBUG_MSG
	char	buf[256] = "syslog\\dump ";
	::DateTime(buf + strlen(buf));
	strcpy(buf + 22, ".log");
	::DeleteFile(buf);
#endif

	m_pShell	= pShell;
	m_pNpcWorld	= this;
	m_timeoutLogin.Startup(RESEND_MSGLOGIN_SECS);
	m_tUpdateStateWin.Startup(UPDATESTATEWIN_SECS);

	PrintText("Open the database...");
	CIniFile	ini(CONFIG_INI_FILENAME, "Database");
	IPSTR	szIP, szLogin, szPassword, szLibName;
	ini.GetString(szIP, "DB_IP", IPSTR_SIZE);
	ini.GetString(szLogin, "DB_USER", IPSTR_SIZE);
	ini.GetString(szPassword, "DB_PW", IPSTR_SIZE);
	ini.GetString(szLibName, "DB_NAME", IPSTR_SIZE);
	m_pDatabase		= ::CreateDatabase(szIP, szLogin, szPassword, szLibName);
	if(!m_pDatabase)
	{
		PrintText("ERROR:Can't open database!");
		return false;
	}

	PrintText("Create map set...");
	m_pMapManager	= new CMapManager;
	if(!m_pMapManager || !m_pMapManager->Create())
		return false;
	PrintText("Create player set...");
	m_pUserManager	= new CUserManager;
	if(!m_pUserManager || !m_pUserManager->Create())
		return false;
	PrintText("Create npc set...");
	m_pNpcManager	= new CNpcManager;
	if(!m_pNpcManager || !m_pNpcManager->Create())
		return false;
	PrintText("Create syn set...");
	m_pSynManager	= new CSynManager;
	if(!m_pSynManager || !m_pSynManager->Create())
		return false;

	if(!m_pItemType->Create(m_pDatabase))
		return false;

	PrintText("<<<<<<<< Create Jehad server kernel ok! >>>>>>>>");
	return true;
}

//////////////////////////////////////////////////////////////////////
void CNpcWorld::ProcessMsg(OBJID idPacket, const char* pbufMsg, int nSize, OBJID idNpc)
{
	// TODO: 请在此添加客户端上传消息的处理代码
	if(!pbufMsg || nSize <= 0 || nSize >_MAX_MSGSIZE)
        return ;

#ifdef	PALED_DEBUG_X
		MSGBUF	szMsg;
		sprintf(szMsg, "VVV 接收消息:%u, NpcID:%u", idPacket, idNpc);
		PrintText(szMsg);
#endif
	CNetMsg* pMsg	=CNetMsg::CreateMsg(idNpc, idPacket, pbufMsg, nSize);
	if(pMsg)
	{
		try {
			pMsg->Process(this);
		}
		catch(...)
		{
//			CNetMsg::DumpMsg(pMsg);
			LOGCATCH("CGameSocket::ProcessMsg()! MsgType:%d, NpcID:%u", idPacket, idNpc);
		}
		SAFE_DELETE(pMsg);
	}

	return;
}

//////////////////////////////////////////////////////////////////////
void CNpcWorld::OnTimer(DWORD nCurr)
{
	if(!m_pShell->IsConnectOK())
		return ;

	if(m_nLoginState == STATE_NORMAL)
	{
		if(m_timeoutLogin.IsActive())
		{
			if(m_timeoutLogin.IsTimeOut(LOGIN_DELAY_SECS))
			{
				m_timeoutLogin.Clear();
				PrintText("Generator begin.");
			}
			return ;
		}

		m_pMapManager->OnTimer(nCurr);
		m_pUserManager->OnTimer(nCurr);
		m_pNpcManager->OnTimer(nCurr);

		if(m_tUpdateStateWin.ToNextTime())
		{
			int nAmount		= 0;
			int nGenAmount	= 0;
			int	nGenActive	= 0;
			for(int i = 0; i < NpcManager()->QueryGenSet()->GetAmount(); i++)
			{
				CGenPtr pGen = NpcManager()->QueryGenSet()->GetObjByIndex(i);
				if(pGen)
				{
					nAmount		+= pGen->GetAmount();
					nGenAmount	+= pGen->GetGenAmount();
					if(pGen->GetMaxNpc() > nGenAmount)
						nGenActive++;
				}
			}
			char	buf[STATESTR_SIZE];
			sprintf(buf, "player set in view range:%u\r\n"
							"npc set:%u(%u)\r\n"
							"born from generator:%u\r\n"
							"born ok from generator:%u\r\n"
							"active generators:%u\r\n",
				UserManager()->QuerySet()->GetAmount(),
				NpcManager()->QuerySet()->GetAmount(), NpcManager()->CountActiveNpc(),
				nGenAmount, nAmount, nGenActive);
			m_pShell->SetState(buf);
		}
	}
	else if(m_nLoginState == STATE_LOGINING)
	{
		if(m_timeoutLogin.ToNextTime(RESEND_MSGLOGIN_SECS))
		{
			PrintText("Login game server . . .");
		}
	}
	else if(m_nLoginState == STATE_NONE)
	{
		m_nLoginState = STATE_LOGINING;

		CMsgLogin	msg;
		if(msg.Create(0, NPCSERVER_ACCOUNT, NPCSERVER_PASSWORD))
			SendMsg(NPCSERVER_VERSION, &msg);

		LOGDUMP("CMsgLogin STATE_NONE");
	}
	else if(m_nLoginState == STATE_BREAK)
	{
		m_nLoginState = STATE_LOGINING;

		CMsgLogin	msg;
		if(msg.Create(0, NPCSERVER_ACCOUNT, NPCSERVER_PASSWORD))
			SendMsg(NPCSERVER_VERSION_RELOGIN, &msg);

		LOGDUMP("CMsgLogin STATE_BREAK");
	}
	else
		ASSERT(!"CNpcWorld::OnTimer");
}

//////////////////////////////////////////////////////////////////////
void CNpcWorld::ShellCommond(LPCTSTR)
{
	//@ 注意多线程互斥
}

//////////////////////////////////////////////////////////////////////
bool CNpcWorld::SendMsg(OBJID idNpc, CNetMsg* pMsg)
{
#ifdef	DUMP_DEBUG_MSG
	if(pMsg->GetType() == 1002)
		LOGDUMP("Agent send login msg");
	else if(!IsNpcID(idNpc) && idNpc != ID_NONE)
		LOGDUMP("Agent send %u msg", pMsg->GetType());
#endif
	NETMSGBUF	buf;
	int			nNetPacketSize = UniteNpcPacket(buf, sizeof(buf), pMsg->GetType(), pMsg->GetBuf(), pMsg->GetSize(), idNpc);
	ASSERT(nNetPacketSize);
	if(nNetPacketSize)
	{
#ifdef	PALED_DEBUG_X
		MSGBUF	szMsg;
		sprintf(szMsg, "111 发送消息:%u, NpcID:%u", pMsg->GetType(), idNpc);
		PrintText(szMsg);
#endif
		DEBUG_TRY
		if(!m_pShell->SendPacket(buf, nNetPacketSize))
			SetLoginState(STATE_BREAK);
		DEBUG_CATCH("m_pShell->SendPacket()")

		return true;
	}

	return false;
}

//////////////////////////////////////////////////////////////////////
void CNpcWorld::LoginOK()
{
	m_nLoginState = STATE_NORMAL;
	m_timeoutLogin.Update();

	char	szMsg[1024];
	sprintf(szMsg, "Login OK. generator monster after %d secs", LOGIN_DELAY_SECS);
	PrintText(szMsg);
	LOGDUMP(szMsg);
}







⌨️ 快捷键说明

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