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

📄 eventzone.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
字号:
// EventZone.cpp: implementation of the CEventZone class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "server.h"
#include "USER.h"
#include "EventZone.h"
#include "ServerDlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern CServerDlg *g_pMainDlg;

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

CEventZone::CEventZone()
{
	SingleInit();
	m_arEventZone.RemoveAll();
	m_arEventZone.Add(60);
	m_arEventZone.Add(64);
	m_arEventZone.Add(65);
	m_arEventZone.Add(66);
	m_arEventZone.Add(67);
}

CEventZone::~CEventZone()
{

}

int CEventZone::GetEmptyEventZone()
{
	for(int i = 0; i < MAX_SINGLE_EVENT; i++)
	{
		if(InterlockedCompareExchange((PVOID*)&m_SingleEventZone[i].m_lUsed, (PVOID)1, (PVOID)0) == (PVOID*)0)
		{
			m_SingleEventZone[i].m_lCurNum = 0;
			m_SingleEventZone[i].m_sEventZone = 0;
			m_SingleEventZone[i].m_tSuccessType = 0;
			m_SingleEventZone[i].m_tStartType = 0;
			m_SingleEventZone[i].m_tEventTime = 0;
			m_SingleEventZone[i].m_dwStartTime = 0;
			m_SingleEventZone[i].m_dwInterTick = 0;

			for(int j = 0; j < MAX_EVENT_USER; j++)
			{
				m_SingleEventZone[i].m_arUserList[j].uid = -1;
				::ZeroMemory(m_SingleEventZone[i].m_arUserList[j].strUserName, sizeof(m_SingleEventZone[i].m_arUserList[j].strUserName));		
			}

			m_SingleEventZone[i].m_arNpcList.RemoveAll();
			m_SingleEventZone[i].m_dwStartTime = GetTickCount();

			return i;
		}
	}

	return -1;
}

void CEventZone::SingleInit()
{
	for(int i = 0; i < MAX_SINGLE_EVENT; i++)
	{
		m_SingleEventZone[i].m_lUsed = 0;
		m_SingleEventZone[i].m_lCurNum = 0;
		m_SingleEventZone[i].m_sEventZone = 0;
		m_SingleEventZone[i].m_tSuccessType = 0;
		m_SingleEventZone[i].m_tStartType = 0;
		m_SingleEventZone[i].m_tEventTime = 0;
		m_SingleEventZone[i].m_dwStartTime = 0;
		m_SingleEventZone[i].m_dwInterTick = 0;

		for(int j = 0; j < MAX_EVENT_USER; j++)
		{
			m_SingleEventZone[i].m_arUserList[j].uid = -1;
			::ZeroMemory(m_SingleEventZone[i].m_arUserList[j].strUserName, sizeof(m_SingleEventZone[i].m_arUserList[j].strUserName));		
		}

		m_SingleEventZone[i].m_arNpcList.RemoveAll();
	}
}

void CEventZone::RemoveUserInEventZone(int iEventZone)
{
	int i, j;
	int uid = 0, nLen = 0;
	USER *pUser = NULL;

	for(i = 0; i < MAX_EVENT_USER; i++)
	{
		uid = m_SingleEventZone[iEventZone].m_arUserList[i].uid;
		if(uid < 0) continue;

		COM *pCom = g_pMainDlg->GetCOM();
		if ( pCom )
			pUser = pCom->GetUserUid(uid);
		else
			return;

		// IKING 2001.1.
		if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;
		//

		if(strcmp(pUser->m_strUserID, m_SingleEventZone[iEventZone].m_arUserList[i].strUserName) != 0)
		{
			CString szSource = m_SingleEventZone[iEventZone].m_arUserList[i].strUserName;

			pUser = NULL;

			// IKING 2001.1.
			USER *pTUser;
			for(j = 0; j < MAX_USER; j++)
			{
				pTUser = pCom->GetUserUid(j);
				if ( pTUser == NULL ) continue;

				if(pTUser->m_state == STATE_DISCONNECTED || pTUser->m_state == STATE_LOGOUT ) continue;

				if(!szSource.CompareNoCase(pTUser->m_strUserID ) ) pUser = pTUser;
			}
			//
		}

		if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;

//		pUser->m_tGuildHouseWar = GUILD_WAR_AFFTER;

		pUser->m_tQuestWar = GUILD_WAR_AFFTER;
		if(m_SingleEventZone[iEventZone].m_sEventZone == pUser->m_curz && pUser->m_bLive == USER_LIVE) pUser->TownPotal();
	}

	for(i = 0; i < m_SingleEventZone[iEventZone].m_arNpcList.GetSize(); i++)
	{
		uid = m_SingleEventZone[iEventZone].m_arNpcList[i];
		if(uid < 0 || uid >= g_arNpc.GetSize()) continue;

		if(g_arNpc[uid]->m_NpcState != NPC_DEAD)
		{
			g_arNpc[uid]->Dead();
		}
	}

	m_SingleEventZone[iEventZone].m_lCurNum = 0;
	m_SingleEventZone[iEventZone].m_sEventZone = 0;
	m_SingleEventZone[iEventZone].m_tSuccessType = 0;
	m_SingleEventZone[iEventZone].m_tStartType = 0;
	m_SingleEventZone[iEventZone].m_tEventTime = 0;
	m_SingleEventZone[iEventZone].m_dwStartTime = 0;
	m_SingleEventZone[iEventZone].m_dwInterTick = 0;

	for(j = 0; j < MAX_EVENT_USER; j++)
	{
		m_SingleEventZone[iEventZone].m_arUserList[j].uid = -1;
		::ZeroMemory(m_SingleEventZone[iEventZone].m_arUserList[j].strUserName, sizeof(m_SingleEventZone[iEventZone].m_arUserList[j].strUserName));		
	}

	m_SingleEventZone[iEventZone].m_arNpcList.RemoveAll();

}

void CEventZone::CheckSingleEventZoneWarEnd(int iZone)
{
	int i, j;

	for(i = 0; i < MAX_SINGLE_EVENT; i++)
	{
		if(iZone == m_SingleEventZone[i].m_sEventZone)
		{
			if(m_SingleEventZone[i].m_lUsed == 1)
			{
				InterlockedIncrement(&m_SingleEventZone[i].m_lCurNum);

				if(m_SingleEventZone[i].m_lCurNum >= m_SingleEventZone[i].m_arNpcList.GetSize())
				{
					int uid = 0, nLen = 0;
					USER *pUser = NULL;

					for(j = 0; j < MAX_EVENT_USER; j++)
					{
						uid = m_SingleEventZone[i].m_arUserList[j].uid;
						if(uid < 0) continue;

						nLen = strlen(m_SingleEventZone[i].m_arUserList[j].strUserName);
						if(nLen <= 0 || nLen > CHAR_NAME_LENGTH) continue;

						uid = m_SingleEventZone[i].m_arUserList[j].uid;

						COM *pCom = g_pMainDlg->GetCOM();
						if ( pCom )
							pUser = pCom->GetUserUid(uid);
						else
							return;

						pUser = pCom->GetUserUid(uid);
						// IKING 2001.1.
						if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;
						//

						if(strcmp(pUser->m_strUserID, m_SingleEventZone[i].m_arUserList[j].strUserName) != 0)
						{
							CString szSource = m_SingleEventZone[i].m_arUserList[j].strUserName;

							pUser = NULL;

							// IKING 2001.1.
							USER *pTUser;
							for(j = 0; j < MAX_USER; j++)
							{
								pTUser = pCom->GetUserUid(j);
								if ( pTUser == NULL ) continue;

								if(pTUser->m_state == STATE_DISCONNECTED || pTUser->m_state == STATE_LOGOUT ) continue;

								if(!szSource.CompareNoCase(pTUser->m_strUserID)) pUser = pTUser;
							}
							//
						}

						if(pUser == NULL || pUser->m_state != STATE_GAMESTARTED) continue;

						pUser->m_tQuestWar = GUILD_WAR_AFFTER;
						if(m_SingleEventZone[i].m_sEventZone == pUser->m_curz && pUser->m_bLive == USER_LIVE)
						{
							pUser->SendSystemMsg( IDS_USER_QUEST_END, SYSTEM_NORMAL, TO_ME);
						}
					}

					m_SingleEventZone[i].m_dwInterTick = GetTickCount();
				}
			}
		}
	}
}

void CEventZone::CheckUserStateInEventZone(int iZone)
{
	int i;
	int iNum = 0;

	for(i = 0; i < MAX_SINGLE_EVENT; i++)
	{
		if(iZone == m_SingleEventZone[i].m_sEventZone)
		{
			if(m_SingleEventZone[i].m_lUsed == 1)
			{
				RemoveUserInEventZone(i);
				m_SingleEventZone[i].m_lUsed = 0;
			}
		}
	}
}

⌨️ 快捷键说明

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