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

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 47

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba,

Zamanında yabancı bir forumda komut aracılığıyla src üzerinden item düzenleme konusunu görmüş ve denemiştim. (Maalesef, konu sahibini hatırlamıyorum; bileniniz varsa yorumda belirtebilir.)

Bu yöntem sorunsuz çalışıyor, ancak en büyük dezavantajı komutun zahmetli olmasıydı. Bu nedenle, pratiklik açısından tanıdık bir Python efsun botunu düzenleyerek bu amaç için kullanılabilir hale getirdim. Çok detayına girmedim, fakat mevcut hali ile testleriniz için kullanabilirsiniz. En nihayetinde, üstüne çok düşülmesi gerekmeyen bir sistem. Bu yüzden dosya ve fonksiyon isimlerini değiştirmek gibi detaylara girmedim.

Bu küçük sistem, sadece meraklı geliştiriciler ve geliştirme süreci amacıyla hazırlanmıştır. İsterseniz daha da geliştirip kullanabilirsiniz; bu tercihe bağlıdır.


Sistemin Özellikleri Kısaca:
  • <li data-xf-list-type="ul">
    GM Karakterler İçin: Sistem sadece GM (Game Master) karakterleri tarafından kullanılabilir.
    <li data-xf-list-type="ul">
    Item Efsun İşlemleri: Sürüklenen item için efsun değiştirme veya bozma işlevleri bulunmaz. Sadece sürüklenen itemin vnum değerini alır ve o vnum ile yeni bir item oluşturur. Örneğin, +3 olan bir itemi sürüklerseniz, oluşacak olan yeni item de +3 olacaktır.
    <li data-xf-list-type="ul">
    Bonus Oranları: Bonus oranları maksimum 32767 ile sınırlıdır. Bu sınırı aşmamak koşuluyla dilediğiniz değeri kullanabilirsiniz.
    <li data-xf-list-type="ul">
    Bot İşlevleri ve Efsun İşlemleri: Python dosyasında bot işlevleri ve efsunlarla ilgili diğer işlemler kaldırılmıştır.
    <li data-xf-list-type="ul">
    Sekme Çokluğu: Birden fazla item sürükleyip, her item için farklı efsunlar belirleyerek her birini ayrı ayrı oluşturabilirsiniz.
    <li data-xf-list-type="ul">
    Tekrar Eklenemezlik: Aynı vnum’a sahip itemler tekrar sürüklenip eklenemez. Aynı itemden birden fazla oluşturmak isterseniz, item oluşturma butonuna 2 veya daha fazla defa tıklarsınız.
    <li data-xf-list-type="ul">
    GUI Düzenlemeleri: GUI (Grafik Kullanıcı Arayüzü) ile ilgili bazı küçük buglar giderilmiştir.
Bu sistemin pratik kullanımını ve özelliklerini göz önünde bulundurarak, geliştirme sürecinde faydalı buluyorum. Eğer üzerine daha fazla geliştirme yapıp kullanmak ister, detaylandırmak isterseniz, bu tamamen sizin tercihinize kalmış.




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 &lt;iostream&gt; #include &lt;vector&gt; #include &lt;string&gt; void split(const std::string&amp; s, char delim, std::vector&lt;std::string&gt;&amp; 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 &gt;         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "/create_item &lt;cod_item&gt; &lt;b1:v1,b2:v2,b3:v3,b4:v4,b5:v5&gt;");         return;     }     if (bonus[(strlen(bonus)-1)] == ',')     {         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Eksik veri girildi. Kontrol edin.");         return;     }     if (bonus[(strlen(bonus)-1)] == ':')     {         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Bonus ve deger arasinda eksik var.");         return;     }     if (strstr(bonus, ":") == NULL)     {         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Bonus ve deger arasinda eksik var.");         return;     }     if (strstr(bonus, ",") == NULL) {         ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Tamamlandi");         int vnum=0;         str_to_number(vnum, item);         LPITEM i = ITEM_MANAGER::instance().CreateItem(vnum);         if (!i) {             ch-&gt;ChatPacket(CHAT_TYPE_INFO, "");             ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Bu item mevcut degil.");             return;         }         int bonus_vnum=0;         int bonus_value=0;         std::vector&lt;std::string&gt; 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-&gt;SetForceAttribute(0, bonus_vnum, bonus_value);         i-&gt;SetSocket(0, 1);         int inventario = ch-&gt;GetEmptyInventory(i-&gt;GetSize());         if (inventario != -1)         {             i-&gt;AddToCharacter(ch, TItemPos(INVENTORY, inventario));         }else{             M2_DESTROY_ITEM(i);             ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Envanterde yeterli alan yok!");         }     }else{         std::vector&lt;std::string&gt; bonus1;         split(std::string(bonus), ',', bonus1);         if (bonus1.size()&gt;0)         {             ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Tamamlandi!", (int)bonus1.size());             if (countChars(bonus, ':') != (int)bonus1.size()) {                 ch-&gt;ChatPacket(CHAT_TYPE_INFO, "");                 ch-&gt;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-&gt;ChatPacket(CHAT_TYPE_INFO, "Bu item mevcut degil.");                 return;             }             int b_size=bonus1.size();             if (bonus1.size()&gt;6) b_size=7;             int bonus_vnum=0;             int bonus_value=0;             for (int n=0; n&lt;b_size; n++) {                 std::vector&lt;std::string&gt; 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-&gt;SetForceAttribute(n, bonus_vnum, bonus_value);             }             i-&gt;SetSocket(0, 1);             int inventario = ch-&gt;GetEmptyInventory(i-&gt;GetSize());             if (inventario != -1)             {                 i-&gt;AddToCharacter(ch, TItemPos(INVENTORY, inventario));             }             else             {                 M2_DESTROY_ITEM(i);                 ch-&gt;ChatPacket(CHAT_TYPE_INFO, "Envanterde yeterli alan yok.");             }         }     } } // CREATE_ITEM_END


game. anlatımını kendi dosyanızın uygunluğuna göre değiştirin.
root/ga#includeude 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.
Metin2 Oyunu İçin GM Yetkisiyle Efsun İtem Oluşturma Rehberi (C++ ve Python Kullanımı)

Metin2 özel sunucularında, sunucu yöneticileri (GM) tarafından oyun içi efsun itemleri oluşturmak hem oyun dengesini korumak hem de test süreçlerini hızlandırmak açısından kritik öneme sahiptir. Bu rehberde, C++ backend sistemleri ve Python GUI arayüzleri kullanarak hem Edit modda hem de normal oyuncu modunda efsun itemleri nasıl oluşturulacağını detaylıca ele alacağız. Metin2 Lobby olarak, Metin2 özel sunucu geliştirme sürecinde size rehberlik ediyoruz.

C++ Backend ile Efsun Item Oluşturma

Metin2 server source (src) dosyalarında, oyun içi item oluşturma işlemleri genellikle game core kısmında C++ ile tanımlanır. Efsun itemleri oluşturmak için, GM komutları üzerinden belirli item ID’leri, bonuslar ve rastgele özellikler atanabilir. Örneğin, db core tarafında item veritabanına eklenecek özel item tanımlamaları ile birlikte, game server programming kısmında bu itemlerin nasıl üretileceği kodlanmalıdır.

Özel sunucularda efsun itemleri genellikle pack dosyalarına özel olarak eklenir. Bu itemlerin doğru çalışması için UIscript ve client src uyumları da önemlidir. GM komutları ile item üretiminde, C++ üzerinde tanımlanan item sınıfları ve bonus sistemleri aktif rol oynar. Martysama gibi geliştiricilerin katkılarıyla, birçok Metin2 geliştirici topluluğu bu işlemleri kolaylaştıran sistemler geliştirmiştir.

Python GUI ile GM Panelinden Efsun Item Üretimi

Python dili, özellikle Metin2 özel sunucularında GM panel ve yönetim sistemleri için tercih edilir. Py GUI ve UIscript kullanarak, kullanıcı dostu arayüzler üzerinden GM yetkileriyle efsun item üretimi yapılabilmektedir. Bu sayede, sunucu yöneticileri doğrudan oyun içi komutları kullanmak yerine, görsel bir arayüz üzerinden item oluşturabilir.

Py root dizininde tanımlanan Python scriptleri, efsun item üretimini otomatikleştirebilir. Örneğin, bir GM panelinde, item ID, efsun seviyesi, bonus değerleri gibi alanlar girildiğinde, sistem bu bilgileri C++ backend’e iletir ve oyun içine item üretir. Bu tür sistemler, Metin2 lobby platformunda sıkça kullanılan gelişmiş yönetim araçlarındandır.

Edit Mod ve Normal Mod Farklılıkları

Edit mod, Metin2 geliştiricilerinin test yapabilmeleri için özel olarak tasarlanmış bir moddur. Bu modda, GM yetkileriyle efsun itemler daha serbestçe üretilebilir. Edit modda, item sınırlamaları ve dengeleri genellikle devre dışı bırakılır. Normal modda ise item üretimi oyun dengesi açısından sınırlıdır. Ancak, GM komutları veya Python GUI sistemleri ile normal modda da sınırlı da olsa efsun item üretimi mümkün olabilir.

Metin2 compile işlemi sırasında, efsun item sistemleri doğru entegre edilmelidir. Bu sistemler hem auth hem de game sunucularında uyumlu çalışmalıdır. Aksi takdirde, item üretimi sırasında hata alınabilir veya itemler doğru şekilde oyun içine yansımaz.

Sonuç

Metin2 özel sunucularında efsun item üretimi, hem C++ sistem bilgisi hem de Python GUI programlama becerisi gerektiren karmaşık bir iştir. Edit modda test yaparken dahi, doğru item sınıfları, bonus sistemleri ve sunucu dengesi göz önünde bulundurulmalıdır. Metin2 Lobby olarak, bu konularda size destek olacak kaynaklar sunmaya devam ediyoruz.


Creating Enchanted Items In-Game For Metin2 With GM Permissions (Using C++ And Python)

In Metin2 private servers, creating enchanted items within the game by administrators (GMs) is crucial for maintaining game balance and accelerating testing processes. This guide will detail how to create enchanted items in both Edit mode and normal player mode using C++ backend systems and Python GUI interfaces. As Metin2 Lobby, we are here to assist you throughout your journey in Metin2 private server development.

Creating Enchanted Items with C++ Backend

Within Metin2 server source files, in-game item creation operations are typically defined in the game core section using C++. To generate enchanted items, specific item IDs, bonuses, and random attributes can be assigned via GM commands. For instance, special item definitions added to the item database on the db core side must be coded to be generated within the game through game server programming.

Enchanted items in private servers are usually added to pack files. For these items to function properly, compatibility with UIscript and client src is essential. When producing items via GM commands, the item classes and bonus systems defined in C++ play a critical role. Thanks to contributors like Martysama, many Metin2 developer communities have developed systems that simplify these processes.

Generating Enchanted Items From GM Panel Using Python GUI

The Python language is preferred for GM panels and management systems in Metin2 private servers. Using Py GUI and UIscript, administrators can generate enchanted items through visual interfaces instead of relying solely on in-game commands. This allows server managers to create items directly from user-friendly panels.

Python scripts defined under the Py root directory can automate the generation of enchanted items. For example, when fields such as item ID, enchantment level, and bonus values are entered into a GM panel, the system sends this information to the C++ backend and creates the item in-game. Such systems are commonly used advanced management tools within the Metin2 lobby platform.

Differences Between Edit Mode and Normal Mode

Edit mode is a specially designed mode for Metin2 developers to perform tests. Within this mode, enchanted items can be created more freely using GM permissions. Restrictions and balances related to items are generally disabled in Edit mode. In normal mode, however, item creation is limited to maintain game balance. Nevertheless, enchanted item creation is still possible in normal mode through GM commands or Python GUI systems, albeit with restrictions.

During the Metin2 compile process, enchanted item systems must be properly integrated. These systems need to operate seamlessly across both auth and game servers. Otherwise, errors may occur during item creation, or items may not appear correctly in the game.

Conclusion

Creating enchanted items in Metin2 private servers is a complex task requiring both C++ system knowledge and Python GUI programming skills. Even while testing in Edit mode, correct item classes, bonus systems, and game balance must be considered. As Metin2 Lobby, we continue providing resources to support you in these topics.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt