What's new

Welcome to Onforum.net - Web and gaming resource community

Join us now to get access to all our features. Once registered and logged in, you will be able to create topics, post replies to existing threads, give reputation to your fellow members, get your own private messenger, and so, so much more. It's also quick and totally free, so what are you waiting for?

Ask question

Ask Questions and Get Answers from Our Community

Answer

Answer Questions and Become an Expert on Your Topic

Contact Staff

Our Experts are Ready to Answer your Questions

SaveSingleItem , pay for fix.

Status
Not open for further replies.

Madalinx

New member
Joined
Oct 14, 2019
Messages
2
Reaction score
0
Points
1
Credits
0
i have one big problem about one crash.
if somebody know how i can fix this , please say me in pm or reply with skype/discord id for contact
:D

i pay for this fix (how much you want) . Please , just if you know fix.
1eb7b3cee674c48fd43d26fe1e29ca67.png


item_manager.cpp

void ITEM_MANAGER::DelayedSave(LPITEM item)
{
if (item->GetID() != 0)
m_set_pkItemForDelayedSave.insert(item);
}

void ITEM_MANAGER::FlushDelayedSave(LPITEM item)
{
TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);

if (it == m_set_pkItemForDelayedSave.end())
{
return;
}

m_set_pkItemForDelayedSave.erase(it);
SaveSingleItem(item);
}

void ITEM_MANAGER::SaveSingleItem(LPITEM item)
{
if(!item)
{
sys_err("item from SaveSingleItem is NULL!!!");
//return;
}

//if(!item->GetID())
// return;

if (!item->GetOwner())
//if (!item->GetOwner() || !item->GetCount())
{
DWORD dwID = item->GetID();
DWORD dwOwnerID = item->GetLastOwnerPID();

db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
db_clientdesc->Packet(&dwID, sizeof(DWORD));
db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));

sys_log(1, "ITEM_DELETE %s:%u", item->GetName(), dwID);
return;
}

sys_log(1, "ITEM_SAVE %s:%d in %s window %d", item->GetName(), item->GetID(), item->GetOwner()->GetName(), item->GetWindow());

TPlayerItem t;

t.id = item->GetID();
t.window = item->GetWindow();
t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
t.count = item->GetCount();
t.vnum = item->GetOriginalVnum();

#ifdef TRANSMUTE_SYSTEM
t.look = item->GetLook();
#endif
t.owner = (t.window == SAFEBOX || t.window == MALL) ? item->GetOwner()->GetDesc()->GetAccountTable().id : item->GetOwner()->GetPlayerID();
thecore_memcpy(t.alSockets, item->GetSockets(), sizeof(t.alSockets));
thecore_memcpy(t.aAttr, item->GetAttributes(), sizeof(t.aAttr));

db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));
db_clientdesc->Packet(&t, sizeof(TPlayerItem));
}

void ITEM_MANAGER::Update()
{
TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.begin();
TR1_NS::unordered_set<LPITEM>::iterator this_it;

while (it != m_set_pkItemForDelayedSave.end())
{
this_it = it++;
LPITEM item = *this_it;

// SLOW_QUERY 플래그가 있는 것은 종료시에만 저장한다.
if (item->GetOwner() && IS_SET(item->GetFlag(), ITEM_FLAG_SLOW_QUERY))
continue;

SaveSingleItem(item);

m_set_pkItemForDelayedSave.erase(this_it);
}
}

void ITEM_MANAGER::RemoveItem(LPITEM item, const char * c_pszReason)
{
LPCHARACTER o;

if ((o = item->GetOwner()))
{
#ifdef __NEW_PET_SYSTEM_SCALING__
if(item->GetVnum() >= 53041 && item->GetVnum() <= 53048 && o)
{
CScalingPetSystem* petsys = o->GetScalingPetSystem();
if(petsys->GetScalingPetActor())
{
petsys->Unsummon();
}
}
#endif
char szHint[64];
snprintf(szHint, sizeof(szHint), "%s %u ", item->GetName(), item->GetCount());
LogManager::instance().ItemLog(o, item, c_pszReason ? c_pszReason : "REMOVE", szHint);

if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX)
{
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
if (pSafebox)
{
pSafebox->Remove(item->GetCell());
}
}
else
{
o->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);
item->RemoveFromCharacter();
}
}

M2_DESTROY_ITEM(item);
}


item.cpp


DWORD CItem::GetCount()
{
#ifdef ENABLE_CHEQUE_SYSTEM
if (GetType() == ITEM_ELK || GetType() == ITEM_CHEQUE) return MIN(m_dwCount, INT_MAX);
#else
if (GetType() == ITEM_ELK) return MIN(m_dwCount, INT_MAX);
#endif
else
{
return MIN(m_dwCount, 200);
}
}
bool CItem::SetCount(DWORD count)
{
#ifdef ENABLE_CHEQUE_SYSTEM
if (GetType() == ITEM_ELK || GetType() == ITEM_CHEQUE)
#else
if (GetType() == ITEM_ELK)
#endif
{
m_dwCount = MIN(count, INT_MAX);
}
else
{
m_dwCount = MIN(count, ITEM_MAX_COUNT);
}
if (count == 0 && m_pOwner)
{
if (GetSubType() == USE_ABILITY_UP || GetSubType() == USE_POTION || GetVnum() == 70020)
{
LPCHARACTER pOwner = GetOwner();
WORD wCell = GetCell();
RemoveFromCharacter();
if (!IsDragonSoul())
{
LPITEM pItem = pOwner->FindSpecifyItem(GetVnum());
if (NULL != pItem)
{
pOwner->ChainQuickslotItem(pItem, QUICKSLOT_TYPE_ITEM, wCell);
}
else
{
pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 255);
}
}
M2_DESTROY_ITEM(this);
}
else
{
if (!IsDragonSoul())
{
m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 255);
}
M2_DESTROY_ITEM(RemoveFromCharacter());
}
return false;
}
UpdatePacket();
Save();
return true;
}


db when crash , appear this item...

2351233e0b6592a85fc24484e4d66b76.png


i don't know when crash or how crash. shop offline from great.
 
Status
Not open for further replies.
shape1
shape2
shape3
shape4
shape7
shape8
Top