.txt İtem Set Bonus System

  • Konuyu açan Konuyu açan enes turan
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 19
  • Gösterim Gösterim 426

enes turan

Yardımsever Üye
Yardımsever Üye
MT Üye
Mesaj
840
Çözümler
58
Beğeni
764
Puan
919
Ticaret Puanı
0
Merhabalar sizlere kendi kullandığım item set bonus sistemini paylaşmak istiyorum.
!! Lütfen sistemi kurarken veya sonrasında hata alırsanız soru-cevap bölümünü kullanın.


Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.




0208_225538.webp
Dikkat edilmesi gerkenler:

görseldeki gibi alt alta sıralanmasını istiyorsanız
Linkleri görebilmek için giriş yap veya kayıt ol.

Linkleri görebilmek için giriş yap veya kayıt ol.

sistemini kurmanız gerekiyor
ve ekledikten sonra

uiaffectshower.py:
Genişlet Daralt Kopyala
#importların arasına ekle
if app.WJ_MULTI_TEXTLINE:
    import wndMgr,grp
yan yanada olsun sorun yok diyenler için
uiaffectshower.py:
Genişlet Daralt Kopyala
#bu kısmı silin
                if app.WJ_MULTI_TEXTLINE:
                    textLine.SetEnterToken(True) ###

#ve bu kısmı bu şekilde değiştirin
    if app.ENABLE_SET_ITEM:
        def UpdateSetItemDescription(self, affect_type = chr.NEW_AFFECT_SET_ITEM):
            if not self.description:
                return

            if not self.tooltipItem:
                toolTip = self.description
            else:
                toolTip = self.description
                toolTip += " "
                setitem_effect_dict = player.GetSetItemEffect(affect_type)

                if type(setitem_effect_dict) is dict:
                    if len(setitem_effect_dict) > 0:
                        for k in setitem_effect_dict.keys():
                          
                            toolTip += self.tooltipItem.GetAffectString(k, setitem_effect_dict[k])
                            toolTip += " "

            self.SetToolTipText(toolTip, 0, 30, True, 15)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Client src de bu kısmı kendi filesinizin EApplyTypes ve EPointTypes kısmına göre düzenlemeniz gerekmektedir
EApplyTypes = Gamelib/ItemData.h
EPointTypes = UserInterface/Packet.h


GameType.cpp:
Genişlet Daralt Kopyala
const TApplyInfo aApplyInfo[CItemData::MAX_APPLY_NUM] =
{
    { CItemData::    APPLY_NONE,     POINT_NONE,        },
    { CItemData::    APPLY_MAX_HP,     POINT_MAX_HP,        },
    { CItemData::    APPLY_MAX_SP,     POINT_MAX_SP,        },
    { CItemData::    APPLY_CON,     POINT_HT,        },
    { CItemData::    APPLY_INT,     POINT_IQ,        },
    { CItemData::    APPLY_STR, POINT_ST,            },
    { CItemData::    APPLY_DEX,     POINT_DX,        },
    { CItemData::    APPLY_ATT_SPEED,     POINT_ATT_SPEED,        },
    { CItemData::    APPLY_MOV_SPEED,     POINT_MOV_SPEED,        },
    { CItemData::    APPLY_CAST_SPEED,     POINT_CASTING_SPEED,        },
    { CItemData::    APPLY_HP_REGEN,     POINT_HP_REGEN,        },
    { CItemData::    APPLY_SP_REGEN,     POINT_SP_REGEN,        },
    { CItemData::    APPLY_POISON_PCT,     POINT_POISON_PCT,        },
    { CItemData::    APPLY_STUN_PCT,     POINT_STUN_PCT,        },
    { CItemData::    APPLY_SLOW_PCT,     POINT_SLOW_PCT,        },
    { CItemData::    APPLY_CRITICAL_PCT,     POINT_CRITICAL_PCT,        },
    { CItemData::    APPLY_PENETRATE_PCT,     POINT_PENETRATE_PCT,        },
    { CItemData::    APPLY_ATTBONUS_HUMAN,     POINT_ATTBONUS_HUMAN,        },
    { CItemData::    APPLY_ATTBONUS_ANIMAL,     POINT_ATTBONUS_ANIMAL,        },
    { CItemData::    APPLY_ATTBONUS_ORC,     POINT_ATTBONUS_ORC,        },
    { CItemData::    APPLY_ATTBONUS_MILGYO,     POINT_ATTBONUS_MILGYO,        },
    { CItemData::    APPLY_ATTBONUS_UNDEAD,     POINT_ATTBONUS_UNDEAD,        },
    { CItemData::    APPLY_ATTBONUS_DEVIL,     POINT_ATTBONUS_DEVIL,        },
    { CItemData::    APPLY_STEAL_HP,     POINT_STEAL_HP,        },
    { CItemData::    APPLY_STEAL_SP,     POINT_STEAL_SP,        },
    { CItemData::    APPLY_MANA_BURN_PCT,     POINT_MANA_BURN_PCT,        },
    { CItemData::    APPLY_DAMAGE_SP_RECOVER,     POINT_DAMAGE_SP_RECOVER,        },
    { CItemData::    APPLY_BLOCK,     POINT_BLOCK,        },
    { CItemData::    APPLY_DODGE,     POINT_DODGE,        },
    { CItemData::    APPLY_RESIST_SWORD,     POINT_RESIST_SWORD,        },
    { CItemData::    APPLY_RESIST_TWOHAND,     POINT_RESIST_TWOHAND,        },
    { CItemData::    APPLY_RESIST_DAGGER,     POINT_RESIST_DAGGER,        },
    { CItemData::    APPLY_RESIST_BELL,     POINT_RESIST_BELL,        },
    { CItemData::    APPLY_RESIST_FAN,     POINT_RESIST_FAN,        },
    { CItemData::    APPLY_RESIST_BOW,     POINT_RESIST_BOW,        },
    { CItemData::    APPLY_RESIST_FIRE,     POINT_RESIST_FIRE,        },
    { CItemData::    APPLY_RESIST_ELEC,     POINT_RESIST_ELEC,        },
    { CItemData::    APPLY_RESIST_MAGIC,     POINT_RESIST_MAGIC,        },
    { CItemData::    APPLY_RESIST_WIND,     POINT_RESIST_WIND,        },
    { CItemData::    APPLY_REFLECT_MELEE,     POINT_REFLECT_MELEE,        },
    { CItemData::    APPLY_REFLECT_CURSE,     POINT_REFLECT_CURSE,        },
    { CItemData::    APPLY_POISON_REDUCE,     POINT_POISON_REDUCE,        },
    { CItemData::    APPLY_KILL_SP_RECOVER,     POINT_KILL_SP_RECOVER,        },
    { CItemData::    APPLY_EXP_DOUBLE_BONUS,     POINT_EXP_DOUBLE_BONUS,        },
    { CItemData::    APPLY_GOLD_DOUBLE_BONUS, POINT_GOLD_DOUBLE_BONUS,            },
    { CItemData::    APPLY_ITEM_DROP_BONUS,     POINT_ITEM_DROP_BONUS,        },
    { CItemData::    APPLY_POTION_BONUS,     POINT_POTION_BONUS,        },
    { CItemData::    APPLY_KILL_HP_RECOVER,     POINT_NONE,        },
    { CItemData::    APPLY_IMMUNE_STUN,     POINT_IMMUNE_STUN,        },
    { CItemData::    APPLY_IMMUNE_SLOW,     POINT_IMMUNE_SLOW,        },
    { CItemData::    APPLY_IMMUNE_FALL,     POINT_IMMUNE_FALL,        },
    { CItemData::    APPLY_SKILL,     POINT_NONE,        },
    { CItemData::    APPLY_BOW_DISTANCE,     POINT_BOW_DISTANCE,        },
    { CItemData::    APPLY_ATT_GRADE_BONUS,     POINT_ATT_GRADE_BONUS,        },
    { CItemData::    APPLY_DEF_GRADE_BONUS,     POINT_DEF_GRADE_BONUS,        },
    { CItemData::    APPLY_MAGIC_ATT_GRADE,     POINT_MAGIC_ATT_GRADE_BONUS,        },
    { CItemData::    APPLY_MAGIC_DEF_GRADE,     POINT_MAGIC_DEF_GRADE_BONUS,        },
    { CItemData::    APPLY_CURSE_PCT,     POINT_CURSE_PCT,        },
    { CItemData::    APPLY_MAX_STAMINA,     POINT_MAX_STAMINA,        },
    { CItemData::    APPLY_ATT_BONUS_TO_WARRIOR,     POINT_ATTBONUS_WARRIOR,        },
    { CItemData::    APPLY_ATT_BONUS_TO_ASSASSIN,     POINT_ATTBONUS_ASSASSIN,        },
    { CItemData::    APPLY_ATT_BONUS_TO_SURA,     POINT_ATTBONUS_SURA,        },
    { CItemData::    APPLY_ATT_BONUS_TO_SHAMAN,     POINT_ATTBONUS_SHAMAN,        },
    { CItemData::    APPLY_ATT_BONUS_TO_MONSTER,     POINT_ATTBONUS_MONSTER,        },
    { CItemData::    APPLY_MALL_ATTBONUS,     POINT_ATT_BONUS,        },
    { CItemData::    APPLY_MALL_DEFBONUS,     POINT_MALL_DEFBONUS,        },
    { CItemData::    APPLY_MALL_EXPBONUS,     POINT_MALL_EXPBONUS,        },
    { CItemData::    APPLY_MALL_ITEMBONUS,     POINT_MALL_ITEMBONUS,        },
    { CItemData::    APPLY_MALL_GOLDBONUS,     POINT_MALL_GOLDBONUS,        },
    { CItemData::    APPLY_MAX_HP_PCT,     POINT_MAX_HP_PCT,        },
    { CItemData::    APPLY_MAX_SP_PCT,     POINT_MAX_SP_PCT,        },
    { CItemData::    APPLY_SKILL_DAMAGE_BONUS,     POINT_SKILL_DAMAGE_BONUS,        },
    { CItemData::    APPLY_NORMAL_HIT_DAMAGE_BONUS,     POINT_NORMAL_HIT_DAMAGE_BONUS,        },
    { CItemData::    APPLY_SKILL_DEFEND_BONUS,     POINT_SKILL_DEFEND_BONUS,        },
    { CItemData::    APPLY_NORMAL_HIT_DEFEND_BONUS, POINT_NORMAL_HIT_DEFEND_BONUS,            },
    { CItemData::    APPLY_PC_BANG_EXP_BONUS,     POINT_PC_BANG_EXP_BONUS,        },
    { CItemData::    APPLY_PC_BANG_DROP_BONUS,     POINT_PC_BANG_DROP_BONUS,        },
    { CItemData::    APPLY_EXTRACT_HP_PCT,  POINT_NONE,            },
    { CItemData::    APPLY_RESIST_WARRIOR,     POINT_RESIST_WARRIOR,        },
    { CItemData::    APPLY_RESIST_ASSASSIN,     POINT_RESIST_ASSASSIN,        },
    { CItemData::    APPLY_RESIST_SURA,     POINT_RESIST_SURA,        },
    { CItemData::    APPLY_RESIST_SHAMAN,     POINT_RESIST_SHAMAN,        },
    { CItemData::    APPLY_ENERGY,     POINT_ENERGY,        },
    { CItemData::    APPLY_DEF_GRADE,     POINT_DEF_GRADE,        },
    { CItemData::    APPLY_COSTUME_ATTR_BONUS,     POINT_COSTUME_ATTR_BONUS,        },
    { CItemData::    APPLY_MAGIC_ATTBONUS_PER,     POINT_MAGIC_ATT_BONUS_PER,        },
    { CItemData::    APPLY_MELEE_MAGIC_ATTBONUS_PER,     POINT_MELEE_MAGIC_ATT_BONUS_PER,        },
    { CItemData::    APPLY_RESIST_ICE,     POINT_RESIST_ICE,        },
    { CItemData::    APPLY_RESIST_EARTH,     POINT_RESIST_EARTH,        },
    { CItemData::    APPLY_RESIST_DARK,     POINT_RESIST_DARK,        },
    { CItemData::    APPLY_ANTI_CRITICAL_PCT,     POINT_RESIST_CRITICAL,        },
    { CItemData::    APPLY_ANTI_PENETRATE_PCT,     POINT_RESIST_PENETRATE,        },
    { CItemData::    APPLY_BLEEDING_REDUCE,     POINT_BLEEDING_REDUCE,        },
    { CItemData::    APPLY_BLEEDING_PCT,     POINT_BLEEDING_PCT,        },
    { CItemData::    APPLY_ATT_BONUS_TO_WOLFMAN, POINT_ATTBONUS_WOLFMAN,            },
    { CItemData::    APPLY_RESIST_WOLFMAN,     POINT_RESIST_WOLFMAN,        },
    { CItemData::    APPLY_RESIST_CLAW,     POINT_RESIST_CLAW,        },
    { CItemData::    APPLY_ACCEDRAIN_RATE,     POINT_ACCEDRAIN_RATE,        },
    { CItemData::    APPLY_ENCHANT_ELECT,     POINT_ENCHANT_ELECT,        },
    { CItemData::    APPLY_ENCHANT_FIRE,     POINT_ENCHANT_FIRE,        },
    { CItemData::    APPLY_ENCHANT_ICE,     POINT_ENCHANT_ICE,        },
    { CItemData::    APPLY_ENCHANT_WIND,     POINT_ENCHANT_WIND,        },
    { CItemData::    APPLY_ENCHANT_EARTH,     POINT_ENCHANT_EARTH,        },
    { CItemData::    APPLY_ENCHANT_DARK,     POINT_ENCHANT_DARK,        },
    { CItemData::    APPLY_ATTBONUS_CZ,     POINT_ATTBONUS_CZ,        },
    { CItemData::    APPLY_ATTBONUS_INSECT,     POINT_ATTBONUS_INSECT,        },
    { CItemData::    APPLY_ATTBONUS_DESERT,     POINT_ATTBONUS_DESERT,        },
    { CItemData::    APPLY_ATTBONUS_SWORD,     POINT_ATTBONUS_SWORD,        },
    { CItemData::    APPLY_ATTBONUS_TWOHAND,     POINT_ATTBONUS_TWOHAND,        },
    { CItemData::    APPLY_ATTBONUS_DAGGER,     POINT_ATTBONUS_DAGGER,        },
    { CItemData::    APPLY_ATTBONUS_BELL,     POINT_ATTBONUS_BELL,        },
    { CItemData::    APPLY_ATTBONUS_FAN,     POINT_ATTBONUS_FAN,        },
    { CItemData::    APPLY_ATTBONUS_BOW,     POINT_ATTBONUS_BOW,        },
    { CItemData::    APPLY_ATTBONUS_CLAW,     POINT_ATTBONUS_CLAW,        },
    { CItemData::    APPLY_RESIST_HUMAN,     POINT_RESIST_HUMAN,        },
    { CItemData::    APPLY_RESIST_MOUNT_FALL,     POINT_RESIST_MOUNT_FALL,        },
    { CItemData::    APPLY_MOUNT,     POINT_NONE,        },
    { CItemData::    APPLY_SUNGMA_STR,     POINT_SUNGMA_STR,        },
    { CItemData::    APPLY_SUNGMA_HP,     POINT_SUNGMA_HP,        },
    { CItemData::    APPLY_SUNGMA_MOVE,     POINT_SUNGMA_MOVE,        },
    { CItemData::    APPLY_SUNGMA_IMMUNE, POINT_SUNGMA_IMMUNE,            },
    { CItemData::    APPLY_ATTBONUS_STONE,     POINT_ATTBONUS_STONE,        },
    { CItemData::    APPLY_ATTBONUS_BOSS,     POINT_ATTBONUS_BOSS,        },
    { CItemData::    APPLY_RANDOM,     POINT_NONE,        },
};
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
txt den yeni itemlere farklı bonuslar eklemek istediğinizde uygulanması gereken adımlar:
eklenecek yeni efsunun constants.cpp de
C++:
Genişlet Daralt Kopyala
TValueName c_aApplyTypeNames[] =
kısmında ekli olması gerekiyor örn:


C++:
Genişlet Daralt Kopyala
    { "ATT_BONUS_TO_MONSTER",    APPLY_ATTBONUS_MONSTER  },
daha sonra txt kısmından devam edeceğiz aşağıda detaylarına bakabilirsiniz.

Kod:
Genişlet Daralt Kopyala
Group NEWSET
{
    SET_VALUE    101                                --her yeni set için +1

    SET_ITEM_COSTUME_BODY    41682    41685    1    --zırh kostümü için aralık 41682 den 41685 e kadar olan kostümler için geçerli
    SET_ITEM_COSTUME_HAIR    45360    45363    1    --saç kostümü için aralık 45360 dan 45363 e kadar olan kostümler için geçerli
    SET_ITEM_COSTUME_MOUNT    71275    71276    1    --binek için aralık 71275 den 71276 e kadar olan binekler için geçerli
    SET_ITEM_COSTUME_ACCE    86064    86064    1    --kuşak için aralık 86064 d3n 86064 e kadar olan kuşaklar için geçerli
    SET_ITEM_UNIQUE    71136    71188    0            --yüzükler için aralık 71136 dan 71188 e kadar olan yüzükler için geçerli

    1    2    ATT_BONUS_TO_MONSTER    3            --2 item takıldığında vereceği efsun ve oran
    2    3    ATT_BONUS_TO_MONSTER    3            --3 item takıldığında vereceği efsun ve oran
    3    3    ATTBONUS_STONE    10                    --3 item takıldığında vereceği efsun ve oran
    4    4    MOVE_SPEED    20                        --4 item takıldığında vereceği efsun ve oran
    5    4    ATTBONUS_HUMAN    15                    --4 item takıldığında vereceği efsun ve oran
    6    5    ATTBONUS_DEVIL    15                    --5 item takıldığında vereceği efsun ve oran
}

