560 lines
13 KiB
C++
560 lines
13 KiB
C++
#include "StdAfx.h"
|
||
#include "DropItemEntity.h"
|
||
|
||
VOID CDropItemEntity::LogicRun(TICKCOUNT nCurrentTime)
|
||
{
|
||
//延迟删除这个实体
|
||
if(nCurrentTime >= m_expireTime)
|
||
{
|
||
GetGlobalLogicEngine()->GetEntityMgr()->DestroyEntity(GetHandle(),true);
|
||
}
|
||
}
|
||
void CDropItemEntity::Destroy()
|
||
{
|
||
if(IsInited() ==false)
|
||
{
|
||
OutputMsg(rmWaning,"CDropItemEntity destroy again");
|
||
|
||
}
|
||
Inherited::Destroy();
|
||
if(m_pItem !=NULL)
|
||
{
|
||
GetGlobalLogicEngine()->DestroyUserItem(m_pItem);
|
||
m_pItem =NULL;
|
||
}
|
||
}
|
||
bool CDropItemEntity::Init(void * data, size_t size)
|
||
{
|
||
if( Inherited::Init(data,size) ==false ) return false;
|
||
m_pItem =NULL; //物品的指针
|
||
m_ownerExpireTime =0;
|
||
m_btMoneyType = mtCoin;
|
||
|
||
//该道具的存活时间
|
||
static int s_nExpiretTime = GetLogicServer()->GetDataProvider()->GetDropItemConfig().nDropItemExpireTime * 1000;
|
||
m_expireTime = GetGlobalLogicEngine()->getTickCount() + s_nExpiretTime ;
|
||
m_nLogId =0;
|
||
m_CanPickUpTime = 0;
|
||
m_sLogDesc[0] =0;
|
||
m_showLootTips =false;
|
||
|
||
SetInitFlag(true);
|
||
return true;
|
||
}
|
||
|
||
//设置这个道具属于他的主人的时间
|
||
void CDropItemEntity::SetMasterOwnerTime(int nMinSecond)
|
||
{
|
||
m_ownerExpireTime = GetGlobalLogicEngine()->getTickCount() + nMinSecond ;
|
||
}
|
||
|
||
void CDropItemEntity::SetCanPickUpTime(int nTime)
|
||
{
|
||
m_CanPickUpTime = GetGlobalLogicEngine()->getTickCount() + nTime* 1000;
|
||
}
|
||
|
||
void CDropItemEntity::SetDropMasterId(CActor * pActor)
|
||
{
|
||
if (pActor != NULL)
|
||
{
|
||
SetProperty<unsigned int>(PROP_ENTITY_DIR, pActor->GetProperty<unsigned int>(PROP_ENTITY_ID));
|
||
}
|
||
}
|
||
|
||
|
||
void CDropItemEntity::SetDropNoMasterId()
|
||
{
|
||
|
||
SetProperty<unsigned int>(PROP_ENTITY_DIR, 1);
|
||
}
|
||
|
||
void CDropItemEntity::SetMaster(CActor *pActor)
|
||
{
|
||
if(pActor !=NULL)
|
||
{
|
||
SetProperty<unsigned int>(PROP_ENTITY_ID,pActor->GetProperty<unsigned int>(PROP_ENTITY_ID));
|
||
//static int s_nMasterExpiretTime = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nDropItemMasterProtectTime * 1000;
|
||
static int s_nMasterExpiretTime = GetLogicServer()->GetDataProvider()->GetDropItemConfig().nDropItemMasterProtectTime * 1000;
|
||
|
||
SetMasterOwnerTime(s_nMasterExpiretTime);
|
||
}
|
||
}
|
||
void CDropItemEntity::SetItem( CUserItem *pUserItem)
|
||
{
|
||
if(pUserItem && m_pItem != NULL)
|
||
{
|
||
OutputMsg(rmWaning,"SetItem Old Item Not NULL");
|
||
}
|
||
if(pUserItem)
|
||
{
|
||
const CStdItem *pItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem( pUserItem->wItemId);
|
||
if(pItem)
|
||
{
|
||
// if(pItem->w_candidateIconCount >0) //如果有候选的图标
|
||
// {
|
||
// int nIcon = pItem->m_wIcon + wrand(pItem->w_candidateIconCount +1);
|
||
// SetProperty<int>(PROP_ENTITY_ICON,nIcon);
|
||
// }
|
||
// else
|
||
{
|
||
SetProperty<int>(PROP_ENTITY_ICON,pItem->m_wIcon); //设置图标的ID为道具的ID
|
||
}
|
||
if(pItem->m_Flags.showLootTips)
|
||
{
|
||
m_showLootTips =true;
|
||
}
|
||
SetEntityName(pItem->m_sName); //设置名字
|
||
}
|
||
|
||
}
|
||
m_pItem = pUserItem;
|
||
|
||
}
|
||
|
||
int CDropItemEntity::GetLootErrorCode(CActor * pActor,bool boObserVer)
|
||
{
|
||
if(pActor ==NULL ) return tmLootParamError; //参数非法
|
||
|
||
TICKCOUNT nCurTick = GetGlobalLogicEngine()->getTickCount(); //获取当前的时间
|
||
|
||
//已经过期
|
||
if(nCurTick > m_expireTime)
|
||
{
|
||
return tmLootExpired;
|
||
}
|
||
|
||
|
||
if(nCurTick < m_ownerExpireTime)
|
||
{
|
||
unsigned int nMasterId =GetMasterActorId(); //物品所归属的玩家ID
|
||
if(nMasterId && pActor->GetProperty<unsigned int >(PROP_ENTITY_ID) != nMasterId )
|
||
{
|
||
return tmLootNotOwner;
|
||
}
|
||
unsigned int nTeamId = GetTeamId();
|
||
|
||
if(nTeamId && nTeamId !=pActor->GetProperty<unsigned int >(PROP_ACTOR_TEAM_ID) )
|
||
{
|
||
return tmLootNotOwner;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(nCurTick < m_CanPickUpTime)
|
||
{
|
||
return tmLootCanPickUpTime;
|
||
}
|
||
}
|
||
|
||
|
||
if (!boObserVer)
|
||
{
|
||
int nItemPosX,nItemPosY, nActorPosX, nActorPosY;
|
||
pActor->GetPosition(nActorPosX,nActorPosY);
|
||
GetPosition(nItemPosX,nItemPosY);
|
||
if(nItemPosX != nActorPosX || nItemPosY != nActorPosY)
|
||
{
|
||
//OutputMsg(rmTip,"client[%d,%d], item[%d,%d]",nActorPosX,nActorPosY,nItemPosX,nItemPosY);
|
||
//return tpNoError;
|
||
return tmLootPosError;
|
||
}
|
||
else
|
||
{
|
||
return tpNoError;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return tpNoError;
|
||
}
|
||
|
||
}
|
||
|
||
//设置这个队伍的归属
|
||
void CDropItemEntity::SetTeamId(unsigned int nTeamId)
|
||
{
|
||
|
||
if(nTeamId )
|
||
{
|
||
SetProperty<unsigned int>(PROP_ENTITY_DIR,nTeamId);
|
||
//static int s_nMasterExpiretTime = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nDropItemMasterProtectTime * 1000;
|
||
static int s_nMasterExpiretTime = GetLogicServer()->GetDataProvider()->GetDropItemConfig().nDropItemMasterProtectTime * 1000;
|
||
|
||
SetMasterOwnerTime(s_nMasterExpiretTime);
|
||
}
|
||
|
||
}
|
||
|
||
//设置金钱的数目
|
||
void CDropItemEntity::SetMoneyCount( int nMoneyCount, int nMoneyType)
|
||
{
|
||
if(nMoneyCount <0) return;
|
||
SetProperty<int>(PROP_ENTITY_MODELID,nMoneyCount); //这个属性没有用,用于存金钱的数目,省点内存
|
||
m_btMoneyType = (BYTE)nMoneyType; //设置金币类型
|
||
if(nMoneyCount >0 )
|
||
{
|
||
//static int s_MoneyIconIconId = GetLogicServer()->GetDataProvider()->GetGlobalConfig().nDropCoinIconId; //金钱使用哪个图标
|
||
//GLOBALCONFIG & prop= GetLogicServer()->GetDataProvider()->GetGlobalConfig();
|
||
DROPITEMCONFIG & prop= GetLogicServer()->GetDataProvider()->GetDropItemConfig();
|
||
|
||
int nIconId =0, nNameTipsId=0;
|
||
INT_PTR nMaxId = MAX_DROP_COIN_ICON_COUNT -1;
|
||
|
||
int *pDropCounts = NULL;
|
||
int *pDropIcons = NULL;
|
||
// if (m_btMoneyType == mtYuanbao)
|
||
// {
|
||
// pDropCounts = prop.dropYuanBaoCounts;
|
||
// pDropIcons = prop.dropYuanBaoIcons;
|
||
// nNameTipsId = tpMoneyTypeYuanbao;
|
||
// }
|
||
if (m_btMoneyType == mtCoin)
|
||
{
|
||
pDropCounts = prop.dropCoinCounts;
|
||
pDropIcons = prop.dropCoinIcons;
|
||
nNameTipsId = tpMoneyTypeCoin;
|
||
}
|
||
else if (m_btMoneyType == mtBindCoin)
|
||
{
|
||
pDropCounts = prop.dropBindCoinCounts;
|
||
pDropIcons = prop.dropBindCoinIcons;
|
||
nNameTipsId = tpMoneyTypeBindCoin;
|
||
}
|
||
|
||
if (!pDropCounts || !pDropIcons)
|
||
return;
|
||
|
||
for (INT_PTR i = 0; i < nMaxId; i++ )
|
||
{
|
||
int nNextCount = pDropCounts[i+1];
|
||
if (nMoneyCount >= pDropCounts[i] && (nMoneyCount < nNextCount || nNextCount ==0))
|
||
{
|
||
nIconId = pDropIcons[i];
|
||
break;
|
||
}
|
||
/*
|
||
int nNextCount = prop.dropCoinCounts[i+1];
|
||
if(nMoneyCount >= prop.dropCoinCounts[i] && ( nMoneyCount < nNextCount || nNextCount ==0) )
|
||
{
|
||
nIconId = prop.dropCoinIcons[i];
|
||
break;
|
||
}
|
||
*/
|
||
}
|
||
//名字是金币
|
||
SetEntityName(GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(nNameTipsId)); //设置名字
|
||
|
||
SetProperty<int>(PROP_ENTITY_ICON,nIconId); //设置图标的ID为金钱的图标的ID
|
||
|
||
}
|
||
}
|
||
|
||
|
||
//获取金钱的数目
|
||
unsigned int CDropItemEntity::GetMoneyCount()
|
||
{
|
||
return GetProperty<unsigned int>(PROP_ENTITY_MODELID); //这个属性没有用,用于存金钱的数目,省点内存
|
||
}
|
||
|
||
CDropItemEntity * CDropItemEntity::CreateDropItem( CScene *pScene, int nPosX,int nPosY,int nLogId ,LPCTSTR sLogDesc,int nExitTime,bool flag)
|
||
{
|
||
|
||
if (!pScene) {
|
||
return NULL;
|
||
}
|
||
|
||
INT_PTR nDX, nDY;
|
||
bool boResult = false;
|
||
int nMax = 0;
|
||
INT_PTR nTempX = 0;
|
||
INT_PTR nTempY = 0;
|
||
|
||
|
||
//优先 怪物点掉落
|
||
if(pScene->CanMove(nPosX,nPosY) && !pScene->IsTelePort(nPosX,nPosY)) {
|
||
nMax= pScene->GetTypeEntityCount((int)nPosX, (int)nPosY,enDropItem); //获取掉落的物品的数目
|
||
nTempX = nPosX;
|
||
nTempY = nPosY;
|
||
}
|
||
|
||
if(flag) {
|
||
nMax = 666666;//强行进入下面循环
|
||
}
|
||
|
||
|
||
if(nMax != 0 ) {
|
||
|
||
for(int i = 1; i <= 3; i++) {
|
||
|
||
for(int y = -i; y <= i; y++) {
|
||
|
||
for(int x = -i; x <= i; x++) {
|
||
|
||
nDX = nPosX + x;
|
||
nDY = nPosY + y;
|
||
if(pScene->CanMove(nDX,nDY) && !pScene->IsTelePort(nDX,nDY) && !pScene->GetNpcAtXY(nDX,nDY)) {
|
||
if( flag && x==0 && y==0) continue ;
|
||
|
||
int nCount= pScene->GetTypeEntityCount((int)nDX, (int)nDY,enDropItem); //获取掉落的物品的数目
|
||
|
||
if (nCount == 0) {
|
||
boResult = true;
|
||
break;
|
||
}
|
||
else {
|
||
|
||
if( nMax > nCount) {
|
||
nMax = nCount;
|
||
nTempX = nDX;
|
||
nTempY = nDY;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (boResult) break;
|
||
}
|
||
|
||
if (boResult) break;
|
||
}
|
||
}
|
||
if (!boResult ) {
|
||
|
||
if (nMax < 5) {
|
||
nDX = nTempX;
|
||
nDY = nTempY;
|
||
}
|
||
else {
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
CDropItemEntity* pEntity = (CDropItemEntity*)(pScene->CreateEntityAndEnterScene(0, enDropItem, nDX, nDY));
|
||
if(pEntity)
|
||
{
|
||
pEntity->m_nLogId = nLogId;
|
||
if(nExitTime > 0)
|
||
pEntity->m_expireTime = GetGlobalLogicEngine()->getTickCount() + nExitTime * 1000;
|
||
|
||
if(sLogDesc) {
|
||
strncpy(pEntity->m_sLogDesc,sLogDesc,sizeof(pEntity->m_sLogDesc));
|
||
}
|
||
return pEntity;
|
||
}
|
||
|
||
return NULL;
|
||
|
||
}
|
||
|
||
CDropItemEntity * CDropItemEntity::CreateOne( CScene *pScene, int nPosX, int nPosY, int nLogId, LPCTSTR sLogDesc, int nExitTime)
|
||
{
|
||
static const int MAX_COUNT_OF_ONE_GRID_CAN_DROP = 5;
|
||
|
||
if (!pScene) return NULL;
|
||
|
||
INT_PTR nDropPosX = nPosX, nDropPosY = nPosY;
|
||
size_t nDist = 0;
|
||
|
||
int nLoopCount = 64;
|
||
while (nLoopCount-- > 0)
|
||
{
|
||
int nLeftRight[2] = { nPosX - nDist, nPosX + nDist };
|
||
int nTopDown[2] = { nPosY - nDist, nPosY + nDist };
|
||
|
||
//上边
|
||
for (nDropPosX = nLeftRight[0]; nDropPosX <= nLeftRight[1]; nDropPosX++)
|
||
{
|
||
nDropPosY = nTopDown[0];
|
||
if(
|
||
pScene->GetTypeEntityCount(nDropPosX, nDropPosY, enDropItem) < MAX_COUNT_OF_ONE_GRID_CAN_DROP &&
|
||
pScene->CanMove(nDropPosX,nDropPosY) &&
|
||
!pScene->IsTelePort(nDropPosX,nDropPosY)
|
||
)
|
||
{
|
||
goto create_one;
|
||
}
|
||
}
|
||
|
||
//右边
|
||
for (nDropPosY = nTopDown[0] + 1; nDropPosY <= nTopDown[1]; nDropPosY++)
|
||
{
|
||
nDropPosX = nLeftRight[1];
|
||
if(
|
||
pScene->GetTypeEntityCount(nDropPosX, nDropPosY, enDropItem) < MAX_COUNT_OF_ONE_GRID_CAN_DROP &&
|
||
pScene->CanMove(nDropPosX,nDropPosY) &&
|
||
!pScene->IsTelePort(nDropPosX,nDropPosY)
|
||
)
|
||
{
|
||
goto create_one;
|
||
}
|
||
}
|
||
|
||
//下边
|
||
for (nDropPosX = nLeftRight[1] - 1; nDropPosX >= nLeftRight[0]; nDropPosX--)
|
||
{
|
||
nDropPosY = nTopDown[1];
|
||
if(
|
||
pScene->GetTypeEntityCount(nDropPosX, nDropPosY, enDropItem) < MAX_COUNT_OF_ONE_GRID_CAN_DROP &&
|
||
pScene->CanMove(nDropPosX,nDropPosY) &&
|
||
!pScene->IsTelePort(nDropPosX,nDropPosY)
|
||
)
|
||
{
|
||
goto create_one;
|
||
}
|
||
}
|
||
|
||
//左边
|
||
for (nDropPosY = nTopDown[1] - 1; nDropPosY > nTopDown[0]; nDropPosY--)
|
||
{
|
||
nDropPosX = nLeftRight[0];
|
||
if(
|
||
pScene->GetTypeEntityCount(nDropPosX, nDropPosY, enDropItem) < MAX_COUNT_OF_ONE_GRID_CAN_DROP &&
|
||
pScene->CanMove(nDropPosX,nDropPosY) &&
|
||
!pScene->IsTelePort(nDropPosX,nDropPosY)
|
||
)
|
||
{
|
||
goto create_one;
|
||
}
|
||
}
|
||
|
||
//向外一圈
|
||
nDist++;
|
||
}
|
||
|
||
return NULL;
|
||
|
||
// 场景中生成1个掉落品
|
||
create_one:
|
||
{
|
||
CDropItemEntity* pDropItem = (CDropItemEntity*)(pScene->CreateEntityAndEnterScene(0, enDropItem, nDropPosX, nDropPosY));
|
||
pDropItem->m_nLogId = nLogId;
|
||
if(nExitTime > 0)
|
||
pDropItem->m_expireTime = GetGlobalLogicEngine()->getTickCount() + nExitTime * 1000;
|
||
|
||
if(sLogDesc) {
|
||
strncpy(pDropItem->m_sLogDesc,sLogDesc,sizeof(pDropItem->m_sLogDesc));
|
||
}
|
||
return pDropItem;
|
||
}
|
||
}
|
||
|
||
void CDropItemEntity::DealDropItemTimeInfo(CActor * pActor, int type, int pick_time)
|
||
{
|
||
static int nNeedpickTime = GetLogicServer()->GetDataProvider()->GetDropItemConfig().nDropItemNeedTime;
|
||
static int nActorpickTime = GetLogicServer()->GetDataProvider()->GetDropItemConfig().nDropItemMasterProtectTime;
|
||
CTeam * pTeam = NULL;
|
||
if(pActor)
|
||
{
|
||
pTeam = pActor->GetTeam();
|
||
}
|
||
|
||
if(type == 0)
|
||
{
|
||
if(pTeam) {
|
||
SetTeamId(pTeam->GetTeamID());
|
||
}
|
||
else {
|
||
if(pActor)
|
||
{
|
||
SetMaster(pActor); //这个是他的主人了
|
||
}
|
||
}
|
||
SetMasterOwnerTime(nActorpickTime*1000);
|
||
SetCanPickUpTime(nActorpickTime);
|
||
}
|
||
else if(type == 1) { //----所有人都能捡取
|
||
|
||
} else if(type== 2) { //---仅限击杀者捡取
|
||
|
||
if(pTeam) {
|
||
SetTeamId(pTeam->GetTeamID());
|
||
}
|
||
else {
|
||
if(pActor)
|
||
{
|
||
SetMaster(pActor); //这个是他的主人了
|
||
}
|
||
}
|
||
SetCanPickUpTime(100000000);
|
||
SetMasterOwnerTime(100000000); //设置一个很大的时间,24小时以上
|
||
|
||
} else if(type == 666) { //----活动用,手动设置捡取时间
|
||
SetCanPickUpTime(pick_time);
|
||
SetDropNoMasterId();
|
||
|
||
}else { //----所有人都过60秒才能捡取
|
||
SetCanPickUpTime(nNeedpickTime);
|
||
SetDropNoMasterId();
|
||
|
||
}
|
||
}
|
||
|
||
|
||
int CDropItemEntity::GetPetLootErrorCode(CActor * pActor,bool boObserVer)
|
||
{
|
||
if(pActor ==NULL ) return tmLootParamError; //参数非法
|
||
|
||
TICKCOUNT nCurTick = GetGlobalLogicEngine()->getTickCount(); //获取当前的时间
|
||
int nLootPetID = pActor->GetProperty<int>(PROP_ACTOR_LOOT_PET_ID);
|
||
int nDropLootDistance = 0;
|
||
auto cfg = GetLogicServer()->GetDataProvider()->GetLootPetProvider().GetLootPetConfig(nLootPetID);
|
||
if(cfg) {
|
||
nDropLootDistance = cfg->nLootPetDistance;
|
||
}
|
||
|
||
//当捡取宠物都不显示时,默认类型最小Type类型的捡取距离
|
||
if (nLootPetID == 0 && pActor->GetProperty<unsigned long long>(PROP_ACTOR_DEFAULTLOOTPETDIS) != 0)
|
||
{
|
||
nDropLootDistance = pActor->GetProperty<unsigned long long>(PROP_ACTOR_DEFAULTLOOTPETDIS);
|
||
}
|
||
|
||
//已经过期
|
||
if(nCurTick > m_expireTime)
|
||
{
|
||
return tmLootExpired;
|
||
}
|
||
|
||
|
||
if(nCurTick < m_ownerExpireTime)
|
||
{
|
||
unsigned int nMasterId =GetMasterActorId(); //物品所归属的玩家ID
|
||
if(nMasterId && pActor->GetProperty<unsigned int >(PROP_ENTITY_ID) != nMasterId )
|
||
{
|
||
return tmLootNotOwner;
|
||
}
|
||
unsigned int nTeamId = GetTeamId();
|
||
|
||
if(nTeamId && nTeamId !=pActor->GetProperty<unsigned int >(PROP_ACTOR_TEAM_ID) )
|
||
{
|
||
return tmLootNotOwner;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if(nCurTick < m_CanPickUpTime)
|
||
{
|
||
return tmLootCanPickUpTime;
|
||
}
|
||
}
|
||
|
||
|
||
if (!boObserVer)
|
||
{
|
||
int nItemPosX,nItemPosY, nActorPosX, nActorPosY;
|
||
pActor->GetPosition(nActorPosX,nActorPosY);
|
||
GetPosition(nItemPosX,nItemPosY);
|
||
if(abs(nItemPosX - nActorPosX) > nDropLootDistance || abs(nItemPosY - nActorPosY) > nDropLootDistance)
|
||
{
|
||
return tmLootPosError;
|
||
}
|
||
else
|
||
{
|
||
return tpNoError;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return tpNoError;
|
||
}
|
||
|
||
} |