sourceden baslangiç level ve item ayarlama

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
bu zaman kadar çok başlangıç level paylaşıldı hepsinde hp bugu var.
hp bugu nasıl yapılıyor ?
örneğin oyuna 90 level başladın 4300 hp ile başlıyorsun
statü sıfırlama yapınca hp 5500 oluyor.
bu paylaşımda öyle sorun yok.


şuan paylaşacağım sistem sourcede zaten ekli

başlangıç level ve parayı input_login.cpp den ayarlanıyor

configlere
china_event_server: 1
ekle

input_login.cpp

ilgili yere ekle
Kod:
if (china_event_server)     {         table->level = 35;         for (int i = 1; i < 35; ++i)         {             int iHP = number(JobInitialPoints[job].hp_per_lv_begin, JobInitialPoints[job].hp_per_lv_end);             int iSP = number(JobInitialPoints[job].sp_per_lv_begin, JobInitialPoints[job].sp_per_lv_end);             table->sRandomHP += iHP;             table->sRandomSP += iSP;             table->stat_point += 3;         }         table->hp += table->sRandomHP;         table->sp += table->sRandomSP;         table->gold = 1000000;     }




like
Kod:
bool NewPlayerTable2(TPlayerTable * table, const char * name, BYTE race, BYTE shape, BYTE bEmpire) {     if (race >= MAIN_RACE_MAX_NUM)     {         sys_err("NewPlayerTable2.OUT_OF_RACE_RANGE(%d >= max(%d))\n", race, MAIN_RACE_MAX_NUM);         return false;     }     unsigned job;     if (!RaceToJob(race, &job))     {         sys_err("NewPlayerTable2.RACE_TO_JOB_ERROR(%d)\n", race);         return false;     }     sys_log(0, "NewPlayerTable2(name=%s, race=%d, job=%d)", name, race, job);     memset(table, 0, sizeof(TPlayerTable));     strlcpy(table->name, name, sizeof(table->name));     table->level        = 1;     table->job            = race;     table->voice        = 0;     table->part_base    = shape;     table->st        = JobInitialPoints[job].st;     table->dx        = JobInitialPoints[job].dx;     table->ht        = JobInitialPoints[job].ht;     table->iq        = JobInitialPoints[job].iq;     table->hp        = JobInitialPoints[job].max_hp + table->ht * JobInitialPoints[job].hp_per_ht;     table->sp        = JobInitialPoints[job].max_sp + table->iq * JobInitialPoints[job].sp_per_iq;     table->stamina    = JobInitialPoints[job].max_stamina; #if defined(ENABLE_WOLFMAN_CHARACTER) && defined(USE_LYCAN_CREATE_POSITION)     table->x         = LYCAN_CREATE_START_X(bEmpire, job) + number(-300, 300);     table->y         = LYCAN_CREATE_START_Y(bEmpire, job) + number(-300, 300); #else     table->x        = CREATE_START_X(bEmpire) + number(-300, 300);     table->y        = CREATE_START_Y(bEmpire) + number(-300, 300); #endif     table->z        = 0;     table->dir        = 0;     table->playtime = 0;     table->gold     = 0;     table->skill_group = 0;       if (china_event_server)     {         table->level = 35;         for (int i = 1; i < 35; ++i)         {             int iHP = number(JobInitialPoints[job].hp_per_lv_begin, JobInitialPoints[job].hp_per_lv_end);             int iSP = number(JobInitialPoints[job].sp_per_lv_begin, JobInitialPoints[job].sp_per_lv_end);             table->sRandomHP += iHP;             table->sRandomSP += iSP;             table->stat_point += 3;         }

burasını düzenledim

input_db.cpp

Kod:
void CInputDB::PlayerCreateSuccess(LPDESC d, const char * data) {     if (!d)         return;     TPacketDGCreateSuccess * pPacketDB = (TPacketDGCreateSuccess *) data;     if (pPacketDB->bAccountCharacterIndex >= PLAYER_PER_ACCOUNT)     {         d->Packet(encode_byte(HEADER_GC_CHARACTER_CREATE_FAILURE), 1);         return;     }     long lIndex = 0;     #ifdef ENABLE_MOVE_CHANNEL     if (!CMapLocation::instance().Get(pPacketDB->player.x, pPacketDB->player.y, lIndex, pPacketDB->player.lAddr, pPacketDB->player.wPort, g_bChannel))     #else     if (!CMapLocation::instance().Get(pPacketDB->player.x, pPacketDB->player.y, lIndex, pPacketDB->player.lAddr, pPacketDB->player.wPort))     #endif     {         sys_err("InputDB::PlayerCreateSuccess: cannot find server for mapindex %d %d x %d (name %s)",                 lIndex,                 pPacketDB->player.x,                 pPacketDB->player.y,                 pPacketDB->player.szName);     }     TAccountTable & r_Tab = d->GetAccountTable();     r_Tab.players[pPacketDB->bAccountCharacterIndex] = pPacketDB->player;     TPacketGCPlayerCreateSuccess pack;     pack.header = HEADER_GC_CHARACTER_CREATE_SUCCESS;     pack.bAccountCharacterIndex = pPacketDB->bAccountCharacterIndex;     pack.player = pPacketDB->player; #ifdef ENABLE_NEWSTUFF     if (!g_stProxyIP.empty())         pack.player.lAddr=inet_addr(g_stProxyIP.c_str()); #endif     d->Packet(&pack, sizeof(TPacketGCPlayerCreateSuccess));     // 기본 무기와 귀환부를 지급     TPlayerItem t;     memset(&t, 0, sizeof(t));     //baslangic item verme     t.owner = r_Tab.players[pPacketDB->bAccountCharacterIndex].dwID;     struct SInitialItem     {         BYTE    window;         BYTE    pos;         DWORD    count;         DWORD    dwVnum;         // long    socket0;         // long    socket1;         // long    socket2;         // long    socket3;         // long    socket4;         // long    socket5;     };     const int MAX_INITIAL_ITEM = 17;     static SInitialItem initialItems[JOB_MAX_NUM][MAX_INITIAL_ITEM] =     {         // {window_type, envanterdeki yeri, adeti, item_vnum, socket0, socket1, socket2, socket3, socket4, socket5, socket6}         {             // WARRIOR             {EQUIPMENT,    0,    1,    12019},    // Zirh             {EQUIPMENT,    1,    1,    12269},    // Kafalik             {EQUIPMENT,    2,    1,    15209}, // Ayakkabi             {EQUIPMENT,    3,    1,    14209},    // Bilezik             {EQUIPMENT,    4,    1,    149},    // Silah             {EQUIPMENT,    5,    1,    16149}, // Kolye             {EQUIPMENT,    6,    1,    17109}, // Kupe             {EQUIPMENT,    10,    1,    13069},    // Kalkan             {INVENTORY,    1,    1,    71051}, //Kadim Efsun             // {INVENTORY,    2,    1,    72725}, //oto bot hp buyuk extra de?il             // {INVENTORY,    3,    1,    72729}, //oto bot sp buyuk extra de?il             {INVENTORY,    4,    1,    40002}, //ı?ınlasnma yuzu?u             {INVENTORY,    5,    1,    50053}, //at kitabı                                     {INVENTORY,    6,    1,    41774}, //ı?ınlasnma yuzu?u             {INVENTORY,    7,    1,    41776}, //at kitabı             {INVENTORY,    8,    1,    45392}, //ı?ınlasnma yuzu?u             {INVENTORY,    9,    1,    45394}, //at kitabı             {INVENTORY,    9,    1,    72725}, //at kitabı             {INVENTORY,    9,    1,    72729}, //at kitabı                     },         {             // ASSASSIN             {EQUIPMENT,    0,    1,    12029},    // Zirh             {EQUIPMENT,    1,    1,    12399},    // Kafalik             {EQUIPMENT,    2,    1,    15209}, // Ayakkabi             {EQUIPMENT,    3,    1,    14209},    // Bilezik             {EQUIPMENT,    4,    1,    1109},    // Silah             {EQUIPMENT,    5,    1,    16089}, // Kolye             {EQUIPMENT,    6,    1,    17169}, // Kupe             {EQUIPMENT,    10,    1,    13089},    // Kalkan             {INVENTORY,    1,    1,    71051}, //Kadim Efsun             // {INVENTORY,    2,    1,    72725}, //oto bot hp buyuk extra de?il             // {INVENTORY,    3,    1,    72729}, //oto bot sp buyuk extra de?il             {INVENTORY,    4,    1,    40002}, //ı?ınlasnma yuzu?u             {INVENTORY,    5,    1,    50053}, //at kitabı                                     {INVENTORY,    6,    1,    41774}, //ı?ınlasnma yuzu?u             {INVENTORY,    7,    1,    41776}, //at kitabı             {INVENTORY,    8,    1,    45392}, //ı?ınlasnma yuzu?u             {INVENTORY,    9,    1,    45394}, //at kitabı                                 },         {             // SURA             {EQUIPMENT,    0,    1,    12039},    // Zirh             {EQUIPMENT,    1,    1,    12539},    // Kafalik             {EQUIPMENT,    2,    1,    15209}, // Ayakkabi             {EQUIPMENT,    3,    1,    14209},    // Bilezik             {EQUIPMENT,    4,    1,    159,},    // Silah             {EQUIPMENT,    5,    1,    16129}, // Kolye             {EQUIPMENT,    6,    1,    17209}, // Kupe             {EQUIPMENT,    10,    1,    13109},    // Kalkan             {INVENTORY,    1,    1,    71051}, //Kadim Efsun             // {INVENTORY,    2,    1,    72725}, //oto bot hp buyuk extra de?il             // {INVENTORY,    3,    1,    72729}, //oto bot sp buyuk extra de?il             {INVENTORY,    4,    1,    40002}, //ı?ınlasnma yuzu?u             {INVENTORY,    5,    1,    50053}, //at kitabı                                     {INVENTORY,    6,    1,    41774}, //ı?ınlasnma yuzu?u             {INVENTORY,    7,    1,    41776}, //at kitabı             {INVENTORY,    8,    1,    45392}, //ı?ınlasnma yuzu?u             {INVENTORY,    9,    1,    45394}, //at kitabı         },         {             // SHAMAN             {EQUIPMENT,    0,    1,    12049},    // Zirh             {EQUIPMENT,    1,    1,    12679},    // Kafalik             {EQUIPMENT,    2,    1,    15209}, // Ayakkabi             {EQUIPMENT,    3,    1,    14209},    // Bilezik             {EQUIPMENT,    4,    1,    5109},    // Silah             {EQUIPMENT,    5,    1,    16129}, // Kolye             {EQUIPMENT,    6,    1,    17209}, // Kupe             {EQUIPMENT,    10,    1,    13129},    // Kalkan             {INVENTORY,    1,    1,    71051}, //Kadim Efsun             // {INVENTORY,    2,    1,    72725}, //oto bot hp buyuk extra de?il             // {INVENTORY,    3,    1,    72729}, //oto bot sp buyuk extra de?il             {INVENTORY,    4,    1,    40002}, //ı?ınlasnma yuzu?u             {INVENTORY,    5,    1,    50053}, //at kitabı                         {INVENTORY,    6,    1,    41774}, //ı?ınlasnma yuzu?u             {INVENTORY,    7,    1,    41776}, //at kitabı             {INVENTORY,    8,    1,    45392}, //ı?ınlasnma yuzu?u             {INVENTORY,    9,    1,    45394}, //at kitabı                     } #ifdef ENABLE_WOLFMAN_CHARACTER ,         {             // Wolfman             {EQUIPMENT,    0,    1,    21089},    // Zirh             {EQUIPMENT,    1,    1,    21539},    // Kafalik             {EQUIPMENT,    2,    1,    15209}, // Ayakkabi             {EQUIPMENT,    3,    1,    14209},    // Bilezik             {EQUIPMENT,    4,    1,    6059},    // Silah             {EQUIPMENT,    5,    1,    16189}, // Kolye             {EQUIPMENT,    6,    1,    17109}, // Kupe             {EQUIPMENT,    10,    1,    13169},    // Kalkan             {INVENTORY,    1,    1,    71051}, //Kadim Efsun             // {INVENTORY,    2,    1,    72725}, //oto bot hp buyuk extra de?il             // {INVENTORY,    3,    1,    72729}, //oto bot sp buyuk extra de?il             {INVENTORY,    4,    1,    40002}, //ı?ınlasnma yuzu?u             {INVENTORY,    5,    1,    50053}, //at kitabı                         {INVENTORY,    6,    1,    41774}, //ı?ınlasnma yuzu?u             {INVENTORY,    7,    1,    41776}, //at kitabı             {INVENTORY,    8,    1,    45392}, //ı?ınlasnma yuzu?u             {INVENTORY,    9,    1,    45394}, //at kitabı         } #endif     };     unsigned job = pPacketDB->player.byJob;     RaceToJob(job, &job);     for (int i = 0; i < MAX_INITIAL_ITEM; i++)     {         if (initialItems[job][i].dwVnum == 0)             continue;         t.id        = ITEM_MANAGER::instance().GetNewID();         t.window    = initialItems[job][i].window;         t.pos        = initialItems[job][i].pos;         t.count        = initialItems[job][i].count;         t.vnum        = initialItems[job][i].dwVnum;         // t.alSockets[0]    = initialItems[job][i].socket0;         // t.alSockets[1]    = initialItems[job][i].socket1;         // t.alSockets[2]    = initialItems[job][i].socket2;         db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_SAVE, 0, sizeof(TPlayerItem));         db_clientdesc->Packet(&t, sizeof(TPlayerItem));     }     //baslangic item verme bitis     LogManager::instance().CharLog(pack.player.dwID, 0, 0, 0, "CREATE PLAYER", "", d->GetHostName()); }



Kod:
sss

Metin2 Source'den Başlangıç Seviyesi ve Eşya Ayarları Nasıl Yapılır?

Metin2 özel sunucularında oyun içi deneyimi optimize etmek istiyorsanız, doğru başlangıç seviyesi ve eşya ayarlamaları hayati önem taşır. Bu makalede, source üzerinden başlangıç level ve item ayarlarını nasıl yapacağınızı detaylıca anlatacağız.

Başlangıç Seviyesi Nedir ve Neden Önemlidir?

Oyuna yeni başlayan oyuncuların belirli bir seviyeden başlatılması, hem oyun dengesini korumak hem de yeni başlayanların erken aşamada oyun mekaniklerine adapte olmasını sağlar. Bu ayar, genellikle game/src dizinindeki kaynak kodlardan değiştirilebilir. Örneğin, char.cpp veya char_manager.cpp[/COORD] gibi dosyalarda bulunan fonksiyonlar üzerinden oyuncu yaratıldığında verilen başlangıç level değerini düzenleyebilirsiniz.

Örnek Kod Parçası:

void CHARACTER::SetLevel(int level)
{
m_points.level = MAX(1, level); // Buradaki 1 değeri başlangıç levelidir
}

Yukarıdaki kodda MAX(1, level) kısmını MAX(10, level) olarak değiştirmek, tüm yeni karakterlerin 10. seviyeden başlamasını sağlar.

Başlangıç Eşyaları Nasıl Belirlenir?

Yeni bir karakter yaratıldığında sahip olması gereken eşyalar genellikle client/src ve game/src[/COORD] arasında paylaşılan yapılarla belirlenir. Özellikle char_create.cpp veya init.lua gibi dosyalar üzerinden eşya listesi tanımlanabilir. Bu dosyalarda belirtilen item ID'ler, karakter yaratıldığında envanterinize otomatik olarak eklenir.

Örnek olarak:

player.AddItem('Sword_1', 1);
player.AddItem('Heal_Potion', 5);

Bu kod parçası, oyuncuya bir adet kılıç ve beş adet can iksiri verir. Bu ayarlar genellikle py root üzerinden de kolayca değiştirilebilir.

DB (Veritabanı) Üzerinden Ayarlar

Bazı durumlarda, başlangıç ayarları doğrudan db_core üzerinden de yapılabilir. Oyuncu yaratıldığında tetiklenen SQL sorguları ile level ve item bilgileri doğrudan veritabanından çekilebilir. Bu yöntem daha esnek ve dinamik ayarlar yapılmasını sağlar. Örneğin, farklı sınıflar için farklı başlangıç itemleri verilebilir.

Kaynak Kod Düzenleme ve Compile İşlemi

Değişiklik yaptıktan sonra kodun derlenmesi (compile) gerekir. Bu işlem genellikle C++ derleyicileriyle yapılır. Derleme sırasında hata alınırsa, değişiklik yapılan satırlar kontrol edilmelidir. Compile işlemi tamamlandıktan sonra sunucu yeniden başlatılır ve yeni ayarlar aktif olur.

Sonuç

Metin2 özel sunucularında başlangıç seviye ve eşya ayarlamaları, oyun dengesi ve kullanıcı deneyimi açısından büyük rol oynar. Kaynak kodlara erişiminiz varsa, bu işlemleri doğrudan source üzerinden yönetmek en etkili yoldur. Metin2Dev ve benzeri platformlarda bu konuda destek alabilir, örnek kodları inceleyebilirsiniz.


How to Set Starting Level and Items from Metin2 Source?

To optimize the in-game experience on Metin2 private servers, setting the correct starting level and items is crucial. In this article, we will explain in detail how to configure starting level and item settings directly from the source.

What is Starting Level and Why Is It Important?

Starting new players at a specific level helps maintain game balance and allows them to adapt to game mechanics early on. This setting is typically adjusted in source code files located in the game/src directory. For instance, you can modify the starting level value by editing functions found in files such as char.cpp or char_manager.cpp[/COORD].

Sample Code Snippet:

void CHARACTER::SetLevel(int level)
{
m_points.level = MAX(1, level); // Here, the value '1' is the starting level
}

In the above code, changing MAX(1, level) to MAX(10, level) ensures that all new characters start at level 10.

How Are Starting Items Determined?

Items that a new character should possess upon creation are usually defined through structures shared between client/src and game/src[/COORD]. Files like char_create.cpp or init.lua can define the item list. Item IDs specified in these files are automatically added to the player's inventory upon character creation.

For example:

player.AddItem('Sword_1', 1);
player.AddItem('Heal_Potion', 5);

This snippet gives the player one sword and five health potions. These settings can also be easily modified via py root.

Settings via DB (Database)

In some cases, starting settings can be configured directly from the db_core. SQL queries triggered during character creation can fetch level and item data directly from the database. This method allows more flexible and dynamic configurations, such as assigning different starting items based on class type.

Source Code Editing and Compilation Process

After making changes, the code must be compiled. This process is generally done with C++ compilers. If errors occur during compilation, review the modified lines. Once the compilation is complete, restart the server to activate the new settings.

Conclusion

Setting starting levels and items on Metin2 private servers plays a major role in game balance and user experience. If you have access to the source code, managing these settings directly from the source is the most effective approach. You can seek support and examine sample codes on platforms like Metin2Dev.
 

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

Benzer konular

Geri
Üst Alt