not:
-her item takıldığında veya çıkarıldığında önceki efsun silinir, güncellenir son olarak hangi kombinasyon aktifse onun verdiği oranlar geçerli olur.
-her item için birden fazla efsun eklenebilir örn. 3 item takıldığında 5 efsun verdirtebilirsiniz size kalmış.
-her seferinde bütün set_item.. 5 ana itemi eklemenize gerek yok örn. 2 tane itemlede kombinasyon yapılabilir.

ve son olarak txt yi güncellemek için

C++:
Genişlet Daralt Kopyala
/reload set_item
yazmanız yeterli olacaktır.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Güncelleme:

char.cpp:
Genişlet Daralt Kopyala
//kod bloğu değiştirilir

#if defined(__SET_ITEM__)
void CHARACTER::RefreshItemSetBonus()
{
    CAffect* pSetItem = FindAffect(AFFECT_SET_ITEM);
    if (pSetItem)
        RemoveAffect(pSetItem);

    bool bSetBonus = false;
    for (const auto& [bSetValue, vItems] : ITEM_MANAGER::Instance().GetItemSetItemMap())
    {
        BYTE bWearCount = 0;

        const auto& rkItemSetValueMap = ITEM_MANAGER::Instance().GetItemSetValueMap();
        if (rkItemSetValueMap.empty())
            break;

        const auto& ItemSetValueMap = rkItemSetValueMap.find(bSetValue);
        if (ItemSetValueMap == rkItemSetValueMap.end())
            continue;

        for (const auto& [bSetType, kItemTuple] : vItems)
        {
            LPITEM pItem = nullptr;
            LPITEM pUnique1 = nullptr;
            LPITEM pUnique2 = nullptr;

            switch (bSetType)
            {
                case SET_ITEM_COSTUME_BODY:
                    pItem = GetWear(WEAR_COSTUME_BODY);
                    break;

                case SET_ITEM_COSTUME_HAIR:
                    pItem = GetWear(WEAR_COSTUME_HAIR);
                    break;

                case SET_ITEM_COSTUME_MOUNT:
                    pItem = GetWear(WEAR_COSTUME_MOUNT);
                    break;

                case SET_ITEM_COSTUME_ACCE:
                    pItem = GetWear(WEAR_COSTUME_ACCE);
                    break;

                case SET_ITEM_COSTUME_WEAPON:
                    pItem = GetWear(WEAR_COSTUME_WEAPON);
                    break;

                case SET_ITEM_UNIQUE:
                    pUnique1 = GetWear(WEAR_UNIQUE1);
                    pUnique2 = GetWear(WEAR_UNIQUE2);
                    break;
            }

            const auto& [dwMinVnum, dwMaxVnum, bRange] = kItemTuple;

            if (pUnique1 && CHECK_VNUM_RANGE(pUnique1->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pUnique2 && CHECK_VNUM_RANGE(pUnique2->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pItem && CHECK_VNUM_RANGE(pItem->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            for (const auto& [bCount, vSetBonus] : ItemSetValueMap->second)
            {
                if (bWearCount != bCount)
                {
                    bSetBonus = false;
                    continue;
                }

                for (const auto& [wApplyType, lApplyValue] : vSetBonus)
                {
                    AddAffect(AFFECT_SET_ITEM, aApplyInfo[wApplyType].bPointType, lApplyValue, 0, INFINITE_AFFECT_DURATION, 0, true, true);
                    bSetBonus = true;
                }
            }
        }

        if (bSetBonus)
            break;
    }
}
#endif

char_affect.cpp:
Genişlet Daralt Kopyala
//arat
#define IS_NO_SAVE_AFFECT(type)

//define içerisine ekle
|| (type) == AFFECT_SET_ITEM

//arat
void CHARACTER::ClearAffect(bool bSave)

//altında bul
   
        if (bSave)
        {
            if ( IS_NO_CLEAR_ON_DEATH_AFFECT(pkAff->dwType) || IS_NO_SAVE_AFFECT(pkAff->dwType) )
            {
                ++it;
                continue;
            }

//altına ekle
#if defined(__SET_ITEM__)
            if (pkAff->dwType == AFFECT_SET_ITEM)
            {
                ++it;
                continue;
            }
#endif

Anlık item giyme sırasında oluşan lag ve spam yapıldığında oluşabilecek sorunlar için optimizasyon güncellemesidir.
Hayırlı olsun İyi forumlar.
:ao-help:
 
Son düzenleme:
Teşekürler ellerine sağlık form iyice kendine kapandı sessizlik hakim
Birsey sormak istiyorum

/reload set_item yazındca nasıl calisiyor hangi kod blogunabağlı
 
I added it and it works but the rewards are next to each other not on top of each other
Can you check the WJ_MULTI_TEXTLINE system codes?
 
I added it and it works but the rewards are next to each other not on top of each other
Can you check the WJ_MULTI_TEXTLINE system codes?

uiaffectshower.py:
Genişlet Daralt Kopyala
#importların arasına ekle
if app.WJ_MULTI_TEXTLINE:
    import wndMgr,grp

uiaffectshower.py:
Genişlet Daralt Kopyala
#bu kısmı bu şekilde değiştirin
    if app.ENABLE_SET_ITEM:
        def UpdateSetItemDescription(self, affect_type = chr.NEW_AFFECT_SET_ITEM):
            if not self.description:
                return

            if not self.tooltipItem:
                toolTip = self.description
            else:
                toolTip = self.description
                toolTip += "\\n"
                setitem_effect_dict = player.GetSetItemEffect(affect_type)

                if type(setitem_effect_dict) is dict:
                    if len(setitem_effect_dict) > 0:
                        for k in setitem_effect_dict.keys():
                          
                            toolTip += self.tooltipItem.GetAffectString(k, setitem_effect_dict[k])
                            toolTip += "\\n"

            self.SetToolTipText(toolTip, 0, 30, True, 15)

#bu kısmıda bu şekilde değiştirin

    if app.ENABLE_SET_ITEM:
        def SetToolTipText(self, text, x = 0, y = -19, adjust_line_height = False, line_height_distance = 20):
            if not self.toolTipText:
                textLine = ui.TextLine()
                textLine.SetParent(self)
                if app.WJ_MULTI_TEXTLINE:
                    textLine.SetEnterToken(True) ###
                textLine.SetSize(0, 0)
                textLine.SetOutline()
                textLine.Hide()
                self.toolTipText = textLine

                if adjust_line_height:
                    line_height = self.toolTipText.GetLineHeight()
                    self.toolTipText.SetLineHeight(line_height + line_height_distance)

            self.toolTipText.SetText(text)
            w, h = self.toolTipText.GetTextSize()
            self.toolTipText.SetPosition(max(0, x + self.GetWidth() / 2 - w / 2), y)
 
uiaffectshower.py:
Genişlet Daralt Kopyala
#importların arasına ekle
if app.WJ_MULTI_TEXTLINE:
    import wndMgr,grp

uiaffectshower.py:
Genişlet Daralt Kopyala
#bu kısmı bu şekilde değiştirin
    if app.ENABLE_SET_ITEM:
        def UpdateSetItemDescription(self, affect_type = chr.NEW_AFFECT_SET_ITEM):
            if not self.description:
                return

            if not self.tooltipItem:
                toolTip = self.description
            else:
                toolTip = self.description
                toolTip += "\\n"
                setitem_effect_dict = player.GetSetItemEffect(affect_type)

                if type(setitem_effect_dict) is dict:
                    if len(setitem_effect_dict) > 0:
                        for k in setitem_effect_dict.keys():
                         
                            toolTip += self.tooltipItem.GetAffectString(k, setitem_effect_dict[k])
                            toolTip += "\\n"

            self.SetToolTipText(toolTip, 0, 30, True, 15)

#bu kısmıda bu şekilde değiştirin

    if app.ENABLE_SET_ITEM:
        def SetToolTipText(self, text, x = 0, y = -19, adjust_line_height = False, line_height_distance = 20):
            if not self.toolTipText:
                textLine = ui.TextLine()
                textLine.SetParent(self)
                if app.WJ_MULTI_TEXTLINE:
                    textLine.SetEnterToken(True) ###
                textLine.SetSize(0, 0)
                textLine.SetOutline()
                textLine.Hide()
                self.toolTipText = textLine

                if adjust_line_height:
                    line_height = self.toolTipText.GetLineHeight()
                    self.toolTipText.SetLineHeight(line_height + line_height_distance)

            self.toolTipText.SetText(text)
            w, h = self.toolTipText.GetTextSize()
            self.toolTipText.SetPosition(max(0, x + self.GetWidth() / 2 - w / 2), y)
These are the correct modifications.. The modifications in the topic above are not correct
 
Hocam elinize sağlık, bu sistemin yeni setlerde tüm eskileri silip yeniden vermesi öngörebildiğiniz herhangi bir probleme, lag veya hata gibi bir şeye sebep olabilir mi?
 
Hocam elinize sağlık, bu sistemin yeni setlerde tüm eskileri silip yeniden vermesi öngörebildiğiniz herhangi bir probleme, lag veya hata gibi bir şeye sebep olabilir mi?
Affecti güncellemesi için silip tekrar eklemesi gerekiyor buda spam yapıldığında sorun oluşturabilir çözüm önerisi olarak item değiştirme olayima 2 sn delay eklemek olabilir.
 
Affecti güncellemesi için silip tekrar eklemesi gerekiyor buda spam yapıldığında sorun oluşturabilir çözüm önerisi olarak item değiştirme olayima 2 sn delay eklemek olabilir.
Yüzlerce hesaptan aynı anda bir item değiştirme yapıldığında etkisi olur mu? Yoksa oluşabilecek sorun her clientın kendisini mi ilgilendirir sizce? Daha hakim olduğunuz için fikirlerinizden yola çıkarak ihtiyaca göre editleme yapmak isterim diye soruyorum.
 
Yüzlerce hesaptan aynı anda bir item değiştirme yapıldığında etkisi olur mu? Yoksa oluşabilecek sorun her clientın kendisini mi ilgilendirir sizce? Daha hakim olduğunuz için fikirlerinizden yola çıkarak ihtiyaca göre editleme yapmak isterim diye soruyorum.
Bunun üzerinde çalıştım fakat bir sonuca varamadım yani şöyle remove_affect yerine daha fonksiyonel ne kullanabilir hakkında fakat bir sonuca ulaşamadım. Daha bilgili bir geliştirici belki bu konuda yardımcı olmak ister diret remove_affect kullanmak yerine nasıl bir yol izlememiz :)
 
Bunun üzerinde çalıştım fakat bir sonuca varamadım yani şöyle remove_affect yerine daha fonksiyonel ne kullanabilir hakkında fakat bir sonuca ulaşamadım. Daha bilgili bir geliştirici belki bu konuda yardımcı olmak ister diret remove_affect kullanmak yerine nasıl bir yol izlememiz :)
Yanlış anlamış olabilirim diye soruyorum. Her item giyilip-çıkarıldığında tüm set efektleri mi kalkıyor yoksa itemin etkilediği efekt mi kalkıyor. Eğer itemin etkilediğiyse muhtemelen yapı itibariyle yaptığınız en sağlıklıya yakın çözümdür hocam elinize sağlık.

Eğer tüm efektler kalkıp tekrar hesaplanıyor gibiyse yukarıda bahsettiğim gibi olması için birkaç deneme yapmaya çalışıcam :D
 
Yanlış anlamış olabilirim diye soruyorum. Her item giyilip-çıkarıldığında tüm set efektleri mi kalkıyor yoksa itemin etkilediği efekt mi kalkıyor. Eğer itemin etkilediğiyse muhtemelen yapı itibariyle yaptığınız en sağlıklıya yakın çözümdür hocam elinize sağlık.

Eğer tüm efektler kalkıp tekrar hesaplanıyor gibiyse yukarıda bahsettiğim gibi olması için birkaç deneme yapmaya çalışıcam :D
Hayır tüm affectleri değil sadece set bonus affecti için geçerli. Char.cpp de RefreshItemSetBonus() fonksiyonunda görebilirsin :)
Dediğim gibi büyük bir sorun yaratacağını sanmıyorum fakat 2sn delay eklemek güzel olacaktır kafa rahat olsun :)
 
Son düzenleme:
Bunun üzerinde çalıştım fakat bir sonuca varamadım yani şöyle remove_affect yerine daha fonksiyonel ne kullanabilir hakkında fakat bir sonuca ulaşamadım. Daha bilgili bir geliştirici belki bu konuda yardımcı olmak ister diret remove_affect kullanmak yerine nasıl bir yol izlememiz :)
RefreshItemSetBonus() fonksiyonunun çalışma süresini loglayıp bakarmısınız ne kadar sürede tamamlanıyor
 
İşteyim müsait bir zamanda bakarım
Kendi yazdığım sisteme göre öneride bulunacak olursam,

Her koşulda RefreshItemSetBonus() çağırıyorsunuz bu mantıklı değil yeni bir fonksiyon yazıp kuşanılan item setbonus item tablosunda mevcutsa çağırmalısınız.

AFFECT_SET_ITEM effectini IS_NO_SAVE_AFFECT definesinde tanımlamalısınız. Çünkü tabloya kaydedilmesine gerek yok, databaseye gereksiz paket gönderimi olur sadece.

AFFECT_SET_ITEM effecti kaldırıldığında ComputePoints() yapmasını engelleyin.

Fonksiyonun mantığını değiştirmeden bu kadar öneride bulunabilirim. bunları uyguladığınızda lagı oldukça optimize etmiş olursunuz. itemin takılmasına süre engeli koymak bence iyi bir yaklaşım değil.
 
Güncelleme:

char.cpp:
Genişlet Daralt Kopyala
//kod bloğu değiştirilir

#if defined(__SET_ITEM__)
void CHARACTER::RefreshItemSetBonus()
{
    CAffect* pSetItem = FindAffect(AFFECT_SET_ITEM);
    if (pSetItem)
        RemoveAffect(pSetItem);

    bool bSetBonus = false;
    for (const auto& [bSetValue, vItems] : ITEM_MANAGER::Instance().GetItemSetItemMap())
    {
        BYTE bWearCount = 0;

        const auto& rkItemSetValueMap = ITEM_MANAGER::Instance().GetItemSetValueMap();
        if (rkItemSetValueMap.empty())
            break;

        const auto& ItemSetValueMap = rkItemSetValueMap.find(bSetValue);
        if (ItemSetValueMap == rkItemSetValueMap.end())
            continue;

        for (const auto& [bSetType, kItemTuple] : vItems)
        {
            LPITEM pItem = nullptr;
            LPITEM pUnique1 = nullptr;
            LPITEM pUnique2 = nullptr;

            switch (bSetType)
            {
                case SET_ITEM_COSTUME_BODY:
                    pItem = GetWear(WEAR_COSTUME_BODY);
                    break;

                case SET_ITEM_COSTUME_HAIR:
                    pItem = GetWear(WEAR_COSTUME_HAIR);
                    break;

                case SET_ITEM_COSTUME_MOUNT:
                    pItem = GetWear(WEAR_COSTUME_MOUNT);
                    break;

                case SET_ITEM_COSTUME_ACCE:
                    pItem = GetWear(WEAR_COSTUME_ACCE);
                    break;

                case SET_ITEM_COSTUME_WEAPON:
                    pItem = GetWear(WEAR_COSTUME_WEAPON);
                    break;

                case SET_ITEM_UNIQUE:
                    pUnique1 = GetWear(WEAR_UNIQUE1);
                    pUnique2 = GetWear(WEAR_UNIQUE2);
                    break;
            }

            const auto& [dwMinVnum, dwMaxVnum, bRange] = kItemTuple;

            if (pUnique1 && CHECK_VNUM_RANGE(pUnique1->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pUnique2 && CHECK_VNUM_RANGE(pUnique2->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pItem && CHECK_VNUM_RANGE(pItem->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            for (const auto& [bCount, vSetBonus] : ItemSetValueMap->second)
            {
                if (bWearCount != bCount)
                {
                    bSetBonus = false;
                    continue;
                }

                for (const auto& [wApplyType, lApplyValue] : vSetBonus)
                {
                    AddAffect(AFFECT_SET_ITEM, aApplyInfo[wApplyType].bPointType, lApplyValue, 0, INFINITE_AFFECT_DURATION, 0, true, true);
                    bSetBonus = true;
                }
            }
        }

        if (bSetBonus)
            break;
    }
}
#endif

char_affect.cpp:
Genişlet Daralt Kopyala
//arat
#define IS_NO_SAVE_AFFECT(type)

//define içerisine ekle
|| (type) == AFFECT_SET_ITEM

//arat
void CHARACTER::ClearAffect(bool bSave)

//altında bul
   
        if (bSave)
        {
            if ( IS_NO_CLEAR_ON_DEATH_AFFECT(pkAff->dwType) || IS_NO_SAVE_AFFECT(pkAff->dwType) )
            {
                ++it;
                continue;
            }

//altına ekle
#if defined(__SET_ITEM__)
            if (pkAff->dwType == AFFECT_SET_ITEM)
            {
                ++it;
                continue;
            }
#endif

Anlık item giyme sırasında oluşan lag ve spam yapıldığında oluşabilecek sorunlar için optimizasyon güncellemesidir.
 
Güncelleme:

char.cpp:
Genişlet Daralt Kopyala
//kod bloğu değiştirilir

#if defined(__SET_ITEM__)
void CHARACTER::RefreshItemSetBonus()
{
    CAffect* pSetItem = FindAffect(AFFECT_SET_ITEM);
    if (pSetItem)
        RemoveAffect(pSetItem);

    bool bSetBonus = false;
    for (const auto& [bSetValue, vItems] : ITEM_MANAGER::Instance().GetItemSetItemMap())
    {
        BYTE bWearCount = 0;

        const auto& rkItemSetValueMap = ITEM_MANAGER::Instance().GetItemSetValueMap();
        if (rkItemSetValueMap.empty())
            break;

        const auto& ItemSetValueMap = rkItemSetValueMap.find(bSetValue);
        if (ItemSetValueMap == rkItemSetValueMap.end())
            continue;

        for (const auto& [bSetType, kItemTuple] : vItems)
        {
            LPITEM pItem = nullptr;
            LPITEM pUnique1 = nullptr;
            LPITEM pUnique2 = nullptr;

            switch (bSetType)
            {
                case SET_ITEM_COSTUME_BODY:
                    pItem = GetWear(WEAR_COSTUME_BODY);
                    break;

                case SET_ITEM_COSTUME_HAIR:
                    pItem = GetWear(WEAR_COSTUME_HAIR);
                    break;

                case SET_ITEM_COSTUME_MOUNT:
                    pItem = GetWear(WEAR_COSTUME_MOUNT);
                    break;

                case SET_ITEM_COSTUME_ACCE:
                    pItem = GetWear(WEAR_COSTUME_ACCE);
                    break;

                case SET_ITEM_COSTUME_WEAPON:
                    pItem = GetWear(WEAR_COSTUME_WEAPON);
                    break;

                case SET_ITEM_UNIQUE:
                    pUnique1 = GetWear(WEAR_UNIQUE1);
                    pUnique2 = GetWear(WEAR_UNIQUE2);
                    break;
            }

            const auto& [dwMinVnum, dwMaxVnum, bRange] = kItemTuple;

            if (pUnique1 && CHECK_VNUM_RANGE(pUnique1->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pUnique2 && CHECK_VNUM_RANGE(pUnique2->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            if (pItem && CHECK_VNUM_RANGE(pItem->GetVnum(), dwMinVnum, dwMaxVnum, bRange))
                ++bWearCount;

            for (const auto& [bCount, vSetBonus] : ItemSetValueMap->second)
            {
                if (bWearCount != bCount)
                {
                    bSetBonus = false;
                    continue;
                }

                for (const auto& [wApplyType, lApplyValue] : vSetBonus)
                {
                    AddAffect(AFFECT_SET_ITEM, aApplyInfo[wApplyType].bPointType, lApplyValue, 0, INFINITE_AFFECT_DURATION, 0, true, true);
                    bSetBonus = true;
                }
            }
        }

        if (bSetBonus)
            break;
    }
}
#endif

char_affect.cpp:
Genişlet Daralt Kopyala
//arat
#define IS_NO_SAVE_AFFECT(type)

//define içerisine ekle
|| (type) == AFFECT_SET_ITEM

//arat
void CHARACTER::ClearAffect(bool bSave)

//altında bul
  
        if (bSave)
        {
            if ( IS_NO_CLEAR_ON_DEATH_AFFECT(pkAff->dwType) || IS_NO_SAVE_AFFECT(pkAff->dwType) )
            {
                ++it;
                continue;
            }

//altına ekle
#if defined(__SET_ITEM__)
            if (pkAff->dwType == AFFECT_SET_ITEM)
            {
                ++it;
                continue;
            }
#endif

Anlık item giyme sırasında oluşan lag ve spam yapıldığında oluşabilecek sorunlar için optimizasyon güncellemesidir.
paylaşım için teşekkürler uzun zamandır konuşamıyoruz ama yinede formundasın :)
 
Geri
Üst