Files
mir_server/server/LogicServer/team/DropBag.h

454 lines
12 KiB
C
Raw Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
/*
*
*
*/
#define MAX_DROP_ITEM_COUNT 20 //最大的掉落物品的数量,使用一个最大值,齐整内存
//const unsigned int ITEM_OWNER_TEAM_ALL = 0; //队伍中的所有人都能够拾取
//const unsigned int ITEM_OWNER_IS_ROLLING =unsigned int (-1); //物品的所有人正在筛子确认中
//const unsigned int ITEM_OWNER_IS_CAPTIN =unsigned int (-2); //物品正在等待队长分配
/// 物品的拾取状态
enum tagItemLootStyle
{
ITEM_OWNER_ALL_MEMBER =0, ///< 所有人都能够拾取
ITEM_OWNER_SPECIAL_ACTOR =1, ///< 特定一个玩家,已经确定了所有者了
ITEM_OWNER_WAIT_ROLL =2, ///< 物品等等待Roll还没Roll
ITEM_OWNER_IS_WATING_CAPTIN =3, ///< 正在等待队长分配
ITEM_OWNER_UNDER_ROLLING =4, ///< 物品正当Roll等待Roll的结果
ITEM_OWNER_INVALID =5, ///<出现了错误
};
/// 掉落物品的数据结构
class CDropItem : public Counter<CDropItem>
{
public:
CDropItem()
{
memset(this,0,sizeof(*this));
}
static inline bool GetByteFlag(BYTE btValue,INT_PTR nIndexID)
{
if(nIndexID >5) return false; //0-4有效因为只有一个byte存储
return !!(btValue & (0x1 << nIndexID));
}
static inline bool SetByteFlag(BYTE & btValue,INT_PTR nIndexID,bool flag)
{
if(GetByteFlag(btValue,nIndexID) == flag) return false; // 无需改变
if(flag)
{
btValue |= BYTE (1 << nIndexID);
}
else
{
BYTE btShiftValue = ~(1 << nIndexID);
btValue &= btShiftValue;
}
return true;
}
/*
* Comments:
* Param INT_PTR nItemID:ID
* Param INT_PTR nPosID: ID
* Param bool flag:
* @Return void:
*/
inline void SetItemOwnerFlag( INT_PTR nPosID,bool flag)
{
if(nPosID <0 || nPosID >=5) return; //0-7有效因为只有一个byte存储
if(item.wItemId )
{
SetByteFlag(btOWnerFlag,nPosID,flag);
}
}
/*
* Comments:
* Param INT_PTR nItemID: id
* Param INT_PTR nPosID: 0-7
* @Return bool:0
*/
inline bool GetItemOwnerFlag( INT_PTR nPosID )
{
if(nPosID <0 || nPosID >5) return true; //0-7有效因为只有一个byte存储
if(item.wItemId )
{
return GetByteFlag(btOWnerFlag,nPosID);
}
return false;
}
/*
* Comments:Roll的分数
* Param INT_PTR nItemID:ID
* Param INT_PTR nPosID: ID
* Param bool btValue:
* @Return bool: truefalse
*/
inline bool SetItemRollScore(INT_PTR nPosID,BYTE btValue)
{
if(nPosID <0 || nPosID >=5) return false; //0-4有效因为只有一个byte存储
if( GetRollFlag(nPosID) ) return false; //已经投掷过骰子了
scores[nPosID] = btValue;
return true;
}
/*
* Comments:
* Param INT_PTR nState:
* @Return void:
*/
inline void SetItemLootState(INT_PTR nState)
{
btLootType =(BYTE)nState;
}
/*
* Comments:
* @Return INT_PTR:
*/
inline INT_PTR GetItemLootState()
{
return btLootType;
}
//设置Roll状态
inline bool SetRollFlag(INT_PTR nPosID,bool flag)
{
return SetByteFlag(btRollFlag,nPosID,flag);
}
//获取Roll状态
inline bool GetRollFlag(INT_PTR nPosID)
{
return GetByteFlag(btRollFlag,nPosID);
}
/*
* Comments: Roll的分数
* Param INT_PTR nItemID: id
* Param INT_PTR nPosID: 0-7
* @Return bool:
*/
inline BYTE GetItemRollScore(INT_PTR nItemID, INT_PTR nPosID )
{
//0-7有效因为只有一个byte存储
if((nPosID >= 0) && (nPosID < 5) && item.wItemId)
{
return scores[nPosID];
}
return 0;
}
public:
CUserItemContainer::ItemOPParam item;
BYTE scores[5]; ///< 队伍里的每一个人的分数
BYTE btType; //物品的类型,为了较少查找
BYTE btLootType; //该物品的拾取类型
BYTE btOWnerFlag; ///< 哪些人能够拾取的标记能够拾取标记位1取完标记为0
BYTE btRollFlag; ///< 哪些人参加了Roll
char btBroadcastType; ///< 是否需要广播
bool btNeedTrggerEvent; ///< 是否需要触发脚本
unsigned int nActorID ; ///< 物品的所属者,这个是队伍分配的时候才用到
};
class CDropBag : public Counter<CDropBag> //掉落包裹
{
public:
CDropBag()
{
memset(this,0,sizeof(CDropBag));
}
/*
* Comments:
* Param CUserItem * pItem:
* Param unsigned int actorID: actorID
* @Return bool: true,false
*/
inline bool SetItemOnwer(INT_PTR nItemID,unsigned int actorID)
{
INT_PTR nIndex = GetItemIndex(nItemID);
if( (nIndex <0) || (nIndex >= MAX_DROP_ITEM_COUNT)) return false;
dropItems[nIndex].nActorID = actorID;
//dropItems[nIndex].btLootType =
return true;
}
/*
* Comments:
* Param unsigned int actorID: actorID
* @Return void:
*/
inline void SetAllItemOnwer(unsigned int actorID)
{
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; i++)
{
if( dropItems[i].item.wItemId)
{
dropItems[i].nActorID =actorID;
}
}
}
inline bool SetItemLootStyle(INT_PTR nItemID,INT_PTR nLootStyle)
{
INT_PTR nIndex = GetItemIndex(nItemID);
if( (nIndex <0) || (nIndex >= MAX_DROP_ITEM_COUNT)) return false;
dropItems[nIndex].btLootType = (BYTE)nLootStyle;
return true;
}
//设置所有物品的拾取方式
inline void SetAllItemLootStype(INT_PTR nLootStyle)
{
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; i++)
{
if( dropItems[i].item.wItemId)
{
dropItems[i].btLootType =(BYTE)nLootStyle;;
}
}
}
//拾取了金钱,防止重复去取钱
inline void LootMoney(INT_PTR & nCount)
{
nCount= nMoneyCount;
nMoneyCount =0;
}
/*
* Comments:
* Param INT_PTR nItemID: id
* @Return : -1
*/
inline INT_PTR GetItemIndex ( INT_PTR nItemID)
{
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; i++)
{
if(dropItems[i].item.wItemId == nItemID && dropItems[i].item.wItemId)
{
return i;
}
}
return -1;
}
/*
* Comments:
* ParamINT_PTR nItemID: ID
* Param unsigned int actorID:actorID
* Param INT_PTR nTeamIndex:-1
* @Return bool: true
*/
inline bool LootItem( INT_PTR nItemID,unsigned int actorID,INT_PTR nTeamIndex)
{
INT_PTR nIndex = GetItemIndex(nItemID);
if(( nIndex <0) || (nIndex >= MAX_DROP_ITEM_COUNT)) return false;
//如果所有者一致或者这个物品没有设置归属,那么就能够拾取
if( dropItems[nIndex].nActorID == actorID || //属于这个人的
dropItems[nIndex].btLootType == ITEM_OWNER_ALL_MEMBER || //如果大家都能拾取
dropItems[nIndex].btType ==Item::itQuestItem //任务物品都能够拾取
)
{
if(dropItems[nIndex].btType !=Item::itQuestItem ) //有的物品是能够多个人拾取的
{
dropItems[nIndex].item.wItemId =0; //删除这个物品
return true;
}
if(nTeamIndex <0) //如果是一个人拾取的话就删除这个物品
{
dropItems[nIndex].item.wItemId =0; //删除这个物品
return true;
}
//队伍拾取的话
if(dropItems[nIndex].GetItemOwnerFlag(nTeamIndex))
{
dropItems[nIndex].SetItemOwnerFlag(nTeamIndex,false);
if(dropItems[nIndex].btOWnerFlag ==0) //大家都拾取过了
{
dropItems[nIndex].item.wItemId =0; //删除这个物品
}
return true;
}
}
return false;
}
/*
* Comments:
* Param CDropItem & item:
* @Return bool:true,false
*/
inline bool AddDropItem(CDropItem & item )
{
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; i++)
{
if(dropItems[i].item.wItemId )
{
if( dropItems[i].item.wItemId == item.item.wItemId )
{
return false; //已经存在了
}
}
else
{
dropItems[i] =item;
return true;
}
}
return false; //背包已经满了
}
/*
* Comments:
* @Return bool: truefalse
*/
inline bool IsEmpty()
{
if(nMoneyCount >0) return false; //金钱还没拾取
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; i++)
{
if(dropItems[i].item.wItemId )
{
return false;
}
}
return true;
}
//是否已经过期了
inline bool IsExpired( TICKCOUNT nCurrentTickCount)
{
return nExpiredTime < nCurrentTickCount;
}
/*
* Comments:
* Param CUserItem::ItemSeries series:
* @Return CUserItem *:
*/
CDropItem * GetDropBagItem(INT_PTR nItermID)
{
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; ++i)
{
if(dropItems[i].item.wItemId && dropItems[i].item.wItemId == nItermID )
{
return &dropItems[i];
}
}
return NULL;
}
/*
* Comments:
* @Return INT_PTR:
*/
inline INT_PTR GetItemCount()
{
INT_PTR nCount =0;
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; ++i)
{
if(dropItems[i].item.wItemId )
{
++nCount ;
}
}
return nCount;
}
/*
* Comments:
* @Return INT_PTR:
*/
inline INT_PTR GetQuestItemCount()
{
INT_PTR nCount =0;
for(INT_PTR i =0; i < MAX_DROP_ITEM_COUNT; ++i)
{
if( dropItems[i].item.wItemId && dropItems[i].btType == Item::itQuestItem )
{
++nCount;
}
}
return nCount;
}
/*
* Comments:
* Param INT_PTR nIndexID: ,[0-4]
* Param bool flag:
* @Return void:
*/
inline void SetBagOwnerFlag( INT_PTR nIndexID,bool flag)
{
CDropItem::SetByteFlag(btOwnerFlag,nIndexID,flag);
}
/*
* Comments:
* Param INT_PTR nIndexID: 0-4
* @Return bool:0
*/
inline bool GetBagOwnerFlag( INT_PTR nIndexID )
{
return CDropItem::GetByteFlag(btOwnerFlag,nIndexID);
}
//获取一个背包的打开标记
inline bool GetBagClientOpenState( INT_PTR nIndexID)
{
return CDropItem::GetByteFlag(btClientOpenState,nIndexID);
}
//设置一个背包的打开状态
inline bool SetBagClientOpenState(INT_PTR nIndexID,bool flag)
{
return CDropItem::SetByteFlag(btClientOpenState,nIndexID,flag);
}
//设置背包客户端的闪光状态
inline bool SetBagClientBlinkState(INT_PTR nIndexID,bool flag)
{
return CDropItem::SetByteFlag(btClientBlinkState,nIndexID,flag);
}
//获取客户端背包的闪光状态
inline bool GetBagClientBlinkState(INT_PTR nIndexID)
{
return CDropItem::GetByteFlag(btClientBlinkState,nIndexID);
}
unsigned int nTeamID; //所属的队伍
unsigned int nMoneyCount; //金钱的数量
WORD nMonsterID ; //掉落这个物品的怪物的ID
BYTE btOwnerFlag; //哪些人拥有这个包裹
BYTE btClientBlinkState; //客户端物品的闪光状态
BYTE btClientOpenState; //客户端是否打开了这个包裹
BYTE btReserver; //保留
WORD wReserver; //保留
int nPosX; //位置X
int nPosY; //位置y
int nSceneID; //场景ID
unsigned int nKillerActorID; //杀死怪物的人的
CDropItem dropItems[MAX_DROP_ITEM_COUNT]; //掉落物品的指针列表
TICKCOUNT nExpiredTime; //过期时间
};