Çözüldü Oyun içi portallar çalışmıyor.

  • Konuyu açan Konuyu açan ShadowScript
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 18
  • Gösterim Gösterim 382
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ı.

ShadowScript

Üye
Üye
Mesaj
35
Çözümler
1
Beğeni
9
Puan
469
Ticaret Puanı
0
Merhaba arkadaşlar;

oyun için hiç bir portal çalışmıyor. Fakat mob protodan portal kodunu alıp warp yazdıgımda çalışıyor.
Bu konuda yardımlarınızı bekliyorum syserr veya log yok.

Ekran görüntüsü 2025-01-15 001900.webp
 
En son bir moderatör tarafından düzenlenmiş:
Çözüm
void operator () (LPENTITY ent)
{
if (!Valid())
return;

if (!ent->IsType(ENTITY_CHARACTER))
return;

LPCHARACTER pkChr = (LPCHARACTER) ent;

if (!pkChr->IsPC())
return;

int iDist = DISTANCE_APPROX(pkChr->GetX() - m_lX, pkChr->GetY() - m_lY);

if (iDist > 300)
return;

if (m_bEmpire && pkChr->GetEmpire() && m_bEmpire != pkChr->GetEmpire())
return;

if (pkChr->IsHack())
return;

if (!pkChr->CanHandleItem(false, true))
return...
Aynı problem bende de var çözemedim sysser de vermiyor. Portalın içindeyken depoyu açınca "Depo açtıktan sonra 10 saniye bir yere gidemezsin" uyarısı veriyor
 
Filese sistem eklemesi filan yaptınız mı? Belki protoları düzgün okuyamıyordur
 
evet sistem ekli sys err ve log yok portala gidinde hiç bir hareket yok warp kodu ile heryere giedeiliyorum.

herhangi bir syserr var mı?
yok malesef protoda marty sama ile karşılartırdım aynı

Filese sistem eklemesi filan yaptınız mı? Belki protoları düzgün okuyamıyordur
evet bir sürü sistem eklendi bazıalrını ben bazılarını benden önce eklenmiş ama filesi ilk indirdidiğmiden beri hiç çalışmadı porttallar.
c++ tarafında nereleri kontrol etmeliyim files tarafında nereleri yol gösterir misiniz portalların tam olarak algoritması çalışma mantıgı sırası nedir ?
 
Portal için tanımlı olan type değeri files tarafında doğru eşleşiyor mu kontrol etmek lazım
 
Teşşekkürler hangi dosyaya bakmam gerekir source kısmında peki ?
Portalların olduğu kodlara syslog girecek kodlar ekleyin. Bu şekilde hata ayıklama yapabilirsiniz. Aşama aşama kodun belirli bölümlerine bunu yaparak kontrol edin. Bu tarz sorunları bulmanın yolu bu maalesef.
 
Portalların olduğu kodlara syslog girecek kodlar ekleyin. Bu şekilde hata ayıklama yapabilirsiniz. Aşama aşama kodun belirli bölümlerine bunu yaparak kontrol edin. Bu tarz sorunları bulmanın yolu bu maalesef.
tamam peki nerden başlamıyorum portallar hani c++ kodlarında oluyor onu bulamdım bulursam dediniz gibi yapayım
 
Portalların olduğu kodlara syslog girecek kodlar ekleyin. Bu şekilde hata ayıklama yapabilirsiniz. Aşama aşama kodun belirli bölümlerine bunu yaparak kontrol edin. Bu tarz sorunları bulmanın yolu bu maalesef.
Channel1 syslog'da bu var
Jan 14 09:08:24 :: SECTREE DIFFER: nnn 146x33 was 146x34
Ninja karakterinde böyle savaşcı karakterinde sayılar farklı oluyor
 
tamam peki nerden başlamıyorum portallar hani c++ kodlarında oluyor onu bulamdım bulursam dediniz gibi yapayım
game/src/char.cpp dosyasında şu kodu aratın;
C++:
Genişlet Daralt Kopyala
            FuncCheckWarp(LPCHARACTER pkWarp)
            {
                m_lTargetY = 0;
                m_lTargetX = 0;

                m_lX = pkWarp->GetX();
                m_lY = pkWarp->GetY();

                m_bInvalid = false;
                m_bEmpire = pkWarp->GetEmpire();

                char szTmp[64];

                if (3 != sscanf(pkWarp->GetName(), " %s %ld %ld ", szTmp, &m_lTargetX, &m_lTargetY))
                {
                    if (number(1, 100) < 5)
                        sys_err("Warp NPC name wrong : vnum(%d) name(%s)", pkWarp->GetRaceNum(), pkWarp->GetName());

                    m_bInvalid = true;

                    return;
                }

                m_lTargetX *= 100;
                m_lTargetY *= 100;

                m_bUseWarp = true;

                if (pkWarp->IsGoto())
                {
                    LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(pkWarp->GetMapIndex());
                    m_lTargetX += pkSectreeMap->m_setting.iBaseX;
                    m_lTargetY += pkSectreeMap->m_setting.iBaseY;
                    m_bUseWarp = false;
                }
            }

Oyunda herhangi portalda dururken bu kodun çalışıp çalışmadığını ya da çalıştıysa nereye kadar çalıştığını ancak kodun algoritma akış sırasına göre syslog kayıt girdirerek nerede tıkandığını bulmanız lazım. Ancak bundan önce bence protoların düzgün okunup okunmadığını kontrol edin. Işınlanma kapıları için type değeri WARP'dır ve bu 3. sıradadır. Server source tarafında CHAR_TYPE_WARP ile isimlendirilmiştir.

Direkt syserr hatası filan olsa tespiti kolay olurdu ancak bu tarz durumlarda sorunun kaynağını bulmak için aklıma söylediğim yöntemlerden başka bir şey gelmiyor. Eklenen bir sistem vs bunların çalışmasını bozmuş olabilir. Ayrıca hangi filesi kullanıyorsunuz? @SakinAdam üyemizde aynı sorunu yaşadığını belirtmiş.

Channel1 syslog'da bu var
Jan 14 09:08:24 :: SECTREE DIFFER: nnn 146x33 was 146x34
Ninja karakterinde böyle savaşcı karakterinde sayılar farklı oluyor
Hata ile alakalı değil bu
 
game/src/char.cpp dosyasında şu kodu aratın;
C++:
Genişlet Daralt Kopyala
            FuncCheckWarp(LPCHARACTER pkWarp)
            {
                m_lTargetY = 0;
                m_lTargetX = 0;

                m_lX = pkWarp->GetX();
                m_lY = pkWarp->GetY();

                m_bInvalid = false;
                m_bEmpire = pkWarp->GetEmpire();

                char szTmp[64];

                if (3 != sscanf(pkWarp->GetName(), " %s %ld %ld ", szTmp, &m_lTargetX, &m_lTargetY))
                {
                    if (number(1, 100) < 5)
                        sys_err("Warp NPC name wrong : vnum(%d) name(%s)", pkWarp->GetRaceNum(), pkWarp->GetName());

                    m_bInvalid = true;

                    return;
                }

                m_lTargetX *= 100;
                m_lTargetY *= 100;

                m_bUseWarp = true;

                if (pkWarp->IsGoto())
                {
                    LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(pkWarp->GetMapIndex());
                    m_lTargetX += pkSectreeMap->m_setting.iBaseX;
                    m_lTargetY += pkSectreeMap->m_setting.iBaseY;
                    m_bUseWarp = false;
                }
            }

Oyunda herhangi portalda dururken bu kodun çalışıp çalışmadığını ya da çalıştıysa nereye kadar çalıştığını ancak kodun algoritma akış sırasına göre syslog kayıt girdirerek nerede tıkandığını bulmanız lazım. Ancak bundan önce bence protoların düzgün okunup okunmadığını kontrol edin. Işınlanma kapıları için type değeri WARP'dır ve bu 3. sıradadır. Server source tarafında CHAR_TYPE_WARP ile isimlendirilmiştir.

Direkt syserr hatası filan olsa tespiti kolay olurdu ancak bu tarz durumlarda sorunun kaynağını bulmak için aklıma söylediğim yöntemlerden başka bir şey gelmiyor. Eklenen bir sistem vs bunların çalışmasını bozmuş olabilir. Ayrıca hangi filesi kullanıyorsunuz? @SakinAdam üyemizde aynı sorunu yaşadığını belirtmiş.


Hata ile alakalı değil bu
dediini yeri kontrol ettim. ve aynı kod mevcut sys erroru dışarı aldım.
C++:
Genişlet Daralt Kopyala
            FuncCheckWarp(LPCHARACTER pkWarp)
            {
                m_lTargetY = 0;
                m_lTargetX = 0;

                m_lX = pkWarp->GetX();
                m_lY = pkWarp->GetY();

                m_bInvalid = false;
                m_bEmpire = pkWarp->GetEmpire();

                char szTmp[64];

                sys_err("Warp NPC name wrong : vnum(%d) name(%s)", pkWarp->GetRaceNum(), pkWarp->GetName());

                if (3 != sscanf(pkWarp->GetName(), " %s %ld %ld ", szTmp, &m_lTargetX, &m_lTargetY))
                {
                    if (number(1, 100) < 5)
                        sys_err("Warp NPC name wrong : vnum(%d) name(%s)", pkWarp->GetRaceNum(), pkWarp->GetName());

                    m_bInvalid = true;

                    return;
                }

                m_lTargetX *= 100;
                m_lTargetY *= 100;

                m_bUseWarp = true;

                if (pkWarp->IsGoto())
                {
                    LPSECTREE_MAP pkSectreeMap = SECTREE_MANAGER::instance().GetMap(pkWarp->GetMapIndex());
                    m_lTargetX += pkSectreeMap->m_setting.iBaseX;
                    m_lTargetY += pkSectreeMap->m_setting.iBaseY;
                    m_bUseWarp = false;
                }
            }

sys_err("Warp NPC name wrong : vnum(%d) name(%s)", pkWarp->GetRaceNum(), pkWarp->GetName());

bunu bilerek iften yukarı çıkartım ışınma portalına gidince bunu verecekmi bakıcam vermeze eger FuncCheckWarp bu kısım çağrılmıyor demektir.

Eray hocam kontol sagladım sys düşmüyor hiç
 
En son bir moderatör tarafından düzenlenmiş:
char.cpp dosyasında şu kod bloğunu verebilirmisiniz ?

void operator () (LPENTITY ent)
{
C++:
Genişlet Daralt Kopyala
            void operator () (LPENTITY ent)
            {
                if (!Valid())
                    return;

                if (!ent->IsType(ENTITY_CHARACTER))
                    return;

                LPCHARACTER pkChr = (LPCHARACTER) ent;

                if (!pkChr->IsPC())
                    return;

                int iDist = DISTANCE_APPROX(pkChr->GetX() - m_lX, pkChr->GetY() - m_lY);

                if (iDist > 300)
                    return;

                if (m_bEmpire && pkChr->GetEmpire() && m_bEmpire != pkChr->GetEmpire())
                    return;

                if (pkChr->IsHack())
                    return;

                if (!pkChr->CanHandleItem(false, true))
                    return;  
                #ifdef ESYA_KOPYALAMA_FIX
                if ((thecore_pulse() - pkChr->itemPushTime) < PASSES_PER_SEC(10))
                    return;
                #endif
                if (m_bUseWarp)
                    pkChr->WarpSet(m_lTargetX, m_lTargetY);
                else
                {
                    pkChr->Show(pkChr->GetMapIndex(), m_lTargetX, m_lTargetY);
                    pkChr->Stop();
                }
            }
 
En son bir moderatör tarafından düzenlenmiş:
void operator () (LPENTITY ent)
{
if (!Valid())
return;

if (!ent->IsType(ENTITY_CHARACTER))
return;

LPCHARACTER pkChr = (LPCHARACTER) ent;

if (!pkChr->IsPC())
return;

int iDist = DISTANCE_APPROX(pkChr->GetX() - m_lX, pkChr->GetY() - m_lY);

if (iDist > 300)
return;

if (m_bEmpire && pkChr->GetEmpire() && m_bEmpire != pkChr->GetEmpire())
return;

if (pkChr->IsHack())
return;

if (!pkChr->CanHandleItem(false, true))
return;
#ifdef ESYA_KOPYALAMA_FIX
if ((thecore_pulse() - pkChr->itemPushTime) < PASSES_PER_SEC(10))
return;
#endif
if (m_bUseWarp)
pkChr->WarpSet(m_lTargetX, m_lTargetY);
else
{
pkChr->Show(pkChr->GetMapIndex(), m_lTargetX, m_lTargetY);
pkChr->Stop();
}
}
Sorunun Sebebi bu kod.

C++:
Genişlet Daralt Kopyala
#ifdef ESYA_KOPYALAMA_FIX
if ((thecore_pulse() - pkChr->itemPushTime) < PASSES_PER_SEC(10))
return;
#endif
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst