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

📄 eventmgr.h

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 H
字号:
#include "dungeon.h"


#ifndef __EVENTMGR_H__
#define __EVENTMGR_H__

/////////////////////////////////////////////////////////////////////////////
#define MAX_SCRIPT_ITEM	15
class CEventScriptItemBag		// npc啊 唱床临 酒捞袍 啊规, CEventMgr俊辑 荤侩茄促.
{
public :
	int m_nBagNumber;
	int m_aItemNo[MAX_SCRIPT_ITEM];
	int m_nCount;
public :
	CEventScriptItemBag()
	{
		for( int i=0; i<MAX_SCRIPT_ITEM; i++ )
		{
			m_aItemNo[i] = 0;
		}
		m_nCount = 0;
		m_nBagNumber = 0;
	}
	void Count()
	{
		m_nCount = 0;
		while( m_aItemNo[m_nCount] ) m_nCount++;
	}
	int GetItemNumber()
	{
		if( !m_nCount ) return 0;
		return m_aItemNo[rand()%m_nCount];
	}
};


///////////////////////////////////////////////////////////////////////////////

class CEventTime
{
public :
	int m_nEventNo;
	int m_nEventActive;

	CTime m_timeStart;
	CTime m_timeEnd;



public :
	CEventTime()
	{
		Remove();
	}
	~CEventTime()
	{
		Remove();
	}

	void Remove()
	{
		m_timeStart = 0;
		m_timeEnd = 0;
	}

	int CheckActive();
	int IsEventActive() { return m_nEventActive; }
	int SetTime( TIMESTAMP_STRUCT *pStart, TIMESTAMP_STRUCT *pEnd );
	virtual void RunEvent() { return; }
};

class CEventNpcItem	: public CEventTime		// 酒捞袍阑 眠啊肺 冻绢哆妨 霖促.
{
public :
	int m_nNpcNo;			// 酒捞袍阑 冻奔 阁胶磐 锅龋
	int m_nPercent;			// 酒捞袍阑 冻绢 哆副 犬伏
	int m_nMax;				// 醚 捞亥飘 酒捞袍 ( 捞 捞惑 酒捞袍捞 唱坷搁 救等促.
	int m_nItemNo;
	int m_nItemMutant;
	int m_nItemGrade;

	int m_nAmount;		// 泅犁鳖瘤 殿厘茄 酒捞袍 荐

public :
	CEventNpcItem()
	{
		m_nNpcNo = 0;
		m_nPercent = 0;
		m_nMax = 0;
		m_nItemNo = 0;
		m_nItemMutant = 0;
		m_nItemGrade = 0;
		m_nAmount = 0;
	}

	int DropNpcItem( CHARLIST *pNpc );
};


class CEventNpcCreate : public CEventTime	// 捞亥飘侩 npc甫 积己矫挪促.
{
public :
	int m_nMapX;
	int m_nMapY;
	int m_nNpcNo;
	int m_nNpcScriptNo;
	int m_nNpcMany;
	int m_nRegen;			// 府哩且 醚 冉荐 --> 老窜 府哩 窍衬 救窍衬父 巢败敌促.
	//int m_nRegenCount;		// 泅犁鳖瘤 府哩等 墨款飘
	int m_nRegenTime;

	int m_nFirst;
	bool m_bAlive;			// 混酒 乐绰瘤 磷菌绰瘤
	int m_nDeadTime;		// 磷篮 版苞 矫埃
	int m_nNpcIndex;		// 积己等 牢郸胶... 捞亥飘啊 场唱搁 瘤况霖促.

public :
	CEventNpcCreate()
	{
		m_nMapX = 0;
		m_nMapY = 0;
		m_nNpcNo = 0;
		m_nNpcScriptNo = 0;
		m_nNpcMany = 0;
		m_nRegen = 0;
		m_nRegenTime = 0;
		m_nDeadTime = 0;
		m_bAlive = 0;
		m_nFirst = 1;		// 盖贸澜栏肺 父靛绰 芭衬?
		m_nNpcIndex = 0;
	}
	~CEventNpcCreate()
	{
		DeleteEventNpc();
	}

	bool IsAlive() { return m_bAlive; }
	int CreateNpc();
	bool IsCreateAble();
	int CheckKillMonster( CHARLIST *pNpc );
	int DeleteEventNpc();
	int CheckClearCreatedNpc();
};


class CEventObject: public CEventTime	// 捞亥飘 甘
{
public :
	static enum 
	{
		ACTIVE_NUMBER_ = 0x01,
	};

public :
	char m_szObjectTOI[30];
	char m_szObjectB[30];

public :
	CEventObject()
	{
		m_szObjectTOI[0] = 0;
		m_szObjectB[0] = 0;
	}
	virtual void RunEvent();
};


class CEventSound: public CEventTime	// 捞亥飘 甘
{
public :
	static enum 
	{
		ACTIVE_NUMBER_ = 0x02,
	};

public :
	int m_nSoundNo;
public :
	CEventSound()
	{
		m_nSoundNo = 0;
	}
};

class CEventMessage : public CEventTime
{
public :
	int m_bAll;				// 炼扒
	int m_nNation;			// 惫啊 炼扒
	int m_nTime;			// 皋矫瘤 林扁
	char *m_lpszMessage;	// 焊尘 皋技瘤
	int m_nMessageSize;
	DWORD m_nLastTime;		// 付瘤阜栏肺 皋技瘤 焊辰 矫埃

public :
	CEventMessage()
	{
		m_lpszMessage = 0;
		Reset();
	}
	~CEventMessage()
	{
		Reset();
	}
	int Reset()
	{
		SAFE_DELETE_ARRAY(m_lpszMessage);
		m_bAll = 0;
		m_nNation = 0;
		m_nTime = 0;
		m_nLastTime = 0;
		m_nMessageSize = 0;
		return 1;
	}
	void SetMessage( char *msg, int size )
	{
		if( !size ) return;
		SAFE_DELETE_ARRAY(m_lpszMessage);
		m_lpszMessage = new char[size+1];
		strcpy( m_lpszMessage, msg );
		m_nMessageSize = size;
	}
	int CheckEvent();
};


class CEventNpcScript : public CEventTime		// 胶农赋飘甫 烹茄 酒捞袍 罐扁
{
public :
	int m_nScriptNo;
	int m_nNumber;				// 茄 拌沥寸 茄俺牢瘤 酒囱瘤..
	int m_nEventNpcItemBag;		// 力傍且 酒捞袍 抛捞喉 锅龋

	int m_nMessageSize;			
	int m_nMessageSize2;

	char *m_lpszMessage;		// NPC啊 秦具 窍绰 富
	char *m_lpszMessage2;		// 酒捞袍阑 给 临锭 npc啊 秦具 且 富

public :
	CEventNpcScript()
	{
		m_lpszMessage = 0;
		m_lpszMessage2 = 0;
		Reset();
	}
	~CEventNpcScript() { Reset(); }
	int Reset()
	{
		SAFE_DELETE_ARRAY(m_lpszMessage);
		SAFE_DELETE_ARRAY(m_lpszMessage2);
		m_nMessageSize = 0;
		m_nMessageSize2 = 0;
		m_nScriptNo = 0;
		m_nNumber = 0;
		m_nEventNpcItemBag = 0;
		return 1;
	}
	void SetMessage( char *msg, int size )
	{
		if( !size ) return;
		SAFE_DELETE_ARRAY(m_lpszMessage);
		m_lpszMessage = new char[size+1];
		strcpy( m_lpszMessage, msg );
		m_nMessageSize = size;
	}
	void SetMessage2( char *msg, int size )
	{
		if( !size ) return;
		SAFE_DELETE_ARRAY(m_lpszMessage2);
		m_lpszMessage2 = new char[size+1];
		strcpy( m_lpszMessage2, msg );
		m_nMessageSize2 = size;
	}
	int CheckEvent( int npc_index, short int cn );		// 秦寸 胶农赋飘 锅龋甫 啊瘤绊 眉农茄促.	
};

