romegames 1
romegames
kaptanmikro1 1
kaptanmikro1
Reklam vermek için turkmmo@gmail.com

Güvenli alan yakını core fix

  • Konuyu başlatan Konuyu başlatan bList
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 41
  • Görüntüleme Görüntüleme 5K
Güvenli alanların hemen bitim kısımlarında canavarların size saldırmasını yaklasık 1-2-3 dakika izin verirseniz core verdiğini ve ch düştüğünü farkettim. (en azından kullandığım fileste böyleydi)

Tam olarak şu bölgelerden bahsediyorum (eğer köy dışınada korumalı alan yaptıysanız en azından anlarsınız korumalı alan bitiş yerlerinden bahsettiğimi):

0122_203805.png



core.png


Ben fix olarak şu şekilde bir düzeltme yaptım. Kullanmak isteyenler en azından kendilerinde deneyip kullanabilir.


char_skill.cpp aç:

Bu fonksiyonu arat:
C++:
void SetPolyVarForAttack(LPCHARACTER ch, CSkillProto * pkSk, LPITEM pkWeapon)

bu şekilde değiştir:

C++:
void SetPolyVarForAttack(LPCHARACTER ch, CSkillProto * pkSk, LPITEM pkWeapon)
{
    if (ch->IsPC())
    {
        if (pkWeapon && pkWeapon->GetType() == ITEM_WEAPON)
        {
            int iWep = number(pkWeapon->GetValue(3), pkWeapon->GetValue(4));
            iWep += pkWeapon->GetValue(5);

            int iMtk = number(pkWeapon->GetValue(1), pkWeapon->GetValue(2));
            iMtk += pkWeapon->GetValue(5);

            pkSk->SetPointVar("wep", iWep);
            pkSk->SetPointVar("mtk", iMtk);
            pkSk->SetPointVar("mwep", iMtk + ch->GetPoint(POINT_MAGIC_ATT_GRADE_BONUS));
        }
        else
        {
            pkSk->SetPointVar("wep", 0);
            pkSk->SetPointVar("mtk", 0);
            pkSk->SetPointVar("mwep", 0 + ch->GetPoint(POINT_MAGIC_ATT_GRADE_BONUS));
        }
    }
    else
    {
            // int iWep = number(ch->GetMobDamageMin(), ch->GetMobDamageMax());
            pkSk->SetPointVar("wep", 0);
            pkSk->SetPointVar("mwep", 0);
            pkSk->SetPointVar("mtk", 0);

    }
}


Mükemmel insancıl bir arkadaşımızın tavsiyesi olan 2. yöntem:

char.cpp aç:

Bu fonksiyonu arat:
C++:
DWORD CHARACTER::GetMobDamageMax() const

Değiştir:
C++:
DWORD CHARACTER::GetMobDamageMax() const
{
    if(m_pkMobData)
        return m_pkMobData->m_table.dwDamageRange[1];
    else
        return 0;
}


Normal şartlarda tabiki köy dışındaki kurtları taa şehir ortasına kadar getirtmek vs zor ama balıkçı alanları olan sahil kısmını eğer korumalı yaptıysanız veya yapacaksanız en azından bu sorun var mı br deneyin derim.
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

Bu bir fix değildir.
Hata kaynağınız bu kod:
int iWep = number(ch->GetMobDamageMin(), ch->GetMobDamageMax());

ve siz eklediğiniz;
if(pkWeapon == NULL || pkWeapon == 0)
sorgusu ile bu kodun çalışmasını engellemişsiniz.
zaten mobların hiç biri silah ve herhangi bir ekipman takmadığı için üste belirtiğim iWeb kodu hiç bir zaman çalışmayacaktır.
Sizin dosyalarınızdan kaynaklı bir sorun gördüğüm kadarıyla,
sorun sebebi GetMobDamageMax() büyük ihtimal bu koda özel bir şey tanımlı ve o hata vermesine sebep oluyor.

bu saçma salak fix diye paylaşılan şeyi uygulamayınız.

Yani göz var nizam var burada Allah için kod yazmayı bilen onlarca kişi var niye kimse demiyor.
sen önemli bir sorguyu kapatmışsın değeri sürekli 0 döndürmüşsün fix diye de paylaşmışsın diye.

char.cpp deki kodlarınızı kontrol ödin.
DWORD CHARACTER::GetMobDamageMin() const
{
return m_pkMobData->m_table.dwDamageRange[0];
}

DWORD CHARACTER::GetMobDamageMax() const
{
return m_pkMobData->m_table.dwDamageRange[1];
}

bu şekilde değilse büyük ihtimal bir şeyler değiştirmişsiniz.

veya char.h'ı kontrol edin GetMobDamageMax bu fonksiyonlar var mı diye?

birde şu kodu m_pkMobData verisini kontrol ediniz.
belki de bellek temizlemek için bu kodu silen bir kod vardır. o zaman return boş döneceği içinde çökmeye sebep olabilir. kontrol etmek için
DWORD CHARACTER::GetMobDamageMax() const
{
return m_pkMobData->m_table.dwDamageRange[1];
}

bu fonksiyonları
DWORD CHARACTER::GetMobDamageMax() const
{
if(m_pkMobData)
return m_pkMobData->m_table.dwDamageRange[1];
else
return 0;
}

yaparak test edebilirsiniz.

tahminimce sorununuzun sebebi m_pkMobData büyük ihtimalle!
@stlgolden kardeşim insan gibi davranmadığımda haklısın. biraz hızlı sinirleniyorum. o doğru lakin.
ben fix olsun diye vermedim o kodları kontrol etmeniz için hatanın kaynağını bulun diye verdim.
tamamen sizin oyun dosyalarınızdan kaynaklı bir durum bu.
hatta poly... bilmem ne kodunu farklı bir kod içinde kullandığınızdan etrafta saldıran bir mob olmadığı için bile hata alıyor olabilirsiniz.
(bu biraz kafanızı karıştırabilir! :D)

ayrıca bir şeyleri test etmeden niye fix diye yayınlıyorsun.
2.yöntem diye belirttiğin getmax kodu gibi getmin kodu da mevcut onu da düzenlemezsen yine hata alırsınız.
yani düşününce benim verdiğim bu kod bir fix sayılabilir,
lakin bu hatanın oluşmasının temel sebebi charactere saldıran bir mob verisinin olmaması
veya karaktere saldıran mobun verisinin bir kod ile sıfırlanmasından kaynaklı olabilir.

doğru bir düzeltme için hatanın detaylıca incelenmesi gerekir. bir çok fonksiyon bir biri ile bağlantılı. :(
Benim verdiğim kod sadece bir kontrol. saldıran bir mobun gerçekten var olup olmadığını kontrol ediyor.
Saldıran bir mob yok ise 0 değerini döndürüyor. :(
Paylaşım için teşekkürler, ch kontrol de eklendi herhan gibi bir sorunda başka bir core çıkartmasın diye daha stabil ve fazla kod kaldırılıp böyle kullanılabilir.


[CODE title="KOD"]void SetPolyVarForAttack(LPCHARACTER ch, CSkillProto* pkSk, LPITEM pkWeapon)
{
if (!ch) {
sys_err("Ch null geldi.");
return;
}
if (ch->IsPC())
{
if (pkWeapon && pkWeapon->GetType() == ITEM_WEAPON)
{
int iWep = number(pkWeapon->GetValue(3), pkWeapon->GetValue(4));
iWep += pkWeapon->GetValue(5);

int iMtk = number(pkWeapon->GetValue(1), pkWeapon->GetValue(2));
iMtk += pkWeapon->GetValue(5);

pkSk->SetPointVar("wep", iWep);
pkSk->SetPointVar("mtk", iMtk);
pkSk->SetPointVar("mwep", iMtk);
}
else
{
pkSk->SetPointVar("wep", 0);
pkSk->SetPointVar("mtk", 0);
pkSk->SetPointVar("mwep", 0);
}
}
else
{
int iWep = number(pkWeapon != NULL ? ch->GetMobDamageMin() : 0, pkWeapon != NULL ? ch->GetMobDamageMax() : 0);
pkSk->SetPointVar("wep", iWep);
pkSk->SetPointVar("mwep", iWep);
pkSk->SetPointVar("mtk", iWep);
}
}[/CODE]
 
GetMobDamageMax içinde orjinal kodda weapon ile ilgili birşey yok böyle bir fix bu durumda işe yaramaz içinde eklemeler yaptıysanız ancak o durumda işe yarayabilir bu da fix değildir kendi hatanızı düzelttiniz anlamına gelir. Eğer değişiklik yoksa sorun bellek yönetimindeki hatalardan kaynaklı olabilir sorun kaynağı belirsiz detaylı hata ayıklama modunda tarama yapmalısınız.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst