- 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.
Dikkat edilmesi gerkenler:!! 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.
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:
#importların arasına ekle
if app.WJ_MULTI_TEXTLINE:
import wndMgr,grp
uiaffectshower.py:
#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:
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++:
TValueName c_aApplyTypeNames[] =
C++:
{ "ATT_BONUS_TO_MONSTER", APPLY_ATTBONUS_MONSTER },
Kod:
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++:
/reload set_item
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Güncelleme:
char.cpp:
//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:
//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.
Son düzenleme: