📄 eventmgr.cpp
字号:
#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 + -