class CEventMoveMap	: public CEventTime		// 捞亥飘 甘栏肺 捞悼
{
public :
	int m_bAll;
	int m_nSex;
	int m_nClass;
	int m_nNation;
	char m_szMap[20];
	int m_nMapX;
	int m_nMapY;
	int m_nMax;
	
public :
	int Reset()
	{
		m_bAll=0;
		m_nSex=0;
		m_nClass=0;
		m_nNation=0;
		m_nMapX=0;
		m_nMapY=0;
		m_nMax=0;
		m_szMap[0] = 0;
		return 1;
	}
	CEventMoveMap()
	{
		Reset();
	}
};

/////////////////////////////////////////////////////////////////
template <class T1> class TEventMgrBasic
{
public :
	T1 *m_pEvent;
	int m_nEventCount;
	TKeinList<int> m_listActive;
	int m_nActive;

public :
	TEventMgrBasic()
	{
		m_pEvent = 0;
		Reset();
	}
	~TEventMgrBasic()
	{
		Reset();
	}
	void Reset()
	{
		SAFE_DELETE_ARRAY(m_pEvent);
		m_pEvent = 0;
		m_nEventCount = 0;
		ClearActive();
	}
	void Set( int count )
	{
		Reset();
		m_pEvent = new T1[count];
		m_nEventCount = count;
	}
	void ClearActive()
	{
		m_nActive = 0;
		m_listActive.clear();
	}
	void CheckActiveEvent()
	{
		ClearActive();
		for( int i=0; i<m_nEventCount; i++ )
		{
			if( m_pEvent[i].CheckActive() )
			{
				m_nActive++;
				m_listActive.AddNode( i );
			}
		}
		if( IsActive() )
		{
			GetActiveEvent()->RunEvent();
		}
	}
	bool IsActive() { return m_nActive?true:false; }
	void Init( int index, T1 *data )
	{
		m_pEvent[index] = *data;
	}
	int GetNpcNo( int index ) { return m_pEvent[index].m_nNpcNo; }
	T1 *GetEventPoint( int index )
	{
		return &m_pEvent[index];
	}
	T1 *GetActiveEvent()		// 盖贸澜 咀萍宏 等 器牢飘甫 掘绢 柯促.
	{
		if( !IsActive() ) return 0;
		m_listActive.SetFind();
		m_listActive.FindNext();
		m_listActive.GetFind();
		return GetEventPoint( m_listActive.GetFind() );
	}
};


/////////////////////////////////////////////////////

class CEventMgr
{
public :
	enum
	{
		ET_EVENT_ALL		= 0xFFFFFFFF,
		ET_EVENT_NPC_ITEM	= 0x00000001,
		ET_EVENT_NPC_CREATE = 0x00000002,
		ET_EVENT_OBJECT		= 0x00000004,
		ET_EVENT_SOUND		= 0x00000008,
		ET_EVENT_MESSAGE	= 0x00000010,
	};

public :
	TEventMgrBasic<CEventNpcItem> m_eventNpcItem;
	TEventMgrBasic<CEventNpcCreate> m_eventNpcCreate;
	TEventMgrBasic<CEventObject> m_eventObject;
	TEventMgrBasic<CEventSound> m_eventSound;
	TEventMgrBasic<CEventMessage> m_eventMessage;
	TEventMgrBasic<CEventNpcScript> m_eventNpcScript;
	TEventMgrBasic<CEventMoveMap> m_eventMoveMap;
	
	
	CEventScriptItemBag	*m_pItemBag;
	int m_nItemBagCount;
	

public :
	CEventMgr()
	{
		m_pItemBag = 0;
		SetItemBagCount( 0 );
	}
	
	int LoadNpcItem();
	int LoadNpcCreate();
	int LoadEventMap();
	int LoadEventSound();
	int LoadEventMessage();
	int LoadEventNpcScript();
	int LoadItemBag();
	int LoadEventMoveMap();

