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

📄 protocol.h

📁 网络游戏魔域源代码 测试可以完整变异
💻 H
字号:
// protocol.h
// 仙剑修,2002.10.23
//////////////////////////////////////////////////////////////////////

#ifndef	PROTOCOL_H
#define	PROTOCOL_H

#include <string.h>
#include "define.h"
#ifdef MAPGROUP_KERNEL
#include "UserData.h"
#endif

enum{
		//////////////////////////////////////////////////////////////////////
		// 地图组或世界处理的消息
		KERNEL_BASE					= 1000,
		KERNEL_CLIENTMSG			= KERNEL_BASE + 1,				// CLIENTMSG_PACKET0(size:1024+12), 客户端上传的消息。
		KERNEL_NPCMSG				= KERNEL_BASE + 2,				// NPCMSG_PACKET0(size:1024+12), NPC服务器上传的消息。
		KERNEL_CLOSEKERNEL			= KERNEL_BASE + 3,				// INT, SOCKET_ID。通知核心关闭(核心必须再次通知SOCKET层!!!)
		KERNEL_CREATESYNDICATE		= KERNEL_BASE + 10,				// CreateSyndicateInfo
		KERNEL_DESTROYSYNDICATE		= KERNEL_BASE + 11,				// OBJID
		KERNEL_CHANGESYNDICATE		= KERNEL_BASE + 12,				// SynFuncInfo0
		KERNEL_COMBINESYNDICATE		= KERNEL_BASE + 13,				// OBJID+OBJID
		KERNEL_SUPERMANLIST			= KERNEL_BASE + 14,				// OBJID+int, to world: 添加或查询某人的排名。to mapgroup: 更新某人的排行
		KERNEL_QUERYSUPERMANLIST	= KERNEL_BASE + 15,				// OBJID+int, 下传排名名单。


		//////////////////////////////////////////////////////////////////////
		// 由地图组核心处理的消息
		MAPGROUP_BASE				= 10000,
		MAPGROUP_LOGIN				= MAPGROUP_BASE + 1,			// ST_LOGIN, 玩家登录。
		MAPGROUP_BROADCASTMSG		= MAPGROUP_BASE + 2,			// CLIENTMSG_PACKET0(size:1024+12), 转发广播消息。
		MAPGROUP_SOCKETUSERINFO		= MAPGROUP_BASE + 3,			// ST_USERCHANGEMAPGORUP。STRUCT(SOCKET_ID,UserInfoStruct),玩家换地图组。
		MAPGROUP_SENDOBJINFO		= MAPGROUP_BASE + 4,			// CHANGEMAPGORUP_INFO0{id,type,info}
		MAPGROUP_TRANSMITMSG		= MAPGROUP_BASE + 5,			// TRANSMSG_PACKET0(size:1024+16), 转发广播消息。
		MAPGROUP_CHANGEMAPGROUP		= MAPGROUP_BASE + 10,			// ST_CHANGEMAPGROUP。玩家换地图组。
		MAPGROUP_CREATENEWNPC		= MAPGROUP_BASE + 11,			// ST_CREATENEWNPC。创建一个新NPC。
		MAPGROUP_CHANGETEAM			= MAPGROUP_BASE + 12,			// ST_CHANGETEAM, 转发TEAM修改OPERATION。
		MAPGROUP_REMOTECALL			= MAPGROUP_BASE + 13,			// REMOTE_CALL0, 转发给USER。
		MAPGROUP_CHANGENPC			= MAPGROUP_BASE + 14,			// int+str+str, 转发NPC修改OPERATION。
		MAPGROUP_DELTRANSNPC		= MAPGROUP_BASE + 15,			// int, 转发删除TRANS_NPC
		MAPGROUP_DELALLMONSTER		= MAPGROUP_BASE + 16,			// int, 删除所有怪物,以便接收新怪物。同时发到SOCKET_KERNRL
		MAPGROUP_SETMAPSYNID		= MAPGROUP_BASE + 17,			// idMap+idSyn, 修改某地图的占领帮派
		MAPGROUP_LOADALLPET			= MAPGROUP_BASE + 18,			// int, 重新装载所有帮派守护兽
		MAPGROUP_RPC				= MAPGROUP_BASE + 19,			// CEventPack, 转发给指定对象。
		MAPGROUP_TRANSMITMSG_FORCHATROOM = MAPGROUP_BASE + 20,		// 聊天室消息


		//////////////////////////////////////////////////////////////////////
		// 由世界核心处理的消息
		WORLD_BASE					= 20000,
		WORLD_SHELLTALK				= WORLD_BASE + 1,				// STRING, 外壳发送TALK消息。
		WORLD_SETPROCESSID			= WORLD_BASE + 2,				// CHANGE_USERDATA, 设置新的PROCESS_ID
		WORLD_CLOSESOCKET			= WORLD_BASE + 3,				// INT, SOCKET_ID,核心通知SOCKET关闭(SOCKET不再通知核心)
		WORLD_USERNAMEMSG			= WORLD_BASE + 4,				// USERNAMEMSG_PACKET0(size:1024+16+12), 按名字转发给玩家。
		WORLD_USERIDMSG				= WORLD_BASE + 5,				// USERIDMSG_PACKET0(size:1024+4+12), 按ID转发给玩家。
		WORLD_LEVELUP				= WORLD_BASE + 6,				// OBJID, 玩家升到10级。
		WORLD_QUERYFEE				= WORLD_BASE + 7,				// OBJID, ACCOUNT ID。
		WORLD_SENDTIME				= WORLD_BASE + 8,				// INT, SOCKET_ID
		WORLD_TRANSMITMSG			= WORLD_BASE + 9,				// TRANSMSG_PACKET0(size:1024+16), 转发消息。


		//////////////////////////////////////////////////////////////////////
		// 由SOCKET核心处理的消息
		SOCKET_BASE					= 30000,
		SOCKET_CLOSESOCKET			= SOCKET_BASE + 1,				// INT, SOCKET_ID,核心通知SOCKET关闭(SOCKET不再通知核心)
		SOCKET_SETPROCESSID			= SOCKET_BASE + 2,				// CHANGE_USERDATA, 设置新的PROCESS_ID
			//!!! 核心发送该消息时,要同时更新CUSER中的PROCESS_ID标志。核心在处理KERNEL_CLIENTMSG时,一定要检查PROCESS_ID是否匹配!!!
		SOCKET_SENDCLIENTMSG		= SOCKET_BASE + 3,				// SENDCLIENTMSG_PACKET0(size:1024+12), 发向客户端和NPC服务器的消息。
		SOCKET_SENDNPCMSG			= SOCKET_BASE + 4,				// SENDNPCMSG_PACKET0(size:1024+12), 发向客户端和NPC服务器的消息。
		SOCKET_SETNPCSOCKETID		= SOCKET_BASE + 5,				// INT, SOCKET_ID, 世界核心接收到NPC服务器的登录消息时,通知SOCKET核心。(可能为SOCKET_NONE)
		SOCKET_SETNPCPROCESSID		= SOCKET_BASE + 6,				// CHANGE_NPCPROCESSID, 设置新的PROCESS_ID
		SOCKET_CHANGECODE			= SOCKET_BASE + 7,				// CHANGE_USERDATA。修改动态密码。
		SOCKET_BREAKCONNECT			= SOCKET_BASE + 8,				// INT, SOCKET_ID, 踢玩家时,先断开SOCKET连接。
		SOCKET_BREAKALLCONNECT		= SOCKET_BASE + 11,				// INT, GM_SOCKET_ID, 踢所有玩家,禁止所有连接。


		//////////////////////////////////////////////////////////////////////
		// 由外壳处理的消息
		SHELL_BASE					= 40000,
		SHELL_PRINTTEXT				= SHELL_BASE + 1,				// STRING, 核心发送的TEXT消息
		SHELL_KERNELSTATE			= SHELL_BASE + 2,				// STRING, 核心发送的STATE串,多行
		

		//////////////////////////////////////////////////////////////////////
		// 由数据库核心处理的消息
		DB_BASE						= 50000,
		DB_QUERY_USERINFO			= DB_BASE + 1,

		DB_MSG_BASEINFO				= DB_BASE + 101,
		DB_MSG_FRIENDS				= DB_BASE + 102,
		DB_MSG_ENEMYS				= DB_BASE + 103,
		DB_MSG_ITEMS				= DB_BASE + 104,
		DB_MSG_WEAPON_SKILL			= DB_BASE + 105,
		DB_MSG_MAGICS				= DB_BASE + 106,
		DB_MSG_SYNATTR				= DB_BASE + 107,
};

struct CLIENTMSG_PACKET0			// 接收的CLIENT消息
{
	SOCKET_ID		idSocket;			// SOCKET_ID
	OBJID	idPacket;
	int		nSize;
	char	buf[1];				// 用于结构指针,不需要空间
};

struct NPCMSG_PACKET0			// 接收的NPC消息
{
	OBJID	idNpc;
	OBJID	idPacket;
	int		nSize;
	char	buf[1];				// 用于结构指针,不需要空间
};

struct SENDCLIENTMSG_PACKET0
{
	SOCKET_ID		idSocket;			// SOCKET_ID
	OBJID	idPacket;
	int		nSize;
	char	buf[1];				// 用于结构指针,不需要空间
};

struct SENDNPCMSG_PACKET0
{
	OBJID	idNpc;				// 广播消息用BCAST_NPCID
	OBJID	idPacket;
	int		nSize;
	char	buf[1];				// 用于结构指针,不需要空间
};

struct TRANSMSG_PACKET0			// 转发给其它进程处理的消息
{
	SOCKET_ID		idSocket;			// SOCKET_ID
	OBJID			idNpc;				// 同时支持NPC的消息
	OBJID	idPacket;
	int		nSize;
	int		nTrans;				// 附加数据
	char	buf[1];				// 用于结构指针,不需要空间
};

struct USERNAMEMSG_PACKET0			// 让WORLD转发的消息,按名字转发
{
	SOCKET_ID		idSocket;			// SOCKET_ID
	OBJID	idPacket;
	int		nSize;
	char	szName[_MAX_NAMESIZE];		// 转发给该玩家
	char	buf[1];				// 用于结构指针,不需要空间
};

struct USERIDMSG_PACKET0			// 让WORLD转发的消息,按ID转发
{
	SOCKET_ID		idSocket;			// SOCKET_ID
	OBJID	idPacket;
	int		nSize;
	OBJID	idUser;				// 转发给该玩家
	char	buf[1];				// 用于结构指针,不需要空间
};


struct CHANGE_USERDATA
{
	SOCKET_ID	idSocket;
	int			nData;
};

struct CHANGE_NPCPROCESSID
{
	SOCKET_ID	idNpc;
	PROCESS_ID	idProcess;		// 为SOCKET_NONE时为删除
};

struct ST_LOGIN
{
	SOCKET_ID	idSocket;
	OBJID		idUser;
};

#ifdef MAPGROUP_KERNEL
struct ST_USERCHANGEMAPGORUP
{
	SOCKET_ID	idSocket;
	UserInfoStruct		info;
};
#endif

struct CHANGEMAPGORUP_INFO0
{
	OBJID		idUser;
	int			nInfoType;
	char		info[1];
};

struct CHANGE_MAPGROUP
{
	OBJID		idUser;
	PROCESS_ID	idProcess;
};

struct ST_CHANGEMAPGROUP
{
	OBJID		idUser;
	OBJID		idMap;
	int			nPosX;
	int			nPosY;
};

struct ST_CREATENEWNPC
{
	OBJID			id;
	OBJID			idMap;
	OBJID			idData;
	OBJID			idOwner;
	int				nData;
	unsigned short	usPosX;
	unsigned short	usPosY;
	unsigned short	usAction;
	unsigned short	usType;
	unsigned char	ucOwnerType;
};

struct CreateSyndicateInfo
{
	OBJID		idSyn;
	NAMESTR		szName;
	TENETSTR	szTenet;
	NAMESTR		szLeaderTitle;
	NAMESTR		szMemberTitle;
	OBJID		idLeader;
	NAMESTR		szLeader;
	int			nMoney;
	OBJID		idFealty;
	int			nMantle;
	int 		nSynFlag;//0:总团,1:分团,2:分队
};

struct	SynFuncInfo0
{
	OBJID			idSyn;
	union {
		struct {
			int		nRank;				//帮派成员的军衔
			int		nSynMemberLevel;	//帮派成员级别
		};
		struct {
			DWORD	dwData[2];	
		};
	};
	unsigned short	nSize;
	unsigned char	ucFuncType;
	unsigned char	ucSaveFlag;
	union{
		long		IntParam[1];
		char		StrParam[1];
	};
};

struct ST_CHANGETEAM
{
	int				nAction;
	OBJID			idTeam;
	OBJID			idUser;
	int				nData;		// idSocket or (x,y)
};

struct	REMOTE_CALL0
{
	OBJID			idUser;
	unsigned short	nSize;
	unsigned char	ucFuncType;
	union{
		long		IntParam[1];
		char		StrParam[1];
	};
};

struct	VARIANT_SET0
{
	long		m_setLong[1];
	long&		IntParam(int idx)			{ return m_setLong[idx]; }
	char*		StrParam(int idx)			{ return (char*)&m_setLong[idx]; }
};


/////////////////////////////////////////
// DBService用	-- zlong 2004.09.06

struct	ST_QUERY_USERINFO
{
	OBJID	idUser;
};

const int		_MEDAL_BUFSIZE		= 64+1;
const int		_TITLE_BUFSIZE		= 64+1;

struct	ST_DB_USERINFO
{
	OBJID	idUser;

	// 以下为了4字节对齐,没有按照原来的顺序
	DWORD	dwCoin_money;
	DWORD	dwLast_login;
	DWORD	dwLookface;
	DWORD	dwHair;
	char	setMedal[_MEDAL_BUFSIZE];
	UCHAR	ucLevel;
	UCHAR	ucMetempsychosis;
	UCHAR	ucNobility;
	DWORD	dwMedal_select;

	char	setTitle[_TITLE_BUFSIZE];
	UCHAR	ucProfession;
	UCHAR	ucAdditional_point;
	UCHAR	ucAuto_allot;
	DWORD	dwTitle_select;

	DWORD	dwMoney;
	DWORD	dwMoney_saved;
	USHORT	usRecordX;
	USHORT	usRecordY;
	//OBJID	id;
	OBJID	idAccount;
	OBJID	idRecordmap;
	OBJID	idSyndicate;
	int		nDeed;
	int		nExp;

	DWORD	dwTaskMask;
	DWORD	dwVirtue;
	OBJID	idHome;
	DWORD	dwLockKey;
	//DWORD	dwCurrLockKey;
	char	szMate[_MAX_NAMESIZE];
	char	szName[_MAX_NAMESIZE];
	USHORT	usForce;
	USHORT	usConstitution;
	USHORT	usHealth;
	USHORT	usLife;
	USHORT	usMana;
	USHORT	usSoul;
	USHORT	usSpeed;
	SHORT	sPk;
};

struct	ST_DB_FRIEND_INFO
{
		OBJID	id;
		OBJID	idUser;
		OBJID	idFriend;
		char	szFriendName[_MAX_NAMESIZE];
};

struct	ST_DB_FRIEND
{
	OBJID	idUser;

	int		nAmount;
	ST_DB_FRIEND_INFO	setFriends[1];
};

struct	ST_DB_ENEMY
{
	OBJID	idUser;
};

struct	ST_DB_ITEMINFO
{
	OBJID	id;

};
struct	ST_DB_ITEM
{
	OBJID	idUser;

	int		nAmount;
	ST_DB_ITEMINFO	setItems[1];
};

struct	ST_DB_WEAPON_SKILL
{
	OBJID	idUser;
};

struct	ST_DB_MAGIC
{
	OBJID	idUser;
};

struct	ST_DB_SYNATTR
{
	OBJID	idUser;
};



//////////////////////////////////////////////////////////////////////
// C/S 协议的客户端部分	

// 该部分常量、定义仅由以下两个函数使用
const int	PROTOCOL_MSG_HEADSIZE		= 4;
struct CProtocolMsgStruct{
	unsigned short	nMsgSize;
	unsigned short	idPacket;
	char			pMsg[1];
};

// 分解消息包
// return: netpacket size
inline int	SplitPacket(const char* pBuf, int nBufLen, OBJID* pidPacket, char** ppMsg, int* pMsgSize)
{
	if(nBufLen > PROTOCOL_MSG_HEADSIZE)
	{
		CProtocolMsgStruct*	pMsgPtr = (CProtocolMsgStruct*)pBuf;
		if(pMsgPtr->nMsgSize <= nBufLen)
		{
			if(pMsgPtr->nMsgSize < 4 || pMsgPtr->nMsgSize > MAX_PACKETSIZE)
				return 0;

			*pidPacket	= pMsgPtr->idPacket;
			*pMsgSize	= pMsgPtr->nMsgSize - PROTOCOL_MSG_HEADSIZE;
			*ppMsg		= pMsgPtr->pMsg;
			return pMsgPtr->nMsgSize;
		}
	}
	return 0;
}

// 合成消息包
// return: netpacket size
inline int	UnitePacket(char* pBuf, int nBufLen, OBJID idPacket, const char* pMsg, int nMsgSize)
{
	if(nBufLen >= nMsgSize + PROTOCOL_MSG_HEADSIZE)
	{
		CProtocolMsgStruct*	pMsgPtr = (CProtocolMsgStruct*)pBuf;
		pMsgPtr->idPacket		= (unsigned short)idPacket;
		pMsgPtr->nMsgSize		= nMsgSize + PROTOCOL_MSG_HEADSIZE;
		memcpy(pMsgPtr->pMsg,	pMsg, (size_t)nMsgSize);
		return pMsgPtr->nMsgSize;
	}
	return 0;
}

//////////////////////////////////////////////////////////////////////
// C/S 协议的NPC部分	

// 该部分常量、定义仅由以下两个函数使用
const int	PROTOCOL_NPCMSG_HEADSIZE		= 8;
struct CProtocolNpcMsgStruct{
	unsigned short	nMsgSize;
	unsigned short	idPacket;
	unsigned long	idNpc;
	char			pMsg[1];
};

// 分解消息包
// return: netpacket size
inline int	SplitNpcPacket(const char* pBuf, int nBufLen, OBJID* pidPacket, char** ppMsg, int* pMsgSize, OBJID* pidNpc)
{
	if(nBufLen > PROTOCOL_NPCMSG_HEADSIZE)
	{
		CProtocolNpcMsgStruct*	pMsgPtr = (CProtocolNpcMsgStruct*)pBuf;
		if(pMsgPtr->nMsgSize <= nBufLen)
		{
			if(pMsgPtr->nMsgSize < 4 || pMsgPtr->nMsgSize > MAX_PACKETSIZE)
				return 0;

			*pidPacket	= pMsgPtr->idPacket;
			*pMsgSize	= pMsgPtr->nMsgSize - PROTOCOL_NPCMSG_HEADSIZE;
			*pidNpc		= pMsgPtr->idNpc;
			*ppMsg		= pMsgPtr->pMsg;
			return pMsgPtr->nMsgSize;
		}
	}
	return 0;
}

// 合成消息包
// return: netpacket size
inline int	UniteNpcPacket(char* pBuf, int nBufLen, OBJID idPacket, const char* pMsg, int nMsgSize, OBJID idNpc)
{
	if(nBufLen >= nMsgSize + PROTOCOL_NPCMSG_HEADSIZE)
	{
		CProtocolNpcMsgStruct*	pMsgPtr = (CProtocolNpcMsgStruct*)pBuf;
		pMsgPtr->idPacket		= (unsigned short)idPacket;
		pMsgPtr->nMsgSize		= nMsgSize + PROTOCOL_NPCMSG_HEADSIZE;
		pMsgPtr->idNpc			= idNpc;
		memcpy(pMsgPtr->pMsg,	pMsg, (size_t)nMsgSize);

		return pMsgPtr->nMsgSize;
	}
	return 0;
}


#endif // PROTOCOL_H

⌨️ 快捷键说明

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