Çözüldü marty 5.8 getwear game.core

  • Konuyu açan Konuyu açan brave
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 10
  • Gösterim Gösterim 308
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

brave

Üye
Üye
Mesaj
140
Çözümler
5
Beğeni
28
Puan
479
Ticaret Puanı
0
Sanırım gm hesaptan /ip all yaptıktan sonra bu oluştu onun dışında bir şey yapmadım diye hatırlıyorum.

1760687487779.webp


İlgili kod satırlarını daha önce değiştirmedim orjinal haldeler:


char_item.cpp -:
Genişlet Daralt Kopyala
LPITEM CHARACTER::GetWear(BYTE bCell) const
{
    if (!m_PlayerSlots)
        return nullptr;

    if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
    {
        sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
        return NULL;
    }

    return m_PlayerSlots->pItems[INVENTORY_MAX_NUM + bCell];
}

item.cpp:
Genişlet Daralt Kopyala
    if (this != m_pOwner->GetWear(GetCell() - INVENTORY_MAX_NUM))
    {
        sys_err("m_pOwner->GetWear() != this");
        return false;
    }
 
Çözüm
Evet martysama 5.8'de benimde başıma gelmişti. Destroy() içinde ClearItem() çağrısından önce m_PlayerSlots sıfırlanıyorsa → sıralama hatası var.
Sıralamayı değiştir: önce eşyaları temizle, sonra pointer’ları sil yapmak gerekiyor. Yani item silinse bile itemi arıyor buda core çökmesine sebep oluyor.

C++:
Genişlet Daralt Kopyala
LPITEM CHARACTER::GetWear(BYTE bCell) const
{
    if (!m_PlayerSlots || !m_PlayerSlots->pItems)
    {
        sys_err("GetWear: PlayerSlots or pItems null (char %s)", GetName());
        return nullptr;
    }

    if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
    {
        sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
        return nullptr;
    }

    return...
anladığım kadarıyla ip all ile sildiğiniz eşyalara erişmeye çalışıyor ama null dönüyor ondan kaynaklı çözümü nedir bilemiyorum
 
Evet martysama 5.8'de benimde başıma gelmişti. Destroy() içinde ClearItem() çağrısından önce m_PlayerSlots sıfırlanıyorsa → sıralama hatası var.
Sıralamayı değiştir: önce eşyaları temizle, sonra pointer’ları sil yapmak gerekiyor. Yani item silinse bile itemi arıyor buda core çökmesine sebep oluyor.

C++:
Genişlet Daralt Kopyala
LPITEM CHARACTER::GetWear(BYTE bCell) const
{
    if (!m_PlayerSlots || !m_PlayerSlots->pItems)
    {
        sys_err("GetWear: PlayerSlots or pItems null (char %s)", GetName());
        return nullptr;
    }

    if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
    {
        sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
        return nullptr;
    }

    return m_PlayerSlots->pItems[INVENTORY_MAX_NUM + bCell];
}

bu şekilde core yemezsin sadece syser düşer ufak bir önlem
 
En son bir moderatör tarafından düzenlenmiş:
Çözüm
Evet martysama 5.8'de benimde başıma gelmişti. Destroy() içinde ClearItem() çağrısından önce m_PlayerSlots sıfırlanıyorsa → sıralama hatası var.
Sıralamayı değiştir: önce eşyaları temizle, sonra pointer’ları sil yapmak gerekiyor. Yani item silinse bile itemi arıyor buda core çökmesine sebep oluyor.

Kod:
Genişlet Daralt Kopyala
LPITEM CHARACTER::GetWear(BYTE bCell) const
{
    if (!m_PlayerSlots || !m_PlayerSlots->pItems)
    {
        sys_err("GetWear: PlayerSlots or pItems null (char %s)", GetName());
        return nullptr;
    }

    if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
    {
        sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
        return nullptr;
    }

    return m_PlayerSlots->pItems[INVENTORY_MAX_NUM + bCell];
}

bu şekilde core yemezsin sadece syser düşer ufak bir önlem

Başka başınıza gelen core düşmesine sebep olan veya düzeltilmesini önerdikleriniz var mı?
 
Evet martysama 5.8'de benimde başıma gelmişti. Destroy() içinde ClearItem() çağrısından önce m_PlayerSlots sıfırlanıyorsa → sıralama hatası var.
Sıralamayı değiştir: önce eşyaları temizle, sonra pointer’ları sil yapmak gerekiyor. Yani item silinse bile itemi arıyor buda core çökmesine sebep oluyor.

C++:
Genişlet Daralt Kopyala
LPITEM CHARACTER::GetWear(BYTE bCell) const
{
    if (!m_PlayerSlots || !m_PlayerSlots->pItems)
    {
        sys_err("GetWear: PlayerSlots or pItems null (char %s)", GetName());
        return nullptr;
    }

    if (bCell >= WEAR_MAX_NUM + DRAGON_SOUL_DECK_MAX_NUM * DS_SLOT_MAX)
    {
        sys_err("CHARACTER::GetWear: invalid wear cell %d", bCell);
        return nullptr;
    }

    return m_PlayerSlots->pItems[INVENTORY_MAX_NUM + bCell];
}

bu şekilde core yemezsin sadece syser düşer ufak bir önlem
Sizin söylediğiniz mantığa göre diğer playerslots eşya bölümlerine de aynı şekilde tek tek kontrol eklemek gerekir. Bundan ziyade sorunun detayına gidilmesi gerektiğini düşünüyorum.
 
Sizin söylediğiniz mantığa göre diğer playerslots eşya bölümlerine de aynı şekilde tek tek kontrol eklemek gerekir. Bundan ziyade sorunun detayına gidilmesi gerektiğini düşünüyorum.
Katılıyorum.
Evet teoride mevcut sorunu çözen bir hamle ancak tabiri caizse sorunun üstünü örtmek gibi bir durum oluyor. Asıl sorun altta bir yerlerde varlığını devam ettiriyor olabilir bu haliyle.

Core hatasından anladığım kadarıyla m_PlayerSlots smart pointer. (std::unique_ptr)
Eğer öyleyse bu core hatası gayet beklenebilir, çünkü;
777.webp

Bu iki çağrıdan sonra m_PlayerSlots zaten artık nullptr'ye dönmüş demektir.

Marty dosyalarına hakim değilim fakat item remove işlemlerini doğrudan m_PlayerSlots pointerı üzerinden yapmak yerine 2 aşamalı hale getirmek güvenli olabilir.
1-) m_PlayerSlots içindeki itemleri geçici bir vektöre ekle
2-) Vektörü ve içindeki itemleri sil / kaldır

Bu şekilde doğrudan m_PlayerSlots pointerı üzerinden silme veya remove işlemi yapılmamış olur ve uzun vadede kalıcı güvenlik sağlar.
Tabi bu metin2 sonuçta.. asıl sebep bambaşka bir yerden de çıkıyor olabilir ama tahminim bu yönde.
 
Katılıyorum.
Evet teoride mevcut sorunu çözen bir hamle ancak tabiri caizse sorunun üstünü örtmek gibi bir durum oluyor. Asıl sorun altta bir yerlerde varlığını devam ettiriyor olabilir bu haliyle.

Core hatasından anladığım kadarıyla m_PlayerSlots smart pointer. (std::unique_ptr)
Eğer öyleyse bu core hatası gayet beklenebilir, çünkü;
26239 eklentisini görüntüle
Bu iki çağrıdan sonra m_PlayerSlots zaten artık nullptr'ye dönmüş demektir.

Marty dosyalarına hakim değilim fakat item remove işlemlerini doğrudan m_PlayerSlots pointerı üzerinden yapmak yerine 2 aşamalı hale getirmek güvenli olabilir.
1-) m_PlayerSlots içindeki itemleri geçici bir vektöre ekle
2-) Vektörü ve içindeki itemleri sil / kaldır

Bu şekilde doğrudan m_PlayerSlots pointerı üzerinden silme veya remove işlemi yapılmamış olur ve uzun vadede kalıcı güvenlik sağlar.
Tabi bu metin2 sonuçta.. asıl sebep bambaşka bir yerden de çıkıyor olabilir ama tahminim bu yönde.
Dosyaları detaylı incelemeden bir şey söylemek pek mümkün değil ama muhtemelen sorun bir kodun yanlış satırda bulunmasından kaynaklanıyor. Böyle durularda uzaktan bağlantı harici hata çözümü pek mümkün olmuyor maalesef. Geçici vektör konusuna gelirsek, muhtemelen ona gerek kalmaz
 
bt'nin devamınıda atarsanız anca öyle sorunun asıl nedeni belli olur
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst