Metin2 pvp 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:
Kod:
2.Arat
Kod:
C++:
Son hali KIRMIZI İÇİNDEKİ GİBİ OLUCAKTIR.

3. Yine aynı dosya içerisinde aşağıdakini aratıyoruz.
Kod:
Kod:

4. Aynı dosya içerisinde aşağıdaki kodu aratıyor ve değiştiriyoruz.
Kod:
Aşağıdaki ile değiştiriyoruz.
Kod:

5. Clientmanager.cpp açıyoruz ve aşağıdakini aratıyoruz.
Kod:
Kod:

6. Cache.cpp açılır ve aşağıdaki aratılır.
Kod:
C++:

7.Game içerisinde constants.cpp açıyoruz ve aiWeaponSocketQty[WEAPON_NUM_TYPES]
aratıyoruz ve resimdeki gibi değiştiriyoruz.
Kod:
bunun gibi 4 yap armmor body:
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.

İş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:
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

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:
Kod:
Kod:
aşağıda Kod:
Kod:
Kod:

Depo bugu Sona ermiştir.
Item Yansıtma Sorunu İçin Gerekli işlemler Aşağıda Yapılıcaktır Sırasıyla.

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.
Aratılır:
Kod:
C++:
Değiştirilir:
Kod:
C++:
Hayırlı Olsun.

Db/src/clientmanager.cpp açıyoruz.
Aratıyoruz :
Kod:
C++:
Kod:
C++:
Kod:
C++:
Aratıyoruz :
Kod:
C++:
Kod:
C++:
Aratıyoruz :
Kod:
C++:
Altına Ekliyoruz :
Kod:
C++:
Son hali aşağıdaki gibi olacaktır.

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:
Binek bugu için Fix
arat
Kod:
Kod:

Daha temiz anlatım için zip dosyasında defineli yapı bırakıldı.
1.common/item_lenght.h açıyoruz
Bu kodu Aratıyoruz.
Kod:
ITEM_SOCKET_MAX_NUM = 3,
Bulduktan sonra sonundaki 3'ü 4 yapıyoruz.Kod:
ITEM_SOCKET_MAX_NUM = 4,
db/src/ClientManagerPlayer.cpp açıyoruz.2.Arat
Kod:
str_to_number(item.alSockets[2], row[cur++]);
Altına ekleC++:
str_to_number(item.alSockets[3], row[cur++]);
Son hali KIRMIZI İÇİNDEKİ GİBİ OLUCAKTIR.

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.
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.
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.
6. Cache.cpp açılır ve aşağıdaki aratılır.
Kod:
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.C++:
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]);
}
Kod:
http://pastebin.com/4M57yqci Yukarıdaki kodun copy paste'deki hali.

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] =bunun gibi 4 yap armmor body:
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.

İş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

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ğimizdeKod:
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,
ş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.
Depo bugu Sona ermiştir.
Item Yansıtma Sorunu İçin Gerekli işlemler Aşağıda Yapılıcaktır Sırasıyla.

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.Client içerisinde userinterface/pythonplayermodule.cpp içerisinde playerGetItemLink aratıyoruz ve kod blogunu aşağıdaki gibi değiştiriyoruz.
-
Kod:
http://pastebin.com/4HBUkKJe -
Linkteki kod:
PyObject * playerGetItemLink(PyObject * poSelf, PyObject * poArgs) { 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); } - Son durum aşağıdaki gibi olacaktır.

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 -
kod:
LİNKTE BULUNAN İLE DEĞİŞİCEKTİR.PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs) { 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", ""); }
Aratılır:
Kod:
C++:
if attrCount<4:
Değiştirilir:
Kod:
C++:
if attrCount<5:
Hayırlı Olsun.

Db/src/clientmanager.cpp açıyoruz.
Aratıyoruz :
Kod:
C++:
void CClientManager::QUERY_ITEM_SAVE(CPeer * pkPeer, const char * c_pData
Kod Bloğunda Buluyoruz :Kod:
C++:
REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2,
Aşağıdaki Şekilde Değiştiriyoruz :Kod:
C++:
REPLACE INTO item%s (id, owner_id, window, pos, count, vnum, socket0, socket1, socket2, socket3,
Aratıyoruz :
Kod:
C++:
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:
C++:
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)
Aratıyoruz :
Kod:
C++:
p->alSockets[2],
Altına Ekliyoruz :
Kod:
C++:
p->alSockets[3],
Son hali aşağıdaki gibi olacaktır.

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
-
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)
Son hali Aşagıdaki gibi olucaktır.

İş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.
Binek bugu için Fix
arat
Kod:
https://paste2.org/tenbEYBp
değiştirKod:
https://paste2.org/vN4X8ys3

Daha temiz anlatım için zip dosyasında defineli yapı bırakıldı.


