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
like
burasını düzenledim
input_db.cpp
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.
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.
