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

📄 user.h

📁 网络游戏魔域的服务端与客户端完整源代码 包括详细的说明文档与开发日志
💻 H
📖 第 1 页 / 共 4 页
字号:
// User.h: interface for the CUser class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_USER_H__BF5C20F1_5DBE_4E65_9099_E96EFAD7ECBA__INCLUDED_1)
#define AFX_USER_H__BF5C20F1_5DBE_4E65_9099_E96EFAD7ECBA__INCLUDED_1

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#pragma warning(disable:4786)
#include "GameBlock.h"
#include "UserData.h"
#include "Friend.h"
#include "Tutor.h"
#include "Item.h"
#include "Timeout.h"
#include "SquareDeal.h"
#include "gamemap.h"
#include "battleSystem.h"
#include "UserWeaponSkill.h"
#include "Myheap.h"
#include "T_SingleObjSet2.h"
#include "T_SingleMap2.h"
#include "team.h"
#include "magic.h"
#include "math.h"
#include "Package.h"
#include "SynAttr.h"
#include "protocol.h"
#include "booth.h"
#include "autolink.h"
#include "Enemy.h"
#include "AutoPtr.h"
#include "UserPackage.h"
#include "Role.h"

#include <vector>
#include <deque>
using namespace std;

#include "UserTable.h"		// 各种表定义
#include "define.h"	// Added by ClassView

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

const int	_MAX_USERFRIENDSIZE				= 50;
const int	_MAX_TUTORSIZE					= 15;
const int	_MAX_MONEYLIMIT					= 1000000000;
const int	USER_PACKAGE_SIZE				= 20;							// 仓库最多存多少东西
const int	USERDROPITEM_RANGE				= 5;							// 自动掉
const int	USERDROPITEM_RANGE2				= 9;							// 手动扔
//const int	ARROW_FLY_ALT					= 60;							// 箭支飞行高度
const int	JUMP_ALT						= 200;							// 跳的最高高度
const int	FLY_ALT							= 100;							// 飞的最高高度
const int	PERCENT_DECDUR					= 5;							// 装备升级失败后渐耐久的几率
const int	CRIME_KEEP_SECS					= 30;							// 犯罪维持时间
const int   SELF_DEFENCE_SECS               = 20;                           // 正当防卫持续时间
const int	SYNCRIME_KEEP_SECS				= 30;							// 帮派犯罪维持时间
const int	MAX_MENUTASKSIZE				= 20;							// 菜单系统中"回答TASK"的最大数量

const int	PKVALUE_HALFKILL				= 2;
const int	PKVALUE_ONEKILL					= 20;                           // 每杀死一个白名/红名玩家,增加PK值   // add huang 2004.1.11
const int	PKVALUE_REDNAME					= 21;							// 红名玩家最低PK值
const int	PKVALUE_BLACKNAME				= 101;							// 黑名玩家最低PK值

const int	CHANCE_MAKEHOLE					= 300;

const int	SUPERMAN_KILLMONSTER_INCTIME		= 800;				// 无双状态每杀一个怪物的加时(MS)
const int	SUPERMAN_KILLMONSTER_TIMELIMIT		= 120*1000;			// 无双状态延长的时间限制(MS)
const int	TORNADO_KILLMONSTER_INCTIME			= 1000;				// 旋风状态每杀一个怪物的加时(MS)
const int	TORNADO_KILLMONSTER_TIMELIMIT		= 120*1000;			// 旋风状态延长的时间限制(MS)

const int	MASK_CHANGELOOK					= 10000000;						// 变身时LOCKFACE的掩码,face=face + new_face*10000000
const int	MAX_SIZEADD						= 2;							// 最大的SizeAdd,用于魔法区域的放大搜索(注意该数据不要太大)

const int	CHGMAP_LOCK_SECS				= 10;							// 进入地图后的保护时间
const int	SYNWAR_NOMONEY_DAMAGETIMES		= 10;							// 帮派没钱时增加的伤害倍数
const int	PICK_MORE_MONEY					= 1000;							// 捡钱多时,发ACTION消息
const int	SYNCHRO_SECS					= 5;							// 同步消息5秒内同步

const int	IDENT_FEE						= 100;							// 鉴定的价格
const int	UNIDENT_SALE_FEE				= 1;							// 卖未鉴定的价格

const int	MAX_USER_XP						= 100;			// 最大XP值
const int	ADD_XP_SECS						= 30;			// 每隔30秒增加一次XP
const int	ADD_XP_VALUE					= 15;			// 每次增加15点XP
const int	MAX_XPFULL_SECS					= 60;			// XP满最多持续的时间
//const int	ADD_XPFULL_SECS_KILLMONSTER		= 1;			// 每杀死一只怪物多持续1秒钟

const int	ADJUST_EXPFORMAT_LEVEL			= 70;			// 70级以上调整经验存储格式为/10

/////////////////////////////////////////////////////////////////////////
// 导师系统相关
const int	ADDSTUDENT_TUTOREXP				= 10;			// 招收徒弟需要消耗的导师经验
const int	DELSTUDENT_TUTOREXP				= 1000;			// 开除学员扣的导师经验
const int	LEAVETUTOR_LEVEL				= 10;			// 10级以上玩家叛师要扣经验
const int	_MIN_GIVEEXP_LEV				= 30;			// 学员为导师提供奖励经验的最低等级
const int	TUTOREXP_PERCENT				= 40;			// 一级学员奖励给导师的经验比例
const int	TUTOREXP2_PERCENT				= 10;			// 二级学员奖励给导师的经验比例
const int	GETEXP_PER_TUTOREXP0			= 500;			// 初级导师消耗1点导师经验能够获得的学员贡献经验
const int	GETEXP_PER_TUTOREXP1			= 700;			// 中级导师消耗1点导师经验能够获得的学员贡献经验
const int	GETEXP_PER_TUTOREXP2			= 1000;			// 高级导师消耗1点导师经验能够获得的学员贡献经验


//---jinggy---帮派---begin
const int	SYNREPUTE_SECS					= 6*60;		// 玩家每在线6分钟,加10点军团 声望和贡献度。
const int	SYNREPUTE_VAL_PEREACH			= 10;		    
const int	SYNREPUTE_VAL_PROFFER			= 1;		// 玩家每在线6分钟,加一点军团贡献度。

#define		SYNMEM_TIMEONLINE_INTERVAL		15*60			//每15分钟更新一次帮派成员在线时间
#define		SYNMEM_TIMEONLINE_INCREPUTE		10 //③、	军团成员每人每在线6分钟,军团声望增加10点
//---jinggy---帮派---end
//---jinggy---铸造---begin
const int	EQUIPMENT_EXP_ADD_SECS			= 10*60;						// 每10分钟增加一次小于9级的武器经验
const int	EQUIPMENT_EXP_ADD_SECS_AFTER9	= 15*60;						// 每15分钟增加一次9级的武器经验
const int	WEAPON_UPEXP_MAXVALUE			= 8;
const int	ARMOR_UPEXP_MAXVALUE			= 10;
const int	NECKLACE_UPEXP_MAXVALUE			= 12;
const int	SHOE_UPEXP_MAXVALUE			= 14;
const int	BANGLE_UPEXP_MAXVALUE		= 16;
const int	MAX_LEVEL_WARLEVEL	= 9;
const int   DEC_WARGHOSTEXP_FORREPAIR = 3 ;
//---jinggy---铸造---end

const int	PROFFER_BEKILL					= 100;					// 每被敌对帮派玩家杀死一次减少的帮派贡献度
const int	SYNREPUTE_BEKILL				= 100;					// 每次被敌对帮派玩家杀死减少的帮派声望

const int	NEWBIE_LEVEL					= 40;			// 新手的等级
const int	_MIN_TUTOR_LEVEL				= 50;			// 导师最低等级
enum { FLYMAP_ERROR=-1, FLYMAP_NORMAL, FLYMAP_MAPGROUP };
enum { ATTACK_TIME=false, BEATTACK_TIME=true, BY_WEAPON=false, BY_MAGIC=true };

////////////////////////////////////////////////////////////////
// sex define
enum {SEX_NONE = 0, SEX_MAN, SEX_WOMAN, SEX_ASEXUAL, SEX_ALL};

// requre sex define
const unsigned char SEX_REQ_MAN			=	0x01;// 男的可用
const unsigned char SEX_REQ_WOMAN		=	0x02;// 女的可用
const unsigned char SEX_REQ_EUNUCH		=	0x04;// 太监可用


////////////////////////////////////////////////////////////////
const int	MASTER_USERLEV				= 120;
const int	MAX_USERLEV					= 130;
//const int	MAX_EUDEMONLEV				= 130;

typedef	IGameObjSet<CUserWeaponSkill>		IUserWeaponSkillSet;
typedef	CGameObjSet<CUserWeaponSkill>		CUserWeaponSkillSet;

////////////////////////////////////////////////////////////////
enum 
{	
		RACE_NONE	= 0, // 未知
		RACE_HUMAN	= 1, // 人类
		RACE_SPRITE = 2, // 精灵
		RACE_DARKSPRITE = 3, // 暗精灵
};

////////////////////////////////////////////////////////////////
enum {	PROFSORT_MAGICIAN	=1, 
		PROFSORT_SOLDIER	=2, 
		PROFSORT_ARCHER		=3, 

		// no use
		PROFSORT_WIZARD		=4, 
		PROFSORT_DAOIST		=10, 
		PROFSORT_DAOISTGOLD	=11, 
		PROFSORT_DAOISTWOOD	=12, 
		PROFSORT_DAOISTWATER=13, 
		PROFSORT_DAOISTFIRE	=14, 
		PROFSORT_DAOISTEARTH=15, 
		};

////////////////////////////////////////////////////////////////
enum {
	NOBILITY_RANK_NONE		= 0,			// 无爵位
	NOBILITY_RANK_BARON		= 1,			// 爵士
	NOBILITY_RANK_VISCOUNT	= 2,			// 子爵
	NOBILITY_RANK_EARL		= 3,			// 伯爵
	NOBILITY_RANK_MARQUESS	= 4,			// 侯爵
	NOBILITY_RANK_DUKE		= 5,			// 公爵
};

////////////////////////////////////////////////////////////////
class IUserStorage
{
public:
	virtual bool	SendStorageInfo(OBJID idNpc, int nPosition = ITEMPOSITION_STORAGE)						PURE_VIRTUAL_FUNCTION_0
	virtual bool	CheckIn(OBJID idNpc, CItem* pItem, bool bUpdate, int nPosition = ITEMPOSITION_STORAGE)	PURE_VIRTUAL_FUNCTION_0
	virtual CItem*	CheckOut(OBJID idNpc, OBJID idItem, bool bUpdate, int nPosition = ITEMPOSITION_STORAGE)	PURE_VIRTUAL_FUNCTION_0
	virtual int 	GetStorageCount()																		PURE_VIRTUAL_FUNCTION_0
	virtual int 	GetWeight(OBJID idItem)																	PURE_VIRTUAL_FUNCTION_0
	virtual OBJID	GetItemType(OBJID idItem)																PURE_VIRTUAL_FUNCTION_0
	virtual DWORD	GetAmountLimit(OBJID idItem)															PURE_VIRTUAL_FUNCTION_0
};

const int	MASTER_WEAPONSKILLLEVEL	= 12;
const int	MAX_WEAPONSKILLLEVEL	= 20;
const int	nWeaponSkillLeveUpNeedExp[20] = {
				0,
				1200,
				68000,
				250000,
				640000,
				1600000,
				4000000,
				10000000,
				22000000,
				40000000,
				90000000,
				190000000/2,
				285000000/2,
				427500000/2,
				641250000/2,
				961875000/2,
				1442812500/2,
				2164218750/2,
				3246328125/2,
				4200000000/2
};

//////////////////////////////////////////////////////////////////////
enum INFO_ID{
		INFO_NONE=0,
		INFO_ITEM,
		INFO_FRIEND,
		INFO_ENEMY,
		INFO_WEAPONSKILL,
		INFO_MAGIC,
		INFO_SYNATTR,
		INFO_STATUS,
		INFO_TEAM,
};

////////////////////////////////////////////////////////////////
enum REMOTE_CALL{
		REMOTE_CALL_DROP_LEADER,
		REMOTE_CALL_LEAVE_SYN,
		REMOTE_CALL_TEAM_CLOSE_MONEY,
		REMOTE_CALL_TEAM_CLOSE_ITEM,
		REMOTE_CALL_TEAM_CLOSE_GEM_ACCESS,
		REMOTE_CALL_TEAM_HUNTKILL,
};

////////////////////////////////////////////////////////////////
class	IChangeTeam
{
public:
	virtual bool AddTeamMember(OBJID idUser)				PURE_VIRTUAL_FUNCTION_0
	virtual bool DelTeamMember(OBJID idUser)				PURE_VIRTUAL_FUNCTION_0
	virtual bool DelTeam()									PURE_VIRTUAL_FUNCTION_0
	virtual bool SendInfo(SOCKET_ID idSocket, OBJID idAgent)				PURE_VIRTUAL_FUNCTION_0
};

//////////////////////////////////////////////////////////////////////
// extern int RankOfIndex(int nPos);

////////////////////////////////////////////////////////////////
class CNetMsg;
class CPackage;
class CTransformation;
class CAgent;
class CTaskDetail;
class CUser : public CGameObj, public CRole, IUserStorage, IChangeTeam
{
protected:
	CUser();
	virtual ~CUser();
public:
	static		CUser*		CreateNew	()				{ return new CUser; }
	void		ReleaseByOwner			()				{ delete this; }
	void		OnTimer					(time_t tCurr);
	static		CUser*	CreateNewUser	(PROCESS_ID idProcess, SOCKET_ID idSocket, UserInfoStruct* pInfo);
	bool		Create				(PROCESS_ID idProcess, SOCKET_ID idSocket, OBJID idUser);
	bool		Init					();		// login 和 change map_group都要执行的操作

	virtual		bool		FindAroundObj	(OBJID idObjType, OBJID idObj, void** pp)		{ return GetMap()->QueryObj(GetPosX(), GetPosY(), idObjType, idObj, pp); }
	virtual		IRole*		FindAroundRole	(OBJID id)		{ return GetMap()->QueryRole(GetPosX(), GetPosY(), id); }
	virtual		CUser*		FindAroundUser	(OBJID id);
protected: // interface
	virtual		bool		QueryRole		(void** ppv)	{ return *ppv=(IRole*)this,true; }
	virtual		bool		QueryObj		(OBJID idObjType, void** ppv)			{ if(idObjType == OBJ_USER) return *ppv=this,true; return *ppv=NULL,false; }
	virtual		CUser*		QueryOwnerUser	()				{ return this; }
public:
	virtual		IMapThing*	QueryMapThing	()				{ return (IMapThing*)this; }
	IRole*					QueryRole		()				{ return (IRole*)this; }
	IChangeTeam*			QueryChangeTeam	()				{ return (IChangeTeam*)this; }
protected:
	virtual		IUserWeaponSkillSet*	QueryWeapenSkill()	{ return m_pUserWeaponSkillSet; }

public: // IMapThing
//	virtual		OBJID		GetID();
//	virtual		int			GetPosX();
//	virtual		int			GetPosY();
	virtual		int			GetObjType		()			{ return CGameObj::GetObjType(); }

	virtual		void		SendShow		(IRole* pRole);

public: // IRole
	virtual OBJID	GetID			()				{ return m_data.m_Info.id; }
	virtual LPCTSTR	GetName			()				{ return m_data.m_Info.szName; }
	virtual LPCTSTR	GetMate			()				{ return m_data.m_Info.szMate; }
	virtual int		GetSex			()				{ if(m_data.GetLookFace()%2 == 0) return SEX_WOMAN; return SEX_MAN; }
	virtual DWORD	GetLookFace		();
	virtual DWORD 	GetHair()						{ return m_data.m_Info.dwHair; }
	virtual char	GetLength		()				{ return m_data.m_Info.cLength; }
	virtual char	GetFat			()				{ return m_data.m_Info.cFat; }
	virtual int		GetPosX			()				{return m_nPosX;}
	virtual int		GetPosY			()				{return m_nPosY;}
	virtual int 	GetDir			();
	virtual void	SetDir			(int nDir)		{ m_nDir = nDir%8; }
	virtual int		GetPose			();
	virtual void	SetPose			(int nPose)		{ m_nPose = nPose; }
	virtual void	SetEmotion		(int nEmotion)	{ m_nEmotin = nEmotion; }
	virtual DWORD	GetMoney		()				{ return m_data.m_Info.dwMoney; }
	virtual DWORD	GetMoneySaved	()				{ return m_data.m_Info.dwMoney_saved; }
//	virtual DWORD	GetAuctionMoney	()				{ return m_data.m_Info.dwAuction_Money; }//LW

	virtual OBJID	GetMateID		();
//	virtual bool	AddItem			(CItem* pItem);

	void	SetLife(int nLife, BOOL bUpdate=false);
	virtual DWORD	GetLife				();
	virtual DWORD	GetMaxLife			();
	virtual DWORD	GetMana				()			{ return m_data.GetMana(); }	// not over

⌨️ 快捷键说明

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