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

235 lines
7.9 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/*
*/
class CEquipVessel
{
public:
static const INT_PTR EquipmentCount = itMaxEquipPos;
CEquipVessel()
{
clear();
m_nSuitList.clear();
}
void clear()
{
memset(m_Items, 0, sizeof(m_Items));
}
//穿上神炉装备(直接用UserItem不经过背包)
bool TakeOnGodStove(CActor *pActor, CUserItem* pUserItem);
//穿上装备
/*
* Comments:穿
* Param CAnimal * pOner:穿
* Param const CUserItem::ItemSeries & series:
* Param const PETDBDATA *pPetData:
* Param INT_PTR nPos穿011
* Param bool isBagEquip
* @Return INT_PTR:
*/
bool TakeOnEquip(CActor *pActor, const CUserItem::ItemSeries &series,const HERODBDATA *pPetData =NULL,INT_PTR nLocation =0, bool isBagEquip = true);
bool TakeOnEquip(CActor *pActor,CUserItem* pUserItem,const HERODBDATA *pPetData =NULL,INT_PTR nLocation =0, bool isBagEquip = true);
//取下装备
bool TakeOffEquip(CActor *pOner, const CUserItem::ItemSeries &series, bool boCheck = true, bool boHero=false);
//取下装备
bool TakeOffEquip(CActor *pOner,CUserItem *pUserItem, bool boCheck = true, bool boHero=false);
/*
* Comments:
* Param CActor * pOwner:
* Param CUserItem * pUserItem:
* @Return bool:truefalse
*/
bool DirectRemoveEquip(CActor *pOwner,CUserItem *pUserItem, LPCSTR pSender="", INT_PTR nLogIdent=0, bool boDeedFreeMem=false);
//通过物品系列号获取装备在列表中的位置,没有找到则返回-1
INT_PTR FindIndex(const CUserItem::ItemSeries series);
//通过GUID获取装备
inline CUserItem *GetEquipByGuid(const CUserItem::ItemSeries series)
{
INT_PTR nIndex = FindIndex(series);
if(nIndex <0) return NULL;
return m_Items[nIndex];
}
/*
* Comments:
* @Return INT_PTR: 穿
*/
INT_PTR GetEquipCount()
{
INT_PTR nCount=0; //有效的装备的位置
for(INT_PTR i=0; i< EquipmentCount; i ++)
{
if(m_Items[i] !=NULL )
{
nCount ++;
}
}
return nCount;
}
/*
* Comments:
* Param CSuitCal & suitCal:
* @Return void:
*/
// void CheckSuit(CSuitCal &suitCal) const;
//通过物品的id在装备列表里查找
CUserItem* FindItemByID( const INT_PTR wItemId)
{
for (INT_PTR i=0; i<EquipmentCount; i ++)
{
if ( m_Items[i] && m_Items[i]->wItemId == wItemId)
{
return m_Items[i];
}
}
return NULL;
}
//通过物品的扣掉玩家身上的装备
bool DelItemByID( const INT_PTR wItemId)
{
for (INT_PTR i=0; i<EquipmentCount; i ++)
{
if ( m_Items[i] && m_Items[i]->wItemId == wItemId)
{
m_Items[i] = NULL;
return true;
}
}
return false;
}
/* 统计指定物品的装备数量
* wItemId ID
* nQuality -1
* nQuality -1;
* nDuraOdds = - -1
* void * pUserItem:
* @return
*/
INT_PTR GetEquipCountByID(const INT_PTR wItemId, const INT_PTR nQuality = -1, const INT_PTR nStrong = -1,const INT_PTR nBind =-1,const INT_PTR nDuraOdds = -1, void * pNoItem = NULL);
//当装备穿戴到身上的时候,做一些发数据包到客户端
virtual void AfterEquipTakenOn(CActor * pOnwer, INT_PTR nPos,CUserItem *pUserItem,INT_PTR nLocation=0) {}
//当装备从身上卸载的时候,做一些发数据包到客户端
virtual void AfterEquipTakenOff(CActor * pOnwer,CUserItem *pUserItem) {}
//装备被直接爆掉的时候提示玩家
virtual void AfterEquipDirectRemove(CActor * pOnwer,CUserItem *pUserItem) {}
virtual void SuitAttrCal(CAttrCalc &calc) {};
//一件装备是否是基本的装备,基本的装备需要计算衍生属性
inline bool IsBasicEquip(INT_PTR nItemPos) const
{
//return nItemPos >= itWeaponPos && nItemPos <= itIntellectBallPos;
return nItemPos >= itWeaponPos && nItemPos <= itEquipDiamondPos;
}
/*
* Comments: 穿0
* @Return INT_PTR:
*/
INT_PTR GetMinStrongLevel() const;
//获取全套装备最低升星数
INT_PTR GetSuitMinStar() const;
//获取全套装备总升星数
int GetTotalStar() const;
public:
/*
* Comments:穿
* Param const btItemType:
* Param btLocation: 0 1
* @Return INT_PTR:-1
*/
static INT_PTR GetItemTakeOnPosition(const Item::ItemType btItemType, INT_PTR btLocation = 0);
//装备昵称
static LPSTR getEquipName(const CStdItem* pItem );
//颜色描述
static LPSTR getEquipNameDesc(const CStdItem* pItem );
static LPSTR getItemColorDesc(const CStdItem* pItem );
/*
* Comments:
* Param CUserItem * pUseItem:
* Param CActor * pActor: ()
* @Return INT_PTR:
*/
static float GetItemAttrSetScore( CUserItem* pUseItem, CActor* pActor);
//检查物品是否满足穿戴条件
static INT_PTR CheckTakeOnCondition(const CEntity *pMonster, const CStdItem* pStdItem, const CUserItem *pUserItem);
/*
* Comments:
* Param CAttrCalc & cal:
* Param CAttrCalc * pOriginalCal:
* Param CAnimal *pMaster:
* @Return CAttrCalc:
*/
CAttrCalc & CalcAttr(CAttrCalc &cal,CAttrCalc *pOriginalCal=NULL,CAnimal *pMaster=NULL,const HERODBDATA *pPetData = NULL);
//计算一件装备的属性
static void CalcOneEquipAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem, CAnimal* pMaster);
//计算一件装备强化升星的属性
static void CalcOneEquipStarAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem,
CAnimal* pMaster, bool bNeedAddProp);
static void CalcOneEquipInscriptAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem,
CAnimal* pMaster, bool bNeedAddProp);
/* 通过物品ID从装备表中查找物品
* wItemId ID
* @return
*/
static CUserItem* FindItemByID( const INT_PTR wItemId,CUserItem** pUserItemVec,INT_PTR nItemCount);
/*
* Comments:穿
* Param PETDBDATA * pData:
* Param const CStdItem * pStdItem:
* @Return INT_PTR:
*/
static INT_PTR GetPetTakeItemErrorCode(const HERODBDATA*pData, const CStdItem* pStdItem, const CUserItem *pUserItem,CAnimal *pActor);
//获取激活五行的条件btpos为当前装备位置
bool CanActivityFiveAttr(BYTE btPos);
bool IsFiveAttrPos(BYTE btPos);
public:
CUserItem* m_Items[EquipmentCount];//装备物品表
std::map<int, int> m_nSuitList;//
//bool GetItemsByType(const Item::ItemType btItemType, CVector<CUserItem*>& out);
private:
/*
* Comments:
* Param CAttrCalc & cal:
* Param CUserItem * pEquipment:
* Param CUserItem *pStone:
*/
void CalcResonanceAttr(CAttrCalc &cal,CUserItem *pEquipment,CUserItem *pStone);
};