MG Yaşı
2 Ay 1 Gün
Katılım
2 Şub 2026
Konular
224
Mesajlar
363
Tepkime puanı
54
Puan
53
Konum
İstanbul
Selamlar, bir süre önce yabancı bir platformda, komut yardımıyla doğrudan src üzerinden item düzenleme yapılabildiğine dair bir içerikle karşılaşmış ve bunu test etme fırsatı bulmuştum. (Orijinal paylaşım sahibini hatırlamıyorum; bilen varsa belirtirse iyi olur.)

Sistem sorunsuz şekilde çalışıyordu fakat en büyük sıkıntı, bu işlemi gerçekleştirmek için girilmesi gereken komutların oldukça uğraştırıcı olmasıydı. Bu durumu daha kullanışlı hale getirmek adına, Python tarafında çoğunuzun aşina olduğu bir efsun botunu düzenleyerek bu amaca uygun bir yapıya dönüştürdüm. Çok derinlemesine düzenlemeler yapmadım ancak mevcut haliyle test edip değerlendirebilirsiniz. Zaten kapsamlı bir altyapıdan ziyade, geliştirme sürecinde iş kolaylaştırması amacıyla hazırlanmış basit bir yardımcı sistemdir. Bu yüzden dosya ya da fonksiyon isimlerini değiştirme gibi ekstra işlemlerle uğraşmadım.

Bu mini araç, özellikle files geliştirme sürecinde ilgilenen geliştiricilere yöneliktir. Dilerseniz daha da geliştirip kendi ihtiyaçlarınıza göre uyarlamanız tamamen size kalmış.

Sistemin öne çıkan özellikleri:

  • Yalnızca GM yetkisine sahip karakterler tarafından kullanılabilir.
  • Sürükleyip bıraktığınız item üzerinde efsun değiştirme veya kaldırma gibi işlemler uygulanmaz. Sistem sadece ilgili itemin vnum bilgisini alır ve bu değere göre yeni bir item üretir. Örneğin, +3 seviyesindeki bir item sürüklerseniz, oluşturulan yeni item da +3 olacaktır.
  • Bonus değerleri için üst sınır 32767 olarak belirlenmiştir. Bu limite kadar istediğiniz oranları girebilirsiniz.
  • Python dosyasından bot fonksiyonları ve efsunlara dair diğer işlemler çıkarılmıştır.
  • Sekmeli yapı korunmuştur. Birden fazla item ekleyip her biri için farklı bonuslar tanımlayarak ayrı ayrı üretim yapabilirsiniz.
  • Aynı vnum değerine sahip bir item yeniden eklenemez. Aynı itemden birden fazla oluşturmak isterseniz, oluşturma butonuna birden fazla kez basmanız yeterlidir.
  • Arayüzle ilgili bazı küçük hatalar düzeltilmiştir.


1771009087378.png


Anlatım
cmd.cpp açın ve şunu bulun:
Kod:
ACMD(do_item);
Altına ekleyin:
Kod:
ACMD(do_create_item);
Tekrar şu kodu bulun:
Kod:
{ "item",        do_item,        0,            POS_DEAD,    GM_GOD        },
Altına ekleyin:
Kod:
{"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:
Kod:
// 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:


Kod:
ACMD(do_item);
{
    ...
}


Altına ekleyin:


Kod:
// 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:


Kod:
onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)


Altına ekleyin:


Kod:
onPressKeyDict[app.DIK_F5]    = lambda : self.OpenItemCreator()


Dosyanın en altına ekleyin:


Kod:
def OpenItemCreator(self):
        import aiSwitchbot
        creator = aiSwitchbot.Bot()
        creator.Show()


Son olarak verdiğim .py dosyasını root içine atın.

 
Moderatör tarafında düzenlendi:
Geri
Üst