- Mesaj
- 773
- Çözümler
- 50
- Beğeni
- 638
- Puan
- 909
- Ticaret Puanı
- 0
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
if (item->GetSectree())
item->RemoveFromGround();
DWORD dwID = item->GetID();
DWORD dwOwnerID = item->GetLastOwnerPID();
LPCHARACTER o;
TPlayerItem t;
t.window = item->GetWindow();
t.count = item->GetCount();
t.vnum = item->GetOriginalVnum();
t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
{
// 20050613.ipkn.�� �������� ������ ���� ��� ����� ������...
merhabaitem.cpp, char.cpp ve event.cpp yükler misin ve kullandığın pet sisteminin define ismini verirsen bir bakabilirim
build aldım pet çağırlı iken core de vermedi ama oyundan çıkış yapıp girince envanterde ne var ne yok siliyortekrar güncelledim şimdi bir daha denermisin
ona bakalım şimdi bir dk bekle o kısımları düzelteyimbuild aldım pet çağırlı iken core de vermedi ama oyundan çıkış yapıp girince envanterde ne var ne yok siliyor
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
if (item->GetSectree())
item->RemoveFromGround();
DWORD dwID = item->GetID();
DWORD dwOwnerID = item->GetLastOwnerPID();
LPCHARACTER o;
TPlayerItem t;
t.window = item->GetWindow();
t.count = item->GetCount();
t.vnum = item->GetOriginalVnum();
t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
{
// 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�.
/*
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
if (pSafebox)
{
pSafebox->Remove(item->GetCell());
}
if (!item->GetSkipSave() && dwID)
{
TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);
if (it != m_set_pkItemForDelayedSave.end())
m_set_pkItemForDelayedSave.erase(it);
}
*/
}
if (item->GetOwner())
{
if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
{
sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
item->RemoveFromCharacter();
}
else
{
sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
}
}
if (dwID)
{
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
db_clientdesc->Packet(&dwID, sizeof(DWORD));
db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
}
/*
else{
return;
}
*/
}
direk bu halini denedim core vermedi ama cıkış yaptığında itemler envanterden yine gidiyorDestroyItem fonksiyonu
C++:#ifndef DEBUG_ALLOC void ITEM_MANAGER::DestroyItem(LPITEM item) #else void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line) #endif { if (item->GetSectree()) item->RemoveFromGround(); DWORD dwID = item->GetID(); DWORD dwOwnerID = item->GetLastOwnerPID(); LPCHARACTER o; TPlayerItem t; t.window = item->GetWindow(); t.count = item->GetCount(); t.vnum = item->GetOriginalVnum(); t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell(); if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM) { // 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�. CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox(); if (pSafebox) { pSafebox->Remove(item->GetCell()); } if (!item->GetSkipSave() && dwID) { TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item); if (it != m_set_pkItemForDelayedSave.end()) m_set_pkItemForDelayedSave.erase(it); } } if (item->GetOwner()) { if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL) { sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName()); item->RemoveFromCharacter(); } else { sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner()); } } if (dwID) { db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD)); db_clientdesc->Packet(&dwID, sizeof(DWORD)); db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD)); } /* else{ return; } */ }
Bu şekilde dene eğer core alırsan yine altta bulunan satırı aç ve build alıp öyle dene.
core verirse kaldırcaksın yoksa kaldırma bekle bakıcam kodadirek bu halini denedim core vermedi ama cıkış yaptığında itemler envanterden yine gidiyor
/* kaldırıp öyle deneyeyim
Bu dosyalarda bir sorun göremedim, ancak sorunun DestroyItem fonksiyonuyla bir alakası olduğunu sanmıyorum. Çünkü kendisi varsayılan bir fonksiyondur ve kendi başına core verecek bir potansiyele sahip değildir.merhaba
buyrun dosyalar
#define ENABLE_NEW_PET_SYSTEM
söktüğüm fileste zaten DestroyItem fonksiyonunda bir değişiklik yapılmamışBu dosyalarda bir sorun göremedim, ancak sorunun DestroyItem fonksiyonuyla bir alakası olduğunu sanmıyorum. Çünkü kendisi varsayılan bir fonksiyondur ve kendi başına core verecek bir potansiyele sahip değildir.
DestroyItem fonksiyonundan core vermesinin başlıca sebepleri şunlar olabilir:
- (Herhangi bir sebeple) zaten var olmayan bir şeyi yok etmeye(destroy) çalışmak
- Var olan ancak hatalı/eksik bağlamlar sebebiyle yok edilemeyen nesneleri yok etmeye çalışmak
- Yok edilmeye çalışılan nesnenin kendini yok etme özelliğinin olmaması(ancak bu konudaki durumda böyle bir şey söz konusu değil)
- Yok etme işlemlerinin mantık dışı bir senaryoda gerçekleşmesi.
Yani naçizane tavsiyem, DestroyItem fonksiyonuna dokunmadan sorunun ana kaynağını tespit etmen olacaktır. Aksi takdirde DestroyItem fonksiyonuna bilinçsizce veya farkında olmadan yapılan bir müdahele oyundaki bütün itemlere olumsuz şekilde yansıyacaktır. Ve beraberinde core hatasına sebep olan sorun hala bir yerlerde varlığını sürdürecektir. Dolayısıyla NEW_PET_SYSTEM ile alakalı olarak eklemelerini dikkatlice (defineli ve definesiz) kontrol etmen daha doğru olacaktır.
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
if (item->GetSectree())
item->RemoveFromGround();
if (item->GetOwner())
{
if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
{
sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
item->RemoveFromCharacter();
}
else
{
sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
}
}
TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);
if (it != m_set_pkItemForDelayedSave.end())
m_set_pkItemForDelayedSave.erase(it);
DWORD dwID = item->GetID();
sys_log(2, "ITEM_DESTROY %s:%u", item->GetName(), dwID);
if (!item->GetSkipSave() && dwID)
{
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));
}
else
{
sys_log(2, "ITEM_DESTROY_SKIP %s:%u (skip=%d)", item->GetName(), dwID, item->GetSkipSave());
}
if (dwID)
m_map_pkItemByID.erase(dwID);
m_VIDMap.erase(item->GetVID());
#ifdef M2_USE_POOL
pool_.Destroy(item);
#else
#ifndef DEBUG_ALLOC
M2_DELETE(item);
#else
M2_DELETE_EX(item, file, line);
#endif
#endif
}
DestroyItem fonksiyonu çoğu zaman dinamik olarak çalışır ve manuel olarak pek çağrı yapılmaz. Mesela yere atılan veya düşen bir itemin bir süre sonra otomatik yok olması, süresi veya işi biten itemlerin otomatik yok olması gibi olayları kontrol eder ve yürütür. Dolayısıyla src içinde de DestroyItem diye arama yaptığında elle yapılan bir çağrıyı pek göremezsin.söktüğüm fileste zaten DestroyItem fonksiyonunda bir değişiklik yapılmamış
C++:#ifndef DEBUG_ALLOC void ITEM_MANAGER::DestroyItem(LPITEM item) #else void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line) #endif { if (item->GetSectree()) item->RemoveFromGround(); if (item->GetOwner()) { if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL) { sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName()); item->RemoveFromCharacter(); } else { sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner()); } } TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item); if (it != m_set_pkItemForDelayedSave.end()) m_set_pkItemForDelayedSave.erase(it); DWORD dwID = item->GetID(); sys_log(2, "ITEM_DESTROY %s:%u", item->GetName(), dwID); if (!item->GetSkipSave() && dwID) { 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)); } else { sys_log(2, "ITEM_DESTROY_SKIP %s:%u (skip=%d)", item->GetName(), dwID, item->GetSkipSave()); } if (dwID) m_map_pkItemByID.erase(dwID); m_VIDMap.erase(item->GetVID()); #ifdef M2_USE_POOL pool_.Destroy(item); #else #ifndef DEBUG_ALLOC M2_DELETE(item); #else M2_DELETE_EX(item, file, line); #endif #endif }
yaptığım eklemelerin üzerinden geçtim fakat bir kez daha kontrol etsem iyi olacak gibi sonuçta söktüğümüz fileste DestroyItem fonksiyonunda bir değişiklik yapılmamış peki mantık yürüyürsek DestroyItem foksiyonunu kullanımı herhangi bir cpp dosyasında yapılabilirmi yada belli cpp dosyalarımı var en azından tarama alanını küçültmüş olurum
denedim şimdi ve yine sildiŞimdi kodu güncelledim build alıp dene bakalım yine silecekmi
çarı buga sokmuş olabilir mi acaba farklı bi karakter açıp denermisin tek ondamı veriyor acabadenedim şimdi ve yine sildi
biraz ugraştıracak gibiDestroyItem fonksiyonu çoğu zaman dinamik olarak çalışır ve manuel olarak pek çağrı yapılmaz. Mesela yere atılan veya düşen bir itemin bir süre sonra otomatik yok olması, süresi veya işi biten itemlerin otomatik yok olması gibi olayları kontrol eder ve yürütür. Dolayısıyla src içinde de DestroyItem diye arama yaptığında elle yapılan bir çağrıyı pek göremezsin.
yeni bir karakter ile denedim yine aynıçarı buga sokmuş olabilir mi acaba farklı bi karakter açıp denermisin tek ondamı veriyor acaba
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
if (item->GetSectree())
item->RemoveFromGround();
DWORD dwID = item->GetID();
DWORD dwOwnerID = item->GetLastOwnerPID();
LPCHARACTER o;
TPlayerItem t;
t.window = item->GetWindow();
t.count = item->GetCount();
t.vnum = item->GetOriginalVnum();
t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
{
// 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�.
CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
if (pSafebox)
{
pSafebox->Remove(item->GetCell());
}
/*
if (!item->GetSkipSave() && dwID)
{
TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);
if (it != m_set_pkItemForDelayedSave.end())
m_set_pkItemForDelayedSave.erase(it);
}
*/
}
if (item->GetOwner())
{
if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
{
sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
item->RemoveFromCharacter();
}
else
{
sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
}
}
if (!item->GetSkipSave() && dwID)
{
db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
db_clientdesc->Packet(&dwID, sizeof(DWORD));
db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
}
if (dwID)
{
m_map_pkItemByID.erase(dwID);
m_VIDMap.erase(item->GetVID());
}
/*
else{
return;
}
*/
}
defineli olarak src/db kısmında hiçbir eklenti yok. definesiz pet olarak normal arattığımda da bir eklenti yok pet sistemi ile ilgilihacım sql tarafında eksiğin vardır srcden bağımsız itemlerin silinmesi. sql kontrol etmedin mi hiç
bende işte onu ayarlamaya çalışıyorum fena tilt ettidefineli olarak src/db kısmında hiçbir eklenti yok. definesiz pet olarak normal arattığımda da bir eklenti yok pet sistemi ile ilgili
mysql player kısmına gerekli tabloları oluşturdum itemlerin silinmesi zaten yoktu pet çağırılı iken oyunda cıkış yapınca core veriyordu @Dr Livesey
item_manager.cpp/DestroyItem fonksiyonunda bir kaç değişiklik yaptı core olayı çözüldü ama çıkış yapınca envanterde ne varsa silme sorunu çıktı ortaya