Derece Sınırını Değiştirme & Yeni Derece Ekleme [C++ / Python]

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

Admin

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

0408_203727.jpg
[/RIGHT]

Merhaba, derece sınırını kaldırmanın yanı sıra tamamen yeni bir derece eklemeyle ilgili küçük bir eğitim.
32k'nin üzerinde yeni bir rank eklemek istiyorsak (Type) değişkenini int olarak ayarlamazsak, bu mümkün olmayacaktır.


İlk yapacağımız şey, bu sınırı kaldıralım,

Packet.h açıyoruz(SRC/GAME)

Kod:
short    sAlignment;

Yani değişkenin (Type) değeri :

Kod:
Short

değiştir

Kod:
Int


( Packet.h )

Kod:
typedef struct packet_update_char

İçinde:

Kod:
short    sAlignment;

ve şu şekilde değiştirin:

Kod:
int    sAlignment;

Ardından bu işlevi arayın:

Kod:
typedef struct packet_char_additional_info

İçinde:

Kod:
short    sAlignment;

ve şu şekilde değiştirin:

Kod:
int    sAlignment;


Şimdi aynısını düzenlememiz gerekiyor

Source_Client / Client / UserInterface / InstanceBase.cpp
Sonra bu kodu arayın:

Kod:
void CInstanceBase::SetAlignment(short sAlignment)

yukarıdaki ile aynıdır değiştir: ( short yerine int )

Ardından Source_Client / Client / UserInterface / InstanceBase.h Dosyasını arayın

Kod:
WYSZUKAJ -   short    m_sAlignment;

değiştir ( Short yerine int ) (Bu 2 kez gerçekleşir.)

Kod:
WYSZUKAJ -   void     SetAlignment(short sAlignment);

değiştir ( Short için int )


Source_Client / Client / UserInterface / NetworkActorManager.h
Bunu arayın:

Kod:
WYSZUKAJ -   void     SetAlignment(short sAlignment);

ve gelen değişim ( Short yerine int ) (Bu 2 kez gerçekleşir)


Source_Client / Client / UserInterface / Packet.h

Ara:

Kod:
short    m_sAlignment;

ve gelen değişim ( Short yerine int ) (Bu 2 kez gerçekleşir)


Source_Client / Client / UserInterface / Packet.h

Ara:

Kod:
short    sAlignment;

ve değişim ( Short yerine int ) (Bu 3 kez gerçekleşir)


Şimdi yeni bir Kademe ekleyeceğiz
/ Src / Game / ve File Char_Battle.cpp'yi aç
Şimdi arıyoruz:

Kod:
int iAlignIndex;

Burada buna benzer bir şey görüyoruz:

Kod:
if (GetRealAlignment() >= 120000)        // Kahraman         iAlignIndex = 0;     else if (GetRealAlignment() >= 80000)    // Soylu         iAlignIndex = 1;     else if (GetRealAlignment() >= 40000)    // İyi         iAlignIndex = 2;     else if (GetRealAlignment() >= 10000)    //  Arkadaşca         iAlignIndex = 3;     else if (GetRealAlignment() >= 0)        //  Tarafsız Sıra (Yani 0'da)         iAlignIndex = 4;     else if (GetRealAlignment() > -40000)    //         iAlignIndex = 5;     else if (GetRealAlignment() > -80000)    //         iAlignIndex = 6;         iAlignIndex = 8;                    //  (bu durumda 20k olan sınırı kapatır 20k)

Ve kendimiz için düzenleriz. Örneğimde şu şekilde düzenliyorum:

Kod:
if (GetRealAlignment() >= 1000000)        // Turkmmo (Yeni Sıralamam)         iAlignIndex = 0;     else if (GetRealAlignment() >= 500000)    // Replicant (Yeni Sıralamam)         iAlignIndex = 1;     else if (GetRealAlignment() >= 120000)    // Kahraman         iAlignIndex = 2;     else if (GetRealAlignment() >= 80000)    // Soylu         iAlignIndex = 3;     else if (GetRealAlignment() >= 40000)    // iyi         iAlignIndex = 4;     else if (GetRealAlignment() >= 10000)    // Arkadaşça         iAlignIndex = 5;     else if (GetRealAlignment() >= 0)                iAlignIndex = 6;     else if (GetRealAlignment() > -40000)            iAlignIndex = 7;     else if (GetRealAlignment() > -80000)            iAlignIndex = 8;     else if (GetRealAlignment() > -120000)            iAlignIndex = 9;     else if (GetRealAlignment() > -820000)    // Replicant (Yeni Negatif Sıram )         iAlignIndex = 10;     else         iAlignIndex = 11;

Zaten kendiniz için düzenleme yaptıysanız, devam edelim (aynı dosyada, Char_Battle.cpp)
Aşağıdaki kodu arıyoruz:

Kod:
if (g_iUseLocale && pkKiller->GetParty())                         {                             FPartyAlignmentCompute f(-20000, pkKiller->GetX(), pkKiller->GetY());                             pkKiller->GetParty()->ForEachOnlineMember(f);                             if (f.m_iCount == 0)                                 pkKiller->UpdateAlignment(-20000);                             else                             {                                 sys_log(0, "ALIGNMENT PARTY count %d amount %d", f.m_iCount, f.m_iAmount);                                 f.m_iStep = 1;                                 pkKiller->GetParty()->ForEachOnlineMember(f);                         }                         else                             pkKiller->UpdateAlignment(-20000);                     }                 }

burada sınırımızın olduğu yerde durumumuza giriyoruz:

Kod:
if (g_iUseLocale && pkKiller->GetParty())                         {                             FPartyAlignmentCompute f(-85000, pkKiller->GetX(), pkKiller->GetY());                             pkKiller->GetParty()->ForEachOnlineMember(f);                             if (f.m_iCount == 0)                                 pkKiller->UpdateAlignment(-85000);                             else                             {                         }                         else                             pkKiller->UpdateAlignment(-850000);                     }                 }

Sonra ara:

Kod:
m_iRealAlignment = MINMAX(-200000, m_iRealAlignment + iAmount, 200000);

Ve kendimiz için düzenleriz, benim durumumda - 85.000 ve + 100.000

Kod:
m_iRealAlignment = MINMAX(-850000, m_iRealAlignment + iAmount, 1000000);

Zaten yaptıysanız, oyununuzu derleyin


Source_Client / Client / InstanceBase.h'yi açıyoruz ve bunu arıyoruz:

Kod:
TITLE_NUM = 9,  TITLE_NONE = 4,

  • <li data-xf-list-type="ul">TITLE_NUM - Toplam Sıralar.
    TITLE_NONE - Tarafsız Sıra Numarası.
    Ve kendimize göre değiştiriyoruz

Kod:
TITLE_NUM = 12, TITLE_NONE = 6,

Şimdi Source_Client / Client / InstanceBase.cpp'ye gidiyoruz ve arıyoruz:

Kod:
UINT CInstanceBase::GetAlignmentGrade() {     if (m_sAlignment &gt;= 12000)         return 0;     else if (m_sAlignment &gt;= 8000)         return 1;     else if (m_sAlignment &gt;= 4000)         return 2;     else if (m_sAlignment &gt;= 1000)         return 3;     else if (m_sAlignment &gt;= 0)         return 4;     else if (m_sAlignment &gt; -4000)         return 5;     else if (m_sAlignment &gt; -8000)         return 6;     else if (m_sAlignment &gt; -12000)         return 7;     return 8; }



InstanceBase.cpp

Kod:
int CInstanceBase::GetAlignmentType() {     switch (GetAlignmentGrade())     {         case 0:        ------&gt; Ranga Pozytywna    // Kahraman         case 1:        ------&gt;    Ranga Pozytywna    // Soylu         case 2:        ------&gt;    Ranga Pozytywna    // İyi         case 3:        ------&gt;    Ranga Pozytywna    // Arkadaşça         {             return ALIGNMENT_TYPE_WHITE;             break;         case 8:        ------&gt;    Ranga Negatywna    // Zalim         {             return ALIGNMENT_TYPE_DARK;             break;         }     }     return ALIGNMENT_TYPE_NORMAL; }


Eklendikten sonra şöyle görünecek:

Kod:
int CInstanceBase::GetAlignmentType() {     switch (GetAlignmentGrade())     {         case 0:        ------&gt; Ranga Pozytywna    // Turkmmo (Yeni derece 2)         case 1:        ------&gt;    Ranga Pozytywna    // Replicant (Yeni derece)         case 2:        ------&gt;    Ranga Pozytywna    // Kahraman         case 3:        ------&gt;    Ranga Pozytywna    // Soylu         case 4:        ------&gt;    Ranga Pozytywna    // İyi         case 5:        ------&gt;    Ranga Pozytywna    // Arkadaşça         {             return ALIGNMENT_TYPE_WHITE;             break;         }         case 7:        ------&gt;    Ranga Negatywna    // Agresif         case 8:        ------&gt;    Ranga Negatywna    // Hileli         case 9:        ------&gt;    Ranga Negatywna    // Kötü Niyetli         case 10:        ------&gt;    Ranga Negatywna    // Zalim         case 11:        ------&gt;    Ranga Negatywna    // Turkmmo (Yeni Negatif Derece)         {             return ALIGNMENT_TYPE_DARK;             break;         }     }

Düzenlemeyi bitirdiyseniz, derleyebilirsiniz



şimdi Client / Root'a gidin ve LocaleInfo.py ve Open'ı arayın
Şimdi bunu arıyoruz:

Kod:
TITLE_NAME_LIST = ( PVP_LEVEL0, PVP_LEVEL1, PVP_LEVEL2, PVP_LEVEL3, PVP_LEVEL4, PVP_LEVEL5, PVP_LEVEL6, PVP_LEVEL7, PVP_LEVEL8, )

burada 3 yeni Rütbemizi eklemeliyiz Benim durumumda:

Kod:
( PVP_LEVEL0, PVP_LEVEL1, PVP_LEVEL2, PVP_LEVEL3, PVP_LEVEL4, PVP_LEVEL5, PVP_LEVEL6, PVP_LEVEL7, PVP_LEVEL8, PVP_LEVEL9, PVP_LEVEL10, PVP_LEVEL11, )

Kaydedin ve sonraki Dosyaya gidin, yani IntroLoading.py (Client / Root)

Bunu arıyoruz:

Kod:
## Title         TITLE_COLOR_DICT = (    colorInfo.TITLE_RGB_GOOD_4,                                 colorInfo.TITLE_RGB_GOOD_3,                                 colorInfo.TITLE_RGB_GOOD_2,                                 colorInfo.TITLE_RGB_GOOD_1,                                 colorInfo.TITLE_RGB_NORMAL,                                 colorInfo.TITLE_RGB_EVIL_1,                                 colorInfo.TITLE_RGB_EVIL_2,                                 colorInfo.TITLE_RGB_EVIL_3,                                 colorInfo.TITLE_RGB_EVIL_4,    )

Kendimiz için düzenleriz
Benim durumumda:

Kod:
## Title         TITLE_COLOR_DICT = (    colorInfo.TITLE_RGB_GOOD_6,                                 colorInfo.TITLE_RGB_GOOD_5,                                 colorInfo.TITLE_RGB_GOOD_4,                                 colorInfo.TITLE_RGB_GOOD_3,                                 colorInfo.TITLE_RGB_GOOD_2,                                 colorInfo.TITLE_RGB_GOOD_1,                                 colorInfo.TITLE_RGB_NORMAL,                                 colorInfo.TITLE_RGB_EVIL_1,                                 colorInfo.TITLE_RGB_EVIL_2,                                 colorInfo.TITLE_RGB_EVIL_3,                                 colorInfo.TITLE_RGB_EVIL_5,                                )

Kaydedin ve UiCharacter.py'ye gidin (Client / Root)
bunu arıyoruz:

Kod:
COLOR_DICT = {    0 : colorInfo.TITLE_RGB_GOOD_4,                         1 : colorInfo.TITLE_RGB_GOOD_3,                         2 : colorInfo.TITLE_RGB_GOOD_2,                         3 : colorInfo.TITLE_RGB_GOOD_1,                         4 : colorInfo.TITLE_RGB_NORMAL,                         5 : colorInfo.TITLE_RGB_EVIL_1,                         6 : colorInfo.TITLE_RGB_EVIL_2,                         7 : colorInfo.TITLE_RGB_EVIL_3,                         8 : colorInfo.TITLE_RGB_EVIL_4, }


kendimiz için düzenleriz
Benim durumumda:

Kod:
COLOR_DICT = {    0 : colorInfo.TITLE_RGB_GOOD_6,                         1 : colorInfo.TITLE_RGB_GOOD_5,                         2 : colorInfo.TITLE_RGB_GOOD_4,                         3 : colorInfo.TITLE_RGB_GOOD_3,                         4 : colorInfo.TITLE_RGB_GOOD_2,                         5 : colorInfo.TITLE_RGB_GOOD_1,                         6 : colorInfo.TITLE_RGB_NORMAL,                         7 : colorInfo.TITLE_RGB_EVIL_1,                         8 : colorInfo.TITLE_RGB_EVIL_2,                         9 : colorInfo.TITLE_RGB_EVIL_3,                         10 : colorInfo.TITLE_RGB_EVIL_4,                         11 : colorInfo.TITLE_RGB_EVIL_5,                        }


Kaydedin ve ardından şu adrese gidin: Client / Root / Locale / pl / Locale_Game.txt
ve içinde dereceleri ararız, yani:

Kod:
PVP_LEVEL0 Kahraman PVP_LEVEL1 Soylu PVP_LEVEL2 İyi PVP_LEVEL3 Arkadaşça PVP_LEVEL4 Tarafsız PVP_LEVEL5 Agresif PVP_LEVEL6 Hileli PVP_LEVEL7 Kötü Niyetli PVP_LEVEL8 Zalim

kendimiz için düzenleriz, benim durumumda:

Kod:
PVP_LEVEL0 Turkmmo (Yeni Derece) PVP_LEVEL1 Replicant (Yeni Derece) PVP_LEVEL2 Kahraman PVP_LEVEL3 Soylu PVP_LEVEL4 İyi PVP_LEVEL5 Arkadaşça PVP_LEVEL6 Tarafsız PVP_LEVEL7 Agresif PVP_LEVEL8 Hileli PVP_LEVEL9 Kötü Niyetli PVP_LEVEL10 Zalim PVP_LEVEL11 Turkmmo (Yeni Negatif Derece)


Derece renklerini düzenleme:

Client / Root ve ColorInfo.py açılır
ve böyle bir şey var:

Kod:
TITLE_RGB_GOOD_4 = (  0, 204, 255) TITLE_RGB_GOOD_3 = (  0, 144, 255) TITLE_RGB_GOOD_2 = ( 92, 110, 255) TITLE_RGB_GOOD_1 = (155, 155, 255) TITLE_RGB_NORMAL = (255, 255, 255) TITLE_RGB_EVIL_1 = (207, 117,   0) TITLE_RGB_EVIL_2 = (235,  83,   0) TITLE_RGB_EVIL_3 = (227,   0,   0) TITLE_RGB_EVIL_4 = (255,   0,   0)

Kendimiz için düzenleriz, benim durumumda:

Kod:
TITLE_RGB_GOOD_6 = (  0, 204, 255) // Yeni Sıra 2  TITLE_RGB_GOOD_5 = (  0, 204, 255) // Yeni Sıra 1  TITLE_RGB_GOOD_4 = (  0, 204, 255) // Kahraman TITLE_RGB_GOOD_3 = (  0, 144, 255) // Soylu TITLE_RGB_GOOD_2 = ( 92, 110, 255) // İyi TITLE_RGB_GOOD_1 = (155, 155, 255) // Arkadaşça TITLE_RGB_NORMAL = (255, 255, 255) // Tarafsız TITLE_RGB_EVIL_1 = (207, 117,   0) // Agresif  TITLE_RGB_EVIL_2 = (235,  83,   0) // Hileli TITLE_RGB_EVIL_3 = (227,   0,   0) // Kötü Niyetli TITLE_RGB_EVIL_4 = (255,   0,   0) // Zalim TITLE_RGB_EVIL_5 = (255,   0,   0) // Turkmmo (Yeni Negatif Derece)


Metin2'de Derece Sınırını Değiştirme ve Yeni Derece Ekleme

Metin2 özel sunucularında oyuncuların ilerlemesini desteklemek ve daha fazla oyun içi motivasyon yaratmak için derece sınırlarının genişletilmesi veya yeni derecelerin eklenmesi oldukça yaygın bir geliştirme pratiğidir. Bu işlem genellikle C++ ve Python[/CODE] tabanlı sistemler üzerinden yapılır. Bu rehberde hem game server hem de client tarafında yapılması gereken adımları detaylıca ele alacağız.

1. Derece Sınırı Nedir?
Metin2'de her karakter belirli bir dereceye kadar ilerleyebilir. Varsayılan sistemde bu sınır genellikle 120 ile sınırlıdır. Ancak bazı özel sunucularda bu değer 130, 150 hatta daha yüksek seviyelere çıkarılabilmektedir. Bu işlem için hem sunucu tarafında hem de istemci tarafında değişiklikler yapılması gerekir.

2. C++ Tarafında Derece Sınırı Değiştirme
Sunucu tarafında derece sınırını değiştirmek için öncelikle game server source code üzerinde çalışmanız gerekir. Bu kodlar genellikle C++ dilinde yazılmıştır. Örnek olarak:

- char.cpp dosyasında karakter seviyesiyle ilgili kontrol edilen alanlar vardır. Burada max level değerleri değiştirilebilir.
- constants.h veya benzeri sabit tanımlamaların yapıldığı dosyalarda da MAX_LEVEL gibi sabitler yer alabilir. Bu değerler yeni seviyeye göre güncellenmelidir.

3. Python Tarafında UI ve İstemci Ayarları
İstemci tarafında derece bilgileri genellikle Python ile yazılmış UI sistemleri tarafından yönetilir. Bu nedenle uiscript dosyalarında seviye listeleri, progress bar aralıkları ve diğer görsel öğelerin güncellenmesi gerekir.

Py Root klasörlerinde bulunan character.py veya player.py gibi dosyalarda karakterin mevcut seviyesi gösterilir. Bu dosyaların içerdiği limit kontrolleri yeni seviyeye göre yeniden düzenlenmelidir.

4. Yeni Derece Ekleme
Yeni dereceler eklemek, sadece bir sınır değeri değiştirmekten daha karmaşık olabilir. Oyuncu her yükseldikçe kazandığı bonuslar, yetenek noktaları ve istatistik artışı gibi sistemler de buna göre ayarlanmalıdır. Bu durumda game core ve db core üzerinde değişiklikler yapmak gerekebilir.

Örneğin, 120+ dereceler için yeni bir exp tablosu tanımlamak gerekebilir. Bu tablo genellikle game server veritabanında saklanır ve her yeni derece için gereken tecrübe puanı buradan alınır.

5. Derleme ve Test İşlemi
Tüm değişiklikler yapıldıktan sonra source edit işlemleri tamamlandıktan sonra compile işlemi yapılmalıdır. Derleme sırasında hata alınırsa, yapılan değişiklikler kontrol edilmeli ve düzeltilmelidir. Her yeni derece için test karakterleri ile denemeler yaparak sistemin doğru çalıştığından emin olunmalıdır.

Sonuç
Metin2 özel sunucularında derece sınırı değiştirmek veya yeni dereceler eklemek, C++ ve Python bilgisi gerektiren ancak oldukça faydalı bir geliştirme uygulamasıdır. Doğru yapıldığında oyuncular için daha uzun vadeli bir ilerleme sistemi sunabilir. Bu işlemi yaparken martysama gibi gelişmiş kaynaklardan yardım almak da faydalı olabilir. Her zaman game, auth ve db sistemlerini dikkatli şekilde senkronize etmeyi unutmayın.


Changing Degree Limit and Adding New Degrees in Metin2 [C++ / Python]

In Metin2 private servers, expanding degree limits or adding new degrees is a common development practice to support player progression and create more in-game motivation. This process is typically done through C++ and Python based systems. In this guide, we will cover the steps required on both the game server and client side in detail.

1. What is a Degree Limit?
In Metin2, each character can advance up to a certain degree. By default, this limit is usually capped at 120. However, on some private servers, this value can be increased to 130, 150, or even higher levels. To do so, modifications are required on both the server and client sides.

2. Changing Degree Limit on the C++ Side
To change the degree limit on the server side, you first need to work with the game server source code. These codes are generally written in C++. For example:

- In char.cpp, there are areas where character level checks occur. The max level values here can be adjusted.
- In files like constants.h, constants such as MAX_LEVEL may exist and should be updated according to the new level.

3. Client-Side UI Settings with Python
On the client side, degree information is generally managed by UI systems written in Python. Therefore, uiscript files must be updated with new level lists, progress bar ranges, and other visual elements.

In Py Root folders, files such as character.py or player.py display the current character level. Level cap checks within these files must be restructured for the new degree range.

4. Adding New Degrees
Adding new degrees can be more complex than simply changing a limit value. As players level up, bonuses gained, skill points awarded, and stat increases must also be adjusted accordingly. In this case, modifications may be needed in the game core and db core.

For instance, a new exp table might be defined for levels above 120. This table is usually stored in the game server database and contains the experience points required for each new level.

5. Compilation and Testing
After all changes are made and source edit processes are completed, the compile step must be performed. If errors occur during compilation, the changes should be reviewed and corrected. Ensure that the system works correctly by testing with characters created specifically for each new degree.

Conclusion
Changing the degree limit or adding new degrees in Metin2 private servers is a development task requiring knowledge of C++ and Python, but it is highly beneficial. When done correctly, it can offer a longer-term progression system for players. When performing this task, resources like martysama can also be helpful. Always remember to carefully synchronize your game, auth, and db systems.
 

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

Geri
Üst Alt