[C++,PY] Official Pet Sisteminiz İçin Slot Effect Ekleme

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

Admin

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

Pythonplayer.cpp açılır ve aratılır.

Kod:
void CPythonPlayer::Clear()

kod bloğunun içine , en altına eklenir.

Kod:
ClearActivePet();

aynı kod bloğunun altına eklenir.

Kod:
DWORD  CPythonPlayer::GetActivePetID() {     return m_dwActivePetID; } DWORD  CPythonPlayer::GetActivePetItemVNum() {     return m_dwActivePetVnum; } void  CPythonPlayer::ClearActivePet() {     m_dwActivePetVnum = 0;     m_dwActivePetID = 0; } void  CPythonPlayer::SetActivePetItem(DWORD id, DWORD vnum) {     m_dwActivePetID = id;     m_dwActivePetVnum = vnum; }

Pythonplayer.h açılır ve aratılır.

Kod:
bool    IsEquipItemInSlot(TItemPos iSlotIndex);

altına eklenir.

Kod:
DWORD    GetActivePetID();         DWORD    GetActivePetItemVNum();         void    SetActivePetItem(DWORD id,  DWORD vnum);         void    ClearActivePet();

birdaha aratılır

Kod:
DWORD                    m_dwPlayTime;

altına eklenilir.

Kod:
DWORD                    m_dwActivePetID;         DWORD                    m_dwActivePetVnum;

Pythonplayermodule.cpp açılır ve aratılır

Kod:
PyObject* playerSendDragonSoulRefine(PyObject* poSelf, PyObject* poArgs)

Kod bloğu altına eklenir.

Kod:
PyObject* playerSetActivePetItem(PyObject* poSelf, PyObject* poArgs) {     int id, vnum;     if (!PyTuple_GetInteger(poArgs, 0, &id))         return Py_BuildException();     if (!PyTuple_GetInteger(poArgs, 1, &vnum))         return Py_BuildException();     CPythonPlayer::Instance().SetActivePetItem((DWORD)id, (DWORD)vnum);     return Py_BuildNone(); } PyObject* playerGetActivePetItemId(PyObject* poSelf, PyObject* poArgs) {     return Py_BuildValue("i", CPythonPlayer::Instance().GetActivePetID()); } PyObject* playerGetActivePetItemVNum(PyObject* poSelf, PyObject* poArgs) {     return Py_BuildValue("i", CPythonPlayer::Instance().GetActivePetItemVNum()); }

tekrar aratılır.

Kod:
{ "SendDragonSoulRefine",        playerSendDragonSoulRefine,            METH_VARARGS },

altına eklenilir.

Kod:
{ "SetActivePetItem",            playerSetActivePetItem,                METH_VARARGS },         { "GetActivePetItemId",            playerGetActivePetItemId,            METH_VARARGS },         { "GetActivePetItemVNum",        playerGetActivePetItemVNum,            METH_VARARGS },


Sourcelik işlemler bitti , root/constinfo.py açılır ve en altına eklenilir.

Kod:
def IS_PET_ITEM(itemVnum):     if itemVnum == 0:         return 0     if itemVnum >= 55701 and itemVnum <= 55706:         return 1     return 0

root/uiinventory.py açılır ve aratılır

Kod:
def SetInventoryPage(self, page):         self.inventoryTab[self.inventoryPageIndex].SetUp()         self.inventoryPageIndex = page         self.inventoryTab[self.inventoryPageIndex].Down()         self.RefreshBagSlotWindow()     def SetEquipmentPage(self, page):         self.equipmentPageIndex = page         self.equipmentTab[1-page].SetUp()         self.RefreshEquipSlotWindow()

Üstüne eklenilir.

Kod:
def __ActivePetHighlightSlot(self, slotIndex):         petID = player.GetActivePetItemId()         itemPetID = player.GetItemMetinSocket(player.INVENTORY, slotIndex, 0)         tempSlotPos = slotIndex         while tempSlotPos >= player.INVENTORY_PAGE_SIZE:             tempSlotPos -= player.INVENTORY_PAGE_SIZE         if petID == itemPetID and petID != 0:             self.wndItem.ActivateSlot(tempSlotPos)         else:             self.wndItem.DeactivateSlot(tempSlotPos)

bulunur.
Kod:
self.wndItem.RefreshSlot()

üstüne eklenir.
Kod:
if constInfo.IS_PET_ITEM(itemVnum):                 self.__ActivePetHighlightSlot(slotNumber)

Official Pet Sisteminiz İçin Slot Effect Ekleme

Metin2 özel sunucularında geliştirme yaparken, oyuncu deneyimini artırmak adına bazı görsel efektler ve sistemsel özellikler eklemek oldukça değerlidir. Bu yazıda, Official Pet Sistemi üzerine slot efekti ekleme sürecini detaylıca ele alacağız. Bu işlem hem C++ hem de Python[/COORD] tarafında yapılabilecek küçük ama etkili bir geliştirmedir.

Neden Slot Effect Eklenmeli?
Pet sistemleri, Metin2 oyunlarında uzun zamandır popüler olan bir özelliktir. Oyuncular petlerini güçlendirerek, savaşlarda destek alabilirler. Ancak, pet slotları genellikle sade bir şekilde gösterilir. Burada devreye slot efekti girer. Bu efekt sayesinde pet slotunda bonus özellikler aktif edilebilir, bu da oyuncunun petini daha güçlü hissetmesini sağlar. Örneğin, tüm slotlar dolduğunda +%20攻击力 veya +%10 생명력 gibi bonuslar verilebilir.

C++ Tarafında Uygulama
Öncelikle, game core dosyasında bulunan pet sistemine erişim sağlanmalıdır. Pet slotları ile ilgili veriler genellikle pet_data sınıfı altında tutulur. Yeni bir fonksiyon tanımlanarak, slotların doluluk durumuna göre bonus efektler aktif edilebilir. Bu fonksiyon, pet bilgileri güncellenirken çağrılır.

Örnek olarak:
Kod:
void ApplySlotEffects(LPCHARACTER ch, LPITEM pet_item) { if (IsAllSlotsFilled(pet_item)) { ch->AddAffect(AFFECT_SLOT_BONUS, POINT_ATTBONUS_HR, 20); // +%20攻击力 } }


Python Tarafında Uygulama
Python tarafında, genellikle uiscript ve py root üzerinde değişiklik yapılır. Pet UI dosyasında slot efektlerini görsel olarak göstermek için bir ekran bileşeni oluşturulabilir. Ayrıca, slot sayısı arttıkça efektlerin dinamik olarak değişmesi sağlanabilir.

Örnek olarak:
Kod:
def UpdateSlotEffect(self): if self.pet_slot_count == 4: self.AddBonus(ATTACK_BONUS, 20)


Not: Bu işlemler sırasında source edit yaparken dikkatli olunmalıdır. Yanlış bir değişiklik sunucunuzun kararsız çalışmasına sebep olabilir. Metin2 compile işleminden sonra mutlaka test edilmelidir.

Bonus Efekt Tanımı
Bonus efektler genellikle db core üzerinden tanımlanır. Bu tanım, hem auth hem de game sunucusu tarafından okunabilir. Bonuslar için özel ID'ler tanımlanmalı ve bu ID'ler affect_info.txt gibi dosyalarda belirtilmelidir.

Güvenlik ve Performans
Pet slot efekti eklerken performans kaybı yaşamamak adına efektlerin sadece gerekli zamanlarda hesaplanması sağlanmalıdır. Ayrıca, güvenlik açısından bonus değerlerinin doğrulanması önemlidir. Aksi takdirde exploit riski oluşabilir.

Bu sistem, Metin2Lobby gibi platformlarda da sıklıkla karşılaşılan gelişmiş sistemlerden biridir. Geliştiriciler için örnek kaynaklar ve martysama gibi paylaşımcılar, bu konuda önemli destek sağlar.


Adding Slot Effects for Your Official Pet System

When developing on Metin2 private servers, adding visual effects and system features can significantly enhance the player experience. In this article, we will detail how to add slot effects to the Official Pet System. This enhancement can be implemented on both C++ and Python sides, providing a small but impactful addition to gameplay.

Why Add Slot Effects?
Pet systems have long been a popular feature in Metin2 games. Players can strengthen their pets to gain support during battles. However, pet slots are often displayed in a plain way. That's where slot effects come into play. With these effects, bonus attributes can be activated when slots are filled, making players feel more powerful with their pets. For example, +%20 attack power or +%10 HP could be granted when all slots are filled.

Implementation in C++
Firstly, access to the pet system within the game core file must be obtained. Pet slot-related data is usually stored under the pet_data class. A new function can be defined to activate bonus effects based on the fill status of the slots. This function is called whenever pet information is updated.

As an example:
Kod:
void ApplySlotEffects(LPCHARACTER ch, LPITEM pet_item) { if (IsAllSlotsFilled(pet_item)) { ch->AddAffect(AFFECT_SLOT_BONUS, POINT_ATTBONUS_HR, 20); // +%20 Attack Power } }


Implementation in Python
In Python, modifications are typically made to uiscript and py root files. A UI component can be created to visually display slot effects in the pet interface. Additionally, effects can dynamically change as more slots are filled.

As an example:
Kod:
def UpdateSlotEffect(self): if self.pet_slot_count == 4: self.AddBonus(ATTACK_BONUS, 20)


Note: Be cautious when performing source edit; incorrect changes may cause your server to become unstable. After Metin2 compile, always ensure thorough testing.

Defining Bonus Effects
Bonus effects are typically defined via the db core. These definitions should be readable by both the auth and game servers. IDs should be assigned for bonuses and noted in files like affect_info.txt.

Security and Performance
To avoid performance issues when adding pet slot effects, ensure that effects are calculated only when necessary. Additionally, for security reasons, bonus values should be validated to prevent potential exploits.

This system is commonly seen on platforms like Metin2Lobby. Developers and contributors such as martysama provide significant support in this area.
 

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

Benzer konular

Geri
Üst Alt