Files
mir_server/server/LogicServer/item/cnt/UserEquip.h

494 lines
14 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
#define MAXCHANGEDURASENDPACKET 100
class CActor;
class CUserEquipment:
public CEquipVessel,
public CEntitySubSystem<enEuipSystemID, CUserEquipment, CActor>
{
public:
const static int MAX_EQUIP_STRONG_LEVEL =15; //最大的装备强化的等级
const static int MAX_EQUIP_DIAMOND_LEVEL =10; //最大的装备强化的等级
const static int MAX_EQUIP_LEVEL =10; //最大的装备等级
//定义角色身上装备的数量
//static const INT_PTR EquipmentCount = itMaxEquipPos;
typedef CEntitySubSystem<enEuipSystemID, CUserEquipment, CActor> Inherited;
friend class CEntitySubSystem<enEuipSystemID, CUserEquipment, CActor>;
typedef CEquipVessel EquipBaseClass;
//装备,人物,坐骑的外观的数据结构的定义
typedef struct tagEntityAppearValue
{
union
{
int nValue;
struct
{
WORD wLow;
WORD wHigh;
};
};
} ENTITYAPPEARVALUE;
enum emPropMove{
pmInitSmith = 1,
pmStrong,
pmAuth,
pmLuck,
};
public:
/*** 覆盖父类的函数集 ***/
//初始化
virtual bool Initialize(void *data,SIZE_T size);
//析构
virtual VOID Destroy()
{
Clear(NULL, 0);
Inherited::Destroy();
}
/*
* Comments:
* Param INT_PTR nCmd:
* Param CDataPacketReader & packet:
* @Return VOID:
*/
virtual VOID ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet );
/*
* Comments: db
* Param INT_PTR nCmd:
* Param INT_PTR nErrorCode:
* Param CDataPacketReader & reader:
* @Return VOID:
*/
virtual VOID OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader );
/*
* Comments:
* Param PACTORDBDATA pData:
* @Return void:
*/
virtual void Save(PACTORDBDATA pData);
virtual void OnEnterGame();
//pos位置装备发生变化
void EquipChange(int nPos);
/*
*
*
*
*/
virtual VOID OnTimeCheck(TICKCOUNT nTickCount);
//装备成就
void DealEquipmentAchieve();
/*
* Comments:
* Param CAnimal * pOnwer:
* Param INT_PTR nPos:
* Param CUserItem * pUserItem:
* Param INT_PTR nLocation:穿01
* @Return void:
*/
virtual void AfterEquipTakenOn(CActor * pOnwer,INT_PTR nPos,CUserItem *pUserItem,INT_PTR nLocation=0);
//装备脱下来的时候
virtual void AfterEquipTakenOff(CActor * pOnwer,CUserItem *pUserItem);
bool DeleteEquip(int nIdx, LPCSTR pSender, INT_PTR nLogIdent,bool bNeedFreeMemory=true);
/* 从装备容器中删除并销毁物品
* param ID
* nQuality -1
* nQuality -1;
* nDuraOdds = - -1
* @return
*/
INT_PTR DeleteEquip(const CUserItemContainer::ItemOPParam& param, LPCSTR lpSender, const INT_PTR nLogIdent, const int nDuraOdds = -1);
public:
//判断 穿戴多少件多少等级的装备
int GetEquipLevelCount(int nLevel);
void HandGetRankOtherEquip(CDataPacketReader &packet);
//判断 穿戴多少件熔铸装备
int GetEquipMeltingCount(int nLevel);
//判断 穿戴多少件多少转的装备
int GetEquipCircleCount(int nCircle);
//检查装备数量
void CheckEquipCount();
bool GetEquipByItemId(WORD nItemId);
//穿上装备(直接用UserItem不经过背包,如神炉系统)
bool TakeOn(CUserItem* pUserItem);
//穿上装备
bool TakeOn(const CUserItem::ItemSeries &series);
//取下装备
bool TakeOff(const CUserItem::ItemSeries &series, bool boCheckGrid = true);
/* 计算装备属性 */
//CAttrCalc& CalcAttributes(CAttrCalc &calc);
//清空装备物品如果nLogIdent不为0则记录日志并向客户端发送
INT_PTR Clear(LPCSTR lpSender = NULL, const INT_PTR nLogIdent = 0);
//通过装备的位置获取装备
inline CUserItem * GetEquipByPos(INT_PTR nPos)
{
if(nPos >= itWeaponPos && nPos < itMaxEquipPos)
{
return m_Items[nPos];
}
else
{
return NULL;
}
}
/*
* Comments: 12
* Param INT_PTR nSortID: ID6nSortID =1,6
* @Return CUserItem *:
*/
CUserItem * GetEquipBySortID(INT_PTR nSortID)
{
INT_PTR nCount=0; //有效的装备的位置
for(INT_PTR i=0; i< EquipmentCount; i ++)
{
if(m_Items[i] !=NULL )
{
nCount ++;
if(nCount == nSortID)
{
return m_Items[i];
}
}
}
return NULL;
}
/*
* Comments:
* Param CAttrCalc & cal:
* Param CAttrCalc * pOriginalCal:
* @Return CAttrCalc &:
*/
CAttrCalc & CalcAttributes(CAttrCalc &cal,CAttrCalc *pOriginalCal=NULL);
//刷玩家的外观的属性
VOID RefreshAppear();
/*
* Comments:
* Param CUserItem * pEquip:
* Param int nValue:
* Param bool bForce:
* @Return bool:true,false
*/
bool ChangeEquipDua(CUserItem * pEquip,int nValue,bool bForce = false);
/*
* Comments:
* Param CUserItem * pUserItem:
* Param CActor * pActor:actorID
* @Return void:
*/
static void SendItemDuaChange(CUserItem * pUserItem, CActor *pActor);
//攻击别人,要处理装备的耐久
void OnAttackOther(CAnimal *pEntity, bool bChgDura=true);
//被攻击,要处理装备的耐久
void OnAttacked(CAnimal *pEntity);
//死亡的时候需要减装备的耐久
void OnDeath();
void SetEquipItemProp(INT_PTR nSlotId, INT_PTR nPropId, INT_PTR nVal);
/*
* Comments:
* @Return void:
*/
void OnEnterScene();
/*
* Comments:
* Param int nType:
* Param const char * sComment:
* Param int nLogId: Id
* @Return INT_PTR:
* @Remark:
*/
INT_PTR RemoveItemByType(int nType, const char * sComment, int nLogId);
/*
* Comments:
* Param int nType:
* @Return CUserItem*: NULL
* @Remark:
*/
inline CUserItem* GetItemByType(INT_PTR nType)
{
INT_PTR nPos= GetItemTakeOnPosition( (const Item::ItemType) nType);
if((nPos <0) || (nPos >= EquipmentCount)) return NULL;
return m_Items[nPos];
}
/*
* Comments:使
* Param INT_PTR nStrong:
* @Return bool:
*/
bool IsStrongLevel(INT_PTR nStrong);
/*
* Comments:使
* @Return bool:
*/
//bool IsForgeItem();
/*
* Comments:
* Param CUserItem * pItem:
* @Return bool:true
*/
bool IsItemInEquip( CUserItem * pItem );
//void OnSmithEquip(); //精锻装备
void OnTakeOnCheckSuit(); //穿上装备的时候检查套装
void OnCheckDiamondLevel(); //检查宝石的等级
void OnCheckEquipStrong(); //检查装备的强化
//通过物品的id在装备列表里查找
inline CUserItem* FindItemByID( const INT_PTR wItemId)
{
return EquipBaseClass::FindItemByID(wItemId);
}
/*
* Comments:0
* @Return void:
*/
void ClearEquipSharp(bool boCast);
public:
//获取装备的穿戴位置编号,返回-1表示物品不是装备
//static INT_PTR GetItemTakeOnPosition(const Item::ItemType btItemType);
/*
* Comments:
* Param CEquipVessel * pEquips:
* @Return INT_PTR:
*/
static const INT_PTR GetStarAppear(const CEquipVessel *pEquips);
/*
* Comments:
* @Return INT_PTR:
*/
// static const INT_PTR GetSuitAppear(const CEquipVessel *pEquips);
/*
* Comments: 2Uint16来存放的1616
* Param CUserItem * pUserItem:
* Param bool showDiamind:
* @Return int:
*/
static int GetEquipAppear(CUserItem * pUserItem);
//获取足迹外观
static int GetFootAppear(const CUserItem *pUserItem, bool showAppear = true);
/*
* Comments:
* Param CEquipVessel * pEquips:
* Param bool showFation:
* Param bool isZanzen:
* Param int nVocation:
* Param int nSex:
* Param int & nModelId:id
* Param int & nWeaponAppear:
* Param int & nWingAppear:
* Param int & nSwingLevel:id
* Param int & nSoldierSoulAppear:
* @param pMaster
* @Return void:
*/
static void GetAppear(const CEquipVessel *pEquips,int nVocation, int nSex,
int& nModelId,int &nWeaponAppear, int &nWingAppear, int &nSwingLevel, int &nSoldierSoulAppear,
int nEntityType = enActor,CActor *pMaster=NULL);
/*
* Comments:
* Param CUserItem * pItem:
* @Return bool:
*/
static bool NeedShowWeaponExtend( CActor *pMaster, const HERODBDATA *pPetData=NULL);
CAttrCalc & CalcFashionAttr(CAttrCalc & cal);
/*
* Comments:
* Param INT_PTR nValue:
* @Return INT_PTR:
*/
INT_PTR OnAbsorbExp(INT_PTR nValue);
//套装
virtual void SuitAttrCal(CAttrCalc &calc);
private:
//下面是一些网络数据包的处理
void HandError(CDataPacketReader &packet){}; //这个是没有用的数据包
void HandTakeOnEquip(CDataPacketReader &packet); //装上装备
void HandTakeOffEquipWithGuid (CDataPacketReader &packet);//脱下一件装备参数是装备的GUID
//void HandTakeOffEquipWithPos(CDataPacketReader &packet); //脱下一件装备,参数是装备的位置
void HandGetEquip(CDataPacketReader &packet); //获取自身的装备
void HandGetOtherEquip(CDataPacketReader &packet); //获取其他玩家的装备
void HandGetBelongActorInfo(CDataPacketReader &packet); //获取非活动副本Boss归属玩家信息
void HandSetFathionClothFlag(CDataPacketReader &packet); //设置是否显示时装
void HandGetOfflineEquip(CDataPacketReader &packet); //获取离线玩家的装备
void HandGetHeroOfflineEquip(CDataPacketReader &packet); //获取离线玩家英雄的装备
void HandEquipInsure(CDataPacketReader &packet); //装备投保
void HandUseSenderRing(CDataPacketReader & packet); //用传送戒指传送
void HandGetSenderRingCd(CDataPacketReader & packet); //请求传送戒指的CD时间
void HandMoveEquipProp(CDataPacketReader & packet); //装备转移
void HandUpgradeStar(CDataPacketReader & packet); //装备升星
void HandRecover(CDataPacketReader & packet); //装备分解
void HandComposite(CDataPacketReader & packet); //装备合成
void HandSetExtraEquipShowFlag( CDataPacketReader & packet ); //[幻武玄甲]设置幻武玄甲的外观是否显示
void HandRecoverStar(CDataPacketReader & packet); //恢复装备强化失败损失的星级
void HandTransferStar(CDataPacketReader & packet); //装备强化星级转移
void HandInscript(CDataPacketReader & packet); //装备铭刻
void HandTransferInscript(CDataPacketReader & packet); //装备铭刻转移
void HandIdentifySlotUnlock( CDataPacketReader & packet ); //鉴定属性槽解锁
void HandIdentify( CDataPacketReader & packet ); //装备鉴定
void HandTransferIdentify( CDataPacketReader & packet ); //装备鉴定转移
/*
* Comments:
* Param CUserItem * pItem:
* @Return bool:
*/
bool NeedShowFashion();
bool DeleteEquip(CUserItem *pItem, LPCSTR pSender, INT_PTR nLogIdent, bool boDeedFreeMem = true);
/*
* Comments:
* Param CUserItem * pUserItem:
* Param int nPropID: ID
* @Return:
*/
inline VOID CheckAppearChange(CUserItem * pUserItem,int nPropID)
{
//外观
int nOldAppear = ((CEntity*)m_pEntity)->GetProperty<int>(nPropID);
int nNewAppear = GetEquipAppear(pUserItem); //获取外形
if(nNewAppear != nOldAppear)
{
((CEntity*)m_pEntity)->SetProperty<int>(nPropID,nNewAppear);
}
}
/*
* Comments: 穿
* Param INT_PTR nPos:穿
* Param CStdItem pStdItem:
* @Return void:
*/
void EquipTakenInitTimer(INT_PTR nPos,const CStdItem * pStdItem);
/*
* Comments:
* Param CUserItem * pEquip:
* Param const CStdItem * pStdItem:
* @Return void:
*/
void OnEquipDurChanged(CUserItem *pEquip,const CStdItem * pStdItem);
INT_PTR CalcWeaponEndureConsume();
INT_PTR CalcDressEndureConsume();
INT_PTR CalcArmorEndureConsume();
INT_PTR GetRandomInRange(INT_PTR nUpper, INT_PTR nLower);
//检查时装战力
bool CheckSetFashion();
protected:
//CUserItem* m_Items[EquipmentCount];//装备物品表
//下面这些用于源泉类的物品
//CTimer<1000> m_hpTimer; //hp的源泉的定时器
//CTimer<1000> m_mpTimer; //mp源泉的定时器
CTimer<30*1000> m_ItemTimeChkTimer; //物品时间检查的定时器
TICKCOUNT m_nSenderRingCd;
//HP,MP源泉
WORD m_wHpSourceInterval; //HP源的作用时间间隔
WORD m_wHpSourceValue; //每次添加的数值
WORD m_wMpSourceInterval; //MP源的作用时间间隔
WORD m_wMpSourceValue; //每次添加的数值
CRandHit m_weaponEndureConsHit; // 武器耐久消耗命中
CRandHit m_dressEndureConsHit; // 衣服耐久消耗命中
CRandHit m_armorEndureConsHit; // 衣服外的其它护甲装备耐久消耗命中
unsigned int m_nEquipScore ; //装备的得分
WORD m_ChangeDura[EquipmentCount]; //各部位装备改变
//WORD m_nEquipPosStrongLevel[EquipmentCount]; //装备-部位强化数据(现在只存了等级)
BYTE m_nIsExtraWeaponShow; //是否显示幻武外观
BYTE m_nIsExtraDressShow; //是否显示玄甲外观
public:
//跨服数据
void SendMsg2CrossServer(int nType);
//跨服数据初始化
VOID OnCrossInitData(std::vector<CUserItem>& Equips);
void HandGetCenterRankOtherEquip(CDataPacketReader &packet);
};