📄 user_item.cpp
字号:
{
if (CItem::IsGhostGem(nItemType))
this->SendSysMsg(STR_GEMBAG_FULL);
else
this->SendSysMsg(STR_ITEMBAG_FULL);
return NULL;
}
CItemPtr pItem = CItem::CreateNew();
CHECKF(pItem);
bool INSERT_TRUE = true;
if(!pItem->Create(GameDataDefault()->GetGameItemData(), pInfo, GameDataDefault()->GetEudemonData(), INSERT_TRUE, pInfo->id))
{
pItem->ReleaseByOwner();
ASSERT(!"Create");
this->SendSysMsg(STR_FAILED_GENERATE_ITEM);
return NULL;
}
if (!AddItem(pItem, bSynchro))
{
//如果添加物品失败!
::LogSave("AddItem failed in CUser::AwardItem.");
pItem->DeleteRecord();
pItem->ReleaseByOwner();
return NULL;
}
return pItem;
}
//////////////////////////////////////////////////////////////////////
bool CUser::EraseItem(OBJID idItem, bool bSynchro) // 同时操作数据库
{
CItemPtr pItem = m_pPackage->PopItem(idItem);
if (pItem)
{
pItem->DeleteRecord();
pItem->ReleaseByOwner();
if(bSynchro)
{
CMsgItem msg;
if(msg.Create(idItem, ITEMACT_DROP))
this->SendMsg(&msg);
}
UpdateWeight();
return true;
}
else
return false;
}
//////////////////////////////////////////////////////////////////////
bool CUser::EraseEquip(int nPosition, bool bSynchro) // 同时操作数据库
{
CItemPtr& refpEquip = GetEquipItemRef(nPosition);
CHECKF(refpEquip);
OBJID idItem = refpEquip->GetID();
refpEquip->DeleteRecord();
refpEquip->ReleaseByOwner();
refpEquip = NULL;
if(bSynchro)
{
CMsgItem msg;
if(msg.Create(idItem, ITEMACT_DROPEQUIPMENT, nPosition))
this->SendMsg(&msg);
if(nPosition == ITEMPOSITION_HELMET
|| nPosition == ITEMPOSITION_ARMOR
|| nPosition == ITEMPOSITION_WEAPONR
|| nPosition == ITEMPOSITION_WEAPONL
|| nPosition == ITEMPOSITION_MANTLE )
{
CMsgPlayer msgPlayer;
if (msgPlayer.Create(this->QueryRole()))
this->BroadcastRoomMsg(&msgPlayer, EXCLUDE_SELF);
}
}
// UnequipMagicItem(nPosition); // 在下次 SetAtkTarget()时删除
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::EquipItem(CItem* pItem, int nPosition, bool bSynchro)
{
CHECKF(pItem);
if (QueryMagic())
QueryMagic()->AbortMagic();
OBJID idItem = pItem->GetID();
if (!this->TryItem(idItem, nPosition))
return false;
// 双击,自动安排
if(nPosition >= ITEMPOSITION_PACK_BEGIN && nPosition < ITEMPOSITION_PACK_END)
{
if (this->IsWing())
return false;
if(pItem->IsHelmet())
{
nPosition = ITEMPOSITION_HELMET;
}
else if(pItem->IsNecklace())
{
nPosition = ITEMPOSITION_NECKLACE;
}
else if(pItem->IsArmor())
{
nPosition = ITEMPOSITION_ARMOR;
}
else if(pItem->IsHoldEnable())
{
if(pItem->IsArrowSort())
{
nPosition = ITEMPOSITION_WEAPONL;
}
else if(pItem->IsWeapon2())
{
nPosition = ITEMPOSITION_WEAPONR;
}
else if(pItem->IsWeapon1() && (!m_pWeaponR || m_pWeaponL))
{
nPosition = ITEMPOSITION_WEAPONR;
}
else // if(pItem->IsWeapon1() && !m_pWeaponL || pItem->IsShield())
{
nPosition = ITEMPOSITION_WEAPONL;
}
}
else if(pItem->IsRing())
{
nPosition = ITEMPOSITION_RINGR;
}
else if (pItem->IsBangle())
{
nPosition = ITEMPOSITION_RINGL;
}
else if(pItem->IsShoes())
{
nPosition = ITEMPOSITION_SHOES;
}
else if(pItem->IsMount())
{
nPosition = ITEMPOSITION_MOUNT;
}
else if(pItem->IsSprite())
{
nPosition = ITEMPOSITION_SPRITE;
}
else if(pItem->IsMantle())
{
nPosition = ITEMPOSITION_MANTLE;
}
}
// 冗错
//if(m_setItem.size() > _MAX_USERITEMSIZE)
/*
if (m_pPackage->IsPackFull(pItem))
{
CItem* pEquip = GetEquipItemByPos(nPosition);
if(pEquip)
return false;
}
*/
// 先取出,以空出背包。
CHECKF(DelItemPt(idItem)); // VVVVVVVVVVVVVVVVVVVVVVVVVVVV
bool bRet = false;
switch(nPosition)
{
case ITEMPOSITION_HELMET:
{
if(pItem->IsHelmet())
{
UnEquipOnly(nPosition);
m_pHelmet = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_HELMET);
bRet = true;
}
}
break;
case ITEMPOSITION_NECKLACE:
{
if(pItem->IsNecklace())
{
UnEquipOnly(nPosition);
m_pNecklace = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_NECKLACE);
bRet = true;
}
}
break;
case ITEMPOSITION_ARMOR:
{
if(pItem->IsArmor())
{
UnEquipOnly(nPosition);
m_pArmor = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_ARMOR);
bRet = true;
}
}
break;
case ITEMPOSITION_WEAPONR:
{
if(pItem->IsHoldEnable())
{
if(pItem->IsWeapon2())
{
if(!( m_pWeaponR && m_pWeaponL && !IsBackPackSpare(2, 0, ID_NONE, ITEMPOSITION_BACKPACK) ))
{
UnEquipOnly(ITEMPOSITION_WEAPONR);
if(m_pWeaponL && !(m_pWeaponL->IsArrow() && pItem->IsBow() || m_pWeaponL->IsDart() && pItem->IsCrossBow()))
UnEquipOnly(ITEMPOSITION_WEAPONL);
m_pWeaponR = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONR);
bRet = true;
}
}
else if(pItem->IsWeapon1())
{
if(!(m_pWeaponL && (m_pWeaponL->IsArrow() || m_pWeaponL->IsDart()) && !IsBackPackSpare(2, 0, ID_NONE, ITEMPOSITION_BACKPACK) ))
{
UnEquipOnly(ITEMPOSITION_WEAPONR);
if(m_pWeaponL && m_pWeaponL->IsArrowSort())
UnEquipOnly(ITEMPOSITION_WEAPONL);
m_pWeaponR = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONR);
bRet = true;
}
}
}
}
break;
case ITEMPOSITION_WEAPONL:
{
if(pItem->IsHoldEnable())
{
if(m_pWeaponR)
{
if( m_pWeaponR->IsWeapon1() && (pItem->IsWeapon1()||pItem->IsShield())
|| m_pWeaponR->IsBow() && pItem->IsArrow() || m_pWeaponR->IsCrossBow() && pItem->IsDart() )
{
UnEquipOnly(nPosition);
m_pWeaponL = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_WEAPONL);
UnequipMagicItem(ITEMPOSITION_WEAPONL); //paled: need not
bRet = true;
}
}
}
}
break;
case ITEMPOSITION_RINGR:
{
if(pItem->IsRing())
{
UnEquipOnly(nPosition);
m_pRingR = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_RINGR);
bRet = true;
}
}
break;
case ITEMPOSITION_RINGL:
{
if(pItem->IsBangle())
{
UnEquipOnly(nPosition);
m_pRingL = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_RINGL);
bRet = true;
}
}
break;
case ITEMPOSITION_SHOES:
{
if(pItem->IsShoes())
{
UnEquipOnly(nPosition);
m_pShoes = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_SHOES);
bRet = true;
}
}
break;
case ITEMPOSITION_MOUNT:
{
if(pItem->IsMount())
{
UnEquipOnly(nPosition);
m_pMount = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_MOUNT);
bRet = true;
}
}
break;
case ITEMPOSITION_SPRITE: // add by zlong 2003-11-27
{
if (pItem->IsSprite())
{
UnEquipOnly(nPosition);
m_pSprite = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_SPRITE);
bRet = true;
}
}
break;
case ITEMPOSITION_MANTLE:
{
if (pItem->IsMantle())
{
UnEquipOnly(nPosition);
m_pMantle = pItem;
pItem->SetInt(ITEMDATA_POSITION, ITEMPOSITION_MANTLE);
bRet = true;
}
}
break;
default:
ASSERT(!"switch");
} // switch
if(!bRet)
AddItem(pItem, SYNCHRO_FALSE); // 恢复物品 AAAAAAAAAAAAAAAAAAAAAAA
if(bRet)
{
//---jinggy---2004-11-19--启动设备经验值记数器---begin
if(pItem->GetWarGhostLevel()==MAX_LEVEL_WARLEVEL-1)
UpdateEquipmentExp_Startup(nPosition,EQUIPMENT_EXP_ADD_SECS_AFTER9);
else if(pItem->GetWarGhostLevel()<MAX_LEVEL_WARLEVEL-1)
UpdateEquipmentExp_Startup(nPosition,EQUIPMENT_EXP_ADD_SECS);
//---jinggy---2004-11-19--启动设备经验值记数器---end
if(bSynchro)
{
CMsgItem msg;
if(msg.Create(idItem, ITEMACT_EQUIP, nPosition))
this->SendMsg(&msg);
if(nPosition == ITEMPOSITION_HELMET
|| nPosition == ITEMPOSITION_ARMOR
|| nPosition == ITEMPOSITION_WEAPONR
|| nPosition == ITEMPOSITION_WEAPONL
|| nPosition == ITEMPOSITION_MANTLE
|| nPosition == ITEMPOSITION_MOUNT )
{
CMsgPlayer msgPlayer;
if (msgPlayer.Create(this->QueryRole()))
this->BroadcastRoomMsg(&msgPlayer, EXCLUDE_SELF);
}
}
// UpdateWeight();
CalcFightRate();
EquipMagicItem(pItem, nPosition);
return true;
}
else
{
return false;
}
}
//////////////////////////////////////////////////////////////////////
bool CUser::TryItem(OBJID idItem, int nPosition)
{
CItemPtr pItem = GetItem(idItem);
if(!pItem)
return false;
if (pItem->IsTaskItem())
return false;
if (pItem->GetInt(ITEMDATA_REQ_LEVEL) && pItem->GetInt(ITEMDATA_REQ_LEVEL) > GetLev()) // 综合等级
return false;
if (pItem->IsNeedIdent())
return false;
if (pItem->GetInt(ITEMDATA_REQ_SEX) &&
(pItem->GetInt(ITEMDATA_REQ_SEX) & (1<<GetSex())) == 0)
return false;
if(pItem->IsMount() && pItem->GetInt(ITEMDATA_AMOUNT) == 0)
return false;
// rebirth ------------------------------------------------
if(this->GetMetempsychosis() && GetLev() >= 70)
return true; //!
if (pItem->GetInt(ITEMDATA_REQ_PROF) != 0)
{
int nRequireProfSort = (pItem->GetInt(ITEMDATA_REQ_PROF)%1000)/10;
int nRequireProfLevel = pItem->GetInt(ITEMDATA_REQ_PROF)%10;
int nProfSort = this->GetProfessionSort();
int nProfLevel = this->GetProfessionLevel();
if (nRequireProfSort == 19) // 道士通用
{
if (nProfSort < 10) // 不是道士
return false;
else
{
if (ITEMPOSITION_WEAPONL == nPosition)
return false;
}
}
else
{
if (nRequireProfSort != nProfSort)
return false;
}
if (nProfLevel < nRequireProfLevel)
return false;
}
// if (pItem->GetInt(ITEMDATA_REQ_SKILL) && pItem->IsWeapon() &&
// pItem->GetInt(ITEMDATA_REQ_SKILL) > GetWeaponSkillLev(pItem->GetInt(ITEMDATA_TYPE)))
// return false;
if ((pItem->GetInt(ITEMDATA_REQ_FORCE) && pItem->GetInt(ITEMDATA_REQ_FORCE) > GetForce())
|| (pItem->GetInt(ITEMDATA_REQ_DEX) && pItem->GetInt(ITEMDATA_REQ_DEX) > GetDex())
|| (pItem->GetInt(ITEMDATA_REQ_HEALTH) && pItem->GetInt(ITEMDATA_REQ_HEALTH) > GetHealth())
|| (pItem->GetInt(ITEMDATA_REQ_SOUL) && pItem->GetInt(ITEMDATA_REQ_SOUL) > GetSoul()))
{
return false;
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::ChkUseItem(CItem* pItem, IRole* pTarget)
{
CHECKF (pItem);
CHECKF (pTarget);
USHORT usTarget = pItem->GetInt(ITEMDATA_TARGET);
if (usTarget == TARGET_NONE)
{
if (pTarget->GetID() == this->GetID())
return true;
else
return false;
}
if (usTarget&TARGET_FORBIDDEN)
return false;
// PK模式由判断提示由客户端完成
CUser* pUser = NULL;
if (pTarget->QueryObj(OBJ_USER, IPP_OF(pUser)))
{
// 限制使用对象
if ((usTarget&TARGET_SELF) && pUser->GetID() != this->GetID()
|| (usTarget&TARGET_OTHERS) && pUser->GetID() == this->GetID())
return false;
// 是否对尸体使用的限制
if (((usTarget&TARGET_BODY) && pUser->IsAlive())
|| (!(usTarget&TARGET_BODY) && !pUser->IsAlive()))
return false;
}
else
{
CMonster* pMonster = NULL;
if (!pTarget->QueryObj(OBJ_MONSTER, IPP_OF(pMonster)))
return false;
// 判断目标类型
if (!((usTarget&TARGET_MONSTER) && pMonster->IsMonster())
&& !((usTarget&TARGET_EUDEMON) && pMonster->IsEudemon()))
return false;
// 判断限制条件
CUser* pOwner = pMonster->QueryOwnerUser();
if (pOwner)
{
if ((usTarget&TARGET_SELF) && pOwner->GetID() != this->GetID()
|| (usTarget&TARGET_OTHERS) && pOwner->GetID() == this->GetID())
return false;
}
if (((usTarget&TARGET_BODY) && pMonster->IsAlive())
|| (!(usTarget&TARGET_BODY) && !pMonster->IsAlive()))
return false;
}
return true;
}
//////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -