📄 user_item.cpp
字号:
pItem->GetInfo(&info);
bDropItem = pItem->IsExchangeEnable();
if (pItem->IsNonsuchItem())
{
::MyLogSave("gmlog/drop_item", "%s(%u) drop equip:[id=%u, type=%u], dur=%d, max_dur=%d",
this->GetName(),
this->GetID(),
pItem->GetID(),
pItem->GetInt(ITEMDATA_TYPE),
pItem->GetInt(ITEMDATA_AMOUNT),
pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
}
pItem->DeleteRecord(); //??? 防作弊,提前删除
pItem->ReleaseByOwner();
pItem = NULL;
break;
}
}
if(i >= ITEMPOSITION_EQUIPEND)
{
pItem = GetItem(idItem);
if (pItem)
{
if (pItem->IsNonsuchItem())
{
::MyLogSave("gmlog/drop_item", "%s(%u) drop item:[id=%u, type=%u], dur=%d, max_dur=%d",
this->GetName(),
this->GetID(),
pItem->GetID(),
pItem->GetInt(ITEMDATA_TYPE),
pItem->GetInt(ITEMDATA_AMOUNT),
pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
}
if (pItem->IsDiscardable())
{
// 丢弃幻兽要扣亲密度
if (pItem->IsEudemon())
{
CallBackEudemon(pItem->GetID());
DetachEudemon(pItem);
int nFidelity = __max(0, pItem->GetInt(ITEMDATA_FIDELITY) - EUDEMON_DEC_FIDELITY_WHEN_DEAL);
pItem->SetInt(ITEMDATA_FIDELITY, nFidelity);
}
//丢弃物品重新设置战魂经验值
pItem->WarGhostLevelReset();
pItem->GetInfo(&info);
bDropItem = pItem->IsExchangeEnable();
char szPrompt[255];
sprintf(szPrompt,STR_DROPITEM_PROMPT,pItem->GetStr(ITEMDATA_NAME));
this->SendSysMsg(szPrompt);
EraseItem(idItem, SYNCHRO_TRUE); //??? 防作弊,提前删除
pItem = NULL;
}
else
{
this->SendSysMsg(STR_NOT_DISCARDABLE);
return false;
}
}
}
if(bDropItem)
{
POINT pos;
pos.x = x;
pos.y = y;
CMapItem* pMapItem = CMapItem::CreateNew();
if(pMapItem)
{
IF_OK(pMapItem->Create(MapManager()->SpawnMapItemID(), GetMap(), pos, &info))
{
MapManager()->QueryMapItemSet()->AddObj(pMapItem);
}
else
{
this->SendSysMsg(STR_MAKE_ITEM_FAILED, pMapItem->GetInfo()->idType);
pMapItem->ReleaseByOwner();
}
}
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::DropMoney (DWORD dwMoney, int x, int y)
{
// CHECKF(nMoney > 0);
CHECKF(GetMap()->IsLayItemEnable(x, y));
if(this->GetMoney() < dwMoney)
return false;
POINT pos;
pos.x = x;
pos.y = y;
CMapItem* pMapItem = CMapItem::CreateNew();
if(pMapItem)
{
if(pMapItem->CreateMoney(MapManager()->SpawnMapItemID(), GetMap(), pos, dwMoney))
{
this->SpendMoney(dwMoney, SYNCHRO_TRUE); // 先删除,防止作弊
MapManager()->QueryMapItemSet()->AddObj(pMapItem);
if (this->IsAlive())
this->SendSysMsg(STR_DROP_MONEY_SUCC, dwMoney);
else
this->SendSysMsg(STR_DIE_DROP_MONEY, dwMoney);
}
else
{
this->SendSysMsg(STR_MAKE_MONEY_FAILED, dwMoney);
pMapItem->ReleaseByOwner();
}
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::SplitItem (OBJID idItem, int nNum)
{
// if(IsItemFull(0))
// return false;
CItemPtr pItem = GetItem(idItem);
if(!pItem || !pItem->IsPileEnable() || nNum <= 0 || nNum >= pItem->GetInt(ITEMDATA_AMOUNT))
return false;
// 检查背包是否满
if (this->IsItemFull(0, pItem->GetInt(ITEMDATA_TYPE), pItem->GetInt(ITEMDATA_AMOUNTLIMIT)))
{
return false;
}
CItemPtr pOther = pItem->Split(nNum);
CHECKF(pOther);
AddItem(pOther, SYNCHRO_TRUE);
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::CombineItem (OBJID idItem, OBJID idOther)
{
CItemPtr pItem = GetItem(idItem);
CItemPtr pOther = GetItem(idOther);
if(!pItem || !pOther || !pItem->IsPileEnable() || pItem->GetInt(ITEMDATA_TYPE) != pOther->GetInt(ITEMDATA_TYPE))
return false;
int nNewNum = pItem->GetInt(ITEMDATA_AMOUNT) + pOther->GetInt(ITEMDATA_AMOUNT);
if(nNewNum > pItem->GetInt(ITEMDATA_AMOUNTLIMIT))
{
pOther->SetInt(ITEMDATA_AMOUNT, nNewNum - pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
{
CMsgItem msg;
IF_OK(msg.Create(pOther->GetID(), ITEMACT_SYNCHRO_AMOUNT, pOther->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
}
else
{
EraseItem(idOther, SYNCHRO_TRUE);
pItem->SetInt(ITEMDATA_AMOUNT, nNewNum);
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
}
return true;
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::CombineNewItem (CItem* pItem, ItemInfoStruct* pInfo, bool bSynchro)
{
CHECKF(CItem::IsCountable(pInfo->idType));
CHECKF(pItem->GetInt(ITEMDATA_TYPE) == pInfo->idType);
int nNewNum = pItem->GetInt(ITEMDATA_AMOUNT) + pInfo->nAmount;
if(nNewNum > pItem->GetInt(ITEMDATA_AMOUNTLIMIT))
{
// other
pInfo->nAmount = nNewNum - pItem->GetInt(ITEMDATA_AMOUNTLIMIT);
CItemPtr pOther = CItem::CreateNew();
CHECKF(pOther);
if(!pOther->Create(GameDataDefault()->GetGameItemData(), pInfo, GameDataDefault()->GetEudemonData()))
{
pOther->ReleaseByOwner();
return NULL;
}
this->AddItem(pOther, bSynchro);
// item
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
if(bSynchro)
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
return pOther;
}
else
{
pItem->SetInt(ITEMDATA_AMOUNT, nNewNum);
if(bSynchro)
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
return pItem;
}
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::FindCombineItem (OBJID idType)
{
return m_pPackage->FindCombineItem(idType);
}
//////////////////////////////////////////////////////////////////////
bool CUser::SpendArrow()
{
CItem* pArrow = GetEquipItemByPos(ITEMPOSITION_WEAPONL);
if(!pArrow)
return false;
CHECKF(pArrow->IsArrowSort());
// spend one
return SpendItem(pArrow, 1, ITEMPOSITION_WEAPONL);
}
//////////////////////////////////////////////////////////////////////
bool CUser::SpendItem(CItem* pItem, int nNum/*=1*/, int nPosition/*=ITEMPOSITION_BACKPACK*/, bool bSynchro/*=true*/) // may be erase
{
if(pItem->IsPileEnable() && pItem->GetInt(ITEMDATA_AMOUNT) > nNum)
{
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - nNum);
if(bSynchro)
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
}
else
{
if(pItem->IsPileEnable())
ASSERT(pItem->GetInt(ITEMDATA_AMOUNT) == nNum);
if(nPosition >= ITEMPOSITION_PACK_BEGIN && nPosition < ITEMPOSITION_PACK_END)
EraseItem(pItem->GetID(), bSynchro);
else
{
ASSERT(nPosition >= ITEMPOSITION_EQUIPBEGIN && nPosition < ITEMPOSITION_EQUIPEND);
EraseEquip(nPosition, bSynchro);
}
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::SpendItemByType(OBJID idType, bool bSynchro)
{
CHECKF(idType);
CItem* pItem = GetTaskItemByType(idType);
if(!pItem)
return false;
if(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) > 1)
{
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - 1);
if(bSynchro)
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
}
else
{
if (pItem->IsNonsuchItem())
{
::MyLogSave("gmlog/SpendItemByType", "%s(%u) Spend item:[id=%u, type=%u], dur=%d, max_dur=%d",
this->GetName(),
this->GetID(),
pItem->GetID(),
pItem->GetInt(ITEMDATA_TYPE),
pItem->GetInt(ITEMDATA_AMOUNT),
pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
}
EraseItem(pItem->GetID(), bSynchro);
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::SpendEquipItem(int nSubType, int nNum, bool bSynchro)
{
CHECKF(nNum > 0);
CItem* pItem = NULL;
if (m_pWeaponR && m_pWeaponR->GetItemSubType() == nSubType && m_pWeaponR->GetInt(ITEMDATA_AMOUNT) >= nNum)
pItem = m_pWeaponR;
else if (m_pWeaponL && m_pWeaponL->GetItemSubType() == nSubType && m_pWeaponL->GetInt(ITEMDATA_AMOUNT) >= nNum)
pItem = m_pWeaponL;
IF_NOT(pItem)
return false;
//ASSERT(!pItem->IsExpend() || pItem->GetInt(ITEMDATA_AMOUNT) >= nNum);
ASSERT(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) >= nNum);
if(pItem->IsExpend() && pItem->GetInt(ITEMDATA_AMOUNT) > nNum)
{
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT) - nNum);
if(bSynchro)
{
CMsgItem msg;
IF_OK(msg.Create(pItem->GetID(), ITEMACT_SYNCHRO_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNT)))
SendMsg(&msg);
}
}
else
{
if (pItem->IsNonsuchItem())
{
::MyLogSave("gmlog/SpendEquipItem", "%s(%u) Spend item:[id=%u, type=%u], dur=%d, max_dur=%d",
this->GetName(),
this->GetID(),
pItem->GetID(),
pItem->GetInt(ITEMDATA_TYPE),
pItem->GetInt(ITEMDATA_AMOUNT),
pItem->GetInt(ITEMDATA_AMOUNTLIMIT));
}
this->EraseEquip(pItem->GetInt(ITEMDATA_POSITION), bSynchro);
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::RepairItem (OBJID idItem, bool bSynchro)
{
CHECKF(idItem);
CItemPtr pItem = GetEquipItem(idItem);
if(!pItem)
pItem = GetItem(idItem);
if(!( pItem && pItem->IsRepairEnable() && pItem->GetInt(ITEMDATA_AMOUNTLIMIT) > pItem->GetInt(ITEMDATA_AMOUNT) ))
{
this->SendSysMsg(STR_REPAIR_FAILED);
return false;
}
int nMoney = pItem->CalcRepairMoney();
int nRepair = pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - pItem->GetInt(ITEMDATA_AMOUNT);
if(nMoney <= 0 || nRepair <= 0)
return true;
//---jinggy如果玩家的武器或装备的耐久<=10%才修理,则战魂经验减3点---begin
if(pItem->IsEquipment()||pItem->IsWeapon())
{
int nScale = pItem->GetInt(ITEMDATA_AMOUNT)*100/pItem->GetInt(ITEMDATA_AMOUNTLIMIT);
if(nScale<=10)
{
pItem->WarGhostLevelDec(DEC_WARGHOSTEXP_FORREPAIR);
//通知客户端 设备属性更新
CMsgItemInfo msg;
IF_OK (msg.Create(pItem))
SendMsg(&msg);
}
}
//---jinggy如果玩家的武器或装备的耐久<=10%才修理,则战魂经验减3点---end
//---jinggy---过是向帮派NPC买,修理东西,帮派成员有优惠---begin
/*CGameMap * pSynMap = this->GetMap();
if(pSynMap->IsSynMap())
{
if(pSynMap->GetSynID() == this->GetSynID())
{
int nSynMemLevel = this->QuerySynAttr()->GetSynMemberLevel();
nPrice = MulDiv(nPrice, __max(0, (100-5*nSynMemLevel)), 100);
}
}*/
//---jinggy---过是向帮派NPC买,修理东西,帮派成员有优惠---end
if (!this->SpendMoney(nMoney, SYNCHRO_TRUE))
{
this->SendSysMsg(STR_REPAIR_NO_MONEY_d, nMoney);
return false; // not enough money
}
/* // 圣战要求修理装备不降低最大耐久度
// max durability changed
CHECKF(pItem->IsEquipment());
if (pItem->GetInt(ITEMDATA_AMOUNT) < pItem->GetInt(ITEMDATA_AMOUNTLIMIT) / 2)
{
if(::RandGet(100) < 5)
pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
}
else if(pItem->GetInt(ITEMDATA_AMOUNT) < pItem->GetInt(ITEMDATA_AMOUNTLIMIT) / 10)
{
if(::RandGet(100) < 10)
pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
}
else
{
if(::RandGet(100) < 80)
pItem->SetInt(ITEMDATA_AMOUNTLIMIT, ::CutTrail(1, pItem->GetInt(ITEMDATA_AMOUNTLIMIT) - 1));
}
*/
pItem->SetInt(ITEMDATA_AMOUNT, pItem->GetInt(ITEMDATA_AMOUNTLIMIT), true);
if (bSynchro)
{
CMsgItemInfo msg;
CHECKF(msg.Create(pItem, ITEMINFO_UPDATE));
SendMsg(&msg);
}
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::RepairAll (bool bSynchro)
{
/*
int nMoney = 0;
for(int i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if(pEquip)
nMoney += pEquip->CalcRepairMoney();
}
if(GetMoney() < nMoney)
return false;
for( i = ITEMPOSITION_EQUIPBEGIN; i < ITEMPOSITION_EQUIPEND; i++)
{
CItem* pEquip = GetEquipItemByPos(i);
if(pEquip && pEquip->CalcRepairMoney() > 0)
pEquip->SetInt(ITEMDATA_AMOUNT, pEquip->GetInt(ITEMDATA_AMOUNTLIMIT), UPDATE_FALSE);
}
if(bSynchro)
{
CMsgItem msg;
CHECKF(msg.Create(ID_NONE, ITEMACT_REPAIRALL));
SendMsg(&msg);
}
return true;
*/
// 暂时去掉
return false;
}
//////////////////////////////////////////////////////////////////////
bool CUser::IdentItem (OBJID idItem, bool bSynchro)
{
CHECKF(idItem);
CItemPtr pItem = GetEquipItem(idItem);
if(!pItem)
pItem = GetItem(idItem);
if(!( pItem && pItem->IsNeedIdent() ))
return false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -