📄 npc.h
字号:
// Npc.h: interface for the CNpc class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_TASKNPC_H__D7A2DFC3_2C2C_4F67_BB52_8F55409E76BC__INCLUDED_)
#define AFX_TASKNPC_H__D7A2DFC3_2C2C_4F67_BB52_8F55409E76BC__INCLUDED_
#include "MyHeap.h"
#include "GameData.h"
#include "NpcShop.h"
#include "NpcStorage.h"
#include "NpcTable.h"
#include "Myheap.h"
#include "Role.h"
#include "AutoPtr.h"
#include "Auction.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CUser;
class CGameMap;
/////////////////////////////////////////////////////////////////////////////////////
//define constant ..
const int ADD_NEW_NPC = 0;
const int LAY_NEW_NPC = 10;
const int PRE_CHANGE_POSITION = 11;
const int CHANGE_POSITION = 12;
const int DYNANPCDIEDELAY_SECS = 3; // DYNA_NPC死亡多少秒后删除
const int GOAL_EXP_PERCENT = 10; // 打靶子的经验值百分比(按次的经验值是5%的机会)
const int SYNFLAG_SIZEADD = 5; // 帮派柱子的附加尺寸
const int SYNWAR_GAINMONEY_PERCENT = 10; // 帮派战得到对方基金的比例
const int DEFAULT_NPC_SIZEADD = 4; // 每个方面加两格
const int SYNWARLETTERNPC_CHECKINTERVAL = 60*20;//每间隔20分钟检查占领帮派是否到了7周
/////////////////////////////////////////////////////////////////////////////////////
const int _MAX_NPCTASK =8;
const int MAX_NPCDATA =4; // 必须小于_MAX_NPCTASK
/////////////////////////////////////////////////////////////////////////////////////
// 程序使用的DATA情况
enum {
SYNFLAGNPC_FIXFUND=0,SYNFLAGNPC_FIGHTBEGIN,SYNFLAGNPC_FIGHTEND,SYNFLAGNPC_MOREMAPID, // 帮派标志(time:WWHHMMSS, sun day = 7)
SYNWARLETTER_ISATTACK=0,SYNWARLETTER_ATTACK_SYNID=1,SYNWARLETTER_OCCUPYTIME=2,SYNWARLETTER_DEPOSIT=3,
SYNDRESS_SORT=0,SYNDRESS_SETTING=1,
GOALNPC_LEVEL=3,
TIMERNPC_TIME=3,
TRUNKNPC_SIZE=3,
EUDEMON_BROODER_NPC_SIZE=2, EUDEMON_STORAGE_NPC_SIZE=3,
STORAGENPC_SIZE=3,
NEIGHBORNPC_X=1,NEIGHBORNPC_Y=2,NEIGHBORNPC_SERIAL=3,
}; //? 目前一组最多支持4个变量
/////////////////////////////////////////////////////////////////////////////////////
enum NPCTYPE{
_NPC_NONE = 0, // 通用NPC
_SHOPKEEPER_NPC = 1, // 商店NPC
_TASK_NPC = 2, // 任务NPC(已作废,仅用于兼容旧数据)
_STORAGE_NPC = 3, // 寄存处NPC
_TRUNCK_NPC = 4, // 箱子NPC
_FACE_NPC = 5, // 变头像NPC
_FORGE_NPC = 6, // 锻造NPC (only use for client)
_EMBED_NPC = 7, // 镶嵌NPC
_STATUARY_NPC = 9, // 雕像NPC
_SYNFLAG_NPC = 10, // 帮派标记NPC
_ROLE_PLAYER = 11, // 其他玩家 (only use for client)
_ROLE_HERO = 12, // 自己 (only use for client)
_ROLE_MONSTER = 13, // 怪物 (only use for client)
_BOOTH_NPC = 14, // 摆摊NPC (CBooth class)
_SYNTRANS_NPC = 15, // 帮派传送NPC, 固定那个不要用此类型! (用于00:00收费)(LINKID为固定NPC的ID,与其它使用LINKID的互斥)
_ROLE_BOOTH_FLAG_NPC = 16, // 摊位标志NPC (only use for client)
_ROLE_MOUSE_NPC = 17, // 鼠标上的NPC (only use for client)
_ROLE_MAGICITEM = 18, // 陷阱火墙 (only use for client)
_ROLE_DICE_NPC = 19, // 骰子NPC
_ROLE_SHELF_NPC = 20, // 物品架
_WEAPONGOAL_NPC = 21, // 武器靶子NPC
_MAGICGOAL_NPC = 22, // 魔法靶子NPC
_BOWGOAL_NPC = 23, // 弓箭靶子NPC
_ROLE_TARGET_NPC = 24, // 挨打,不触发任务 (only use for client)
_ROLE_FURNITURE_NPC = 25, // 家具NPC (only use for client)
_ROLE_CITY_GATE_NPC = 26, // 城门NPC (only use for client)
_ROLE_NEIGHBOR_DOOR = 27, // 邻居的门
_ROLE_CALL_PET = 28, // 召唤兽 (only use for client)
_EUDEMON_TRAINPLACE_NPC = 29, // 幻兽驯养所
_AUCTION_NPC = 30, // 拍买NPC 物品领取NPC LW
_ROLE_MINE_NPC = 31, // 矿石NPC
_ROLE_3DFURNITURE_NPC = 101, // 3D家具NPC
_SYN_NPC_WARLETTER = 110, //增加新的NPC类型 专门用来 下战书的 帮派NPC
};
/////////////////////////////////////////////////////////////////////////////////////
enum NPCSORT{
NPCSORT_NONE = 0,
NPCSORT_TASK = 1, // 任务类
NPCSORT_RECYCLE = 2, // 可回收类
NPCSORT_SCENE = 4, // 场景类(带地图物件)
NPCSORT_LINKMAP = 8, // 挂地图类(LINKID为地图ID,与其它使用LINKID的互斥)
NPCSORT_DIEACTION = 16, // 带死亡任务(LINKID为ACTION_ID,与其它使用LINKID的互斥)
NPCSORT_DELENABLE = 32, // 可以手动删除(不是指通过任务)
NPCSORT_EVENT = 64, // 带定时任务, 时间在data3中,格式为MMWWHHMMSS。(LINKID为ACTION_ID,与其它使用LINKID的互斥)
NPCSORT_TABLE = 128, // 带数据表类型
// NPCSORT_SHOP = , // 商店类
// NPCSORT_DICE = , // 骰子NPC
NPCSORT_USELINKID = NPCSORT_LINKMAP | NPCSORT_DIEACTION | NPCSORT_EVENT,
};
/////////////////////////////////////////////////////////////////////////////////////
struct NPCINFO_ST{
OBJID idOwner;
int nOwnerType;
OBJID idMap;
int nPosX;
int nPosY;
int nType;
int nLookFace;
int setTask[_MAX_NPCTASK];
int setData[MAX_NPCDATA];
NAMESTR szData;
OBJID idLink;
int nLife;
OBJID idBase;
int nSort;
char cLength;
char cFat;
};
/////////////////////////////////////////////////////////////////////////////////////
enum NPCDATA{
NPCDATA_OWNERID=1,
NPCDATA_OWNERTYPE,
NPCDATA_NAME,
NPCDATA_TYPE,
NPCDATA_LOOKFACE, STATUARYDATA_DIR=NPCDATA_LOOKFACE,
NPCDATA_LENGTH, // 高矮 -- zlong 2004-02-03
NPCDATA_FAT, // 胖瘦
NPCDATA_IDXSERVER,
NPCDATA_MAPID,
NPCDATA_POSX_, // 外部不要直接使用,注意与m_nPosX的同步
NPCDATA_POSY_, // 外部不要直接使用,注意与m_nPosY的同步
NPCDATA_TASK0, STATUARYDATA_HELMET=NPCDATA_TASK0,
NPCDATA_TASK1, STATUARYDATA_ARMOR=NPCDATA_TASK1,
NPCDATA_TASK2, STATUARYDATA_WEAPONR=NPCDATA_TASK2,
NPCDATA_TASK3, STATUARYDATA_WEAPONL=NPCDATA_TASK3,
NPCDATA_TASK4, STATUARYDATA_FRAME=NPCDATA_TASK4,
NPCDATA_TASK5, STATUARYDATA_POSE=NPCDATA_TASK5,
NPCDATA_TASK6, STATUARYDATA_LOOKFACE=NPCDATA_TASK6,
NPCDATA_TASK7, STATUARYDATA_RANKSHOW_HAIR=NPCDATA_TASK7,
NPCDATA_DATA0,
NPCDATA_DATA1,
NPCDATA_DATA2,
NPCDATA_DATA3,
NPCDATA_DATASTR,
NPCDATA_LINKID, // 挂地图类的地图ID,死亡任务ID
NPCDATA_LIFE,
NPCDATA_MAXLIFE,
NPCDATA_BASE,
NPCDATA_SORT,
NPCDATA_ITEMTYPE,
NPCDATA_SIZE_FRONT,
NPCDATA_SIZE_BACK,
NPCDATA_SIZE_LEFT,
NPCDATA_SIZE_RIGHT,
};
typedef IGameData<NPCDATA> INpcData;
char szNpcTable[];
typedef CGameData<NPCDATA,szNpcTable,szID> CNpcData;
char szDynTable[];
typedef CGameData<NPCDATA,szDynTable,szID> CDynaNpcData;
/////////////////////////////////////////////////////////////////////////////////////
//class CNpcTrunk;
class CNpcTask;
class CNpcScene;
class CNpcLink;
class CNpcBet;
class CAuction;
class CNpc : public CGameObj, public CRole
{
protected:
CNpc();
virtual ~CNpc();
public:
static CNpc* CreateNew() { return new CNpc; }
bool Create(PROCESS_ID idProcess, NPCINFO_ST* pInfo, OBJID idItemType, LPCTSTR szName);
bool Create(PROCESS_ID idProcess, IRecordset* pRecordset, bool bDynaNpc);
//保留 bool Create(OBJID id);
//保留 bool Create(TaskNpcInfo* pInfo); // INSERT DB
// virtual ULONG ReleaseByOwner() { delete this; return 0; }
IRole* QueryRole() { return (IRole*)this; }
virtual bool FindAroundObj (OBJID idObjType, OBJID idObj, void** pp) { return GetMap()->QueryObj(GetPosX(), GetPosY(), idObjType, idObj, pp); }
public: // IRole ================================================================================
virtual void ReleaseByOwner() { delete this; }
virtual OBJID GetID() { return m_id; }
virtual int GetObjType() { return CGameObj::GetObjType(); }
virtual int GetPosX() { return m_nPosX; }//m_pData->GetInt(NPCDATA_POSX); }
virtual int GetPosY() { return m_nPosY; }//m_pData->GetInt(NPCDATA_POSY); }
virtual void SendShow(IRole* pRole); // 向玩家发送物件外形数据
public: // get attrib
virtual LPCTSTR GetName ();
// virtual LPCTSTR GetMate () { return NOMATE_NAME; }
virtual DWORD GetLookFace () { if(GetType()==_STATUARY_NPC) return m_pData->GetInt(STATUARYDATA_LOOKFACE); return m_pData->GetInt(NPCDATA_LOOKFACE); }
virtual char GetLength () { return m_pData->GetInt(NPCDATA_LENGTH); }
virtual char GetFat () { return m_pData->GetInt(NPCDATA_FAT); }
virtual DWORD GetHair () { return m_pData->GetInt(STATUARYDATA_RANKSHOW_HAIR)&0xFFFF; }
virtual int GetDir () { return MaskDir(m_pData->GetInt(NPCDATA_LOOKFACE))%MAX_DIRSIZE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -