Çözüldü Sunucu üzerinden oyuncuya emoji kullandırma kodu hata nerede?

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

asilords

Üye
Üye
Mesaj
94
Çözümler
2
Beğeni
34
Puan
669
Ticaret Puanı
0
Game src den oyuncuya emoji kullandırmak istiyorum oxeventten örnek alarak deniyorum işe yaramadı hata nerede?

a:
Genişlet Daralt Kopyala
            char chatbuf[256];
            int len = snprintf(chatbuf, sizeof(chatbuf), "%s", number(0, 1) == 1 ? "cheer1" : "cheer2");

cheer1 ya da cheer2 seçiyor tek emoji şeklinde yardımcı olabilecek var m?
 
Çözüm
Aşağıda gösterdiğim videodaki örneğe göre; bir karakter bağırma ekranından herhangi bir yazı yazdığında sevinç duygusu çalışacak.




Sanıyorum ki bunu bireysel olarak kullanmak istiyorsun; bu yüzden FindPC veya iter vb. ile arama yapmana gerek yok.
Doğrudan ch->GetVID() ile oyuncunun VID değerini çekmen yeterli olacaktır. Aşağıda verdiğim kodu komple alıp istediğin yerde kullanabilirsin. Sorunsuz çalışacaktır. Ancak yapmak istediğin işlemlere göre gerekli olabilecek ek kontrolleri kendin eklemen gerek.

C++:
Genişlet Daralt Kopyala
        char chatbuff[256+1];
        int len = snprintf(chatbuff, sizeof(chatbuff),
                        "%s %u %u", "cheer1", (DWORD)ch->GetVID(), 0);

        if (len < 0 || len >= (int) sizeof(chatbuff))...
-
amaç ne burada ben onu anlamadım tam olarak
Sunucu üzerinden karekteri dans ettirmek istiyorum bu kodu kullanarak.
v:
Genişlet Daralt Kopyala
            char chatbuf[256];
            int len = snprintf(chatbuf, sizeof(chatbuf), "%s", number(0, 1) == 1 ? "cheer1" : "cheer2");

Kodta sorun var. ox sırasında doğru cevap verilince de bu kod kullanılmış emoji yaptırıyor ama bende çalışmadı nedense.

oxevent.cpp te böu şekilde kullanılmış ben kendime uyarladım ama çalışmadı.
s:
Genişlet Daralt Kopyala
                char chatbuf[256];
                int len = snprintf(chatbuf, sizeof(chatbuf),
                        "%s %u %u", number(0, 1) == 1 ? "cheer1" : "cheer2", (DWORD)pkChar->GetVID(), 0);
 
kodu direkt aynı şekilde kopyalayıp denesene
 
Game src den oyuncuya emoji kullandırmak istiyorum oxeventten örnek alarak deniyorum işe yaramadı hata nerede?

a:
Genişlet Daralt Kopyala
            char chatbuf[256];
            int len = snprintf(chatbuf, sizeof(chatbuf), "%s", number(0, 1) == 1 ? "cheer1" : "cheer2");

cheer1 ya da cheer2 seçiyor tek emoji şeklinde yardımcı olabilecek var m?
OX kısmından aldığınız örneği tekrar inceleyelim, yaptığınız hatayı göstermek için;

C++:
Genişlet Daralt Kopyala
                char chatbuf[256];
                int len = snprintf (chatbuf, sizeof (chatbuf), "%s %u %u", number (0, 1) == 1 ? "cheer1" : "cheer2", (DWORD)pkChar->GetVID(), 0);

                // 리턴값이 sizeof(chatbuf) 이상일 경우 truncate되었다는 뜻..
                if (len < 0 || len >= (int) sizeof (chatbuf))
                {
                    len = sizeof (chatbuf) - 1;
                }

                // \0 문자 포함
                ++len;

Öncelikle bu kodu alıyorsanız, bu verdiğim şekilde komple almalısınız, alttaki kontroller de buna dahil. Kodu bu şekilde alın, istediğiniz duyguya göre düzenleyin yalnız yaptığınız bir hata var, kodun sonunda mevcut karakterlerin VID değerini alan bir kod var siz bunu silmişsiniz, bu şekilde tabii ki çalışmayacaktır, buna dikkat ederek tekrar deneyebilirsiniz.
 
OX kısmından aldığınız örneği tekrar inceleyelim, yaptığınız hatayı göstermek için;

C++:
Genişlet Daralt Kopyala
                char chatbuf[256];
                int len = snprintf (chatbuf, sizeof (chatbuf), "%s %u %u", number (0, 1) == 1 ? "cheer1" : "cheer2", (DWORD)pkChar->GetVID(), 0);

                // 리턴값이 sizeof(chatbuf) 이상일 경우 truncate되었다는 뜻..
                if (len < 0 || len >= (int) sizeof (chatbuf))
                {
                    len = sizeof (chatbuf) - 1;
                }

                // \0 문자 포함
                ++len;

Öncelikle bu kodu alıyorsanız, bu verdiğim şekilde komple almalısınız, alttaki kontroller de buna dahil. Kodu bu şekilde alın, istediğiniz duyguya göre düzenleyin yalnız yaptığınız bir hata var, kodun sonunda mevcut karakterlerin VID değerini alan bir kod var siz bunu silmişsiniz, bu şekilde tabii ki çalışmayacaktır, buna dikkat ederek tekrar deneyebilirsiniz.
pkChar tanımını istiyor aşağıdaki tabi tanımladığımda bu sefer iter tanımını soruyor onuda tanımladığımda için işine gereksiz kodlar giriyor anlamını bilemediğim.

pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);

itertype(m_map_attender) iter = m_map_attender.begin();
itertype(m_map_attender) iter_tmp;

m_map_attender Ne için kullanılıyor?
 
pkChar tanımını istiyor aşağıdaki tabi tanımladığımda bu sefer iter tanımını soruyor onuda tanımladığımda için işine gereksiz kodlar giriyor anlamını bilemediğim.

pkChar = CHARACTER_MANAGER::instance().FindByPID(iter->second);

itertype(m_map_attender) iter = m_map_attender.begin();
itertype(m_map_attender) iter_tmp;

m_map_attender Ne için kullanılıyor?
Benim verdiğim kısımda m_map_attender yok sen anladığım kadarıyla kodun tümünü almayı denedin, OX kısmındaki orijinal kodda bu iter mapte olan ve bu fonksiyondan etkilenmesi istenen oyuncuları konteyner içinden seçmek için kullanılıyor, yani belirli bölümdeki oyuncuları yanlış cevap verdikleri zaman erase ile silip OX'dan atması gibi.

Ne yapmak istediğini tam bilmiyorum ama oyuncuların tamamını dans ettiren bir GM komutu vardı, o konuyu bulursan oradaki kodlardan kopya çekebilirsin, chat_type ile command yollatmak berbat bir seçenek değil, kullanılabilir ama OX tarzında bir yöntem daha sağlıklı olur.
 
Benim verdiğim kısımda m_map_attender yok sen anladığım kadarıyla kodun tümünü almayı denedin, OX kısmındaki orijinal kodda bu iter mapte olan ve bu fonksiyondan etkilenmesi istenen oyuncuları konteyner içinden seçmek için kullanılıyor, yani belirli bölümdeki oyuncuları yanlış cevap verdikleri zaman erase ile silip OX'dan atması gibi.

Ne yapmak istediğini tam bilmiyorum ama oyuncuların tamamını dans ettiren bir GM komutu vardı, o konuyu bulursan oradaki kodlardan kopya çekebilirsin, chat_type ile command yollatmak berbat bir seçenek değil, kullanılabilir ama OX tarzında bir yöntem daha sağlıklı olur.
Yapmak istediğim baska bir mmo oyununda gördüğüm, + basınca ve sandıktan iyi bir item cıktığında karekter sevinme emojisi yapıyor hoşuma gitti için metin2 de yapmak istedim. Yorum için teşekkürler denemeleri sürdüreceğim çözüm bulana kadar.
 
Aşağıda gösterdiğim videodaki örneğe göre; bir karakter bağırma ekranından herhangi bir yazı yazdığında sevinç duygusu çalışacak.




Sanıyorum ki bunu bireysel olarak kullanmak istiyorsun; bu yüzden FindPC veya iter vb. ile arama yapmana gerek yok.
Doğrudan ch->GetVID() ile oyuncunun VID değerini çekmen yeterli olacaktır. Aşağıda verdiğim kodu komple alıp istediğin yerde kullanabilirsin. Sorunsuz çalışacaktır. Ancak yapmak istediğin işlemlere göre gerekli olabilecek ek kontrolleri kendin eklemen gerek.

C++:
Genişlet Daralt Kopyala
        char chatbuff[256+1];
        int len = snprintf(chatbuff, sizeof(chatbuff),
                        "%s %u %u", "cheer1", (DWORD)ch->GetVID(), 0);

        if (len < 0 || len >= (int) sizeof(chatbuff))
            len = sizeof(chatbuff) - 1;

        ++len;
   
        TPacketGCChat pack_chat;
        pack_chat.header = HEADER_GC_CHAT;
        pack_chat.size = sizeof(TPacketGCChat) + len;
        pack_chat.type = CHAT_TYPE_COMMAND;
        pack_chat.id = 0;
        TEMP_BUFFER buf;
        buf.write(&pack_chat, sizeof(TPacketGCChat));
        buf.write(chatbuff, len);
   
        ch->PacketAround(buf.read_peek(), buf.size());
        ch->ChatPacket(CHAT_TYPE_COMMAND, chatbuff);

Bu kullanımın herhangi bir zararı veya dezavantajı olmaz. Oyunda hiçbir şey yapmadan sabit dursan bile arka planda onlarca paket sürekli çalışıyor zaten. Ayrıca bu işlem geçicidir, işlem tamamlandığında veriler sıfırlanır. Bu gibi durumlarda paket kullanmak zorundasın.
Çünkü server tarafında harici ve geçici bir bellek oluşturuyorsun, içeriğini dolduruyorsun ve bunu bir şekilde cliente göndermen gerek. Bunun da en pratik yolu mevcut paketlerden uygun olanını seçip kullanmaktır.
 
Çözüm
Aşağıda gösterdiğim videodaki örneğe göre; bir karakter bağırma ekranından herhangi bir yazı yazdığında sevinç duygusu çalışacak.




Sanıyorum ki bunu bireysel olarak kullanmak istiyorsun; bu yüzden FindPC veya iter vb. ile arama yapmana gerek yok.
Doğrudan ch->GetVID() ile oyuncunun VID değerini çekmen yeterli olacaktır. Aşağıda verdiğim kodu komple alıp istediğin yerde kullanabilirsin. Sorunsuz çalışacaktır. Ancak yapmak istediğin işlemlere göre gerekli olabilecek ek kontrolleri kendin eklemen gerek.

C++:
Genişlet Daralt Kopyala
        char chatbuff[256+1];
        int len = snprintf(chatbuff, sizeof(chatbuff),
                        "%s %u %u", "cheer1", (DWORD)ch->GetVID(), 0);

        if (len < 0 || len >= (int) sizeof(chatbuff))
            len = sizeof(chatbuff) - 1;

        ++len;
  
        TPacketGCChat pack_chat;
        pack_chat.header = HEADER_GC_CHAT;
        pack_chat.size = sizeof(TPacketGCChat) + len;
        pack_chat.type = CHAT_TYPE_COMMAND;
        pack_chat.id = 0;
        TEMP_BUFFER buf;
        buf.write(&pack_chat, sizeof(TPacketGCChat));
        buf.write(chatbuff, len);
  
        ch->PacketAround(buf.read_peek(), buf.size());
        ch->ChatPacket(CHAT_TYPE_COMMAND, chatbuff);

Bu kullanımın herhangi bir zararı veya dezavantajı olmaz. Oyunda hiçbir şey yapmadan sabit dursan bile arka planda onlarca paket sürekli çalışıyor zaten. Ayrıca bu işlem geçicidir, işlem tamamlandığında veriler sıfırlanır. Bu gibi durumlarda paket kullanmak zorundasın.
Çünkü server tarafında harici ve geçici bir bellek oluşturuyorsun, içeriğini dolduruyorsun ve bunu bir şekilde cliente göndermen gerek. Bunun da en pratik yolu mevcut paketlerden uygun olanını seçip kullanmaktır.

Dediğiniz gibi sorunsuz çalıştı zaman ayırdığınız için teşekkür ederim. Diğer yorum yapıp yardımcı olmaya çalışan kişilere de teşekkürler. Yardımlarınız olmasa sorunları çözmem imkansız. Herkese iyi günler dilerim.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst