Metin ve Boss kestikçe özellik veren item sistemi- Metin & Boss Hunter System

TheAdmin33

Ah bu şarkıların gözü kör olsun
Premium Üye
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
768
Çözümler
45
Beğeni
1.423
Puan
1.139
Ticaret Puanı
0
Daha önce paylaşmış olduğum Toplu Envanter Sistemi ne uyumlu Metin ve Boss kestikçe özellik veren item sistemi yazdım onu paylaşıyorum.

Ekran Alıntısı.PNG





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

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


Uyarı0;
ccommon/lenht.h ile UserInterface/GameType.h uyumlu olmasına dikkat edin yoksa İtemi taktığınızda görünmeyebilir.

Uyarı1;
Aşağıdaki gibi bir syserr alırsanız common/length.h içindeki WEAR_MAX_NUM , WEAR_MAX ve UserInterface/GameType.h içindeki c_Wear_Max değerlerini arttırın.

syserr:
SYSERR: Oct 16 18:39:23 :: EquipTo: EquipTo: invalid wear cell (this: #21550 Beyaz Şebnem +50 wearflag: 8388608 cell: 32)

Uyarı2;
Eğer common/ittem_length.h içindeki enum EItemWearableFlag 'ın içi 32 yi aşarsa 32 ve sonrasındakileri aşağıdaki gibi düzenleyin.(@Kaiser 'e teşekkürler)

item_length.h:
WEARABLE_DENEME  =  (1 << 29),
WEARABLE_DENEME2  = (1 << 30),
WEARABLE_DENEME3  = (1 << 31),
WEARABLE_DENEME4  = ((uint64_t)1 << 32),
WEARABLE_DENEME5  = ((uint64_t)1 << 33),
WEARABLE_DENEME6  = ((uint64_t)1 << 34),
 
En son bir moderatör tarafından düzenlenmiş:
keşke ben metin2 yi bırakmadan önce paylaşsaydın... paylaşım için teşekkürler
 
Her metin veya boss kesildiğinde level limiti sorgusu yapıcak şekilde yazdım bunu daha stabil hale nasıl getirebilirim? :unsure: @Kaiser
 
Doğrudan socket üzerinden işlem yaptığın için yazılan kodlarda pek bir sorun göremedim ben.
kodu şu şekil düzenlesem daha iyi olurmu acaba? if sorgusunda sürekli fonksiyon çağırmamamış olurum

char_battle.cpp:
    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);

        if (item && (item->GetType() == ITEM_COSTUME))
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);
            if (0 < Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                DWORD Hunter_Number = item->SetSocket(KILLED_NUMBER_SOCKET);
                item->SetSocket(KILLED_NUMBER_SOCKET, Hunter_Number + 1);

                if (Hunter_Number == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
                }
            }
            else if (0 == Hunter_Level)
            {
                item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
            }
        }
    }

socketten veri çekmekle static değişkene atama yapmak aynı şeyemi denk geliyor? @Kaiser
 
kodu şu şekil düzenlesem daha iyi olurmu acaba? if sorgusunda sürekli fonksiyon çağırmamamış olurum

char_battle.cpp:
    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);

        if (item && (item->GetType() == ITEM_COSTUME))
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);
            if (0 < Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                DWORD Hunter_Number = item->SetSocket(KILLED_NUMBER_SOCKET);
                item->SetSocket(KILLED_NUMBER_SOCKET, Hunter_Number + 1);

                if (Hunter_Number == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
                }
            }
            else if (0 == Hunter_Level)
            {
                item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
            }
        }
    }

socketten veri çekmekle static değişkene atama yapmak aynı şeyemi denk geliyor? @Kaiser
else if eklemek var olan iflere fazladan bir sorgu daha eklemek demektir. Yani diğer iflerle beraber bir de else if'i (her zaman) sorgulayacak.
Bunun yerine kısaca şöyle yapabilirsin:

C++:
    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);
        if (!item)
            return // eğer WEAR_COSTUME_HUNTER_BOSS yoksa aşağıyı sorgulamasına gerek yok
        else
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);
            if (0 < Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                DWORD Hunter_Number = item->SetSocket(KILLED_NUMBER_SOCKET);
                item->SetSocket(KILLED_NUMBER_SOCKET, Hunter_Number + 1);

                if (Hunter_Number == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
                }
            }
        }
    }

Böylelikle iç içe if'ler yerine bütün hepsi tek bir if-else içine alınmış olur. Bu şekilde kullanıldığında her boss veya metin kesildiğinde
if (item && (item->GetType() == ITEM_COSTUME)) şartını sorgulamak yerine, eğer şart sağlanıyorsa direkt else bloğundan devam edecek.
Sağlamıyorsa da zaten return ile durdurulacak. Eski halinde şart sağlansa da sağlanmasa da if (item && (item->GetType() == ITEM_COSTUME)) sorgusu her türlü işleme alınıyor(ve altındakiler de).

Static değişkene veri atamak ile socket pek de aynı sayılmaz. Socket ile yapılan işlemlerde, bir değişkene veri atamaya göre daha fazla sorgu gerekebilir.(yerine göre.) Tabi yine de nasıl bir yol izleneceğine göre değişir.
 
else if eklemek var olan iflere fazladan bir sorgu daha eklemek demektir. Yani diğer iflerle beraber bir de else if'i (her zaman) sorgulayacak.
Bunun yerine kısaca şöyle yapabilirsin:

C++:
    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);
        if (!item)
            return // eğer WEAR_COSTUME_HUNTER_BOSS yoksa aşağıyı sorgulamasına gerek yok
        else
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);
            if (0 < Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                DWORD Hunter_Number = item->SetSocket(KILLED_NUMBER_SOCKET);
                item->SetSocket(KILLED_NUMBER_SOCKET, Hunter_Number + 1);

                if (Hunter_Number == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
                }
            }
        }
    }

Böylelikle iç içe if'ler yerine bütün hepsi tek bir if-else içine alınmış olur. Bu şekilde kullanıldığında her boss veya metin kesildiğinde
if (item && (item->GetType() == ITEM_COSTUME)) şartını sorgulamak yerine, eğer şart sağlanıyorsa direkt else bloğundan devam edecek.
Sağlamıyorsa da zaten return ile durdurulacak. Eski halinde şart sağlansa da sağlanmasa da if (item && (item->GetType() == ITEM_COSTUME)) sorgusu her türlü işleme alınıyor(ve altındakiler de).

Static değişkene veri atamak ile socket pek de aynı sayılmaz. Socket ile yapılan işlemlerde, bir değişkene veri atamaya göre daha fazla sorgu gerekebilir.(yerine göre.) Tabi yine de nasıl bir yol izleneceğine göre değişir.
tamam anladım .
 
Son düzenleme:
else if eklemek var olan iflere fazladan bir sorgu daha eklemek demektir. Yani diğer iflerle beraber bir de else if'i (her zaman) sorgulayacak.
Bunun yerine kısaca şöyle yapabilirsin:

C++:
    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);
        if (!item)
            return // eğer WEAR_COSTUME_HUNTER_BOSS yoksa aşağıyı sorgulamasına gerek yok
        else
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);
            if (0 < Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                DWORD Hunter_Number = item->SetSocket(KILLED_NUMBER_SOCKET);
                item->SetSocket(KILLED_NUMBER_SOCKET, Hunter_Number + 1);

                if (Hunter_Number == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(item->GetSocket(HUNTER_LEVEL_SOCKET)));
                }
            }
        }
    }

Böylelikle iç içe if'ler yerine bütün hepsi tek bir if-else içine alınmış olur. Bu şekilde kullanıldığında her boss veya metin kesildiğinde
if (item && (item->GetType() == ITEM_COSTUME)) şartını sorgulamak yerine, eğer şart sağlanıyorsa direkt else bloğundan devam edecek.
Sağlamıyorsa da zaten return ile durdurulacak. Eski halinde şart sağlansa da sağlanmasa da if (item && (item->GetType() == ITEM_COSTUME)) sorgusu her türlü işleme alınıyor(ve altındakiler de).

Static değişkene veri atamak ile socket pek de aynı sayılmaz. Socket ile yapılan işlemlerde, bir değişkene veri atamaya göre daha fazla sorgu gerekebilir.(yerine göre.) Tabi yine de nasıl bir yol izleneceğine göre değişir.

böyle düzenledim nasıl? (level 0 mı diye kontrol ettirmessem fonksiyonla level limit kontrolu yaptırmak zorunda kalıyorum)

char_battle.cpp:
    if (pkKiller && pkKiller->IsPC() && IsStone())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_METIN);

        if (!item)
        {
            return
        }
        else
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);

            if (Hunter_Level > 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                return
            }
            else if (0 < Hunter_Level && Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                item->SetSocket(KILLED_NUMBER_SOCKET, item->GetSocket(KILLED_NUMBER_SOCKET) + 1);

                if (item->GetSocket(KILLED_NUMBER_SOCKET) == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                }
            }
            else if (0 == Hunter_Level)
            {
                item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
            }
        }
    }
 
Son düzenleme:
PythonItemModule.cpp deki kodları eklememe rağmen client source build ederken hata veriyor bu kodlara tanımsız diyor
 
böyle düzenledim nasıl? (level 0 mı diye kontrol ettirmessem fonksiyonla level limit kontrolu yaptırmak zorunda kalıyorum)

char_battle.cpp:
    if (pkKiller && pkKiller->IsPC() && IsStone())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_METIN);

        if (!item)
        {
            return
        }
        else
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);

            if (Hunter_Level > 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                return
            }
            else if (0 < Hunter_Level && Hunter_Level <= 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                item->SetSocket(KILLED_NUMBER_SOCKET, item->GetSocket(KILLED_NUMBER_SOCKET) + 1);

                if (item->GetSocket(KILLED_NUMBER_SOCKET) == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                {
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                }
            }
            else if (0 == Hunter_Level)
            {
                item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
            }
        }
    }
O zaman else if'i kullanabilirsin.
Ayrıca şu kısmın hiç bir işlevi yok:
C++:
            if (Hunter_Level > 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                return
            }

7 ye kadar olan bir sıralama için 7 den büyükse diye bir şart koşulamaz.
 
O zaman else if'i kullanabilirsin.
Ayrıca şu kısmın hiç bir işlevi yok:
C++:
            if (Hunter_Level > 7)//7 seviye var. yeni seviye eklerseniz 7 yi arttırın
            {
                return
            }

7 ye kadar olan bir sıralama için 7 den büyükse diye bir şart koşulamaz.
7 level var ama en sonda +1 daha ekleyip 8 yapıyor ve bitiyor. bu if sorgusunu max seviye olduğunda diğer if sorgularını yapmasın diye koydum. mantıksızmı olmuş?
 
7 level var ama en sonda +1 daha ekleyip 8 yapıyor ve bitiyor. bu if sorgusunu max seviye olduğunda diğer if sorgularını yapmasın diye koydum. mantıksızmı olmuş?
Eğer 8 oluyorsa problem yok o zaman. 7 den büyük olduğu zaman işlemi durdurur.
 
aldığım bazı geri bildirimlerde bazı donma ve geçikme problemlerinin olduğu söylendi kodu tekrardan güncelledim kasma veya donma sorunu çözüldü ;

char_battle.cpp:
#ifdef METIN_BOSS_HUNTER
    if (pkKiller && pkKiller->IsPC() && IsStone())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_METIN);

        if (item != NULL)
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);

            if (Hunter_Level < 8)//yeni seviye eklerseniz 8 i arttırın
            {
                if (0 < Hunter_Level && Hunter_Level <= 7)//yeni seviye eklerseniz 7 yi arttırın
                {
                    item->SetSocket(KILLED_NUMBER_SOCKET, item->GetSocket(KILLED_NUMBER_SOCKET) + 1);

                    if (item->GetSocket(KILLED_NUMBER_SOCKET) == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                    {
                        item->ClearAttribute();
                        item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                        item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                        item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                        item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                    }
                }
                else if (0 == Hunter_Level)
                {
                    item->ClearAttribute();
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_METIN, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                }
            }
        }
    }

    if (pkKiller && pkKiller->IsPC() && IsBoss())
    {
        LPITEM item = pkKiller->GetWear(WEAR_COSTUME_HUNTER_BOSS);

        if (item != NULL)
        {
            BYTE Hunter_Level = item->GetSocket(HUNTER_LEVEL_SOCKET);

            if (Hunter_Level < 8)//yeni seviye eklerseniz 8 i arttırın
            {
                if (0 < Hunter_Level && Hunter_Level <= 7)//yeni seviye eklerseniz 7 yi arttırın
                {
                    item->SetSocket(KILLED_NUMBER_SOCKET, item->GetSocket(KILLED_NUMBER_SOCKET) + 1);

                    if (item->GetSocket(KILLED_NUMBER_SOCKET) == item->GetSocket(HUNTER_LEVEL_LIMIT_SOCKET))
                    {
                        item->ClearAttribute();
                        item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                        item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                        item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                        item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                    }
                }
                else if (0 == Hunter_Level)
                {
                    item->ClearAttribute();
                    item->SetForceAttribute( 0, APPLY_ATTBONUS_BOSS, GetHunterLevelBonusInfo(Hunter_Level));
                    item->SetSocket(HUNTER_LEVEL_SOCKET, Hunter_Level + 1);
                    item->SetSocket(KILLED_NUMBER_SOCKET, 0);
                    item->SetSocket(HUNTER_LEVEL_LIMIT_SOCKET, GetHunterLevelInfo(Hunter_Level + 1));
                }
            }
        }
    }
#endif
 
@TheAdmin33
1. metin geç patlayınca 2 kere sayma olayı var sanırım.
2. metin kesince boss tılsımına da sayıyor. bu olay boss kesince olmuyor.
@Kaiser

 
Son düzenleme:
Geri
Üst