sycnlimitlemesiyle alakalı

metin2ortak100100

Yasaklanmış Üye
Cezalı
Mesaj
6
Beğeni
3
Puan
28
Ticaret Puanı
0
// Senkronizasyon sahibi ile mesafe 250 birimden fazla ise, senkronizasyon yapılmaz
if (DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY()) > 2000)
{
sys_log(1, "SetSyncOwner distance over than 250 %s %s", GetName(), ch->GetName());

if (m_pkChrSyncOwner == ch)
return true;

return false;
}

2000 sizde 250 yazar

şöyleki

a karakter birine saldırınca b kıpırdamadan duruyorsa b karakteri ileri atar doğru.
a kakrateri b karakteri 500 600 mesafeyi iter ama damage işlemesi halen devam eder doğru.
ama a karakter b karater 500 600 mesafe ileri atsada öldürsede 500 600 mesafe ilerde.
b karater oyunu baslat dirilme dediğinde baslangıc pozisyonunda doğuyor.

hata bu

bu durum b karaterin sync girmediği içindir görünürde hareketsiz kaldığı içindir
buna karakter kayması diyip düzeltelim çabasına giren çok oldu aslında mesafeyi aşınca sync kaaptma işlevi varmış






Kod:
Genişlet Daralt Kopyala
bool CHARACTER::SetSyncOwner(LPCHARACTER ch, bool bRemoveFromList)
{
    // TRENT_MONSTER: Özel bir kısıtlama (hareket etmeyen karakterler)
    if (IS_SET(m_pointsInstant.dwAIFlag, AIFLAG_NOMOVE))
        return false;
    // END_OF_TRENT_MONSTER

    // Senkronizasyon yapılacak karakter var mı?
    if (ch)
    {
        // Eğer hedef karakterle savaş yapılabilir değilse, senkronizasyon yapılmaz
        if (!battle_is_attackable(ch, this))
        {
            SendDamagePacket(ch, 0, DAMAGE_BLOCK);
            return false;
        }
    }

    // Eğer kendisiyle senkronize olmaya çalışıyorsa, işlem yapılmaz
    if (ch == this)
    {
        sys_err("SetSyncOwner owner == this (%p)", this);
        return false;
    }

    // Eğer senkronizasyon yapılacak karakter yoksa
    if (!ch)
    {
        // Senkronizasyon sahibini kaldırma işlemi
        if (bRemoveFromList && m_pkChrSyncOwner)
        {
            m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.remove(this);
        }

        // Senkronizasyon sahibi varsa loglama yaparak sıfırlama işlemi
        if (m_pkChrSyncOwner)
            sys_log(1, "SyncRelease %s %p from %s", GetName(), this, m_pkChrSyncOwner->GetName());

        m_pkChrSyncOwner = NULL;
    }
    else
    {
        // Eğer hedef karakter senkronizasyon sahibi olamazsa, işlem yapılmaz
        if (!IsSyncOwner(ch))
            return false;

        // Senkronizasyon sahibi ile mesafe 250 birimden fazla ise, senkronizasyon yapılmaz
        if (DISTANCE_APPROX(GetX() - ch->GetX(), GetY() - ch->GetY()) > 2000)
        {
            sys_log(1, "SetSyncOwner distance over than 250 %s %s", GetName(), ch->GetName());

            if (m_pkChrSyncOwner == ch)
                return true;

            return false;
        }

        // Eğer mevcut senkronizasyon sahibi farklıysa
        if (m_pkChrSyncOwner != ch)
        {
            // Önceki senkronizasyon sahibinden çıkarma
            if (m_pkChrSyncOwner)
            {
                sys_log(1, "SyncRelease %s %p from %s", GetName(), this, m_pkChrSyncOwner->GetName());
                m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.remove(this);
            }

            // Yeni senkronizasyon sahibini ayarlama
            m_pkChrSyncOwner = ch;
            m_pkChrSyncOwner->m_kLst_pkChrSyncOwned.emplace_back(this);

            // Senkronizasyon zamanını sıfırlama
            static const timeval zero_tv = {0, 0};
            SetLastSyncTime(zero_tv);

            sys_log(1, "SetSyncOwner set %s %p to %s", GetName(), this, ch->GetName());
        }

        // Senkronizasyon zamanını güncelleme
        m_fSyncTime = get_float_time();
    }

    // Senkronizasyon paketini oluşturma
    TPacketGCOwnership pack;
    pack.bHeader    = HEADER_GC_OWNERSHIP;
    pack.dwOwnerVID = ch ? ch->GetVID() : 0;
    pack.dwVictimVID = GetVID();

    // Paket çevredeki karakterlere gönderilir
    PacketAround(pack);
    return true;
}
 
bu fonksiyon zaten düzgün şekilde çalışmıyor, ne mesafe ayarlandığının bir önemi yok. IsSyncOwner içerisinde m_pkChrSyncOwner olmadığı taktirde fonksiyon false olarak dönüş sağlıyor m_pkChrSyncOwner değerini ise atayan tek şey bu fonksiyon ancak "if (!IsSyncOwner(ch))" kontrolü sonrasında yani paylaşılan koddada 69.satırda, IsSyncOwner kısmını geçemediği için hiçbir şekilde değer atanamıyor ve sürekli false olarak dönüş sağlıyor
 
bu fonksiyon zaten düzgün şekilde çalışmıyor, ne mesafe ayarlandığının bir önemi yok. IsSyncOwner içerisinde m_pkChrSyncOwner olmadığı taktirde fonksiyon false olarak dönüş sağlıyor m_pkChrSyncOwner değerini ise atayan tek şey bu fonksiyon ancak "if (!IsSyncOwner(ch))" kontrolü sonrasında yani paylaşılan koddada 69.satırda, IsSyncOwner kısmını geçemediği için hiçbir şekilde değer atanamıyor ve sürekli false olarak dönüş sağlıyor
bi konu hakkında danışıcaktım.

ışınlanma yapınca cpu 0.21 den 3 e çıkıyor.
35 kişi aynı anda ışınlansa yada oyuan gir çık yapsa oyun pert mi olur.

buna nasıl limit koyabiliriz.oyuna giriştete aynı.

dediğim değerler 1 saniye sürüyor

entergame deki birçok işlevi kapattım ama halen aynı
loglara bakınca item load gibi birçok işlev var hepsini önbellepe mi almalıyım
filesda martysama
 
Son düzenleme:
Geri
Üst