	int CheckNpcItem( CHARLIST *pNpc );
	int CheckActiveEvent( int type );
	int IsActive( int type );
	int CheckCloseEvent( int type );
	int Proc();
	int LoadEvent()
	{
		LoadNpcItem();
		LoadNpcCreate();
		LoadEventMap();
		LoadEventSound();
		LoadEventMessage();
		LoadEventNpcScript();
		LoadItemBag();
		LoadEventMoveMap();
		return 1;
	}
	void *GetActiveEvent( int type );
	int CheckScriptNo( int item_index, short int cn );

	// 酒捞袍 啊规俊 包访等 窃荐甸
	void SetItemBagCount( int count )
	{
		if( m_pItemBag ) delete [] m_pItemBag;
		if( !count )
		{
			m_pItemBag = 0;
			m_nItemBagCount = 0;
			return;
		}
		m_pItemBag = new CEventScriptItemBag[count];
		m_nItemBagCount = count;
	}	
	CEventScriptItemBag	*GetBagPoint( int bag_number )
	{
		for( int i=0; i<m_nItemBagCount; i++ )
		{
			if( m_pItemBag[i].m_nBagNumber == bag_number ) return &m_pItemBag[i];
		}
		return NULL;
	}
	CEventScriptItemBag	*GetBagPointByIndex( int index ) { return &m_pItemBag[index]; }
	CEventNpcScript *GetEventNpcScript( int script_no );
	CEventNpcScript *GetEventNpcScriptByEventNo( int event_no );
	CEventMoveMap *GetEventMoveMapPoint( int event_no );

};





/////////////////////////////////////////////////////////////////////////

// 021117 YGI
class CLightVersion
{
public :
	// 甘 捞悼 包访	// 甘包访篮 辑滚肺 颗变促.
	string *m_szlpMap;
	int m_nCount;

public :
	CLightVersion()
	{
		m_nCount = 0;
		m_szlpMap = 0;
	}
	~CLightVersion()
	{
		Clear();
	}
	void Clear()
	{
		m_nCount =0;
		SAFE_DELETE_ARRAY(m_szlpMap);
	}		
	int LoadLightVersionMap();
	bool IsAbleMapMove( CHARLIST *ch, const char *mapname );
	bool IsLightVersion( CHARLIST *ch );
};

///////////////////////////////////////////////////////////////////////////
// 030624 YGI
class CEventFlagMgr		// 捞亥飘 包访 敲饭弊甸
{
public : 
	bool m_bMoveMapWhenDie;		// 磷阑 版快 官冰栏肺 泼变促.
	bool m_bSaveLogAboutSaveUserData;	// 030919 HK YGI

public :
	CEventFlagMgr()
	{
		m_bMoveMapWhenDie = 0;
		m_bSaveLogAboutSaveUserData = 0;	// 030919 HK YGI
	}
	bool IsMoveMapWhenDie() const
	{
		return m_bMoveMapWhenDie;
	}
	void SetMoveMapWhenDie( bool flag )
	{
		m_bMoveMapWhenDie = flag;
	}
	// 030919 HK YGI
	void InitSaveLogFlag();
	bool IsSaveLogWhenSaveUserData() 
	{
		return m_bSaveLogAboutSaveUserData;
	}
};
extern CEventFlagMgr g_EventFlagMgr;



extern CLightVersion g_LightVersion;

extern int MakeAndSetItem( ItemAttr *item, int item_no, int item_mutant, int item_grade );
extern CEventMgr	g_EventMgr;
extern void SendSaveAmountEventNpcItem( int event_no, int amount );
extern int SendEventNpcScriptItem( short int cn, int npc_index, int bag_num, char *message, int size );

extern bool CheckContinueLine( char check );

///////////////////////////////////////////////////////////////////////////
// 040105 YGI 焊拱
class CEventFindTreasure
{
	POINTS *m_pXY;		// 焊拱 谅钎
	int m_nXYCount;		// 荐樊

public :
	CEventFindTreasure()
	{
		m_pXY = 0;
		m_nXYCount = 0;
	}
	~CEventFindTreasure()
	{
		Clear();
	}
	bool Clear()
	{
		if( m_pXY ) delete [] m_pXY;
		m_pXY = 0;
		m_nXYCount = 0;
		return true;
	}
	bool SetBuffer( int size )
	{
		if( size < 0 ) return false;
		m_pXY = new POINTS[size];
		m_nXYCount = size;
		return true;
	}
	int SetPoint( int index, int x, int y )
	{
		if( index > m_nXYCount ) return false;
		m_pXY[index].x = x;
		m_pXY[index].y = y;
		return true;
	}
	int IsEvent()		// 捞亥飘 吝牢啊?
	{
		return m_nXYCount;
	}
	int CheckXY( int x, int y )		// 焊拱捞 汞腮镑牢啊?
	{
		if( !IsEvent() ) return -1;
		for( int i=0; i<m_nXYCount; i++ )
		{
			if( m_pXY[i].x==x && m_pXY[i].y==y )
			{
				return i;
			}
		}
		return -1;
	}
};

class CTreasureGuardTBL		// 殿厘秦具 窍绰 阁胶磐
{
public :
	int *m_pNpcNo;
	int *m_pNpcCount;
	int m_nCount;
public : 
	CTreasureGuardTBL()
	{
		m_pNpcNo = 0;
		m_pNpcCount = 0;
		m_nCount = 0;
	}
	~CTreasureGuardTBL()
	{
		Reset();
	}
	void Reset()
	{
		if( m_pNpcNo ) delete [] m_pNpcNo;
		if( m_pNpcCount ) delete [] m_pNpcCount;
		m_pNpcNo = 0;
		m_pNpcCount = 0;
		m_nCount = 0;
	}
	void SetCount( int count )
	{
		m_nCount = count;
		m_pNpcNo = new int[count];
		m_pNpcCount = new int[count];
		memset( m_pNpcNo, 0, sizeof(int)*count);
		memset( m_pNpcCount, 0, sizeof(int)*count);
	}
	void Set( int index, int npc_no, int count )
	{
		if( index >= m_nCount ) return;
		if( index < 0 ) return;
		m_pNpcNo[index] = npc_no;
		m_pNpcCount[index] = count;
	}
};

enum TREASURE_MAP_ITEM
{
	LOW_LEVEL_MAP = 10276, // 檬鞭 瘤档
	MIDDLE_LEVEL_MAP = 10277,
	HIGH_LEVEL_MAP = 10278,
	UNKNOWN_MAP = 10279,
	TREASURE_BOX = 10280,	// 焊拱惑磊
};

class CTreasureGuardMgr
{
public :
	typedef map< int, POINTS > MAP_GUARD;	// points.x --> 焊拱 殿鞭, points.y --> 醚 阁胶磐 荐
	typedef MAP_GUARD::iterator ITOR_MAP_GUARD;

	MAP_GUARD m_Data;

public :
	CTreasureGuardMgr() { }
	~CTreasureGuardMgr()
	{
		m_Data.clear();
	}
	bool IsEvent( int index )		// 捞亥飘 柳青 吝牢啊?
	{
		ITOR_MAP_GUARD itor = m_Data.find(index);
		if (itor != m_Data.end())
		{
			return true;
		}
		return false;
	}
	int AddNew( int index, POINTS data )
	{
		m_Data.insert( MAP_GUARD::value_type( index, data ) );
		return 1;
	}
	int CreateGuard( int index, int treasure_class, int x, int y, int cn );
	int KilledTreasureGuard( CHARLIST *user, CHARLIST *boss );
};



extern CTreasureGuardTBL g_TreasureGuardTBL[5];
extern CTreasureGuardMgr g_TreasureGuardMgr;


extern CEventFindTreasure g_EventFindTreasure;
extern CEventFlagMgr g_EventFlagMgr;
extern int IsTreasureMapItem( int item_no );

#endif

⌨️ 快捷键说明

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