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

1016 lines
27 KiB
C++
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#include "StdAfx.h"
#include<algorithm>
#include "EquipVessel.h"
#include "../../base/Container.hpp"
#include "script/interface/SystemParamDef.h"
#define BASE_EQUIP_COUNT 10 //基本装备数(目前无勋章)
#define RING_BANGLE_COUNT 2
INT_PTR CEquipVessel::GetPetTakeItemErrorCode(const HERODBDATA*pData, const CStdItem* pStdItem, const CUserItem *pUserItem,CAnimal *pMaster)
{
if(pData ==NULL || pStdItem ==NULL) return tpItemNotExist;
const CStdItem::ItemUseCondition *pCond = pStdItem->m_Conditions.pConds;
unsigned int nReqValue;
if (pUserItem == NULL) return tpItemNotExist;
for (INT_PTR i=pStdItem->m_Conditions.nCount-1; i>-1; --i)
{
switch(pCond->btCond)
{
case CStdItem::ItemUseCondition::ucLevel: //等级必须大于等于value级
nReqValue = (unsigned int)pCond->nValue;
//转数判断
if ((unsigned int)pData->bLevel < (unsigned int)nReqValue)
return tpItemCannotTakeOnForLevel;
break;
case CStdItem::ItemUseCondition::ucGender: //性别编号必须等于value0男1女
if ((unsigned int)pData->bSex != (unsigned int)pCond->nValue) return tpItemCannotTakeOnForSex;
break;
case CStdItem::ItemUseCondition::ucJob: //职业编号必须等于value
if ((unsigned int)pData->bVocation != (unsigned int)pCond->nValue && pCond->nValue != 0) return tpItemCannotTakeOnForVocation;
break;
case CStdItem::ItemUseCondition::ucBattlePower: //战力必须大于等于value
{
if ((unsigned int)pData->nScore < (unsigned int)pCond->nValue)
return tpItemCannotTakeOnForBattlePower;
break;
}
}
pCond++;
}
return tpNoError;
}
bool CEquipVessel::TakeOnEquip(CActor *pActor,CUserItem* pUserItem,const HERODBDATA *pPetData,INT_PTR nLocation ,bool isBagEquip)
{
INT_PTR nPos;
const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
if (!pStdItem || pStdItem->m_nPackageType != 1)//no exist or type not is equipmentType
{
//TODO:向角色发送不可穿戴此物品的消息,物品不是一个可穿戴的装备
if(pActor->GetType() ==enActor)
{
pActor->SendOldTipmsgWithId(tpItemCannotTakeOn,ttTipmsgWindow);
}
return false;
}
int nJop = pActor->GetProperty<int>(PROP_ACTOR_VOCATION);
nPos = GetItemTakeOnPosition((Item::ItemType)pStdItem->m_btType);
if (nPos == -1)
{
return false;
}
//判断装备穿戴的条件是否满足
INT_PTR nErrorCode=tpNoError;
//是否需要检测条件,如果不需要检测条件的话就不检测
if(pPetData ==NULL)
{
nErrorCode= CheckTakeOnCondition(pActor, pStdItem, pUserItem);
}
else
{
nErrorCode= GetPetTakeItemErrorCode(pPetData, pStdItem, pUserItem,pActor);
}
if ( nErrorCode != tpNoError )
{
if(pActor->GetType() ==enActor)
{
( (CActor*)pActor)->SendOldTipmsgWithId(nErrorCode,ttFlyTip + ttTipmsgWindow);
}
return false;
}
CUserItem *pOldEquip =NULL; //当前有装备,需要换装
bool bHero = pPetData? true : false;
CUserBag& bag= pActor->GetBagSystem();
//如果当前的位置有装备的话
if(m_Items[nPos])
{
pOldEquip = m_Items[nPos];
}
//自动绑定的
if( pStdItem->m_Flags.autoBindOnTake)
{
if (!pUserItem->binded()) // 修改Bug发送的绑定装备装上去也提示"**装备后绑定"
{
bag.SetItemProperty(pUserItem, Item::ipItemBind, ufBinded);
if(pActor->GetType() ==enActor && !(pStdItem->isGodStoveEquipment()))//神炉装备不提示
{
( (CActor*)pActor)->SendOldTipmsgFormatWithId(tpItemTakenOnBinded,
ttTipmsgWindow,
CUserBag::GetItemLink(pStdItem->m_nIndex,pUserItem));
}
}
}
bool isDelItem = true;
//穿上物品
if(pUserItem->wCount > 1) {
CUserItem* pNewEquip = GetLogicServer()->GetLogicEngine()->AllocUserItem(true); //新的物品
if(pNewEquip ==NULL) return false;
CUserItem::ItemSeries newGuid = pNewEquip->series; //保存序列号
memcpy(pNewEquip,pUserItem,sizeof(*pUserItem)); //先拷贝过去
pNewEquip->series = newGuid; //序列号是新的
pNewEquip->wCount = (WORD)1; //新的数量
pActor->RemoveConsume(0, pUserItem->wItemId, 1, -1, -1,-1,0, GameLog::Log_TakeOn);
m_Items[nPos] = pNewEquip;
isDelItem = false;
}else{
m_Items[nPos] = pUserItem;
}
if(!m_Items[nPos]) return false;
//这里要向客户端发一个消息,告诉玩家装备上这件物品
AfterEquipTakenOn(pActor,nPos,m_Items[nPos]);
if (isBagEquip && isDelItem)
{
bag.RemoveItem(pUserItem->series,"take_on_equip",GameLog::Log_TakeOn,false); //这里会走一个删除流程
}
if(pOldEquip) //这个时候需要把这件装备加到背包里去
{
WORD nLogId = GameLog::Log_TakeOff;
pActor->GetBagSystem().AddItem(pOldEquip, pActor->GetEntityName(),nLogId);
//TakeOffEquip(pActor, pOldEquip, true, bHero);
}
return true;
}
bool CEquipVessel::TakeOnEquip(CActor *pActor,const CUserItem::ItemSeries &series,const HERODBDATA *pPetData,INT_PTR nLocation , bool isBagEquip)
{
CUserBag& bag= pActor->GetBagSystem();
//从角色的包裹中查找要穿戴的物品
CUserItem* pUserItem = bag.FindItemByGuid(series);
if (!pUserItem)
{
//TODO:向角色发送要穿戴的物品不存在的消息
if(pActor->GetType() ==enActor)
{
( (CActor*)pActor)->SendOldTipmsgWithId(tpItemNotExist,ttTipmsgWindow);
}
return false;
}
//确认物品是否是一个可穿戴的装备
return TakeOnEquip(pActor, pUserItem, pPetData, nLocation, true);
}
bool CEquipVessel::DirectRemoveEquip(CActor *pOwner,CUserItem *pUserItem, LPCSTR pSender, INT_PTR nLogIdent, bool boDeedFreeMem)
{
if(pUserItem ==NULL) return false;
INT_PTR nIndex= FindIndex(pUserItem->series);
if(nIndex <0) return false;
AfterEquipDirectRemove(pOwner,pUserItem);
AfterEquipTakenOff(pOwner,pUserItem);
pUserItem->btHandPos =0;
m_Items[nIndex] =NULL;
//记录日志
const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
if (pStdItem )
{
CUserBag::LogChangeItemCount(pUserItem, pStdItem, -pUserItem->wCount,
pSender, pOwner->GetProperty<unsigned int>(PROP_ENTITY_ID), pOwner->GetEntityName(),
nLogIdent, pOwner->GetAccount());
}
else
{
OutputMsg(rmError,"DirectRemoveEquip pStdItem is NULL ");
}
if (boDeedFreeMem)
{
GetGlobalLogicEngine()->DestroyUserItem(pUserItem);
}
return true;
}
bool CEquipVessel::TakeOffEquip(CActor *pOner,CUserItem *pUserItem, bool boCheckGrid, bool boHero)
{
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
if (!pStdItem)
{
return false;
}
if (boCheckGrid && pStdItem->isGodStoveEquipment())
{
return false;//神炉装备不能脱到背包
}
//如果背包已经满了则不能取下物品
if ( boCheckGrid && !pOner->GetBagSystem().CanAddItem(pUserItem, true))
{
//TODO:向角色发送背包已满,无法取下物品的消息
if(pOner->GetType() ==enActor)
{
( (CActor*)pOner)->SendTipmsgFormatWithId(tmEquipNoBagNum, tstUI);
}
return false;
}
//先脱装备? 可能添加物品那边有问题 导致脱装备失败
AfterEquipTakenOff(pOner,pUserItem);
WORD nLogId = boHero? GameLog::Log_TakeOff : GameLog::Log_TakeOff;
if( boCheckGrid && pOner->GetBagSystem().AddItem(pUserItem, pOner->GetEntityName(),nLogId) ==0 )
{
return false;
}
else
{
pUserItem->btHandPos =0; //清掉装备的位置
//AfterEquipTakenOff(pOner,pUserItem);
return true;
}
}
bool CEquipVessel::TakeOffEquip(CActor *pActor,const CUserItem::ItemSeries &series, bool boCheckGrid, bool boHero)
{
//查找装备穿戴的位置
INT_PTR nPos = FindIndex(series);
if ( nPos < 0 )
{
//TODO:向角色发送装备物品不存在的消息
if(boCheckGrid && pActor->GetType() ==enActor)
{
( (CActor*)pActor)->SendOldTipmsgWithId(tpItemNotExist,ttTipmsgWindow);
}
return false;
}
else
{
if(TakeOffEquip(pActor,m_Items[nPos], boCheckGrid, boHero))
{
m_Items[nPos] =NULL;
return true;
}
else
{
return false;
}
}
}
void CEquipVessel::CalcOneEquipAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem, CAnimal* pMaster)
{
if (!pUserItem)
{
return;
}
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
if (!pStdItem)
{
return;
}
bool bNeedAddProp = true;
if (bNeedAddProp)//有耐久
{
if (pUserItem->btLuck)
{
GAMEATTR val;
if (pUserItem->btLuck > 0)
{
val.type = aLuckAdd;
val.value.nValue = pUserItem->btLuck;
}
if (pOriginalCal)
{
*pOriginalCal << val;
}
calc << val;
}
std::string bestAttr = pUserItem->cBestAttr;
if(bestAttr != "")
{
std::vector< std::string > results = SplitStr(bestAttr, "|");
int nCount = results.size();
for (int i = 0; i< nCount; i++)
{
std::vector< std::string > temp_res = SplitStr( results[i], ",");
if(temp_res.size() >=2 )
{
int type = atoi(temp_res[0].c_str());
int value = atoi(temp_res[1].c_str());
GAMEATTR val;
val.type = type;
val.value.nValue = value;
calc << val;
}
}
}
pStdItem->CalcAttributes(calc, pUserItem->btQuality, pUserItem->btStrong, pUserItem, pMaster);
}
if (pOriginalCal)
{
pStdItem->CalcAttributes(*pOriginalCal, pUserItem->btQuality, pUserItem->btStrong, pUserItem, pMaster);
}
/*** ★★★★★★★★★★★★★★★★计算装备鉴定属性★★★★★★★★★★★★★★★★ ***/
for( INT_PTR j = 0; j < CUserItem::MaxSmithAttrCount; ++j)
{
if( pUserItem->smithAttrs[j].type)
{
if( bNeedAddProp )
{
calc << pUserItem->smithAttrs[j];
}
if( pOriginalCal )
{
*pOriginalCal << pUserItem->smithAttrs[j];
}
}
}
/*** ★★★★★★★★★★★★★★★★计算装备升星属性★★★★★★★★★★★★★★★★ ***/
CalcOneEquipStarAttr(calc, pOriginalCal, pUserItem, pMaster, bNeedAddProp);
/*** ★★★★★★★★★★★★★★★★计算装备铭刻属性★★★★★★★★★★★★★★★★ ***/
//CalcOneEquipInscriptAttr(calc, pOriginalCal, pUserItem, pMaster, bNeedAddProp);
/*** ★★★★★★★★★★★★★★★★计算启兵属性加成★★★★★★★★★★★★★★★★ ***/
//(基础属性+品质属性)* (1+部位强化百分比)
}
/*计算装备的强化升星属性
EquipStar配置仅仅是供客户端显示和服务器扣费使用
*/
void CEquipVessel::CalcOneEquipStarAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem,
CAnimal* pMaster, bool bNeedAddProp)
{
if( pUserItem->wStar > 0 && pMaster )
{
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
if (pStdItem && pUserItem->wStar > 0)
{
ItemUpStarCfg* pCfg = GetLogicServer()->GetDataProvider()->GetUpStar().getItemUpStarCfg(pUserItem->wItemId, pUserItem->wStar);
if (pCfg)
{
for( int k = 0; k < pCfg->attr.nCount; k++ )
{
calc << pCfg->attr.pAttrs[k];
}
}
}
}
}
/*计算装备的铭刻属性
EquipInscriptCfg配置仅仅是供客户端显示和服务器扣费使用
*/
void CEquipVessel::CalcOneEquipInscriptAttr(CAttrCalc &calc, CAttrCalc *pOriginalCal, CUserItem* pUserItem,
CAnimal* pMaster, bool bNeedAddProp)
{
}
/*
*/
CAttrCalc & CEquipVessel::CalcAttr(CAttrCalc &calc,CAttrCalc *pOriginalCal ,CAnimal *pMaster,const HERODBDATA *pPetData)
{
INT_PTR i;
const CStdItem *pStdItem;
CUserItem *pUserItem;
//const CStdItem::UnitedAttributeGroup *pUnitedGroup;
CStdItemProvider& stdItemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider();
// INT_PTR nOrangeEquipCount =0; //橙色装备的数目
// INT_PTR nMatchAllSuitCount =0; //能够匹配所有套装的件数
bool nFlag = true;
CAttrCalc cal;
bool bNeedCalcEquipPosStrongDerive = true;//是否需要计算启兵衍生属性(戴上所有装备并所有装备耐久>0)
for (i=0 ; i<EquipmentCount; i++)
{
bool isBasicEquips = IsBasicEquip(i); //是否是基本装备12件
pUserItem = m_Items[i];
if(pUserItem ==NULL)
{
continue;
}
//计算套装 加成的基础装备属性
if(!isBasicEquips && nFlag)
{
SuitAttrCal(cal);
nFlag = false;
}
pStdItem = stdItemProvider.GetStdItem(pUserItem->wItemId);
if (pPetData)
{
if (GetPetTakeItemErrorCode(pPetData,pStdItem, pUserItem,pMaster)) //如果装备的条件不满足了,则不计算属性了
{
continue;
}
}
else if (pMaster)
{
if (CheckTakeOnCondition(pMaster,pStdItem, pUserItem)) //如果装备的条件不满足了,则不计算属性了
{
continue;
}
}
//统一计算单件装备属性
CalcOneEquipAttr(cal, pOriginalCal, pUserItem, pMaster);
//单件装备套装加成
}
//内功共鸣属性
if ( m_Items[itSilverNeedlePos] && m_Items[itSilverHairClaspPos] )
{
CalcResonanceAttr(cal, m_Items[itSilverNeedlePos], m_Items[itSilverHairClaspPos]);
}
if ( m_Items[itDeterminationPos] && m_Items[itHeartNourishingJadePos] )
{
CalcResonanceAttr(cal, m_Items[itDeterminationPos], m_Items[itHeartNourishingJadePos]);
}
if ( m_Items[itGoldSealPos] && m_Items[itGoldObsidianBeadPos] )
{
CalcResonanceAttr(cal, m_Items[itGoldSealPos], m_Items[itGoldObsidianBeadPos]);
}
if ( m_Items[itSandersPearlPos] && m_Items[itBlackSandalwoodStonePos] )
{
CalcResonanceAttr(cal, m_Items[itSandersPearlPos], m_Items[itBlackSandalwoodStonePos]);
}
calc <<cal;
return calc;
}
CUserItem* CEquipVessel::FindItemByID(const INT_PTR wItemId,CUserItem** pUserItemVec,INT_PTR nItemCount)
{
for (INT_PTR i=0; i<nItemCount; i ++)
{
if ( pUserItemVec[i] && pUserItemVec[i]->wItemId == wItemId )
{
return pUserItemVec[i];
}
}
return NULL;
}
INT_PTR CEquipVessel::GetEquipCountByID(const INT_PTR wItemId, const INT_PTR nQuality, const INT_PTR nStrong,const INT_PTR nBind,const INT_PTR nDuraOdds, void * pNoItem)
{
INT_PTR Result = 0;
CUserItem *pUserItem, *pNoGetItem = NULL;
if (pNoItem != NULL)
{
pNoGetItem = (CUserItem*)pNoItem;
}
for (INT_PTR i= EquipmentCount-1; i>-1; --i)
{
pUserItem = m_Items[i];
if (pUserItem && pUserItem->wItemId == wItemId )
{
if ( pUserItem->btQuality != nQuality && nQuality != -1)
continue;
if ( pUserItem->btStrong != nStrong && nStrong != -1 )
continue;
//判断绑定属性是否一致
if(nBind != -1 && nBind != 255)
{
if( (nBind && 0==pUserItem->btFlag) || (nBind==0 && pUserItem->btFlag) )
{
continue;
}
}
// if ((pUserItem->wDuraMax - pUserItem->wDura) > nDuraOdds && nDuraOdds != -1)
// continue;
if (pNoGetItem != NULL && pNoGetItem == pUserItem)
{
continue;
}
Result ++;
}
}
return Result;
}
INT_PTR CEquipVessel::FindIndex(const CUserItem::ItemSeries series)
{
for (INT_PTR i=0; i<EquipmentCount; ++i)
{
if ( m_Items[i] && m_Items[i]->series.llId == series.llId )
return i;
}
return -1;
}
float CEquipVessel::GetItemAttrSetScore( CUserItem* pUseItem, CActor* pActor)
{
if (!pUseItem)
{
return 0;
}
const CStdItem* pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUseItem->wItemId);
if (pStdItem)
{
CAttrCalc calc;
CAttrCalc pOrignCalc;
CalcOneEquipAttr(calc, &pOrignCalc, pUseItem, pActor);
CAttrEval *pCal = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetEval(pActor->GetProperty<unsigned int>(PROP_ACTOR_VOCATION));
if (pCal)
{
return pCal->GetAttrSetScore(pOrignCalc);
}
}
return 0;
}
INT_PTR CEquipVessel::GetItemTakeOnPosition(const Item::ItemType btItemType, INT_PTR btLocation)
{
if(btItemType > Item::itUndefinedType && btItemType < Item::itEquipMax)
{
INT_PTR nPos;
switch (btItemType)
{
case Item::itWeapon:
nPos = itWeaponPos;
break;
case Item::itDress:
nPos = itDressPos;
break;
case Item::itHelmet:
nPos = itHelmetPos;
break;
case Item::itNecklace:
nPos = itNecklacePos;
break;
case Item::itDecoration:
nPos = itDecorationPos;
break;
case Item::itBracelet:
nPos = itBraceletPos;
break;
case Item::itRing:
nPos = itRingPos;
break;
case Item::itGirdle:
nPos = itGirdlePos;
break;
case Item::itShoes:
nPos = itShoesPos;
break;
case Item::itEquipDiamond:
nPos = itEquipDiamondPos;
break;
case Item::itSzBambooHat: //特戒
nPos = itBambooHatPos;
break;
case Item::itSztFaceNail: //幻武
nPos = itFaceNailPos;
break;
case Item::itSzitCape: //玄甲
nPos = itCapePos;
break;
case Item::itSzitShiel:
nPos = itShieldPos;
break;
case Item::itPearl:
nPos = itPearlPos;
break;
case Item::itMagicpWeapon:
nPos = itMagicpPos;
break;
case Item::itSilverNeedle:
nPos = itSilverNeedlePos;
break;
case Item::itDetermination:
nPos = itDeterminationPos;
break;
case Item::itGoldSeal:
nPos = itGoldSealPos;
break;
case Item::itSandersPearl:
nPos = itSandersPearlPos;
break;
case Item::itSilverHairClasp:
nPos = itSilverHairClaspPos;
break;
case Item::itHeartNourishingJade:
nPos = itHeartNourishingJadePos;
break;
case Item::itGoldObsidianBead:
nPos = itGoldObsidianBeadPos;
break;
case Item::itBlackSandalwoodStone:
nPos = itBlackSandalwoodStonePos;
break;
default:
nPos = -1;
break;
}
return nPos;
}
else
{
return -1;
}
}
INT_PTR CEquipVessel::CheckTakeOnCondition(const CEntity *pMonster, const CStdItem* pStdItem, const CUserItem *pUserItem)
{
const CStdItem::ItemUseCondition *pCond;
if (pMonster == NULL
|| pStdItem == NULL)
{
return tpItemNotExist;
}
pCond = pStdItem->m_Conditions.pConds;
INT_PTR nEntityType = pMonster->GetType();
if (pUserItem == NULL)
{
return tpItemNotExist;
}
if(pStdItem->m_CanUseType > eITEM_USE_LIMIT_NULL
&& pStdItem->m_CanUseType < eITEM_USE_LIMIT_MAX) //使用次数限制
{
if(pStdItem->m_CanUseCount <= 0)
{
return tpNoError;
}
}
for (INT_PTR i = pStdItem->m_Conditions.nCount - 1; i > -1; --i)
{
switch(pCond->btCond)
{
case CStdItem::ItemUseCondition::ucLevel: //等级必须大于等于value级
if (pMonster->GetProperty<unsigned int>(PROP_CREATURE_LEVEL) < (unsigned int)pCond->nValue)
return tpItemCannotTakeOnForLevel;
break;
case CStdItem::ItemUseCondition::ucGender: //性别编号必须等于value0男1女
if( nEntityType ==enActor &&
pMonster->GetProperty<unsigned int>(PROP_ACTOR_SEX) != (unsigned int)pCond->nValue) return tpItemCannotTakeOnForSex;
break;
case CStdItem::ItemUseCondition::ucJob: //职业编号必须等于value
if( nEntityType ==enActor &&
pMonster->GetProperty<unsigned int>(PROP_ACTOR_VOCATION) != (unsigned int)pCond->nValue && pCond->nValue != 0) return tpItemCannotTakeOnForVocation;
break;
case CStdItem::ItemUseCondition::ucSocialMask:
{
if(nEntityType ==enActor)
{
unsigned int nActorId = pMonster->GetId();
//必须为沙巴克城主
if(nActorId > 0 && nActorId != GetGlobalLogicEngine()->GetGuildMgr().GetCityOwnMasterId())
{
return tpNotSbkCityOwner;
}
}
break;
}
case CStdItem::ItemUseCondition::ucBattlePower: //战力必须大于等于value
if (nEntityType == enActor) //转数判断
{
if (pMonster->GetProperty<unsigned int>(PROP_ACTOR_BATTLE_POWER) < (unsigned int)pCond->nValue)
return tpItemCannotTakeOnForBattlePower;
}
break;
case CStdItem::ItemUseCondition::ucMinCircle: //大于等于这个转生才能使用
{
if (nEntityType == enActor) //转数判断
{
if (pMonster->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE) < (unsigned int)pCond->nValue)
{
/*就判断转数没必要判断等级等级在ucLevel判断
INT_PTR nMinLv = pStdItem->GetUseConditionValue(CStdItem::ItemUseCondition::ucLevel);
if(pMonster->GetProperty<unsigned int>(PROP_CREATURE_LEVEL) < nMinLv)
{
return tpNoMoreCircleNotUse;
}*/
return tpNoMoreCircleNotUse;
}
}
break;
}
case CStdItem::ItemUseCondition::ucMaxCircle: //小于等于这个转生才能使用
{
if (nEntityType == enActor) //转数判断
{
if (pMonster->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE) > (unsigned int)pCond->nValue)
return tpUpCircleCanNotUse;
}
break;
}
case CStdItem::ItemUseCondition::ucInternalWorkLevel: //大于等于这个内功等级才能使用
{
if (nEntityType == enActor) //内功判断
{
if (pMonster->GetProperty<unsigned int>(PROP_ACTOR_MERIDIALv) < (unsigned int)pCond->nValue)
return tmInternalWorkLevelNotEnough;
}
break;
}
case CStdItem::ItemUseCondition::ucGuildLevel: //行会等级必须大于等于value级
{
if (nEntityType == enActor) //行会等级
{
if (pMonster->GetProperty<unsigned int>(PROP_ACTOR_GUILD_LEVEL) < (unsigned int)pCond->nValue)
return tmGuildLevelLimit;
}
break;
}
}
++pCond;
}
return tpNoError;
}
int CEquipVessel::GetTotalStar() const
{
CStdItemProvider &stdItemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider();
const CUserItem *pUserItem = NULL;
const CStdItem *pStdItem = NULL;
int nStar = 0 ;
for(INT_PTR i = 0; i < EquipmentCount; ++i)
{
bool isBasicEquips = IsBasicEquip(i); //是否是基本装备
if(!isBasicEquips)
continue;
pUserItem = m_Items[i];
if (!pUserItem)
{
continue;
}
pStdItem = stdItemProvider.GetStdItem(pUserItem->wItemId);
if (!pStdItem)
{
continue;
}
nStar = nStar + pUserItem->wStar;
}
return nStar;
}
INT_PTR CEquipVessel::GetSuitMinStar() const
{
CStdItemProvider &stdItemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider();
INT_PTR nCount = 0;
const CUserItem *pUserItem = NULL;
const CStdItem *pStdItem = NULL;
int nStar = 0 ; //全身装备最低升星等级
int nEquipStarCount = 0; //已升星的装备数量
//for(INT_PTR i = 0; i < itBloodSoulPos; ++i)
for(INT_PTR i = 0; i < itMaxEquipPos; ++i)
{
bool isBasicEquips = IsBasicEquip(i); //是否是基本装备
if(!isBasicEquips)
continue;
pUserItem = m_Items[i];
if (!pUserItem)
{
continue;
}
pStdItem = stdItemProvider.GetStdItem(pUserItem->wItemId);
if (!pStdItem)
{
continue;
}
if(pUserItem->wStar > 0 && nStar == 0)
{
nStar = pUserItem->wStar;
nEquipStarCount++;
}else if(pUserItem->wStar > 0 && nStar > 0)
{
if(pUserItem->wStar < nStar)
{
nStar = pUserItem->wStar;
nEquipStarCount++;
}else
{
nEquipStarCount++;
}
}
}
if(nEquipStarCount <BASE_EQUIP_COUNT)
{
return 0;
}else
{
return nStar;
}
}
INT_PTR CEquipVessel::GetMinStrongLevel() const
{
CStdItemProvider &stdItemProvider = GetLogicServer()->GetDataProvider()->GetStdItemProvider();
INT_PTR nMinStrongLevel = 100; //最低的强化的属性
const CUserItem *pUserItem = NULL;
const CStdItem *pStdItem = NULL;
for(INT_PTR i = 0; i < EquipmentCount; ++i)
{
bool isBasicEquips = IsBasicEquip(i); //是否是基本装备12件
pUserItem = m_Items[i];
if(pUserItem ==NULL)
{
//如果是基本装备没有装备玩家的最低的宝石和强化等级直接设置为0(全身才有效)
if(isBasicEquips)
{
nMinStrongLevel = 0;
}
break;
}
pStdItem = stdItemProvider.GetStdItem(pUserItem->wItemId);
if (!pStdItem)
break;
if(isBasicEquips) //如果是基本的装备就是12件
{
//全身最低的强化的等级
if( pUserItem->btStrong < nMinStrongLevel)
{
nMinStrongLevel = pUserItem->btStrong;
}
}
}
return nMinStrongLevel < CStdItem::MaxItemStrong && nMinStrongLevel > 0 ? nMinStrongLevel : 0;
}
bool CEquipVessel::CanActivityFiveAttr(BYTE btPos)
{
return false;
}
bool CEquipVessel::IsFiveAttrPos(BYTE btPos)
{
return false;
}
LPSTR CEquipVessel::getEquipName(const CStdItem* pItem )
{
if(!pItem) return NULL;
if(pItem->m_btType > Item::itUndefinedType && pItem->m_btType < Item::itEquipMax)
{
INT_PTR nPos;
switch (pItem->m_btType)
{
case Item::itWeapon:
nPos = tmEquipName1;
break;
case Item::itDress:
nPos = tmEquipName2;
break;
case Item::itHelmet:
nPos = tmEquipName3;
break;
case Item::itNecklace:
nPos = tmEquipName4;
break;
case Item::itDecoration:
nPos = tmEquipName5;
break;
case Item::itBracelet:
nPos = tmEquipName6;
break;
case Item::itRing:
nPos = tmEquipName7;
break;
case Item::itGirdle:
nPos = tmEquipName8;
break;
case Item::itShoes:
nPos = tmEquipName9;
break;
case Item::itEquipDiamond:
nPos = tmEquipName10;
break;
case Item::itSzBambooHat: //特戒
nPos = tmEquipName11;
break;
case Item::itSztFaceNail: //幻武
nPos = tmEquipName12;
break;
case Item::itSzitCape: //玄甲
nPos = tmEquipName13;
break;
case Item::itSzitShiel:
nPos = tmEquipName14;
break;
case Item::itPearl:
nPos = tmEquipName15;
break;
case Item::itMagicpWeapon:
nPos = tmEquipName16;
break;
default:
return NULL;
}
return GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(nPos);;
}
return NULL;
}
LPSTR CEquipVessel::getEquipNameDesc(const CStdItem* pItem )
{
if(!pItem) return NULL;
INT_PTR nPos = tmEquipQuality0;
switch (pItem->b_showQuality)
{
case 0:
nPos = tmEquipQuality0;
break;
case 1:
nPos = tmEquipQuality1;
break;
case 2:
nPos = tmEquipQuality2;
break;
case 3:
nPos = tmEquipQuality3;
break;
case 4:
nPos = tmEquipQuality4;
break;
case 5:
nPos = tmEquipQuality5;
break;
}
return GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(nPos);
}
LPSTR CEquipVessel::getItemColorDesc(const CStdItem* pItem )
{
if(!pItem) return NULL;
INT_PTR nPos = tmItemQuality0;
switch (pItem->b_showQuality)
{
case 0:
nPos = tmItemQuality0;
break;
case 1:
nPos = tmItemQuality1;
break;
case 2:
nPos = tmItemQuality2;
break;
case 3:
nPos = tmItemQuality3;
break;
case 4:
nPos = tmItemQuality4;
break;
case 5:
nPos = tmItemQuality5;
break;
}
return GetLogicServer()->GetDataProvider()->GetTipmsgConfig().GetTipmsg(nPos);
}
void CEquipVessel::CalcResonanceAttr(CAttrCalc &cal,CUserItem *pEquipment,CUserItem *pStone)
{
const CStdItem* pEquipmentStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pEquipment->wItemId);
const CStdItem* pStoneStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pStone->wItemId);
if ( pEquipmentStdItem && pStoneStdItem )
{
AttriGroup* pAttr = GetLogicServer()->GetDataProvider()->GetResonanceItemProvider().GetResonanceItemConfig(pStoneStdItem->m_wResonanceId, pEquipmentStdItem->m_nIndex);
if (pAttr)
{
for (size_t i = 0; i < pAttr->nCount; i++)
{
cal << pAttr->pAttrs[i];
}
}
}
}