4 Adet Taş Ekleme + İtem Yansıtma Sorunu + Depo Sorunu + LAG ENGELLEME TOPLU PAYLASIM

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 65

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
serverler de bildiğiniz gibi itemlere 3 taş eklenebilmektedir fakat bu çok adaletli bir durum sayılmaz çünkü bir iteme savaşçı, sura, ninja taşı eklendiğinde şamanlar karşısında korumasız kalacaksınız ve oyuncular zorluk yaşayacaktır bu eşitliğin sağlanması adına sizlere source ile 4 taş eklemeyi anlatacağız. Bu sefer db üzerinde de değişiklik yapacağız. Sırası ile aşağıdaki işlemleri yapacağız.
1.common/item_lenght.h açıyoruz
Bu kodu Aratıyoruz.
Kod:
ITEM_SOCKET_MAX_NUM = 3,[/FONT]
Bulduktan sonra sonundaki 3'ü 4 yapıyoruz.
Kod:
ITEM_SOCKET_MAX_NUM = 4,
db/src/ClientManagerPlayer.cpp açıyoruz.
2.
Kod:
str_to_number(item.alSockets[2], row[cur++]); altına str_to_number(item.alSockets[3], row[cur++]); ekliyoruz aşağıdaki resimdeki gibi.
Son hali KIRMIZI İÇİNDEKİ GİBİ OLUCAKTIR.
QZMj6g.png
[/CENTER]
3. Yine aynı dosya içerisinde aşağıdakini aratıyoruz.
Kod:
SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2 ,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtyp e2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrv alue4,attrtype5,attrvalue5,attrtype6,attrvalue6
aratıyoruz ve aşağıdaki ile değiştiriyoruz.
Kod:
SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,socket3,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6
Son görüntüsü aşağıdaki gibi olacaktır.
PPMg46.png


4. Aynı dosya içerisinde aşağıdaki kodu aratıyor ve değiştiriyoruz.
Kod:
SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6

Aşağıdaki ile değiştiriyoruz.
Kod:
SELECT id,window+0,pos,count,vnum,socket0,socket1,socket2,socket3,attrtype0,attrvalue0,attrtype1,attrvalue1,attrtype2,attrvalue2,attrtype3,attrvalue3,attrtype4,attrvalue4,attrtype5,attrvalue5,attrtype6,attrvalue6
Son görüntü aşağıdaki gibi olacaktır.
Jn2vdj.png


5. Clientmanager.cpp açıyoruz ve aşağıdakini aratıyoruz.
Kod:
SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2
Aşağıdaki ile değiştiriyoruz.
Kod:
SELECT id, window+0, pos, count, vnum, socket0, socket1, socket2, socket3
Son görüntü aşağıdaki gibi olacaktır.
E5JZbD.png


6. Cache.cpp açılır ve aşağıdaki aratılır.
iLen += snprintf(szColumns + iLen, sizeof(szColumns) iLen, , socket0, socket1, socket2, socket3);
Aratıyoruz ve resimdeki gibi değiştiriyoruz komple. Aşağıda yazan kod ile.
Kod:
[LIST=1] [*]              if (isSocket) [*]                { [*]                        iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", socket0, socket1, socket2, socket3"); [*]                        iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen, [*]                                        ", %lu, %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3]); [*]                        iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen, [*]                                        ", socket0=%lu, socket1=%lu, socket2=%lu, socket3=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3]); [*]                } [/LIST]
Kod:
http://pastebin.com/4M57yqci Yukarıdaki  kodun copy paste'deki hali.

qPBrB5.png

7.Game içerisinde constants.cpp açıyoruz ve aiWeaponSocketQty[WEAPON_NUM_TYPES]
aratıyoruz ve resimdeki gibi değiştiriyoruz.

Kod:
const int32_t aiWeaponSocketQty[WEAPON_NUM_TYPES] = {     4, // WEAPON_SWORD,     4, // WEAPON_DAGGER,     4, // WEAPON_BOW,     4, // WEAPON_TWO_HANDED,     4, // WEAPON_BELL,     4, // WEAPON_FAN,     0, // WEAPON_ARROW,     0, // WEAPON_MOUNT_SPEAR };
arat : aiArmorSocketQty[ARMOR_NUM_TYPES] =
Kod:
const int32_t aiArmorSocketQty[ARMOR_NUM_TYPES] = {     4, // ARMOR_BODY,     1, // ARMOR_HEAD,     1, // ARMOR_SHIELD,     0, // ARMOR_WRIST,     0, // ARMOR_FOOTS,     0  // ARMOR_ACCESSORY };
İşlemlerimiz server taraflı olarak tamamlanmış oldu. Şimdi yapmamız gereken son işlem ise client taraflı olarak değişim yapmaktır.
8. Adım da client içerisinde userinterface/gametype.h içersinde ITEM_SOCKET_SLOT_MAX_NUM
aratıyoruz ve karşısındaki 3 sayısını 4 ile değiştiriyoruz son durum aşağıdaki gibi olacaktır.

W1YdOL.png


İşlemlerimiz tamamlanmış oldu fakat oyun içerisine her 3 taş basılan iteme 4. taşı basamazsınız sebebi ise item_proto içerisinde iteme basılacak taş sayısından kaynaklıdır. Bu işlemi sadece item_proto yani navicat mysql üzerinden yapacağız sakın locale içerisindekini değiştirmeyin item parlamaları bozlur! Bu işlemin kısa yolu için aşağıdaki query kodunu kullanabilirsiniz.
Kod:
UPDATE item_proto SET socket_pct=4′ WHERE socket_pct=3
Şeklinde bütün 3 taş basılan itemleri 4e çekebilirsiniz.
UYARI!
4 taş ekledikten sonra serverinizde iç görü küresi çalışmayabilir bunun çözümü için client üzerinde değişiklik yapmanız gerekiyor onun içinde Aşagıya inin
D4JaQv.png

Metin2 Depo Bugu Çözümü

Merhaba arkadaşlar bildiğiniz gibi size metin2 de bir iteme 4 taş eklemeyi anlatmıştık fakat sistemde şöyle bir bug mevcut misalen 4 taş basılan bir iteminiz var siz bu itemi depoya koydunuz ve tekrar geri aldınız artık item 4 değil 3 taş basılabiliyor veya 4 taş basmışken teki kayboluyor. Çözümü biraz uğraştırsada sonunda gözden kaçan ufak bir koddan sonra çözdük sorunu ve sizlerle paylaşmak istedik çözümü işlemlerini db source üzerinden yapacağız.
Kod:
Db/src/clientmanager.cpp açıyoruz.
Kod:
void CClientManager::QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData)
aratıyoruz ve biraz aşağı indiğimizde
Kod:
REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2,

satırı görüyoruz bu kısımı şu şekilde değiştiriyoruz.
Kod:
REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3,   [COLOR=rgb(255, 255, 255)][/FONT][/COLOR]
şeklinde Değiştirin.
aşağıda
Kod:
VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)
burası mevcut burayıda bununla değiştiriyoruz.

Kod:
VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)
ile değiştiriyoruz.
Kod:
p->alSockets[2], altına p->alSockets[3],
ekliyoruz ve işlemimiz tamamlanmıştır aşağıdaki resimde kırmızı ile gösterilen kısımlar eklenecek kısımlardır.
Jn2mYj.png

Depo bugu Sona ermiştir.
Item Yansıtma Sorunu İçin Gerekli işlemler Aşağıda Yapılıcaktır Sırasıyla.
D4JaQv.png
Bugün yeni açılan bir serverde item yansıtmada sorun olduğunu fark ettim server 40k yani source kodlara sahip ve onlar üzerinden yapılmış bir server item bağırma alanına ekleniyor fakat mouse ile tıklanıldığında iteme ait bilgiler gözükmemekte ilk başta clientte sorun olduğunu düşünüp gerekli düzenlemeleri yapmama rağmen hiç bir şekilde başarılı sonucu ulaşamadım sonrasında biraz araştırma ile sorunun 4. taştan olduğunu fark ettim çözümü için clienti kendiniz düzenlemelisiniz. Çözüm gayet kolay 3 adet dosyadaki değişim ile çözülmektedir.

  1. <li data-xf-list-type="ol">1.Client içerisinde userinterface/pythonplayermodule.cpp içerisinde playerGetItemLink aratıyoruz ve kod blogunu aşağıdaki gibi değiştiriyoruz. <li data-xf-list-type="ol">
    Kod:
    http://pastebin.com/4HBUkKJe
    <li data-xf-list-type="ol">
    Kod:
    PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs)  {             TItemPos Cell;               switch (PyTuple_Size(poArgs))             {             case 1:                     if (!PyTuple_GetInteger(poArgs, 0, &amp;Cell.cell))                             return Py_BuildException();                     break;             case 2:                     if (!PyTuple_GetByte(poArgs, 0, &amp;Cell.window_type))                             return Py_BuildException();                     if (!PyTuple_GetInteger(poArgs, 1, &amp;Cell.cell))                             return Py_BuildException();                     break;             default:                     return Py_BuildException();             }             const TItemData * pPlayerItem = CPythonPlayer::Instance().GetItemData(Cell);             CItemData * pItemData = NULL;             char buf[1024];               if (pPlayerItem &amp;&amp; CItemManager::Instance().GetItemDataPointer(pPlayerItem-&gt;vnum, &amp;pItemData))             {                     char itemlink[256];                     int len;                     bool isAttr = false;                       len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x:%x:%x:%x",                                     pPlayerItem-&gt;vnum, pPlayerItem-&gt;flags,                                     pPlayerItem-&gt;alSockets[0], pPlayerItem-&gt;alSockets[1], pPlayerItem-&gt;alSockets[2] , pPlayerItem-&gt;alSockets[3],  pPlayerItem-&gt;alSockets[4],  pPlayerItem-&gt;alSockets[5]);                       for (int i = 0; i &lt; ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++i)                             if (pPlayerItem-&gt;aAttr[i].bType != 0)                             {                                     len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",                                                     pPlayerItem-&gt;aAttr[i].bType, pPlayerItem-&gt;aAttr[i].sValue);                                     isAttr = true;                             }                         if( GetDefaultCodePage() == CP_ARABIC ) {                             if (isAttr)                                     //"item:¹øÈ£:Ç÷¡±×:¼ÒÄÏ0:¼ÒÄÏ1:¼ÒÄÏ2"                                     snprintf(buf, sizeof(buf), " |h|r[%s]|cffffc700|H%s|h", pItemData-&gt;GetName(), itemlink);                             else                                     snprintf(buf, sizeof(buf), " |h|r[%s]|cfff1e6c0|H%s|h", pItemData-&gt;GetName(), itemlink);                     } else {                             if (isAttr)                                     //"item:¹øÈ£:Ç÷¡±×:¼ÒÄÏ0:¼ÒÄÏ1:¼ÒÄÏ2"                                     snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData-&gt;GetName());                             else                                     snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData-&gt;GetName());                     }             }             else                     buf[0] = '\0';               return Py_BuildValue("s", buf);  }
    <li data-xf-list-type="ol">Son durum aşağıdaki gibi olacaktır.
    8D1APV.png

    2. Client içerisinde userinterface/pythonchatmodule.cpp açıyoruz ve chatGetLinkFromHyperlink aratıyoruz ve aşağıdaki ile değiştiriyoruz.
    Kod:
    http://pastebin.com/gLehYrax
    <li data-xf-list-type="ol">
    Kod:
    PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs)  {             char * szHyperlink;                       if (!PyTuple_GetString(poArgs, 0, &amp;szHyperlink))                     return Py_BuildException();               std::string stHyperlink(szHyperlink);             std::vector&lt;std::string&gt; results;               split_string(stHyperlink, ":", results, false);               // item:vnum:flag:socket0:socket1:socket2:socket3:socket4:socket5             if (0 == results[0].compare("item"))             {                     if (results.size() &lt; 9)                             return Py_BuildValue("s", "");                       CItemData * pItemData = NULL;                       if (CItemManager::Instance().GetItemDataPointer(htoi(results[1].c_str()), &amp;pItemData))                     {                             char buf[1024] = { 0 };                             char itemlink[256];                             int len;                             bool isAttr = false;                               len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x:%x:%x:%x",                                             htoi(results[1].c_str()),                                             htoi(results[2].c_str()),                                             htoi(results[3].c_str()),                                             htoi(results[4].c_str()),                                             htoi(results[5].c_str()),                                             htoi(results[6].c_str()),                                             htoi(results[7].c_str()),                                             htoi(results[8].c_str()));                               if (results.size() &gt;= 11)                             {                                     for (int i = 9; i &lt; results.size(); i += 2)                                     {                                             len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",                                                             htoi(results[i].c_str()),                                                             atoi(results[i+1].c_str()));                                             isAttr = true;                                     }                             }                               if (isAttr)                                     //"item:¹øÈ£:Ç÷¡±×:¼ÒÄÏ0:¼ÒÄÏ1:¼ÒÄÏ2"                                     snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData-&gt;GetName());                             else                                     snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData-&gt;GetName());                               return Py_BuildValue("s", buf);                     }             }               return Py_BuildValue("s", "");  }
    <li data-xf-list-type="ol"> LİNKTE BULUNAN İLE DEĞİŞİCEKTİR. <li data-xf-list-type="ol">
    <li data-xf-list-type="ol">uiinventory.py

    Aratılır:


    Kod:

    if attrCount&lt;4:


    Değiştirilir:


    Kod:

    if attrCount&lt;5:



    Hayırlı Olsun.


    nMQDOg.png

    Db/src/clientmanager.cpp açıyoruz.

    Aratıyoruz :
    Kod:
    Kod:
    void CClientManager::QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData
    Kod Bloğunda Buluyoruz :
    Kod:
    Kod:
    REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2,
    Aşağıdaki Şekilde Değiştiriyoruz :

    Kod:
    Kod:
    REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3,

    Aratıyoruz :
    Kod:
    Kod:
    VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)
    Aşagıdaki Şekilde Değiştiriyoruz :
    Kod:

    Kod:
    [LIST] [*]VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d) [/LIST]

    Aratıyoruz :
    Kod:

    p-&gt;alSockets[2],

    Altına Ekliyoruz :
    Kod:

    p-&gt;alSockets[3],


    Son hali aşağıdaki gibi olacaktır.
    qPBVdR.png


    3. Ve son olarak root içerisindeki uitooltip.py içerisinde def SetHyperlinkItem(self, tokens): aratılır ve aşağıdaki ile değiştirilir.
    Kod:
    http://pastebin.com/guY1jL6N DEĞİŞTİRİLİR
    <li data-xf-list-type="ol">
    Kod:
    def SetHyperlinkItem(self, tokens):                     minTokenCount = 3 + player.METIN_SOCKET_MAX_NUM                     maxTokenCount = minTokenCount + 2 * player.ATTRIBUTE_SLOT_MAX_NUM                     if tokens and len(tokens) &gt;= minTokenCount and len(tokens) &lt;= maxTokenCount:                             head, vnum, flag = tokens[:3]                             itemVnum = int(vnum, 16)                             metinSlot = [int(metin, 16) for metin in tokens[3:9]]                               rests = tokens[9:]                             if rests:                                     attrSlot = []                                       rests.reverse()                                     while rests:                                             key = int(rests.pop(), 16)                                             if rests:                                                     val = int(rests.pop())                                                     attrSlot.append((key, val))                                       attrSlot += [(0, 0)] * (player.ATTRIBUTE_SLOT_MAX_NUM - len(attrSlot))                             else:                                     attrSlot = [(0, 0)] * player.ATTRIBUTE_SLOT_MAX_NUM                               self.ClearToolTip()                             self.AddItemData(itemVnum, metinSlot, attrSlot)                               ItemToolTip.OnUpdate(self)


    Son hali Aşagıdaki gibi olucaktır.
    yL4gjk.png

    İşlem tamamlanmıştır artık sorunsuz bir biçimde itemlerinizi yansıtabileceksiniz bu işlem sadece 4 taş için değil 6 taş içinde yapmış olduk.

    LAG ENGELL İÇİN İSE YAPILICAK OLAN İŞLEMLER...

    Metin2 pvp serverlerin en büyük sorunlarından bir tanesi lagdır. Oyuncular daimi olarak bundan şikayet eder bizlerde sizlere bu yazımızda lagı nasıl siz taraflı olarak engelleyebileceğiniz anlatacağız. Öncelikle lagın sebeplerini listeleyelim.
    1.Oyuncunun bilgisayarı oyununuz için yeterli değildir. Yani oyuncunun fps değeri düşer ve lag kasmalar yapar.
    2.İnternet bağlantısı. Oyuncunuzun internet bağlantısı çok düşük ise yaptığı işlemler sunucuya geç ulaşacaktır.
    3.Serveriniz yeterli gelmiyordur. Oyuncu sayınız 400 olur anlık siz bu kadar oyuncuyu 1Gb serverde tutmak isterseniz mutlaka lag olacaktır.
    Bizler daha çok üçüncü madde ile ilgileneceğiz ve sizlere ipuçları vereceğiz.
    Sunucu seçerken dikkat etmeniz gerekenler;
    Lagın en büyük sebeplerinden birisi oyuncudan ziyade server sahibinin bilgisizliği veya doğru kişiler ile çalışmamasıdır. Sunucu çok önemli bir faktördür. Sunucuyu kiralarken kiraladığınız yerin güvenilir olmasına dikkatedin bırakın metin2 kurmasın sadece freebsd gerekli sürümleri kursun gerisini siz kurun veya gelecek olan yazılarımızdaki anlatımlardan kurulumu kendiniz yapın.
    İşlemci olarak xeon öneriyoruz. Sürüm ise yeni sürüm olmasına dikkat edin ve performanslarına mutlaka bakın bunun için internette daima kullandığımız site
    Bağlantı en önemli faktörlerdendir. Aslen metin2 çok fazla bağlantı kullanmaz fakat çok kötü bir hat ile bu durum eziyete dönüşecektir tabiki ve ping sürelerine dikkat edin çok uzak mesafedeki sunucuları seçmeyin. Ortalama olarak 500 anlık online olan bir serverda anlık maximum 4-5mbit civarı olacaktır. Bu çok yüksek bir değer değildir. Fakat önerimiz garanti olması açısından 1gbit portu olan en az 100mbit garanti hat veren bir firma ile çalışmanız.
    Harddisk en önemlisidir. Çünkü metin2 büyün verileri devamlı mysql ile update vs. işlemleri yapar ve bu işlemler sırasında harddisk dönme hızı az olursa lag olacaktır. Bilgiler geç yazılacak dolayısı ile veriler geç gönderilecektir. Önerimiz mutlaka SSD harddiske sahip bir sunucu kiralamanız yönündedir.
    Bunların dışında vds alacaksanız mutlaka az sanallaştırma yapan yani örn ana sistemi 64gb olan bir makinada 60 vps kuran bir yer ile değil 30vds kuran bir firma ile çalışmalısınız.
    Bu kısımlar lag ile çok alakalı değil şeklinde düşünebilirsiniz fakat asıl önemli kısımları bunlardır. Diğer bizim yapacaklarımız basit işlemlerdir.
    Putty yani harddisk temizlemesi;
    Bu işlem çok önemsiz gibi gözüksede bizce şart bir durumdur ve bunu cron sistemi ile yaparsanız sorunsuz bir biçimde her gün her 1-2dk da bir lag silmesi yapabilirsiniz. Kendimize ait olan clear.sh dosyası; <li data-xf-list-type="ol">
    Kod:
    #!/bin/sh rm -rf /usr/game/channel1/core1/stdout rm -rf /usr/game/channel1/core1/packet_info.txt rm -rf /usr/game/channel1/core1/p2p_packet_info.txt rm -rf /usr/game/channel1/core1/syslog rm -rf /usr/game/channel1/core1/syserr rm -rf /usr/game/channel1/core1/game.core rm -rf /usr/game/channel1/core2/stdout rm -rf /usr/game/channel1/core2/packet_info.txt rm -rf /usr/game/channel1/core2/p2p_packet_info.txt rm -rf /usr/game/channel1/core2/syslog rm -rf /usr/game/channel1/core2/syserr rm -rf /usr/game/channel1/core2/game.core rm -rf /usr/game/channel1/core3/stdout rm -rf /usr/game/channel1/core3/packet_info.txt rm -rf /usr/game/channel1/core3/p2p_packet_info.txt rm -rf /usr/game/channel1/core3/syslog rm -rf /usr/game/channel1/core3/syserr rm -rf /usr/game/channel1/core3/game.core rm -rf /usr/game/channel1/core4/stdout rm -rf /usr/game/channel1/core4/packet_info.txt rm -rf /usr/game/channel1/core4/p2p_packet_info.txt rm -rf /usr/game/channel1/core4/syslog rm -rf /usr/game/channel1/core4/syserr rm -rf /usr/game/channel1/core4/game.core rm -rf /usr/game/channel2/core1/stdout rm -rf /usr/game/channel2/core1/packet_info.txt rm -rf /usr/game/channel2/core1/p2p_packet_info.txt rm -rf /usr/game/channel2/core1/syslog rm -rf /usr/game/channel2/core1/syserr rm -rf /usr/game/channel2/core1/game.core rm -rf /usr/game/channel2/core2/stdout rm -rf /usr/game/channel2/core2/packet_info.txt rm -rf /usr/game/channel2/core2/p2p_packet_info.txt rm -rf /usr/game/channel2/core2/syslog rm -rf /usr/game/channel2/core2/syserr rm -rf /usr/game/channel2/core2/game.core rm -rf /usr/game/channel2/core3/stdout rm -rf /usr/game/channel2/core3/packet_info.txt rm -rf /usr/game/channel2/core3/p2p_packet_info.txt rm -rf /usr/game/channel2/core3/syslog rm -rf /usr/game/channel2/core3/syserr rm -rf /usr/game/channel2/core3/game.core rm -rf /usr/game/channel2/core4/stdout rm -rf /usr/game/channel2/core4/packet_info.txt rm -rf /usr/game/channel2/core4/p2p_packet_info.txt rm -rf /usr/game/channel2/core4/syslog rm -rf /usr/game/channel2/core4/syserr rm -rf /usr/game/channel2/core4/game.core rm -rf /usr/game/channel3/core1/stdout rm -rf /usr/game/channel3/core1/packet_info.txt rm -rf /usr/game/channel3/core1/p2p_packet_info.txt rm -rf /usr/game/channel3/core1/syslog rm -rf /usr/game/channel3/core1/syserr rm -rf /usr/game/channel3/core1/game.core rm -rf /usr/game/channel3/core2/stdout rm -rf /usr/game/channel3/core2/packet_info.txt rm -rf /usr/game/channel3/core2/p2p_packet_info.txt rm -rf /usr/game/channel3/core2/syslog rm -rf /usr/game/channel3/core2/syserr rm -rf /usr/game/channel3/core2/game.core rm -rf /usr/game/channel3/core3/stdout rm -rf /usr/game/channel3/core3/packet_info.txt rm -rf /usr/game/channel3/core3/p2p_packet_info.txt rm -rf /usr/game/channel3/core3/syslog rm -rf /usr/game/channel3/core3/syserr rm -rf /usr/game/channel3/core3/game.core rm -rf /usr/game/channel3/core4/stdout rm -rf /usr/game/channel3/core4/packet_info.txt rm -rf /usr/game/channel3/core4/p2p_packet_info.txt rm -rf /usr/game/channel3/core4/syslog rm -rf /usr/game/channel3/core4/syserr rm -rf /usr/game/channel3/core4/game.core rm -rf /usr/game/channel4/core1/stdout rm -rf /usr/game/channel4/core1/packet_info.txt rm -rf /usr/game/channel4/core1/p2p_packet_info.txt rm -rf /usr/game/channel4/core1/syslog rm -rf /usr/game/channel4/core1/syserr rm -rf /usr/game/channel4/core1/game.core rm -rf /usr/game/channel4/core2/stdout rm -rf /usr/game/channel4/core2/packet_info.txt rm -rf /usr/game/channel4/core2/p2p_packet_info.txt rm -rf /usr/game/channel4/core2/syslog rm -rf /usr/game/channel4/core2/syserr rm -rf /usr/game/channel4/core2/game.core rm -rf /usr/game/channel4/core3/stdout rm -rf /usr/game/channel4/core3/packet_info.txt rm -rf /usr/game/channel4/core3/p2p_packet_info.txt rm -rf /usr/game/channel4/core3/syslog rm -rf /usr/game/channel4/core3/syserr rm -rf /usr/game/channel4/core3/game.core rm -rf /usr/game/channel4/core4/stdout rm -rf /usr/game/channel4/core4/packet_info.txt rm -rf /usr/game/channel4/core4/p2p_packet_info.txt rm -rf /usr/game/channel4/core4/syslog rm -rf /usr/game/channel4/core4/syserr rm -rf /usr/game/channel4/core4/game.core rm -rf /usr/game/channel5/core1/stdout rm -rf /usr/game/channel5/core1/packet_info.txt rm -rf /usr/game/channel5/core1/p2p_packet_info.txt rm -rf /usr/game/channel5/core1/syslog rm -rf /usr/game/channel5/core1/syserr rm -rf /usr/game/channel5/core1/game.core rm -rf /usr/game/channel5/core2/stdout rm -rf /usr/game/channel5/core2/packet_info.txt rm -rf /usr/game/channel5/core2/p2p_packet_info.txt rm -rf /usr/game/channel5/core2/syslog rm -rf /usr/game/channel5/core2/syserr rm -rf /usr/game/channel5/core2/game.core rm -rf /usr/game/channel5/core3/stdout rm -rf /usr/game/channel5/core3/packet_info.txt rm -rf /usr/game/channel5/core3/p2p_packet_info.txt rm -rf /usr/game/channel5/core3/syslog rm -rf /usr/game/channel5/core3/syserr rm -rf /usr/game/channel5/core3/game.core rm -rf /usr/game/channel5/core4/stdout rm -rf /usr/game/channel5/core4/packet_info.txt rm -rf /usr/game/channel5/core4/p2p_packet_info.txt rm -rf /usr/game/channel5/core4/syslog rm -rf /usr/game/channel5/core4/syserr rm -rf /usr/game/channel5/core4/game.core rm -rf /usr/game/channel6/core1/stdout rm -rf /usr/game/channel6/core1/packet_info.txt rm -rf /usr/game/channel6/core1/p2p_packet_info.txt rm -rf /usr/game/channel6/core1/syslog rm -rf /usr/game/channel6/core1/syserr rm -rf /usr/game/channel6/core1/game.core rm -rf /usr/game/channel6/core2/stdout rm -rf /usr/game/channel6/core2/packet_info.txt rm -rf /usr/game/channel6/core2/p2p_packet_info.txt rm -rf /usr/game/channel6/core2/syslog rm -rf /usr/game/channel6/core2/syserr rm -rf /usr/game/channel6/core2/game.core rm -rf /usr/game/channel6/core3/stdout rm -rf /usr/game/channel6/core3/packet_info.txt rm -rf /usr/game/channel6/core3/p2p_packet_info.txt rm -rf /usr/game/channel6/core3/syslog rm -rf /usr/game/channel6/core3/syserr rm -rf /usr/game/channel6/core3/game.core rm -rf /usr/game/channel6/core4/stdout rm -rf /usr/game/channel6/core4/packet_info.txt rm -rf /usr/game/channel6/core4/p2p_packet_info.txt rm -rf /usr/game/channel6/core4/syslog rm -rf /usr/game/channel6/core4/syserr rm -rf /usr/game/channel6/core4/game.core rm -rf /usr/game/game99/core1/stdout rm -rf /usr/game/game99/core1/packet_info.txt rm -rf /usr/game/game99/core1/p2p_packet_info.txt rm -rf /usr/game/game99/core1/syslog rm -rf /usr/game/game99/core1/syserr rm -rf /usr/game/game99/core1/game.core rm -rf /usr/game/game99/core2/stdout rm -rf /usr/game/game99/core2/packet_info.txt rm -rf /usr/game/game99/core2/p2p_packet_info.txt rm -rf /usr/game/game99/core2/syslog rm -rf /usr/game/game99/core2/syserr rm -rf /usr/game/game99/core2/game.core rm -rf /usr/game/game99/core3/stdout rm -rf /usr/game/game99/core3/packet_info.txt rm -rf /usr/game/game99/core3/p2p_packet_info.txt rm -rf /usr/game/game99/core3/syslog rm -rf /usr/game/game99/core3/syserr rm -rf /usr/game/game99/core3/game.core rm -rf /usr/game/g1/db/stdout rm -rf /usr/game/g1/db/packet_info.txt rm -rf /usr/game/g1/db/p2p_packet_info.txt rm -rf /usr/game/g1/db/syslog rm -rf /usr/game/g1/db/syserr rm -rf /usr/game/g1/db/game.core rm -rf /usr/game/g1/auth/stdout rm -rf /usr/game/g1/auth/packet_info.txt rm -rf /usr/game/g1/auth/p2p_packet_info.txt rm -rf /usr/game/g1/auth/syslog rm -rf /usr/game/g1/auth/syserr rm -rf /usr/game/g1/auth/game.core rm -rf /var/db/mysql/*.err cd ./g1/auth ./clear_logs.sh cd /usr/game/g1/db ./clear_logs.sh cd /usr/game/channel1/core1 ./clear_logs.sh cd /usr/game/channel1/core2 ./clear_logs.sh cd /usr/game/channel1/core3 ./clear_logs.sh cd /usr/game/channel1/core4 ./clear_logs.sh cd /usr/game/channel2/core1 ./clear_logs.sh cd /usr/game/channel2/core2 ./clear_logs.sh cd /usr/game/channel2/core3 ./clear_logs.sh cd /usr/game/channel2/core4 ./clear_logs.sh cd /usr/game/channel3/core1 ./clear_logs.sh cd /usr/game/channel3/core2 ./clear_logs.sh cd /usr/game/channel3/core3 ./clear_logs.sh cd /usr/game/channel3/core4 ./clear_logs.sh cd /usr/game/channel4/core1 ./clear_logs.sh cd /usr/game/channel4/core2 ./clear_logs.sh cd /usr/game/channel4/core3 ./clear_logs.sh cd /usr/game/channel4/core4 ./clear_logs.sh cd /usr/game/channel5/core1 ./clear_logs.sh cd /usr/game/channel5/core2 ./clear_logs.sh cd /usr/game/channel5/core3 ./clear_logs.sh cd /usr/game/channel5/core4 ./clear_logs.sh cd /usr/game/channel6/core1 ./clear_logs.sh cd /usr/game/channel6/core2 ./clear_logs.sh cd /usr/game/channel6/core3 ./clear_logs.sh cd /usr/game/channel6/core4 ./clear_logs.sh cd /usr/game/game99/core1 ./clear_logs.sh cd /usr/game/game99/core2 ./clear_logs.sh cd /usr/game/game99/core3 ./clear_logs.sh cd /usr/game/game99/core1 rm -rf game.core cd /usr/game/game99/core2 rm -rf game.core cd /usr/game/game99/core3 rm -rf game.core cd /usr/game/g1/auth rm -rf auth.core rm -rf /var/db/mysql/*.err rm -rf /var/db/mysql/*.pid rm -rf /var/db/mysql/*.core rm -rf /var/db/mysql/*.dll rm -rf /var/db/mysql/ProfileLog rm -rf /var/db/mysql/ibdata1 rm -rf /var/db/mysql/ib_logfile0 rm -rf /var/db/mysql/ib_logfile1 rm -rf /var/db/mysql/ib_logfile2 rm -rf /var/db/mysql/ib_logfile3 rm -rf /var/db/mysql/ib_logfile4 rm -rf /var/db/mysql/ib_logfile5 rm -rf /var/db/mysql/ib_logfile6 rm -rf /var/db/mysql/ib_logfile7 rm -rf /var/db/mysql/ib_logfile8 rm -rf /var/db/mysql/ib_logfile9 rm -rf /var/db/mysql/ib_logfile10 rm -rf /var/db/mysql/ib_logfile11 rm -rf /var/db/mysql/ib_logfile12 rm -rf /var/db/mysql/mysql-bin.index rm -rf /var/db/mysql/mysql-bin.000000 rm -rf /var/db/mysql/mysql-bin.000001 rm -rf /var/db/mysql/mysql-bin.000002 rm -rf /var/db/mysql/mysql-bin.000003 rm -rf /var/db/mysql/mysql-bin.000004 rm -rf /var/db/mysql/mysql-bin.000005 rm -rf /var/db/mysql/mysql-bin.000006 rm -rf /var/db/mysql/mysql-bin.000007 rm -rf /var/db/mysql/mysql-bin.000008 rm -rf /var/db/mysql/mysql-bin.000009 rm -rf /var/db/mysql/mysql-bin.000010 rm -rf /var/db/mysql/mysql-bin.000011 rm -rf /var/db/mysql/mysql-bin.000012 rm -rf /var/db/mysql/mysql-bin.000013 rm -rf /var/db/mysql/mysql-bin.000014 rm -rf /var/db/mysql/mysql-bin.000015 rm -rf /var/db/mysql/mysql-bin.000016 rm -rf /var/db/mysql/mysql-bin.000017 rm -rf /var/db/mysql/mysql-bin.000018 rm -rf /var/db/mysql/mysql-bin.000019 rm -rf /var/db/mysql/mysql-bin.000020 rm -rf /var/db/mysql/mysql-bin.000021 rm -rf /var/db/mysql/mysql-bin.000022 rm -rf /var/db/mysql/mysql-bin.000023 rm -rf /var/db/mysql/mysql-bin.000024 rm -rf /var/db/mysql/mysql-bin.000025 sleep 1 clear echo -e "Loglar Silindi [URL="http://www.needmps.com"]www.needmps.com[/URL] ASIPLY TURKMMO "
    Mysql loglarının temizlenmesi; <li data-xf-list-type="ol">AsiPly Turkmmo.
    Eğer 34k ve türevi kullanıyorsanız daha çok efsun botlu server kullanıyorsanız serverinizde muhteşem seviyede log tutar bunun için yapmanız gereken saat başı özellikle oyuncuların yoğun olduğu saatlerde navicate girip log veritabanını açıp tüm tabloları seçip empty table yapmanız gerekmektedir. Tabloları silip kurtulayım şeklinde düşünebilirsiniz fakat bu risklidir bundan sonra mysqlde kapanmalar yaşayabilirsiniz. <li data-xf-list-type="ol">İşine Yarayan İşini Gören Arkadaşlar Bir teşekürü ve repi çok görmeyin 30 saniyelik işler bunlar. <li data-xf-list-type="ol">KANIT <li data-xf-list-type="ol">
    pirjZq.png
    <li data-xf-list-type="ol">Son olarak Konuyu Kirletmeye ÇALISMAYALIM ALINTI YERLER VARDIR. Binek bugu var Çözemedim.

4 Adet Taş Ekleme + İtem Yansıtma Sorunu + Depo Sorunu + LAG ENGELLEME TOPLU PAYLASIM

Metin2 özel sunucularında geliştirme yaparken karşılaşılan yaygın sorunlar genellikle taş ekleme, item yansıtma, depo güncellemeleri ve gecikme (LAG) gibi konularla ilgilidir. Bu makalede, Metin2Lobby üzerinden sunulan deneyimler doğrultusunda bu başlıkları detaylıca ele alacağız. Özellikle C++ sistem ve Python GUI tabanlı çözümlerle nasıl daha stabil ve performanslı sunucular geliştirilebileceğini göreceksiniz.

Taş Ekleme Sorunları ve Çözümler
Metin2 oyununda 4 adet taş ekleme işlemi, genellikle karakterin belirli bonuslar kazanmasını sağlar. Ancak bazı özel sunucularda bu taşların doğru şekilde yansıması sağlanamadığında, kullanıcılar beklenen bonusları alamaz veya sistem hatalı çalışabilir. Bu durum genellikle client src ve game server[/COORD] arasında senkronizasyon eksikliğinden kaynaklanır. Taş ekleme sistemini düzeltmek için öncelikle taş ekleme event handler’ı kontrol edilmeli ve taş eklendiğinde sunucu tarafında güncelleme yapılması sağlanmalıdır. Ayrıca uiscript dosyalarında taş ekranı doğru şekilde render edilmelidir.

Item Yansıtma Sorunları
Bazı sunucularda oyuncuların envanterine eklenen itemler doğru şekilde yansımaz. Bu genellikle py root ve game core senkronizasyonundan kaynaklanabilir. Oyuncuya item verildiğinde hem client hem de server tarafında aynı anda güncellenmelidir. Aksi takdirde item verilmiş gibi görünür ancak oyuncu kullanamaz veya item gözükmez. Bu sorunun çözümü için Martysama tarzı script yapıları incelenmeli ve item update mekanizması optimize edilmelidir. Item yansıtma hatası yaşayan sunucularda genellikle RPC (Remote Procedure Call) mekanizması eksik veya yanlış implement edilmiştir.

Depo Sorunları ve Veritabanı Güncellemeleri
Oyuncuların depolarında yaşanan sorunlar genellikle DB core ile ilgilidir. Oyuncu depoya item koyduğunda, veritabanında doğru şekilde kayıt edilmelidir. Eğer bu işlem eksikse, oyuncu depodan item alamayabilir ya da depo sıfırlanabilir. Bu tür hatalar auth ve game sunucuları arasındaki veri aktarımı esnasında oluşur. Depo sistemini düzeltmek için DB sorguları gözden geçirilmeli ve transaction yönetimi optimize edilmelidir. Ayrıca server src üzerinde depo işlemlerini tetikleyen event handler’lar kontrol edilmelidir.

LAG (Gecikme) Engelleme Yöntemleri
Metin2 özel sunucularda en büyük problemlerden birisi olan LAG, genellikle sunucu performansı ve ağ optimizasyonu eksikliğinden kaynaklanır. Özellikle PvP odaklı sunucularda LAG, oyun deneyimini ciddi şekilde etkiler. Sunucuda çok fazla NPC spawn edilmesi, hatalı timer yapılandırması, eksik network buffer yönetimi gibi sebeplerle LAG oluşabilir. Bu sorunun çözümü için compile sırasında sunucu ayarları optimize edilmeli, gereksiz sorgular azaltılmaldır. LAG azaltımı için source edit işlemleri yapılırken performans odaklı yaklaşımlar benimsenmelidir. Örneğin, item drop oranları optimize edilmeli, gereksiz loglamalar kaldırılmalıdır. Metin2 Lobby olarak bu tür sistemleri test edip, kullanıcı dostu çözümler geliştirmeye devam ediyoruz.


Adding 4 Stones + Item Reflection Issues + Storage Problems + LAG Prevention Collective Sharing

In developing Metin2 private servers, common issues usually involve stone addition, item reflection, storage updates, and latency (LAG). In this article, we will examine these topics in detail based on experiences shared through Metin2Lobby. Particularly, you will see how more stable and high-performance servers can be developed with solutions based on C++ systems and Python GUI.

Stone Addition Issues and Solutions
In Metin2, adding 4 stones typically grants specific bonuses to the character. However, in some private servers, if these stones are not properly reflected, users may not receive expected bonuses or the system might malfunction. This issue often stems from lack of synchronization between client src and game server. To fix stone addition systems, the stone event handler must be checked and updates should be ensured on the server side upon stone insertion. Additionally, uiscript files should correctly render the stone interface.

Item Reflection Problems
In certain servers, items added to players' inventories do not reflect correctly. This often stems from synchronization issues between py root and game core. When an item is given to a player, both the client and server sides must update simultaneously. Otherwise, the item might appear as given but cannot be used or visible. For resolving such item reflection errors, structures like Martysama scripts should be examined, and the item update mechanism optimized. Incorrect or missing RPC (Remote Procedure Call) implementations often cause these errors.

Storage Issues and Database Updates
Problems occurring in player storages are generally related to the DB core. When a player deposits an item into storage, it must be correctly recorded in the database. If this process fails, players might not retrieve items or the storage could reset. Such errors occur during data transfers between auth and game servers. To fix storage systems, database queries must be reviewed and transaction management optimized. Also, event handlers triggering storage operations within server src should be inspected.

LAG Prevention Methods
LAG, one of the biggest problems in Metin2 private servers, often arises from poor server performance and insufficient network optimization. Especially in PvP-focused servers, LAG significantly impacts gameplay. Causes might include excessive NPC spawns, incorrect timer configurations, and inadequate network buffer management. To address LAG reduction, server settings should be optimized during compile, and unnecessary queries reduced. During source edit processes, performance-oriented approaches must be adopted. For instance, item drop rates should be optimized and redundant logging removed. At Metin2 Lobby, we continue testing such systems and developing user-friendly solutions.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Geri
Üst Alt