kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Bvural41 1
Bvural41
NovaLst 1
NovaLst
bikral 1
bikral
ShadowFon 1
ShadowFon
D 1
delimuratt
PrimeAC 1
PrimeAC
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Best Studio 1
Best Studio
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Cevaplanmadı item yansıtma 7. efsun sorunu

  • Konuyu başlatan Konuyu başlatan devemoji
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 3
  • Görüntüleme Görüntüleme 163

devemoji

Hüküm haktan yanadır.
Telefon Numarası Onaylanmış Üye
Yönetici
Katılım
4 Ocak 2016
Konular
203
Mesajlar
933
Çözüm
7
Online süresi
2mo 3h
Reaksiyon Skoru
910
Altın Konu
73
Başarım Puanı
214
MmoLira
8,508
DevLira
18
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

7. Efsun (Attribute) Hyperlink'te Görünmüyor (Tooltip Sorunu)​


Merhaba arkadaşlar,
item üzerinde efsun düzgün şekilde gözüküyor ama chatte iteme tıklayınca açılan hyperlink tooltip kısmında sadece 6 efsun görünüyor. 7. efsun hiç gözükmüyor.
Ek olarak 3 taş soketini 4 yaptım o görünmüyordu düzenlemesini https://forum.turkmmo.com/konu/3768480-chat-item-yansitma-fixi-6-tas/ bu konudan yaptım görünüyor.

[CODE title="pythonplayermodule.cpp"]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.bType != 0)
{
len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
pPlayerItem->aAttr.bType, pPlayerItem->aAttr.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);
}[/CODE]

[CODE title="uitooltip.py"]

class HyperlinkItemToolTip(ItemToolTip):
def __init__(self):
ItemToolTip.__init__(self, isPickable=True)

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:7]]

rests = tokens[7:]
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)

def OnUpdate(self):
pass

def OnMouseLeftButtonDown(self):
self.Hide()
[/CODE]
 
uiinventory'deki tooltip ile kıyaslayarak yapabilirsiniz aslında direk ayrıca sadece 7. efsun burada gözükmüyor ise ATTRIBUTE_SLOT_MAX_NUM ne olarak tanımlı? bundan kaynaklı olabilir.
 
Tamamdır, bu tam bir "sistemi genişlettim ama bir parçası geride kaldı" sorunu. Klasiktir. 4 taş olayını o konudan bakıp çözmen de büyük iş, demek ki doğru yerlere nasıl bakacağını biliyorsun, bu en önemlisi.

Bak bu chat'e item yansıtma olayı iki aşamalı bir sistem gibi düşün. Biri Gönderici (C++), diğeri Alıcı (Python).

* Gönderici, senin paylaştığın pythonplayermodule.cpp'deki kod, itemin bilgilerini alıp item:vnum:soket0... gibi uzun bir metin haline getirir ve chat'e basar.

* Alıcı, yani uitooltip.py'deki kod da o metni okur, parçalara ayırır ve o item gösterme penceresini çizer.
Senin sorunun, bu iki tarafın limitlerinin birbiriyle uyuşmamasından kaynaklanıyor.

Çözüme gelirsek, sorun %99 ihtimalle Python tarafındaki, yani Alıcı taraftaki bir limitten kaynaklanıyor. Senin uitooltip.py dosyan, büyük ihtimalle hala en fazla 6 efsun gösterecek şekilde ayarlı. Bunu sağlayan şey player.ATTRIBUTE_SLOT_MAX_NUM adında bir sabittir. Eski sistemlerde bu 6 olarak gelir. Senin bunu 7 yapman lazım.

Bu sabit direkt uitooltip.py içinde olmayabilir. Genellikle root pack'inin içindeki player.py veya constInfo.py gibi bir dosyada tanımlanır. O dosyaları açıp içinde ATTRIBUTE_SLOT_MAX_NUM diye arat ve değerini 7 olarak değiştir.

Aynı şekilde C++ tarafındaki ITEM_ATTRIBUTE_SLOT_MAX_NUM sabitinin de 7 olduğundan emin olman lazım. Bu da genellikle client source'unda UserInterface klasörü içindeki GameType.h gibi bir dosyada bulunur.

Ancak paylaştığın o C++ fonksiyonu biraz eski. Ben sana onun yerine daha modern ve esnek bir versiyonunu vereyim. Mevcut playerGetItemLink fonksiyonunu silip yerine bunu yapıştırırsan daha sağlıklı olur. Bu kod, taş ve efsun sayılarını sabitlere göre dinamik olarak ayarlar.


[CODE title="C++"]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);
if (!pPlayerItem)
return Py_BuildValue("s", "");

CItemData* pItemData = NULL;
if (!CItemManager::Instance().GetItemDataPointer(pPlayerItem->vnum, &pItemData))
return Py_BuildValue("s", "");

char itemlink[1024];
int len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x", pPlayerItem->vnum, pPlayerItem->flags);

for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i)
{
len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x", pPlayerItem->alSockets);
}

bool isAttr = false;
for (int i = 0; i < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++i)
{
if (pPlayerItem->aAttr.bType != 0)
{
len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d", pPlayerItem->aAttr.bType, pPlayerItem->aAttr.sValue);
isAttr = true;
}
}

char buf[1024];
if (GetDefaultCodePage() == CP_ARABIC) {
if (isAttr)
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)
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);
}[/CODE]

Özetleyelim, önce Python tarafındaki ATTRIBUTE_SLOT_MAX_NUM sabitini 7 yap, sonra C++ tarafındaki ITEM_ATTRIBUTE_SLOT_MAX_NUM sabitinin 7 olduğundan emin ol. En son da verdiğim bu yeni C++ koduyla eski fonksiyonu değiştirip client'ını yeniden derle. Sorunun çözülecektir inş.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst