[C++ & Py]-[GM] Oyun İçi (Edit-Normal) Efsun İtem Oluşturma

Kaiser

𝗝𝗮𝗺𝗮𝗶𝘀 𝗩𝘂
Admin
Geliştirici
Yardımsever Üye
Mesaj
3.776
Çözümler
358
Beğeni
3.692
Puan
1.849
Ticaret Puanı
0
Merhaba, zamanında yabancı bir forumda komut aracılığı ile src üzerinden edit item yapma konusunu görmüştüm ve denemiştim. (Sahibini hatırlamıyorum, bileniniz varsa yorumda belirtebilir.)

Sorunsuz çalışıyor, ancak bunun tek ve en büyük dezavantajı, bu işlem için yazılması gereken komutun zahmetli olmasıydı. Bende pratik olması açısından python taraflı hepinizin bildiği bir efsun botunu düzenleyerek bu amaç için kullanılacak hale getirmiştim. Çok detayına girmedim, fakat şu an ki hali ile testleriniz için kullanabilirsiniz. Çok da üstüne düşülmesi gereken bir sistem sayılmaz. O yüzden dosya/fonksiyon isimlerini falan değiştirme gibi fantezilere girişmedim.
Bu küçük sistem sadece meraklısı olan geliştiriciler için, files geliştirme süreci içindir. Eğer daha da geliştirip kullanmak isterseniz, o da bir tercih.

Sistemin özellikleri kısaca:
  • - Sadece GM karakterler kullanabilir.
  • - Sürüklenen item için: efsun değiştirme-bozma gibi işlemler yapmaz. Sadece ve sadece sürüklenen itemin vnum değerini alır ve o vnum ile yeni item oluşturur. Dolayısıyla giyili vaziyette olan bir itemi de rahatlıkla sürükleyebilirsiniz. Eğer sürüklediğiniz item +3 ise, oluşacak olan item de +3 olacaktır.
  • - Bonus oranları maksimum sınırı 32767'dir. Bu sınırı aşmayacak şekilde dilediğiniz değeri kullanabilirsiniz.
  • - Python dosyasında bot işlevleleri ve efsunlarla alakalı diğer işlemler kaldırıldı.
  • - Sekme çokluğu korundu, yani birden fazla item sürükleyip, her item için farklı efsunlar belirleyip her birini ayrı ayrı oluşturabilirsiniz.
  • - Aynı vnum'a sahip itemler sürüklenip tekrar eklenemez. Aynı itemden birden fazla oluşturmak istiyorsanız item oluşturma butonuna 2+ defa tıklarsınız.
  • - GUI ile alakalı bazı küçük buglar giderildi.

Kısa bir tanıtım videosu:



Anlatım:
cmd.cpp açın ve şunu bulun:
C++:
ACMD(do_item);

Altına ekleyin:
C++:
ACMD(do_create_item);

Tekrar şu kodu bulun:
C++:
{ "item",        do_item,        0,            POS_DEAD,    GM_GOD        },

Altına ekleyin:
C++:
{"create_item",        do_create_item,        0,            POS_DEAD,    GM_IMPLEMENTOR        },

cmd_gm.cpp dosyasını açın ve #include satırlarının altına ekleyin:
C++:
// CREATE_ITEM_START
#include <iostream>
#include <vector>
#include <string>
void split(const std::string& s, char delim, std::vector<std::string>& v) {
    int i = 0;
    int pos = s.find(delim);
    while (pos != std::string::npos)
    {
        v.push_back(s.substr(i, pos-i));
        i = ++pos;
        pos = s.find(delim, pos);
        if (pos == std::string::npos) v.push_back(s.substr(i, s.length()));
    }
}

int countChars(char* s, char c)
{
    return *s == '\0' ? 0 : countChars( s + 1, c ) + (*s == c);
}
// CREATE_ITEM_END


Bu fonksiyonu bulun:
C++:
ACMD(do_item);
{
    ...
}

Altına ekleyin:
C++:
// CREATE_ITEM_START
ACMD(do_create_item)
{
    char item[256];
    char bonus[1024];
    two_arguments(argument, item, sizeof(item), bonus, sizeof(bonus));
    if (!*item || !*bonus)
    {
        // HATA - Kullanim ornegi >
        ch->ChatPacket(CHAT_TYPE_INFO, "/create_item <cod_item> <b1:v1,b2:v2,b3:v3,b4:v4,b5:v5>");
        return;
    }
    if (bonus[(strlen(bonus)-1)] == ',')
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Eksik veri girildi. Kontrol edin.");
        return;
    }
    if (bonus[(strlen(bonus)-1)] == ':')
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bonus ve deger arasinda eksik var.");
        return;
    }
    if (strstr(bonus, ":") == NULL)
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bonus ve deger arasinda eksik var.");
        return;
    }
    if (strstr(bonus, ",") == NULL) {
        ch->ChatPacket(CHAT_TYPE_INFO, "Tamamlandi");
        int vnum=0;
        str_to_number(vnum, item);
        LPITEM i = ITEM_MANAGER::instance().CreateItem(vnum);
        if (!i) {
            ch->ChatPacket(CHAT_TYPE_INFO, "");
            ch->ChatPacket(CHAT_TYPE_INFO, "Bu item mevcut degil.");
            return;
        }
        int bonus_vnum=0;
        int bonus_value=0;
        std::vector<std::string> bonus2;
        split(std::string(bonus), ':', bonus2);
        str_to_number(bonus_vnum, std::string(bonus2[0]).c_str());
        str_to_number(bonus_value, std::string(bonus2[1]).c_str());
        i->SetForceAttribute(0, bonus_vnum, bonus_value);
        i->SetSocket(0, 1);
        int inventario = ch->GetEmptyInventory(i->GetSize());
        if (inventario != -1)
        {
            i->AddToCharacter(ch, TItemPos(INVENTORY, inventario));
        }else{
            M2_DESTROY_ITEM(i);
            ch->ChatPacket(CHAT_TYPE_INFO, "Envanterde yeterli alan yok!");
        }
    }else{
        std::vector<std::string> bonus1;
        split(std::string(bonus), ',', bonus1);
        if (bonus1.size()>0)
        {
            ch->ChatPacket(CHAT_TYPE_INFO, "Tamamlandi!", (int)bonus1.size());
            if (countChars(bonus, ':') != (int)bonus1.size()) {
                ch->ChatPacket(CHAT_TYPE_INFO, "");
                ch->ChatPacket(CHAT_TYPE_INFO, "Eksik veri girildi. Kontrol edin.");
                return;             
            }
            int vnum=0;
            str_to_number(vnum, item);
            LPITEM i = ITEM_MANAGER::instance().CreateItem(vnum);
            if (!i)
            {
                ch->ChatPacket(CHAT_TYPE_INFO, "Bu item mevcut degil.");
                return;
            }
            int b_size=bonus1.size();
            if (bonus1.size()>6) b_size=7;
            int bonus_vnum=0;
            int bonus_value=0;
            for (int n=0; n<b_size; n++) {
                std::vector<std::string> bonus2;
                split(std::string(bonus1[n]), ':', bonus2);
                str_to_number(bonus_vnum, std::string(bonus2[0]).c_str());
                str_to_number(bonus_value, std::string(bonus2[1]).c_str());
                i->SetForceAttribute(n, bonus_vnum, bonus_value);
            }
            i->SetSocket(0, 1);
            int inventario = ch->GetEmptyInventory(i->GetSize());
            if (inventario != -1)
            {
                i->AddToCharacter(ch, TItemPos(INVENTORY, inventario));
            }
            else
            {
                M2_DESTROY_ITEM(i);
                ch->ChatPacket(CHAT_TYPE_INFO, "Envanterde yeterli alan yok.");
            }
        }
    }
}
// CREATE_ITEM_END

game.py anlatımını kendi dosyanızın uygunluğuna göre değiştirin.
root/game.py açın ve bulun:
Python:
onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)

Altına ekleyin:
Python:
onPressKeyDict[app.DIK_F5]    = lambda : self.OpenItemCreator()

Dosyanın en altına ekleyin:
Python:
    def OpenItemCreator(self):
        import aiSwitchbot
        creator = aiSwitchbot.Bot()
        creator.Show()

Son olarak verdiğim .py dosyasını root içine atın.
Linkleri görebilmek için giriş yap veya kayıt ol.
 

Dosya Eklentileri

  • aiswitchbot.zip
    4,9 KB · Gösterim: 11
harika paylaşım bunun c++ taraflı efsun botulu guisi gelir mi :D
 
Elinize sağlık test aşaması için kullanışlı bir fikir çok hoşuma gitti şahsen, belki kodlarda değişiklikler yapılabilir isteğe göre ama fikir gayet güzel. 👏
 
harika paylaşım bunun c++ taraflı efsun botulu guisi gelir mi :D
Eğer yapıp paylaşırsan neden gelmesin :giggle:

Elinize sağlık test aşaması için kullanışlı bir fikir çok hoşuma gitti şahsen, belki kodlarda değişiklikler yapılabilir isteğe göre ama fikir gayet güzel. 👏
Teşekkür ederim, envanter doluluk kontrolü gibi basit kontroller mevcut ancak dediğim gibi fazla detayına girme gereği duymadım.
Dileyenler özelleştirip kullanabilirler. (y)
 
ben aşağıdaki helal olsun kısmına koptum sdlkmfqlkw paylaşım için teşekkürler
 
Maşallah savaşçının yüzüne nur inmiş.
1716578224709.png
 
Paylaşım için teşekkürler. Bende "Bu düzenleme mevcut değil" uyarısı verdi sebebi ne olabilir?

0527_043907.jpg
 
mevcut itemi sürükleyerek yeni efsunlusunu oluşturma değil de item yokken yani bi kod ile veya isim ile item oluşturup efsunlama yapılabilirmi
 
Geri
Üst