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

📄 eventmgr.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "..\stdafx.h"
#include "..\LowerLayers\servertable.h"
#include "..\LowerLayers\recvmsg.h"
#include "..\LowerLayers\mylog.h"
#include "DefaultHeader.h"
#include "MenuDefine.h"
#include "ItemList.h"
#include "CItem.h"
#include "teambattle.h"
#include "scrp_exe.h"
#include "chatting.h"
#include "menuserver.h"		// 020620 YGI
#include "dungeon.h"
#include "eventmgr.h"
#include "ItemMgr.h"



CEventMgr	g_EventMgr;

// 030624 YGI
CEventFlagMgr g_EventFlagMgr;

//////////////////////////////////////////////////////////////////////////////////
// CEventTime
int CEventTime::SetTime( TIMESTAMP_STRUCT *pStart, TIMESTAMP_STRUCT *pEnd )
{
	Remove();
	CTime temp_start( pStart->year, pStart->month, pStart->day,
		pStart->hour, pStart->minute, pStart->second );

	CTime temp_end( pEnd->year, pEnd->month, pEnd->day,
		pEnd->hour, pEnd->minute, pEnd->second );

	m_timeStart = temp_start;
	m_timeEnd = temp_end;

	//MyLog( 0, "%s", m_pTimeStart->Format( "%Y/%m/%d %H:%M:%S" ) );
	//MyLog( 0, "%s", m_pTimeEnd->Format( "%Y/%m/%d %H:%M:%S" ) );

	return 1;
	return CheckActive();
}

int CEventTime::CheckActive()
{
	m_nEventActive = 0;

	CTime curr_time;
	curr_time = CTime::GetCurrentTime();

	if( m_timeStart > curr_time || m_timeEnd < curr_time ) return 0;

	m_nEventActive = 1;
	return 1;
}

/////////////////////////////////////////////////////////////////////////////////////
// CEventNpcItem
int CEventNpcItem::DropNpcItem( CHARLIST *pNpc )
{
	if( !m_nItemNo ) return 0;
	if( m_nAmount >= m_nMax ) return 0;		// 歹捞惑 酒捞袍捞 唱坷搁 救等促.
	if( !m_nPercent ) return 0;
	if( m_nPercent != -1 )
	{
		if( rand()%m_nPercent != m_nPercent/2 ) return 0;
	}
	// 酒捞袍阑 父甸磊..
	ItemAttr item;
	if( ItemMgr.MakeDefaultRareItem( &item, m_nItemNo, m_nItemMutant, m_nItemGrade ) )
	{
		// 己傍, 历厘棺 冻迸霖促.
		DropItem( pNpc->X + (rand()%100)-50, pNpc->Y +(rand()%100)-50, &item);
		m_nAmount++;
		
		// 叼厚单阁栏肺 荤角阑 焊郴霖促.
		SendSaveAmountEventNpcItem( m_nEventNo, m_nAmount );
		return 1;
	}
	return 0;
}
///////////////////////////////////////////////////////////////////////////////////
// CEventNpcCreate
bool CEventNpcCreate::IsCreateAble()
{
	if( !IsEventActive() ) return false;
	if( IsAlive() ) return false;
	if(	!m_nFirst && !m_nRegen ) return false;

	int after_dead = g_curr_time - m_nDeadTime;
	if( after_dead < m_nRegenTime ) return false;
	
	m_nFirst = 0;	// 捞哩 贸澜捞 酒聪促.

	return true;
}

int CEventNpcCreate::CreateNpc()
{
	if( !IsCreateAble() ) return 0;

	const int nId = ::GetDeleteAbleNPC();
	if(0 <= nId)
	{//老馆 各捞 乐促搁
		::DeleteNpc( nId );
	}
	else
	{//瘤匡 荐 乐绰 阁胶磐啊 绝促搁
		::MyLog(0,"Critical Error Can't Get Normal Monster(CEventNpcCreate::CreateNpc())");
		return 0;
	}

	::NPC_Create( nId, m_nNpcNo, m_nMapX, m_nMapY, m_nNpcScriptNo, 0, GT_EVENT_NPC );
	m_bAlive = true;
	m_nNpcIndex = nId;

	return 1;
}

int CEventNpcCreate::CheckKillMonster( CHARLIST *pNpc )
{
	if( !IsAlive() ) return 0;
	if (m_nNpcIndex != pNpc->GetServerID()) return 0;
	//if( pNpc->generationtype != GT_EVENT_NPC ) return 0;
	m_bAlive = false;
	m_nDeadTime = g_curr_time;
	m_nNpcIndex = 0;
	return 1;
}

// 捞亥飘啊 场车绰单 巢酒 乐绰 npc绰 绝浚促.
int CEventNpcCreate::CheckClearCreatedNpc()
{
	if( IsEventActive() ) return 0;	// 捞亥飘啊 劝己拳 登绢 乐栏搁 救凳
	if( !IsAlive() ) return 0;		// 混酒 乐绰 仇捞 乐栏搁...
	if( m_nNpcIndex && NPCList[m_nNpcIndex].generationtype == GT_EVENT_NPC )
	{
		DeleteEventNpc();
	}
	return 1;
}

int CEventNpcCreate::DeleteEventNpc()
{
	// 傲 磷牢促. 酒捞袍篮 冻备瘤 臼绰促.
	if( !m_nNpcIndex ) return 0;
	::DeleteNpc( m_nNpcIndex );

	m_bAlive = false;
	m_nDeadTime = 0;
	m_nNpcIndex = 0;
	return 1;
}
/////////////////////////////////////////////////////////////////////////////////////
// CEventObject
extern int ReloadTOI( char *filename1, char *filename2 );
void CEventObject::RunEvent()
{
	::ReloadTOI( m_szObjectTOI, m_szObjectB );
}

/////////////////////////////////////////////////////////////////////////////////////
// CEventMessage
extern void BroadCastBBS_Sub( char *msg, int len );
int CEventMessage::CheckEvent()
{
	if( !IsEventActive() ) return 0;
	if( !m_nTime ) return 0;
	if( !m_lpszMessage ) return 0;
	int gab = g_curr_time - m_nLastTime;
	if( gab < m_nTime ) return 0;
	if( !m_bAll )
	{
		switch( m_nNation )
		{
			case 1 :	// 官捞辑胶
				if( MapInfo[MapNumber].nation != N_VYSEUS ) 
				{
					m_nTime = 0;		// 厚背甫 埃窜窍霸 场郴扁 困秦
					return 0;
				}
				break;
			case 2 :	// 磊捞戚
				if( MapInfo[MapNumber].nation != N_ZYPERN ) 
				{
					m_nTime = 0;
					return 0;
				}
				break;
			case 3 :	// 老胶
				if( MapInfo[MapNumber].nation != N_YILSE ) 
				{
					m_nTime = 0;
					return 0;
				}
				break;
		}
	}
	BroadCastBBS_Sub( m_lpszMessage, m_nMessageSize );
	m_nLastTime = g_curr_time;
	return 1;
}

/////////////////////////////////////////////////////////////////////////////////////
// CEventNpcScript
int CEventNpcScript::CheckEvent( int npc_index, short int cn )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return 0;

	if( !m_nScriptNo ) return 0;
	if( NPCList[npc_index].eventno != m_nScriptNo ) return 0;
	if( !m_nEventNpcItemBag ) return 0;

	if( m_nNumber )
	{
		// 叼厚 单阁栏肺 焊陈促啊 犬牢饶 贸府
		//
		k_event_script_item	data;
		data.event_no = m_nEventNo;
		data.server_id = cn;
		data.npc_index = npc_index;
		strcpy( data.name, ch->Name );
		strcpy( data.id, connections[cn].id );
		data.bag_num = m_nEventNpcItemBag;
		data.script_no = m_nScriptNo;
		data.result = 0;
		int size = sizeof( k_event_script_item );
		::SendPacketDefault( CMD_CHECK_EVENT_SCRIPT_ITEM, &data, size, DB_DEMON );		// 叼厚 单阁栏肺 焊郴 焊磊

		return 1;
	}
	else
	{
		// 酒捞袍阑 父甸绢 林绊 皋技瘤甫 焊辰促.
		::SendEventNpcScriptItem( cn, npc_index, m_nEventNpcItemBag, m_lpszMessage, m_nMessageSize );
	}
	return 1;
}

int SendEventNpcScriptItem( short int cn, int npc_index, int bag_num, char *message, int size )
{
	CHARLIST *ch = CheckServerId( cn );
	if( !ch ) return 0;
	CEventScriptItemBag *pItemBag = g_EventMgr.GetBagPoint( bag_num );
	if( !pItemBag ) return 0;
	int item_no = pItemBag->GetItemNumber();
	ItemAttr item = GenerateItem( item_no );
	if( !item.item_no ) return 0;

	int a, b, c;
	int ret = SearchInv( ch->inv, a, b, c );
	if( !ret ) return 0;		// 后磊府啊 绝促.

	// 酒捞袍阑 持绢 霖促.
	POS pos;
	SetItemPos( INV, a, b, c, &pos );
	ch->inv[a][b][c] = item;
	SendServerEachItem( &pos, &item, ch->GetServerID());

	if( message && size )		// npc狼 措拳甫 焊郴霖促.
		SendDial( cn, npc_index, message, size );

	return 1;
}

/////////////////////////////////////////////////////////////////////////////////////
// CEventMgr
int CEventMgr::CheckActiveEvent( int type )
{
	if( type & ET_EVENT_NPC_ITEM )
	{
		m_eventNpcItem.CheckActiveEvent();
	}
	if( type & ET_EVENT_NPC_CREATE )
	{
		m_eventNpcCreate.CheckActiveEvent();
	}
	if( type & ET_EVENT_OBJECT )
	{
		m_eventObject.CheckActiveEvent();
	}
	if( type & ET_EVENT_SOUND )
	{
		m_eventSound.CheckActiveEvent();
	}
	if( type & ET_EVENT_MESSAGE )
	{
		m_eventMessage.CheckActiveEvent();
	}


	return 1;
}

int CEventMgr::CheckNpcItem( CHARLIST *pNpc )
{
	m_eventNpcItem.m_listActive.SetFind();
	while(  m_eventNpcItem.m_listActive.FindNext() )
	{
		int index = m_eventNpcItem.m_listActive.GetFind();
		if( m_eventNpcItem.GetNpcNo(index) == pNpc->npc_index )
		{
			// 酒捞袍 包访
			m_eventNpcItem.m_pEvent[index].DropNpcItem( pNpc );
		}
	}

	// 咀萍宏 登绢 乐绰 捞亥飘甫 茫酒辑 秦寸 npc啊 磷菌澜阑 技泼茄促.
	if( pNpc->generationtype == GT_EVENT_NPC )
	{
		m_eventNpcCreate.m_listActive.SetFind();
		while( m_eventNpcCreate.m_listActive.FindNext() )
		{
			int index = m_eventNpcCreate.m_listActive.GetFind();
			m_eventNpcCreate.GetEventPoint( index )->CheckKillMonster( pNpc );
		}
	}

	return 1;
}

int CEventMgr::IsActive( int type )
{
	if( type & ET_EVENT_NPC_ITEM )
	{
		return m_eventNpcItem.IsActive();
	}
	if( type & ET_EVENT_NPC_CREATE )
	{
		return m_eventNpcCreate.IsActive();
	}
	if( type & ET_EVENT_OBJECT )
	{
		return m_eventObject.IsActive();
	}
	if( type & ET_EVENT_SOUND )
	{

⌨️ 快捷键说明

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