Basit Sistem Yazma Rehberi (Envanter içi çöp / item silme butonu)

  • Konuyu açan Konuyu açan leqions
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 33
  • Gösterim Gösterim 1K

leqions

Üye
Üye
Mesaj
76
Çözümler
4
Beğeni
97
Puan
669
Ticaret Puanı
0
Merhaba arkadaşlar. Ben dahil bir çoğumuz, internette paylaşılmış sistemlerin / fixlerin mantığı basit de olsa karmaşık da olsa neyin neden yapıldığını çoğu zaman anlamadan, ilgilenmeden, sırf kopyala yapıştır yöntemiyle server - client kodlarımıza dahil ediyoruz. Tabi ki en rahatı ve güzeli bu. Ama benim "en azından yapmaya çalıştığım şeyi yapıp çalıştırabilecek kadar" neyin ne olduğunu anlamaya ihtiyacım vardı. Bolca deneme yanılma sonunda mantığın temel kısmını kavradığımı zannediyorum.

Ben, ucundan da olsa, basitçe client - server arası paketlerin nasıl işlediğini, python tarafından (oyun içinden) tetikleyerek client'te çalıştırdığımız fonksiyondan gönderdiğimiz paketle server üzerinde işlemin nasıl yapıldığını elimden geldiğince göstermek için tek videoluk (yaklaşık 40 dakika) bir rehber hazırladım.

Basit bir mantığa sahip olduğunu düşündüğüm için bu rehberde "envanter içi sürükle-bırak item silme butonu" yaptım.

Ortam müsait olmadığı için sesli kayıt alamadım fakat anlatımı videoya eklediğim metinlerle olabildiğince destekledim ve yazılı açıklamalarda bulundum.
Şu anda Windows Altyapı Server Files kullandığımdan, tüm kaynak kodlarını Visual Studio'da derliyorum. Fakat yaptığım işlemlerin aynıları BSD için de geçerli.

Video İçeriği:
Genişlet Daralt Kopyala
-1. Kısım: Envantere butonu yerleştirmek. (pack / python)

-2. Kısım: Butona bir eşyayla tıklanıp tıklanmadığının kontrolü (sürükle-bırak)
            ve beraber tıklanan eşyanın hangi slotta / pozisyonda olduğunun verisini
            elde edip bunu oyun içinde yazdırmak. (pack / python)
           
-3. Kısım: Client source'da, oyun içinden edindiğimiz "item pozisyonu" verisini
            servera göndermek üzere bir paket tanımlamak ve Python tarafından
            "net.FonksiyonAdımız" kullanımıyla erişebileceğimiz (ve veriyi servera
            gönderecek olan) bir fonksiyon yazmak. Root'tan fonksiyonu çağırmak.
            (client src / c++)
           
-4. Kısım: Server source'da gelen veriyi işlemek üzere aynı paketi tanımlamak,
            gelen envanter pozisyonuna göre itemi bulup, eğer giyilmiyorsa itemi silmek.
            (game src / c++)
            Ve sürüklenen itemin mouse'a takılı kalmasını önlemek.
            (python)
           
-5. ve son kısım: "Silmek istediğinden emin misin?" evet/hayır kontrolü.
                    (pack / python)

Videoya geçmeden önce, @MT2Dev 'in konuyla ilgili yazdığı faydalı yol gösterme ve bilgilendirme mesajını buraya sabitlemek istiyorum.
Konuda işlenen sistem rehberini bu mesajıyla bir bütün haline getirdiği ve benim de bilmediğim kısımlara ışık tuttuğu için kendisine tekrardan teşekkür ediyorum :)

MT2Dev'in Mesajı


Umarım birilerinin işine yarar :)

 
Son düzenleme:
eve geçince izliyim ama rehber rehberdir eline sağlık şimdiden
 
baştan sona izledim harika olmuş. sistemin kodlarınıda item silme sistemi diye paylaşırsan sevinirim :D ayrıca itemi sürükledikten sonra çıkan popupdialogtada detachobject kullanılabilir. mausta itemle birlikte evet yada hayıra basıyorsun çünkü. gerçekten mükemmel anlatılmış. devamını bekliyorum.
 
Böyle kişiler oldukça forumun sırtı yere gelmez adamsın @leqions normalde kimse böyle bir şeyi babasının hayrına anlatmaz gerçekten takdir ettim faydalı içerik :) başarılar dilerim.
baştan sona izledim harika olmuş. sistemin kodlarınıda item silme sistemi diye paylaşırsan sevinirim :D ayrıca itemi sürükledikten sonra çıkan popupdialogtada detachobject kullanılabilir. mausta itemle birlikte evet yada hayıra basıyorsun çünkü. gerçekten mükemmel anlatılmış. devamını bekliyorum.
çok teşekkür ediyorum arkadaşlar sağ olun. @hasanmacit evet haklısın oraya da detach koyduğumda on numara olacak :) kodları da sistem konusu açıp foruma yükleyeceğim çok kısa süre içinde.
 
Paylaşım için teşekkürler.

Şu paket mevzusu çok merak ettiğim bir şeydi sayende biraz anladım ben burdan yürür giderim :) , sağol.

command kullanımıyla ilgili video gelir mi?

Birde epack32 de dosyaları ordan oraya atmanın sebebi anlaşılır olsun diyemiydi anlamadım ama other kısmından default path kısmından derlemek istediğin pack in dosya yolunu seçebilirsin. Sürekli dosyaları ordan oraya aktarmak zorunda kalmazsın.
 
Paylaşım için teşekkürler.

Şu paket mevzusu çok merak ettiğim bir şeydi sayende biraz anladım ben burdan yürür giderim :) , sağol.

command kullanımıyla ilgili video gelir mi?

Birde epack32 de dosyaları ordan oraya atmanın sebebi anlaşılır olsun diyemiydi anlamadım ama other kısmından default path kısmından derlemek istediğin pack in dosya yolunu seçebilirsin. Sürekli dosyaları ordan oraya aktarmak zorunda kalmazsın.
çok teşekkürler. aslında çok uzun süredir nedense packleri manuel olarak kopyala yapıştır yapıyorum, özel bir sebebi yok. en başından beri öyle alıştım ve galiba sadece manasız bir el alışkanlığı olarak kaldı :D bu arada command kullanımı derken tam olarak neyi kast ettiğini anlayamadım maalesef :(
 
çok teşekkürler. aslında çok uzun süredir nedense packleri manuel olarak kopyala yapıştır yapıyorum, özel bir sebebi yok. en başından beri öyle alıştım ve galiba sadece manasız bir el alışkanlığı olarak kaldı :D bu arada command kullanımı derken tam olarak neyi kast ettiğini anlayamadım maalesef :(
cmd_general.cpp dosyasına tanımlamasını yapıyoruz falan.
 
Bir şeyler yapmak isteyip kaynak bulamayan insanlar için şahane bir video hazırlamışsınız, bu mecrada gördüğüm en detaylı sistem videolarından biri olmuş, elinize sağlık.

Video için her şeyi basit tuttuğunuzu ve sadece işleyişi göstermek için bunu yaptığınızı tahmin edebiliyorum, o yüzden size değil, bunu izleyerek yeni bir şeyler yapacak arkadaşlar için şunları da unutmamalarını öneriyorum;

Bu tarz bir sistem yaptıktan sonra mutlaka her noktasına kontrol ekleyin. (Karakter mevcut mu, item mevcut mu, karakterin durumu bu işlev için elverişli mi, spama müsait bir durum var mı vs.)
Videodan örnek vereyim, giyili bir eşyanın silinmemesi için gerekli kontrol var fakat envanterden bir eşya sürüklendiğinde yine evet hayır penceresini tetikleyebiliyoruz, bunun yerine direkt hata mesajı yazdırabiliriz.
Silinecek itemlerin anti-flag değerlerini kontrol edip, oyunun(yada bizim) yok edilmesini istemediği ve bunun için flag eklediği eşyaların silinmesini önleyebiliriz, örnekler çoğaltılabilir videoyu izlediğim süre zarfında ilk aklıma gelenler bunlardı.

Son olarak videonun 24:16 saniyesinde, ne işe yaradığını çözemedim dediğiniz bir bölüm dikkatimi çekti, onun da bilgisini ben vereyim konuya bir katkım olsun;

Bu tarz senaryolarda dizilimin kullanım yerini öğrenmek için kullandığı fonksiyona bakmanız yeterli, bu durumla alakalı örnek verelim;
Gördüğümüz kod:
Genişlet Daralt Kopyala
CPacketInfoCG::CPacketInfoCG()
{
    Set (HEADER_CG_HANDSHAKE,            sizeof (TPacketCGHandshake),            "Handshake",            false);
    Set (HEADER_CG_TIME_SYNC,            sizeof (TPacketCGHandshake),            "TimeSync",                true);
    // devam ediyor..
}

Burada kodu "Set" ile kullanmışlar, Set fonksiyonunu buluyoruz;

Set Fonksiyonu:
Genişlet Daralt Kopyala
void CPacketInfo::Set (int header, int iSize, const char* c_pszName, bool bSeq)
{
    if (m_pPacketMap.find (header) != m_pPacketMap.end())
    {
        return;
    }

    auto element = M2_NEW TPacketElement;
    // devam ediyor...
}

Set fonksiyonuna tanımlı olan verilerin hepsi, ilk kodda sırasıyla kullanılmış yani durum şu;
Kod:
Genişlet Daralt Kopyala
    Set (header,            iSize,            "c_pszName",            bSeq);

header paketin ismi, iSize boyutu, c_pszName paketin kullanım için tanımlanan adı (Client tarafındaki py kullanımı için ekleme yaptığınız bölüm gibi düşünün, benzer fakat server tarafında kayda değer bir görevi yok), bSeq ise paket gönderilirken sequence kullanıp ekstra bir veri gönderip göndermeyeceği, zaten bool değer true yada false girmek zorundasınız.

False yapınca paket hatası almanızın sebebi client tarafında bağlı fonksiyonun sonunda return SendSequence; kullanmanız, server tarafında bunu kapatırsanız paketler uyuşmuyor dolayısıyla hata alıyorsunuz, saygılar.
 
Bir şeyler yapmak isteyip kaynak bulamayan insanlar için şahane bir video hazırlamışsınız, bu mecrada gördüğüm en detaylı sistem videolarından biri olmuş, elinize sağlık.

Video için her şeyi basit tuttuğunuzu ve sadece işleyişi göstermek için bunu yaptığınızı tahmin edebiliyorum, o yüzden size değil, bunu izleyerek yeni bir şeyler yapacak arkadaşlar için şunları da unutmamalarını öneriyorum;

Bu tarz bir sistem yaptıktan sonra mutlaka her noktasına kontrol ekleyin. (Karakter mevcut mu, item mevcut mu, karakterin durumu bu işlev için elverişli mi, spama müsait bir durum var mı vs.)
Videodan örnek vereyim, giyili bir eşyanın silinmemesi için gerekli kontrol var fakat envanterden bir eşya sürüklendiğinde yine evet hayır penceresini tetikleyebiliyoruz, bunun yerine direkt hata mesajı yazdırabiliriz.
Silinecek itemlerin anti-flag değerlerini kontrol edip, oyunun(yada bizim) yok edilmesini istemediği ve bunun için flag eklediği eşyaların silinmesini önleyebiliriz, örnekler çoğaltılabilir videoyu izlediğim süre zarfında ilk aklıma gelenler bunlardı.

Son olarak videonun 24:16 saniyesinde, ne işe yaradığını çözemedim dediğiniz bir bölüm dikkatimi çekti, onun da bilgisini ben vereyim konuya bir katkım olsun;

Bu tarz senaryolarda dizilimin kullanım yerini öğrenmek için kullandığı fonksiyona bakmanız yeterli, bu durumla alakalı örnek verelim;
Gördüğümüz kod:
Genişlet Daralt Kopyala
CPacketInfoCG::CPacketInfoCG()
{
    Set (HEADER_CG_HANDSHAKE,            sizeof (TPacketCGHandshake),            "Handshake",            false);
    Set (HEADER_CG_TIME_SYNC,            sizeof (TPacketCGHandshake),            "TimeSync",                true);
    // devam ediyor..
}

Burada kodu "Set" ile kullanmışlar, Set fonksiyonunu buluyoruz;

Set Fonksiyonu:
Genişlet Daralt Kopyala
void CPacketInfo::Set (int header, int iSize, const char* c_pszName, bool bSeq)
{
    if (m_pPacketMap.find (header) != m_pPacketMap.end())
    {
        return;
    }

    auto element = M2_NEW TPacketElement;
    // devam ediyor...
}

Set fonksiyonuna tanımlı olan verilerin hepsi, ilk kodda sırasıyla kullanılmış yani durum şu;
Kod:
Genişlet Daralt Kopyala
    Set (header,            iSize,            "c_pszName",            bSeq);

header paketin ismi, iSize boyutu, c_pszName paketin kullanım için tanımlanan adı (Client tarafındaki py kullanımı için ekleme yaptığınız bölüm gibi düşünün, benzer fakat server tarafında kayda değer bir görevi yok), bSeq ise paket gönderilirken sequence kullanıp ekstra bir veri gönderip göndermeyeceği, zaten bool değer true yada false girmek zorundasınız.

False yapınca paket hatası almanızın sebebi client tarafında bağlı fonksiyonun sonunda return SendSequence; kullanmanız, server tarafında bunu kapatırsanız paketler uyuşmuyor dolayısıyla hata alıyorsunuz, saygılar.
Elinize sağlık güzel bir yazı olmuş.
sen cantolip misin ?
 
Bir şeyler yapmak isteyip kaynak bulamayan insanlar için şahane bir video hazırlamışsınız, bu mecrada gördüğüm en detaylı sistem videolarından biri olmuş, elinize sağlık.

Video için her şeyi basit tuttuğunuzu ve sadece işleyişi göstermek için bunu yaptığınızı tahmin edebiliyorum, o yüzden size değil, bunu izleyerek yeni bir şeyler yapacak arkadaşlar için şunları da unutmamalarını öneriyorum;

Bu tarz bir sistem yaptıktan sonra mutlaka her noktasına kontrol ekleyin. (Karakter mevcut mu, item mevcut mu, karakterin durumu bu işlev için elverişli mi, spama müsait bir durum var mı vs.)
Videodan örnek vereyim, giyili bir eşyanın silinmemesi için gerekli kontrol var fakat envanterden bir eşya sürüklendiğinde yine evet hayır penceresini tetikleyebiliyoruz, bunun yerine direkt hata mesajı yazdırabiliriz.
Silinecek itemlerin anti-flag değerlerini kontrol edip, oyunun(yada bizim) yok edilmesini istemediği ve bunun için flag eklediği eşyaların silinmesini önleyebiliriz, örnekler çoğaltılabilir videoyu izlediğim süre zarfında ilk aklıma gelenler bunlardı.

Son olarak videonun 24:16 saniyesinde, ne işe yaradığını çözemedim dediğiniz bir bölüm dikkatimi çekti, onun da bilgisini ben vereyim konuya bir katkım olsun;

Bu tarz senaryolarda dizilimin kullanım yerini öğrenmek için kullandığı fonksiyona bakmanız yeterli, bu durumla alakalı örnek verelim;
Gördüğümüz kod:
Genişlet Daralt Kopyala
CPacketInfoCG::CPacketInfoCG()
{
    Set (HEADER_CG_HANDSHAKE,            sizeof (TPacketCGHandshake),            "Handshake",            false);
    Set (HEADER_CG_TIME_SYNC,            sizeof (TPacketCGHandshake),            "TimeSync",                true);
    // devam ediyor..
}

Burada kodu "Set" ile kullanmışlar, Set fonksiyonunu buluyoruz;

Set Fonksiyonu:
Genişlet Daralt Kopyala
void CPacketInfo::Set (int header, int iSize, const char* c_pszName, bool bSeq)
{
    if (m_pPacketMap.find (header) != m_pPacketMap.end())
    {
        return;
    }

    auto element = M2_NEW TPacketElement;
    // devam ediyor...
}

Set fonksiyonuna tanımlı olan verilerin hepsi, ilk kodda sırasıyla kullanılmış yani durum şu;
Kod:
Genişlet Daralt Kopyala
    Set (header,            iSize,            "c_pszName",            bSeq);

header paketin ismi, iSize boyutu, c_pszName paketin kullanım için tanımlanan adı (Client tarafındaki py kullanımı için ekleme yaptığınız bölüm gibi düşünün, benzer fakat server tarafında kayda değer bir görevi yok), bSeq ise paket gönderilirken sequence kullanıp ekstra bir veri gönderip göndermeyeceği, zaten bool değer true yada false girmek zorundasınız.

False yapınca paket hatası almanızın sebebi client tarafında bağlı fonksiyonun sonunda return SendSequence; kullanmanız, server tarafında bunu kapatırsanız paketler uyuşmuyor dolayısıyla hata alıyorsunuz, saygılar.
harika bir bilgilendirme olmuş. katkılarınızdan dolayı çok teşekkür ederim elinize sağlık. :)
 
Eline sağlık gayet başarılı bir anlatım olmuş. Yukarda Metin2Dev'in de bahsettiği kısmı baz aldıklarında az çok anlayan biri birçok şey keşfedebilir diye düşünüyorum.
 
Geri
Üst