#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(PROP_ENTITY_DIR, pActor->GetProperty(PROP_ENTITY_ID)); } } void CDropItemEntity::SetDropNoMasterId() { SetProperty(PROP_ENTITY_DIR, 1); } void CDropItemEntity::SetMaster(CActor *pActor) { if(pActor !=NULL) { SetProperty(PROP_ENTITY_ID,pActor->GetProperty(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(PROP_ENTITY_ICON,nIcon); // } // else { SetProperty(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(PROP_ENTITY_ID) != nMasterId ) { return tmLootNotOwner; } unsigned int nTeamId = GetTeamId(); if(nTeamId && nTeamId !=pActor->GetProperty(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(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(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(PROP_ENTITY_ICON,nIconId); //设置图标的ID为金钱的图标的ID } } //获取金钱的数目 unsigned int CDropItemEntity::GetMoneyCount() { return GetProperty(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(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(PROP_ACTOR_DEFAULTLOOTPETDIS) != 0) { nDropLootDistance = pActor->GetProperty(PROP_ACTOR_DEFAULTLOOTPETDIS); } //已经过期 if(nCurTick > m_expireTime) { return tmLootExpired; } if(nCurTick < m_ownerExpireTime) { unsigned int nMasterId =GetMasterActorId(); //物品所归属的玩家ID if(nMasterId && pActor->GetProperty(PROP_ENTITY_ID) != nMasterId ) { return tmLootNotOwner; } unsigned int nTeamId = GetTeamId(); if(nTeamId && nTeamId !=pActor->GetProperty(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; } }