- Mesaj
- 4.038
- Çözümler
- 390
- Beğeni
- 4.159
- 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:
Kısa bir tanıtım videosu:
Anlatım:
cmd.cpp açın ve şunu bulun:
Altına ekleyin:
Tekrar şu kodu bulun:
Altına ekleyin:
cmd_gm.cpp dosyasını açın ve #include satırlarının altına ekleyin:
Bu fonksiyonu bulun:
Altına ekleyin:
game.py anlatımını kendi dosyanızın uygunluğuna göre değiştirin.
root/game.py açın ve bulun:
Altına ekleyin:
Dosyanın en altına ekleyin:
Son olarak verdiğim .py dosyasını root içine atın.
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.