[C++]6 Taş Sistemi Sorunlar Fixed

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba Arkadaşlar Söz Verdiğim Gibi Sizlerle 6 taş sistemini paylaşacağım.Öncelikle 6 taş sistemini paylaşacağım Mantıklı Olarak Düşünüldüğünde Bu sistemi Kendinize Göre 4 taş 5 taş vs. Şeklinde Ayarlayabilirsiniz isterseniz 9 taşta yapabilirsiniz fakat 9 taşı ekledikten sonra item silinir çünkü mysql.player.item tablosunda socket0 dan başlar socket5 e kadardır yani 9 taş felan yapacaksanız burdaki socket sayısınıda arttırmanız gerekmektedir.
Şimdi Konumuza Geçelim.

DB > AuctionManager.cpp Açılır Ve Aratılır.
Kod:
"SELECT id,    owner_id, count, vnum, socket0, socket1, socket2,"[/FONT]
Değiştirilir;
Kod:
"SELECT id,    owner_id, count, vnum, socket0, socket1, socket2, socket3, socket4, socket5"
Aratılır :
Kod:
str_to_number(item.alSockets[2], row[cur++]);
Altına Eklenir.
Kod:
str_to_number(item.alSockets[3], row[cur++]); str_to_number(item.alSockets[4], row[cur++]); str_to_number(item.alSockets[5], row[cur++]);
Açılır Cache.cpp
Kod Bloğu Aratılır.
Kod:
void CItemCache::OnFlush()
Kod:
{     if (m_data.vnum == 0) // vnumÀÌ 0ÀÌ¸é »èÁ¦Ç϶ó°í Ç¥½ÃµÈ °ÍÀÌ´Ù.     {         char szQuery[QUERY_MAX_LEN];         snprintf(szQuery, sizeof(szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);         CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_DESTROY, 0, NULL);         if (g_test_server)             sys_log(0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);     }     else     {         long alSockets[ITEM_SOCKET_MAX_NUM];         TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];         bool isSocket = false, isAttr = false;         memset(&alSockets, 0, sizeof(long) * ITEM_SOCKET_MAX_NUM);         memset(&aAttr, 0, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);         TPlayerItem * p = &m_data;         if (memcmp(alSockets, p->alSockets, sizeof(long) * ITEM_SOCKET_MAX_NUM))             isSocket = true;         if (memcmp(aAttr, p->aAttr, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))             isAttr = true;         char szColumns[QUERY_MAX_LEN];         char szValues[QUERY_MAX_LEN];         char szUpdate[QUERY_MAX_LEN];         int iLen = snprintf(szColumns, sizeof(szColumns), "id, owner_id, window, pos, count, vnum");         int iValueLen = snprintf(szValues, sizeof(szValues), "%u, %u, %d, %d, %u, %u",                 p->id, p->owner, p->window, p->pos, p->count, p->vnum);         int iUpdateLen = snprintf(szUpdate, sizeof(szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",                 p->owner, p->window, p->pos, p->count, p->vnum);         if (isSocket)         {             iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", socket0, socket1, socket2");             iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen,                     ", %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);             iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen,                     ", socket0=%lu, socket1=%lu, socket2=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2]);         }         if (isAttr)         {             iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen,                     ", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"                     ", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");             iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen,                     ", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",                     p->aAttr[0].bType, p->aAttr[0].sValue,                     p->aAttr[1].bType, p->aAttr[1].sValue,                     p->aAttr[2].bType, p->aAttr[2].sValue,                     p->aAttr[3].bType, p->aAttr[3].sValue,                     p->aAttr[4].bType, p->aAttr[4].sValue,                     p->aAttr[5].bType, p->aAttr[5].sValue,                     p->aAttr[6].bType, p->aAttr[6].sValue);             iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen,                     ", attrtype0=%d, attrvalue0=%d"                     ", attrtype1=%d, attrvalue1=%d"                     ", attrtype2=%d, attrvalue2=%d"                     ", attrtype3=%d, attrvalue3=%d"                     ", attrtype4=%d, attrvalue4=%d"                     ", attrtype5=%d, attrvalue5=%d"                     ", attrtype6=%d, attrvalue6=%d",                     p->aAttr[0].bType, p->aAttr[0].sValue,                     p->aAttr[1].bType, p->aAttr[1].sValue,                     p->aAttr[2].bType, p->aAttr[2].sValue,                     p->aAttr[3].bType, p->aAttr[3].sValue,                     p->aAttr[4].bType, p->aAttr[4].sValue,                     p->aAttr[5].bType, p->aAttr[5].sValue,                     p->aAttr[6].bType, p->aAttr[6].sValue);         }         char szItemQuery[QUERY_MAX_LEN + QUERY_MAX_LEN];         snprintf(szItemQuery, sizeof(szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);         if (g_test_server)                sys_log(0, "ItemCache::Flush :REPLACE  (%s)", szItemQuery);         CDBManager::instance().ReturnQuery(szItemQuery, QID_ITEM_SAVE, 0, NULL);         //g_item_info.Add(p->vnum);         ++g_item_count;     }     m_bNeedQuery = false; }
Kod Bloğu Değiştirilir
Kod:
void CItemCache::OnFlush()
Kod:
{     if (m_data.vnum == 0) // vnumÀÌ 0ÀÌ¸é »èÁ¦Ç϶ó°í Ç¥½ÃµÈ °ÍÀÌ´Ù.     {         char szQuery[QUERY_MAX_LEN];         snprintf(szQuery, sizeof(szQuery), "DELETE FROM item%s WHERE id=%u", GetTablePostfix(), m_data.id);         CDBManager::instance().ReturnQuery(szQuery, QID_ITEM_DESTROY, 0, NULL);         if (g_test_server)             sys_log(0, "ItemCache::Flush : DELETE %u %s", m_data.id, szQuery);     }     else     {         long alSockets[ITEM_SOCKET_MAX_NUM];         TPlayerItemAttribute aAttr[ITEM_ATTRIBUTE_MAX_NUM];         bool isSocket = false, isAttr = false;         memset(&alSockets, 0, sizeof(long) * ITEM_SOCKET_MAX_NUM);         memset(&aAttr, 0, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM);         TPlayerItem * p = &m_data;         if (memcmp(alSockets, p->alSockets, sizeof(long) * ITEM_SOCKET_MAX_NUM))             isSocket = true;         if (memcmp(aAttr, p->aAttr, sizeof(TPlayerItemAttribute) * ITEM_ATTRIBUTE_MAX_NUM))             isAttr = true;         char szColumns[QUERY_MAX_LEN];         char szValues[QUERY_MAX_LEN];         char szUpdate[QUERY_MAX_LEN];         int iLen = snprintf(szColumns, sizeof(szColumns), "id, owner_id, window, pos, count, vnum");         int iValueLen = snprintf(szValues, sizeof(szValues), "%u, %u, %d, %d, %u, %u",                 p->id, p->owner, p->window, p->pos, p->count, p->vnum);         int iUpdateLen = snprintf(szUpdate, sizeof(szUpdate), "owner_id=%u, window=%d, pos=%d, count=%u, vnum=%u",                 p->owner, p->window, p->pos, p->count, p->vnum);         if (isSocket)         {             iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen, ", socket0, socket1, socket2, socket3, socket4, socket5");             iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen,                     ", %lu, %lu, %lu, %lu, %lu, %lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3], p->alSockets[4], p->alSockets[5]);             iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen,                     ", socket0=%lu, socket1=%lu, socket2=%lu, socket3=%lu, socket4=%lu, socket5=%lu", p->alSockets[0], p->alSockets[1], p->alSockets[2], p->alSockets[3], p->alSockets[4], p->alSockets[5]);         }         if (isAttr)         {             iLen += snprintf(szColumns + iLen, sizeof(szColumns) - iLen,                     ", attrtype0, attrvalue0, attrtype1, attrvalue1, attrtype2, attrvalue2, attrtype3, attrvalue3"                     ", attrtype4, attrvalue4, attrtype5, attrvalue5, attrtype6, attrvalue6");             iValueLen += snprintf(szValues + iValueLen, sizeof(szValues) - iValueLen,                     ", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d",                     p->aAttr[0].bType, p->aAttr[0].sValue,                     p->aAttr[1].bType, p->aAttr[1].sValue,                     p->aAttr[2].bType, p->aAttr[2].sValue,                     p->aAttr[3].bType, p->aAttr[3].sValue,                     p->aAttr[4].bType, p->aAttr[4].sValue,                     p->aAttr[5].bType, p->aAttr[5].sValue,                     p->aAttr[6].bType, p->aAttr[6].sValue);             iUpdateLen += snprintf(szUpdate + iUpdateLen, sizeof(szUpdate) - iUpdateLen,                     ", attrtype0=%d, attrvalue0=%d"                     ", attrtype1=%d, attrvalue1=%d"                     ", attrtype2=%d, attrvalue2=%d"                     ", attrtype3=%d, attrvalue3=%d"                     ", attrtype4=%d, attrvalue4=%d"                     ", attrtype5=%d, attrvalue5=%d"                     ", attrtype6=%d, attrvalue6=%d",                     p->aAttr[0].bType, p->aAttr[0].sValue,                     p->aAttr[1].bType, p->aAttr[1].sValue,                     p->aAttr[2].bType, p->aAttr[2].sValue,                     p->aAttr[3].bType, p->aAttr[3].sValue,                     p->aAttr[4].bType, p->aAttr[4].sValue,                     p->aAttr[5].bType, p->aAttr[5].sValue,                     p->aAttr[6].bType, p->aAttr[6].sValue);         }         char szItemQuery[QUERY_MAX_LEN + QUERY_MAX_LEN];         snprintf(szItemQuery, sizeof(szItemQuery), "REPLACE INTO item%s (%s) VALUES(%s)", GetTablePostfix(), szColumns, szValues);         if (g_test_server)                sys_log(0, "ItemCache::Flush :REPLACE  (%s)", szItemQuery);         CDBManager::instance().ReturnQuery(szItemQuery, QID_ITEM_SAVE, 0, NULL);         //g_item_info.Add(p->vnum);         ++g_item_count;     }     m_bNeedQuery = false; }

Açılır ClientManager.cpp
öncelikle şu kod aratılır
Kod:
dwSocket2
yaklaşık 10 11 tane olacaktır hepsi değiştirilir
Kod:
dwSocket5
aratılır.
Kod:
socket0, socket1, socket2,
Değiştirilir
Kod:
socket0, socket1, socket2, socket3, socket4, socket5

aratılır
Kod:
socket0, socket1, socket2
değiştirilir
Kod:
socket0, socket1, socket2, socket3, socket4, socket5

arat
Kod:
"VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u)",
değiştir
Kod:
"VALUES(%u, %u, '%s', %d, %u, %u, %u, %u, %u, %u, %u, %u)",
arat
Kod:
pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, dwSocket2);
değiştir
Kod:
pItemAward->dwVnum, pItemAward->dwCount, pItemAward->dwSocket0, pItemAward->dwSocket1, pItemAward->dwSocket2, pItemAward->dwSocket3, pItemAward->dwSocket4, dwSocket5);
arat
Kod:
item.alSockets[2] = pItemAward->dwSocket2;
altına ekle
Kod:
item.alSockets[3] = pItemAward->dwSocket3;
Kod:
item.alSockets[4] = pItemAward->dwSocket4;                     item.alSockets[5] = dwSocket5;
arat
Kod:
"REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, "
değiştir
Kod:
"REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3, socket4, socket5, "
arat
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)",
değiştir
Kod:
"VALUES(%u, %u, %d, %d, %u, %u, %ld, %ld, %ld, %ld, %ld, %ld, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)",
Burda Depodan İtem Kaybolmayı engelliyoruz :)
arat
Kod:
p->alSockets[2],
altına ekle
Kod:
p->alSockets[3],
Kod:
p->alSockets[4],             p->alSockets[5],
ClientManagerPlayer.cpp açılır

aratılır
Kod:
str_to_number(item.alSockets[2], row[cur++]);
altına eklenir
Kod:
str_to_number(item.alSockets[3], row[cur++]);
Kod:
str_to_number(item.alSockets[4], row[cur++]);         str_to_number(item.alSockets[5], row[cur++]);
aratılır
Kod:
socket0,socket1,socket2,
yanına eklenir
Kod:
socket3,socket4,socket5,
tekrar yukarıdaki işlem yapılır.
açılır ItemAwardManager.cpp
aratılır
Kod:
socket0,socket1,socket2
yanına eklenir
Kod:
socket3,socket4,socket5
aratılır
Kod:
str_to_number(kData->dwSocket2, row[col++]);
altına eklenir
Kod:
str_to_number(kData->dwSocket3, row[col++]); str_to_number(kData->dwSocket4, row[col++]); str_to_number(kData->dwSocket5, row[col++]);
açılır ItemAwardManager.h
aratılır
Kod:
DWORD    dwSocket2;
altına eklenir
Kod:
DWORD    dwSocket3; DWORD    dwSocket4; DWORD    dwSocket5;
DB ile işimiz Bitti
common/item_lengt.h
açılır ve aratılır
item_socket_max_num
6 yapılır
Client/gametype.h
arat
ITEM_SOCKET_SLOT_MAX_NUM arat 3 ü 6 yap
Game/src/constants.cpp
aratılır
3, // WEAPON_SWORD,
WEAPON_DAGGER
WEAPON_BOW
WEAPON_TWO_HANDED
WEAPON_BELL
WEAPON_FAN
ARMOR_BODY
bunların yanındaki "3" Sayısı 6 olarak değiştirilir.
şimdi item proto'ya geçelim çoğu kişi yanlış anlatıyor sadece MySQL item_protoda örnek veriyorum runik kılıcı +9
6 taş yapacağınız itemlerin en sonuna gidin sağ tarafına orda socket_pct var o 3 tür onu 6 yapalım işlem bu kadar
NOT: Python item_proto ellemeyin yani ordaki socket_pct ellemeyin eğer orayla oynarsanız o itemin parlaması gidecektir!
Skype;mimikkral001
Yapamayan Herkese Yardımcı Olurum Yeterki Boş boş konuşmayın.
Kanıt ;

NrWQ5Q.jpg


Dipnot:Bu sistemi Kimseden alıntı yapmadım hiç bir forumdan ben ürettim diye bir şeyde demiyorum tamamen kendi mantığımla yaptım.
İtem Yansıtma Problemi fixi aşşağıda :)
root/uitooltip.py
arat değiştir
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) >= minTokenCount and len(tokens) <= 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)
////////////////////////////////


pythonchatmodule.cpp




açılır




//////////////////////////




PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs)




arat


Kod:
PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs)
Kod:
{     char * szHyperlink;     if (!PyTuple_GetString(poArgs, 0, &szHyperlink))         return Py_BuildException();     std::string stHyperlink(szHyperlink);     std::vector<std::string> results;     split_string(stHyperlink, ":", results, false);     // item:vnum:flag:socket0:socket1:socket2:socket3:socket4:socket5     if (0 == results[0].compare("item"))     {         if (results.size() < 9)             return Py_BuildValue("s", "");         CItemData * pItemData = NULL;         if (CItemManager::Instance().GetItemDataPointer(htoi(results[1].c_str()), &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() >= 11)             {                 for (int i = 9; i < 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->GetName());             else                 snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName());             return Py_BuildValue("s", buf);         }     }     return Py_BuildValue("s", ""); }




değiştir.


///////////////////////////////////////////////////////////////////


pythonplayermodule.cpp
arat
Kod:
PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs) /////////////////////////// [CODE]PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs)
Kod:
{     TItemPos Cell;     switch (PyTuple_Size(poArgs))     {     case 1:            if (!PyTuple_GetInteger(poArgs, 0, &Cell.cell))             return Py_BuildException();         break;     case 2:         if (!PyTuple_GetByte(poArgs, 0, &Cell.window_type))             return Py_BuildException();         if (!PyTuple_GetInteger(poArgs, 1, &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 && CItemManager::Instance().GetItemDataPointer(pPlayerItem->vnum, &pItemData))     {         char itemlink[256];         int len;         bool isAttr = false;         len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x:%x:%x:%x",                 pPlayerItem->vnum, pPlayerItem->flags,                 pPlayerItem->alSockets[0], pPlayerItem->alSockets[1], pPlayerItem->alSockets[2] , pPlayerItem->alSockets[3], pPlayerItem->alSockets[4], pPlayerItem->alSockets[5]);         for (int i = 0; i < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++i)             if (pPlayerItem->aAttr[i].bType != 0)             {                 len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",                         pPlayerItem->aAttr[i].bType, pPlayerItem->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->GetName(), itemlink);             else                 snprintf(buf, sizeof(buf), " |h|r[%s]|cfff1e6c0|H%s|h", pItemData->GetName(), itemlink);         } else {             if (isAttr)                 //"item:¹øÈ£:Ç÷¡±×:¼ÒÄÏ0:¼ÒÄÏ1:¼ÒÄÏ2"                 snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName());             else                 snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName());         }     }     else         buf[0] = '\0';     return Py_BuildValue("s", buf); }[/FONT]


değiştir.



Not bir kaç gün içerisinde binek bugunun çözümünü paylaşacağım
Keyifli Forumlar...


C++ ile Metin2'de 6 Taş Sistemi Hatalarının Giderilmesi


Metin2 özel sunucularında geliştirme yapan geliştiriciler genellikle game core üzerinde değişiklikler yaparken bazı eski sistemlerde hatalarla karşılaşabiliyor. Bu hatalardan birisi de 6 Taş Sistemi olarak bilinen socket sisteminde meydana gelen sorunlardır. Bu sistem, oyuncuların eşyalarına 6 taş takmalarını sağlarken zaman zaman beklenmedik durumlarda çökmelere veya istemci tarafında hatalı görsel davranışlara neden olabiliyor.

Bu yazıda, C++ tabanlı Metin2 server src üzerinde 6 Taş Sistemi ile ilgili karşılaşılan yaygın hataları ve bunların sabitlenmiş (fixed) çözümlerini detaylı şekilde ele alacağız. Bu çözüm sayesinde hem game server programming daha stabil hale gelecek hem de kullanıcı deneyimi artacaktır.

Hata Tanımı ve Belirtiler

Genellikle 6 Taş Sistemi aktif edildiğinde aşağıdaki gibi hatalar görülebilir:

- Eşya slotuna 6 taş takılırken oyun çöküyor.
- Takılan taşlar istemciye yansıtmıyor.
- Socket slotu doğru şekilde güncellenmiyor.
- Sunucuda db core ile ilgili veri tutarsızlıkları oluşuyor.

Bu hataların temel nedeni genellikle server src içinde socket işlemlerinin eksik ya da yanlış tanımlandığı bölümlerdir. Özellikle martysama gibi Metin2 development uzmanları tarafından önerilen çözümler doğrultusunda bu hatalar kolayca giderilebilir.

Çözüm Adımları

Öncelikle game core üzerinde item sınıfı içinde bulunan socket ile ilgili fonksiyonları gözden geçirmek gerekir. Özellikle client src ile senkronize çalışmayan socket güncellemeleri hata verebilir. Aşağıda bu işlemi nasıl yapacağınızı adım adım anlatıyoruz:

1. Game Server üzerinde item_addon.cpp dosyasında socket slot kontrolünü sağlayan fonksiyonları inceleyin.

2. Socket verileri db ile senkronize değilse, db core üzerinden socket tablosunun doğru şekilde güncellenmesini sağlayın.

3. Packet yapısında taş takma işlemi için gönderilen verilerin formatını kontrol edin. Yanlış yapılmış paketler istemcide crash sebebi olabilir.

4. UIScript ve Py Root tarafında socket arayüzü eksik ya da hatalı ise, bu da görsel hatalara yol açabilir.

Fix Uygulaması

Yukarıdaki adımları uyguladıktan sonra, 6 Taş Sistemi ile ilgili hataların büyük çoğunluğu giderilebilir. Ancak bazı özel durumlarda pack içindeki veri dosyalarında da değişiklik yapılması gerekebilir. Örneğin, item_proto içinde socket slot sayısı tanımlı değilse, bu da sistemde hata oluşturur. Bu nedenle Metin2 compile işlemi öncesinde tüm yapıların senkronize olduğundan emin olunmalıdır.

Metin2 Development Süreci

Geliştiriciler, Metin2 server src üzerinde çalışırken sıklıkla karşılaştıkları bu tür hatalar için source edit yaparken dikkat etmeleri gereken pek çok husus vardır. Socket sistemi gibi alt sistemlerde yapılan küçük eksiklikler, büyük sorunlara yol açabilir. Bu nedenle Metin2Dev toplulukları, bu tür sistemlerin test edilip sabitlenmesi konusunda aktif rol oynar.

Sonuç

C++ ile geliştirilen Metin2 özel sunucularında 6 Taş Sistemi, doğru şekilde implemente edildiğinde oyuncular için keyifli bir deneyim sunar. Ancak bu sistemin hatasız çalışması için hem game, hem auth, hem de db katmanlarında dikkatli hareket etmek gerekir. Bu yazıda bahsedilen fixler sayesinde, sunucularınızda bu sistemi sorunsuz şekilde kullanabilirsiniz.

Daha fazla Metin2 development ipucu ve C++ script örneği için Metin2Lobby sitemizi takip etmeye devam edin.


Fixed Issues with the 6 Socket System in C++


Developers working on Metin2 private servers often encounter errors while making modifications to the game core. One of these issues involves problems with the 6 Socket System, which can sometimes cause crashes or unexpected visual glitches on the client-side. This system allows players to socket items with 6 stones, but occasionally leads to unwanted behavior.

In this article, we will discuss common errors related to the 6 Socket System within Metin2 server src based on C++ and provide fixed solutions in detail. With this solution, game server programming becomes more stable, and user experience improves significantly.

Error Description and Symptoms

When the 6 Socket System is enabled, the following errors typically occur:

- The game crashes when socketing a stone into an item slot.
- Socketed stones do not appear correctly on the client side.
- The socket slot does not update properly.
- Data inconsistencies arise in the db core.

The main reason for these errors is often incomplete or incorrect definitions within the socket-related functions in the server src. Following solutions suggested by Metin2 development experts like martysama, these errors can be resolved easily.

Solution Steps

Firstly, review the socket-related functions within the item class in the item_addon.cpp file on the Game Server. If socket data is not synchronized with the db, ensure that the socket table in the db core is updated correctly. Also, check the packet structure sent during the socketing process; malformed packets may cause crashes on the client-side. Finally, verify that the UI elements in UIScript and Py Root are correctly implemented.

Applying the Fix

After applying the above steps, most of the errors related to the 6 Socket System can be resolved. However, in some special cases, modifications to data files inside the pack may also be necessary. For example, if the number of socket slots is not defined in item_proto, this can cause errors in the system. Therefore, ensure all structures are synchronized before compiling (Metin2 compile).

Metin2 Development Process

Developers working on Metin2 server src must pay attention to several factors when performing source edit. Minor mistakes in subsystems such as the socket system can lead to major issues. Hence, Metin2Dev communities play an active role in testing and fixing such systems.

Conclusion

The 6 Socket System, when properly implemented in Metin2 private servers developed with C++, offers enjoyable gameplay. However, for the system to function without errors, care must be taken across the game, auth, and db layers. Thanks to the fixes mentioned in this article, you can use this system seamlessly on your servers.

For more Metin2 development tips and C++ script examples, continue following our site Metin2Lobby.
 

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

Geri
Üst Alt