Hikayeler

Reklam vermek için turkmmo@gmail.com

sycnlimitlemesiyle alakalı

apikomt2

Level 6
Uzman
Developer
Katılım
11 May 2023
Konular
237
Mesajlar
1,032
Online süresi
1ay 23g
Reaksiyon Skoru
678
Altın Konu
1
Başarım Puanı
176
TM Yaşı
2 Yıl 11 Ay 14 Gün
MmoLira
503
DevLira
315

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

// 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 kapatma işlevi varmış



Kod:
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;
}


Sync nedir?

Karakterlerin birbirine yaptığı davranış etkileri.
Yani x karakter y karakteri iterse bu bilgi karşı tarafa gider. Burda sync işlevi gerçekleşir.

Bu konunun oluşmasında %90 yapay zeka yardımcı oldu.

Kodun ne işe yaradığını bilmiyorsan kodu yapay zekaya yapıştır kodu detaylı Türkçeleştir yaz hepsini açıklıyor
Bu konudaki kodda yapay zeka turkcelestirdi
 
Son düzenleme:
paylaşım için teşekkürler.
 
paylaşım için teşekkürler.
 
Paylaşım için teşekkürler.
 

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

Geri
Üst