Yardım GetWear'ın Python Karşılığı

  • Konuyu açan Konuyu açan TheAdmin33
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 168
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

TheAdmin33

Ah, bu şarkıların gözü kör olsun
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
1.327
Çözümler
75
Beğeni
5.036
Puan
2.859
Ticaret Puanı
0
game source tarafında herhangi bir slota takılı olan itemi GetWear kullanarak çağırabiliyoruz, python tarafında GetWear tarzı bir methot varmı diye bakındım ama bulamadım ya da gözümden kaçtı bilmiyorum.

Şu kodu python karşılığı nedir bilen varmı;
C++:
Genişlet Daralt Kopyala
    LPITEM item = ch->GetWear(WEAR_WEAPON);
 
game source tarafında herhangi bir slota takılı olan itemi GetWear kullanarak çağırabiliyoruz, python tarafında GetWear tarzı bir methot varmı diye bakındım ama bulamadım ya da gözümden kaçtı bilmiyorum.

Şu kodu python karşılığı nedir bilen varmı;
C++:
Genişlet Daralt Kopyala
    LPITEM item = ch->GetWear(WEAR_WEAPON);
aradım aradım ama en mantıklı bunu buldum def CanEquip(self): belki yoksa bile ilham olabilir
 
Python'da genellikte her window için ayrı sorgulama yapılıyor. INVENTORY, SAFEBOX,EQUIPMENT vs..
Aşağıdaki gibi bir mantık izleyebilirsin.
Python:
Genişlet Daralt Kopyala
    getVNum=player.GetItemIndex
    for i in xrange(player.EQUIPMENT_PAGE_COUNT):
        slotNumber = player.EQUIPMENT_SLOT_START + i
        itemVnum = getVNum(slotNumber)

        if itemVnum:
            item.SelectItem(itemVnum)
            
            itemType = item.GetItemType()
            itemSubType = item.GetItemSubType()
            if item.ITEM_TYPE_UNIQUE == itemType and itemSubType == item.USE_PET:
                .....
 
Python'da genellikte her window için ayrı sorgulama yapılıyor. INVENTORY, SAFEBOX,EQUIPMENT vs..
Aşağıdaki gibi bir mantık izleyebilirsin.
Python:
Genişlet Daralt Kopyala
    getVNum=player.GetItemIndex
    for i in xrange(player.EQUIPMENT_PAGE_COUNT):
        slotNumber = player.EQUIPMENT_SLOT_START + i
        itemVnum = getVNum(slotNumber)

        if itemVnum:
            item.SelectItem(itemVnum)
           
            itemType = item.GetItemType()
            itemSubType = item.GetItemSubType()
            if item.ITEM_TYPE_UNIQUE == itemType and itemSubType == item.USE_PET:
                .....
tamam işe yararda bu da çok dolambaçlı bir yolmuş gibi geliyor. GetWear için client sourcede yeni bir fonksiyonmu yazmak gerekki acaba:unsure:
 
tamam işe yararda bu da çok dolambaçlı bir yolmuş gibi geliyor. GetWear için client sourcede yeni bir fonksiyonmu yazmak gerekki acaba:unsure:

PythonPlayer.h:
C++:
Genişlet Daralt Kopyala
// Reserved
bool    NEW_IsEmptyReservedDelayTime(float fElapsedtime);

// Check Item Control
bool    IsEquipItemByVnum(int itemVnum);
bool    IsEquipItemByType(BYTE bType, BYTE bSubType);

PythonPlayer.cpp:
C++:
Genişlet Daralt Kopyala
bool CPythonPlayer::IsEquipItemByVnum(int itemVnum)
{
    for (int i = c_Equipment_Start; i < c_Equipment_Start + c_Equipment_Count; ++i)
    {
        TItemPos cell(INVENTORY, i);
        if (cell.IsEquipCell())
        {
            const TItemData* pItem = GetItemData(cell);
            if (pItem && pItem->vnum == itemVnum)
                return true;
        }
    }
    return false;
}
bool CPythonPlayer::IsEquipItemByType(BYTE bType, BYTE bSubType)
{
    for (int i = c_Equipment_Start; i < c_Equipment_Start + c_Equipment_Count; ++i)
    {
        const TItemData* pItem = GetItemData(TItemPos(INVENTORY, i));
        if (!pItem || pItem->vnum == 0)
            continue;

        CItemData* pItemDataProto = NULL;
        if (CItemManager::Instance().GetItemDataPointer(pItem->vnum, &pItemDataProto))
        {
            if (pItemDataProto->GetType() == bType && pItemDataProto->GetSubType() == bSubType)
                return true;
        }
    }
    
#if defined(ENABLE_COSTUME_MOUNT_SYSTEM) || defined(ENABLE_COSTUME_TYPE_WEAPON) // ve diğer tüm kostümler dahil
    for (int i = c_Costume_Slot_Start; i <= c_Costume_Slot_End; ++i)
    {
        const TItemData* pItem = GetItemData(TItemPos(INVENTORY, i));
        if (!pItem || pItem->vnum == 0)
            continue;

        CItemData* pItemDataProto = NULL;
        if (CItemManager::Instance().GetItemDataPointer(pItem->vnum, &pItemDataProto))
        {
            if (pItemDataProto->GetType() == bType && pItemDataProto->GetSubType() == bSubType)
                return true;
        }
    }
#endif
    return false;
}

PythonPlayerModule.cpp:
C++:
Genişlet Daralt Kopyala
PyObject* playerIsEquipItemByVnum(PyObject* poSelf, PyObject* poArgs)
{
    int iVnum = 0;
    if (!PyTuple_GetInteger(poArgs, 0, &iVnum))
        return Py_BadArgument();

    bool bIsEquipped = CPythonPlayer::Instance().IsEquipItemByVnum(iVnum);
    return Py_BuildValue("b", bIsEquipped);
}

PyObject* playerIsEquipItemByType(PyObject* poSelf, PyObject* poArgs)
{
    int iType = 0;
    int iSubType = 0;
    if (!PyArg_ParseTuple(poArgs, "ii", &iType, &iSubType))
        return Py_BadArgument();

    bool bIsEquipped = CPythonPlayer::Instance().IsEquipItemByType(iType, iSubType);
    return Py_BuildValue("b", bIsEquipped);
}
.
.
void initPlayer() // <<<<<<<<<<<<<<

C++:
Genişlet Daralt Kopyala
{ "IsEquipItemByVnum",            playerIsEquipItemByVnum,            METH_VARARGS },
{ "IsEquipItemByType",            playerIsEquipItemByType,            METH_VARARGS },

Python test(uiInventory.py)
Python:
Genişlet Daralt Kopyala
def __UseItem(self, slotIndex):
    if player.IsEquipItemByVnum(19):
        chat.AppendChat(1,"Silah takili")
    if player.IsEquipItemByType(item.ITEM_TYPE_COSTUME, item.COSTUME_TYPE_WEAPON):
        chat.AppendChat(1,"Kostüm silah takili")
    
    [...]

Ekran görüntüsü 2025-08-25 223428.webp
 
C++:
Genişlet Daralt Kopyala
PyObject* chrGetPart(PyObject* poSelf, PyObject* poArgs)
{
    int iPartIndex;
    if (!PyTuple_GetInteger(poArgs, 0, &iPartIndex))
        return Py_BuildException();

    CInstanceBase* pInstance = CPythonCharacterManager::Instance().GetSelectedInstancePtr();
    if (!pInstance)
        return Py_BuildValue("i", 0);

    const auto dwPart = pInstance->GetPart(static_cast<CRaceData::EParts>(iPartIndex));
    return Py_BuildValue("i", dwPart);
}

        { "GetPart",                    chrGetPart,                        METH_VARARGS },
Python:
Genişlet Daralt Kopyala
weapon = chr.GetPart(chr.PART_WEAPON)
 
Doğrudan bir karşılığı yok aslında. Çünkü sunucudaki dil C++ ve GetWear bir CItem nesnesi döndürüyor. Tek dil olduğu için dönen nesne üzerinden üye metod ve değişkenleri vs kullanabiliyorsun direkt. Sahibi kim, vnum bilgisi vs. Fakat bir C++ sınıfı doğrudan bir Python sınıfına çevrilemeyeceğinden primitive türler (int, float, string vs.) şeklinde Python'a geçiriliyorlar, tıpkı önerilen çözümler gibi. Yani bence asıl soru, bir eşyanın hangi bilgisine ihtiyacın olduğudur. veya sadece takılı mı, değil mi.
Yanlışım varsa düzeltin lütfen.
 
Geri
Üst