📄 user_item.cpp
字号:
// User.cpp: implementation of the CUser class.
//
//////////////////////////////////////////////////////////////////////
#include "AllMsg.h"
#include "User.h"
#include "MapGroup.h"
#include "netmsg.h"
#include "ItemType.h"
#include "MapItem.h"
#include "Package.h"
const int MINI_ADDLIFE_DRAG = 100;
//const int ADDLIFE_FIRST_PERCENT = 40;
//const int ADDLIFE_NEXT_PERCENT = 20;
const int STORAGE_NPC_ID = 1005; //? 信仰仓库互通
const int _MINE_RANGE = 1; // 挖矿距离
//////////////////////////////////////////////////////////////////////
// item
//////////////////////////////////////////////////////////////////////
bool CUser::CreateAllItem(IDatabase* pDb)
{
ASSERT(m_pPackage);
// 载入背包物品
if (!m_pPackage->Create(this, pDb))
{
return false;
}
// 载入装备物品
SQLBUF szSQL;
//sprintf(szSQL, "SELECT * FROM %s WHERE owner_id=%u && position<=%u LIMIT %d", _TBL_ITEM, GetID(), ITEMPOSITION_USER_LIMIT, _MAX_ALLUSERITEMSIZE);
sprintf(szSQL, "SELECT * FROM %s WHERE owner_id=%u && position >= %u && position<%u LIMIT %d", _TBL_ITEM, GetID(), ITEMPOSITION_EQUIPBEGIN, ITEMPOSITION_EQUIPEND, ITEMPOSITION_EQUIPEND - ITEMPOSITION_EQUIPBEGIN);
IRecordset* pRes = pDb->CreateNewRecordset(szSQL);
if(pRes)
{
for(int i = 0; i < pRes->RecordCount(); i++)
{
CItemPtr pItem = CItem::CreateNew();
if(pItem)
{
if(pItem->Create(pRes, pDb))
{
int nPosition = pItem->GetInt(ITEMDATA_POSITION);
CItemPtr& refpEquip = GetEquipItemRef(nPosition);
if(!refpEquip) //? 防止两个物品的POSITION相同 paled
{
refpEquip = pItem;
EquipMagicItem(pItem, nPosition);
}
else
{
char err[256];
sprintf(err,"Found same position of user equip.The Item ID: %d",pItem->GetID());
LOGWARNING(err);
pItem->ReleaseByOwner();
}
}
else
{
LOGERROR("玩家[%s]无法加载物品[%u]", GetName(), pItem->GetID());
pItem->ReleaseByOwner();
}
}
pRes->MoveNext();
}
pRes->Release();
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
void CUser::SaveItemInfo()
{
if(m_pHelmet)
m_pHelmet->SaveInfo();
if(m_pNecklace)
m_pNecklace->SaveInfo();
if(m_pArmor)
m_pArmor->SaveInfo();
if(m_pWeaponR)
m_pWeaponR->SaveInfo();
if(m_pWeaponL)
m_pWeaponL->SaveInfo();
if(m_pRingR)
m_pRingR->SaveInfo();
if(m_pRingL)
m_pRingL->SaveInfo();
if(m_pShoes)
m_pShoes->SaveInfo();
if(m_pMount)
m_pMount->SaveInfo();
if(m_pSprite)
m_pSprite->SaveInfo();
if (m_pMantle)
m_pMantle->SaveInfo();
m_pPackage->SaveAllInfo();
}
//////////////////////////////////////////////////////////////////////
void CUser::DeleteAllItem()
{
SAFE_RELEASEBYOWNER(m_pHelmet);
SAFE_RELEASEBYOWNER(m_pNecklace);
SAFE_RELEASEBYOWNER(m_pArmor);
SAFE_RELEASEBYOWNER(m_pWeaponR);
SAFE_RELEASEBYOWNER(m_pWeaponL);
SAFE_RELEASEBYOWNER(m_pRingR);
SAFE_RELEASEBYOWNER(m_pRingL);
SAFE_RELEASEBYOWNER(m_pShoes);
SAFE_RELEASEBYOWNER(m_pMount);
SAFE_RELEASEBYOWNER(m_pSprite);
SAFE_RELEASEBYOWNER(m_pMantle);
m_pPackage->ClearAll();
UpdateWeight();
}
//////////////////////////////////////////////////////////////////////
void CUser::SendAllItemInfo()
{
if(m_pHelmet)
{
CMsgItemInfo msg;
if(msg.Create(m_pHelmet, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pNecklace)
{
CMsgItemInfo msg;
if(msg.Create(m_pNecklace, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pArmor)
{
CMsgItemInfo msg;
if(msg.Create(m_pArmor, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pWeaponR)
{
CMsgItemInfo msg;
if(msg.Create(m_pWeaponR, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pWeaponL)
{
// auto correct (enable since arrow)
// if (m_pWeaponR && m_pWeaponR->GetItemSort() == ITEMSORT_WEAPON2)
{
// ASSERT(!"auto unquiponly when error weapon, may be not backpack room.");
// this->UnEquipOnly(ITEMPOSITION_WEAPONL);
}
// else
{
CMsgItemInfo msg;
if(msg.Create(m_pWeaponL, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
}
if(m_pRingR)
{
CMsgItemInfo msg;
if(msg.Create(m_pRingR, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pRingL)
{
CMsgItemInfo msg;
if(msg.Create(m_pRingL, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pShoes)
{
CMsgItemInfo msg;
if(msg.Create(m_pShoes, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pMount)
{
CMsgItemInfo msg;
if(msg.Create(m_pMount, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pSprite)
{
CMsgItemInfo msg;
if(msg.Create(m_pSprite, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
if(m_pMantle)
{
CMsgItemInfo msg;
if(msg.Create(m_pMantle, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
m_pPackage->SendAllItemInfo();
}
//////////////////////////////////////////////////////////////////////
void CUser::SendAllEquipInfoTo(CUser* pRecv)
{
CHECK(pRecv);
if(m_pHelmet)
{
CMsgItemInfo msg;
if(msg.Create(m_pHelmet, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pNecklace)
{
CMsgItemInfo msg;
if(msg.Create(m_pNecklace, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pArmor)
{
CMsgItemInfo msg;
if(msg.Create(m_pArmor, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pWeaponR)
{
CMsgItemInfo msg;
if(msg.Create(m_pWeaponR, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pWeaponL)
{
CMsgItemInfo msg;
if(msg.Create(m_pWeaponL, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pRingR)
{
CMsgItemInfo msg;
if(msg.Create(m_pRingR, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pRingL)
{
CMsgItemInfo msg;
if(msg.Create(m_pRingL, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pShoes)
{
CMsgItemInfo msg;
if(msg.Create(m_pShoes, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pMount)
{
CMsgItemInfo msg;
if(msg.Create(m_pMount, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pSprite)
{
CMsgItemInfo msg;
if(msg.Create(m_pSprite, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
if(m_pMantle)
{
CMsgItemInfo msg;
if(msg.Create(m_pMantle, ITEMINFO_OTHERPLAYER_EQUIPMENT, GetID()))
pRecv->SendMsg(&msg);
}
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetItem(OBJID idItem)
{
return m_pPackage->GetItem(idItem);
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetItemByType(OBJID idType)
{
return m_pPackage->GetItemByType(idType);
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetTaskItem(LPCTSTR szItemName)
{
return m_pPackage->GetTaskItem(szItemName);
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetTaskItemByType(OBJID idType, int nAmount/*=0*/)
{
return m_pPackage->GetTaskItemByType(idType, nAmount);
}
/////////////////////////////////////////////////////////////////////////////
CItem* CUser::FindSpaceTransSpell()
{
return m_pPackage->FindSpaceTransSpell();
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetEquipItem(OBJID idItem)
{
if(m_pHelmet && m_pHelmet->GetID() == idItem)
return m_pHelmet;
else if(m_pNecklace && m_pNecklace->GetID() == idItem)
return m_pNecklace;
else if(m_pArmor && m_pArmor->GetID() == idItem)
return m_pArmor;
else if(m_pWeaponR && m_pWeaponR->GetID() == idItem)
return m_pWeaponR;
else if(m_pWeaponL && m_pWeaponL->GetID() == idItem)
return m_pWeaponL;
else if(m_pRingR && m_pRingR->GetID() == idItem)
return m_pRingR;
else if(m_pRingL && m_pRingL->GetID() == idItem)
return m_pRingL;
else if(m_pShoes && m_pShoes->GetID() == idItem)
return m_pShoes;
else if(m_pMount && m_pMount->GetID() == idItem)
return m_pMount;
else if(m_pSprite && m_pSprite->GetID() == idItem)
return m_pSprite;
else if(m_pMantle && m_pMantle->GetID() == idItem)
return m_pMantle;
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::GetEquipItemByPos(int nPosition)
{
CItemPtr* ppEquip = this->GetEquipItemPtr(nPosition);
if (!ppEquip)
return NULL;
return *ppEquip;
}
//////////////////////////////////////////////////////////////////////
CItemPtr* CUser::GetEquipItemPtr(int nPosition)
{
switch(nPosition)
{
case ITEMPOSITION_HELMET:
return &m_pHelmet;
case ITEMPOSITION_NECKLACE:
return &m_pNecklace;
case ITEMPOSITION_ARMOR:
return &m_pArmor;
case ITEMPOSITION_WEAPONR:
return &m_pWeaponR;
case ITEMPOSITION_WEAPONL:
return &m_pWeaponL;
case ITEMPOSITION_RINGR:
return &m_pRingR;
case ITEMPOSITION_RINGL:
return &m_pRingL;
case ITEMPOSITION_SHOES:
return &m_pShoes;
case ITEMPOSITION_MOUNT:
return &m_pMount;
case ITEMPOSITION_SPRITE:
return &m_pSprite;
case ITEMPOSITION_MANTLE:
return &m_pMantle;
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
bool CUser::DelItem (OBJID idItem, bool bSynchro)
{
if (m_pPackage->DelItem(idItem))
{
if(bSynchro)
{
CMsgItem msg;
if(msg.Create(idItem, ITEMACT_DROP))
this->SendMsg(&msg);
}
return true;
}
else
return false;
}
//////////////////////////////////////////////////////////////////////
bool CUser::AddItem (CItem* pItem, bool bSynchro, bool bUpdate /*= true*/)
{
CHECKF(pItem);
if (pItem->GetInt(ITEMDATA_OWNERID) != GetID())
pItem->SetInt(ITEMDATA_OWNERID, GetID());
if (pItem->GetInt(ITEMDATA_PLAYERID) != GetID())
pItem->SetInt(ITEMDATA_PLAYERID, GetID());
if (!m_pPackage->AddItem(pItem, bUpdate))
return false;
if(bSynchro)
{
CMsgItemInfo msg;
if(msg.Create(pItem, ITEMINFO_ADDITEM))
this->SendMsg(&msg);
}
UpdateWeight();
return true;
}
//////////////////////////////////////////////////////////////////////
bool CUser::DelItemPt (OBJID idItem)
{
if (m_pPackage->PopItem(idItem))
{
UpdateWeight();
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::PopItem (OBJID idItem, bool bSynchro, bool bUpdate) // 立即清除OWNER
{
CItemPtr pItem = m_pPackage->PopItem(idItem);
if (pItem)
{
pItem->SetInt(ITEMDATA_PLAYERID, ID_NONE, UPDATE_FALSE);
pItem->SetInt(ITEMDATA_OWNERID, ID_NONE, bUpdate); // 立即清除OWNER
if(bSynchro)
{
CMsgItem msg;
if(msg.Create(idItem, ITEMACT_DROP))
this->SendMsg(&msg);
}
UpdateWeight();
return pItem;
}
return NULL;
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::AwardItem(int nItemType, bool bSynchro, bool bIdentOK/*=false*/, bool bAutoCombine/*=true*/) // 同时操作数据库
{
ItemInfoStruct info;
ASSERT(ItemType()->GetInfo(nItemType, &info));
info.idOwner = GetID();
info.idPlayer = GetID();
info.nPosition = this->QueryPackage()->GetItemPositionByType(nItemType);
if(bIdentOK)
info.nIdent &= ~_ITEM_STATUS_NOT_IDENT;
return AwardItem(&info, bSynchro, bAutoCombine);
}
//////////////////////////////////////////////////////////////////////
CItem* CUser::AwardItem(ItemInfoStruct* pInfo, bool bSynchro, bool bAutoCombine/*=true*/) // 同时操作数据库
{
CHECKF (pInfo);
// check weight
int nItemType = pInfo->idType;
if(GetWeight() + CItem::GetWeight(nItemType) > GetWeightLimit())
{
this->SendSysMsg(STR_HEAVEY_BAG);
return NULL;
}
if(bAutoCombine && CItem::IsCountable(nItemType))
{
//CItemTypeData* pType = ItemType()->QueryItemType(pInfo->idType);
//CHECKF(pType);
if(!CItem::IsNeedIdent(pInfo->nIdent) && pInfo->nAmount < pInfo->nAmountLimit)
{
CItem* pItem = FindCombineItem(nItemType);
if(pItem)
{
// check size
if(pItem->GetInt(ITEMDATA_AMOUNT) + pInfo->nAmount > pInfo->nAmountLimit
&& m_pPackage->IsPackFull(pItem))
{
if (pItem->IsGhostGem())
this->SendSysMsg(STR_GEMBAG_FULL);
else
this->SendSysMsg(STR_ITEMBAG_FULL);
return NULL;
}
return CombineNewItem(pItem, pInfo, bSynchro);
}
}
}
if (m_pPackage->IsPackFull(m_pPackage->GetItemPositionByType(nItemType)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -