GİRİŞ & PROBLEM
Merhaba, biliyorsunuz ki oyundaki at sisteminde oyuncu atını sınırsız şekilde arka arkaya besleyebiliyor, bu durum kodlardaki kontroller sebebiyle bir overflow sorunu yaratmayacaktır fakat canı zaten fullenmiş bir atı beslemenin de oyuncuya hiçbir faydası yok diye düşünüyorum.
NEDEN & NELERİ DEĞİŞTİRDİK ?
Atın canı maksimum seviyeye ulaştığında beslenmeye reddetmesini ve oyuncunun bir bilgilendirme mesajı almasını sağladık ayrıca ekstra kontroller de ekledik.
NASIL YAPILIR ?
Öncelikle "horse_rider.cpp" dosyası açılır.
Sonrasında "char_item.cpp" dosyası açılır.
Sonrasında "cmd_general.cpp" dosyası açılır.
Sonrasında "questlua_horse.cpp" dosyası açılır.
Son olarak "locale_string.txt" açılarak sonuna eklenir;
Son bir ekleme yapmak gerekiyor, at menüsünü kullanarak yapılan besleme işlemi için bir kontrol daha eklendi, bunun için eklenti olarak konu altında bulabileceğiniz horse_menu.rar dosyasını indirin ve içerisindeki .quest dosyasını questlerinizin içine atıp okutun, işlem tamam.
[/RIGHT]
Merhaba, biliyorsunuz ki oyundaki at sisteminde oyuncu atını sınırsız şekilde arka arkaya besleyebiliyor, bu durum kodlardaki kontroller sebebiyle bir overflow sorunu yaratmayacaktır fakat canı zaten fullenmiş bir atı beslemenin de oyuncuya hiçbir faydası yok diye düşünüyorum.
NEDEN & NELERİ DEĞİŞTİRDİK ?
Atın canı maksimum seviyeye ulaştığında beslenmeye reddetmesini ve oyuncunun bir bilgilendirme mesajı almasını sağladık ayrıca ekstra kontroller de ekledik.
NASIL YAPILIR ?
Öncelikle "horse_rider.cpp" dosyası açılır.
Kod:
// ARA; void CHorseRider::FeedHorse() // DEĞİŞTİR; void CHorseRider::FeedHorse() // DevFix 100 { unsigned char horselevel = GetHorseLevel(); // DevFix 122 if (horselevel > 0 && GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { return; } // Only when the horse is alive. - [Ymir Dev Note] if (horselevel > 0 && GetHorseHealth() > 0) { UpdateHorseHealth (+1); // Increased the delay for health reduction even when feeding the horse. - [Ymir Dev Note/ipkn] - 24/03/2005 ResetHorseHealthDropTime(); } }
Sonrasında "char_item.cpp" dosyası açılır.
Kod:
// ARA; else if (item->GetVnum() == ITEM_HORSE_FOOD_1) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } return true; } // DEĞİŞTİR; else if (item->GetVnum() == ITEM_HORSE_FOOD_1) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } // DevFix 100 unsigned char horselevel = from->GetHorseLevel(); // DevFix 122 if (from->GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("HORSE_HEALTH_ALREADY_FULL")); return false; } return true; } // ARA; else if (item->GetVnum() == ITEM_HORSE_FOOD_2) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } return true; } // DEĞİŞTİR; else if (item->GetVnum() == ITEM_HORSE_FOOD_2) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } // DevFix 100 unsigned char horselevel = from->GetHorseLevel(); // DevFix 122 if (from->GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("HORSE_HEALTH_ALREADY_FULL")); return false; } return true; } // ARA; else if (item->GetVnum() == ITEM_HORSE_FOOD_3) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } return true; } // DEĞİŞTİR; else if (item->GetVnum() == ITEM_HORSE_FOOD_3) { if (IsDead()) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("죽은 말에게 사료를 먹일 수 없습니다.")); return false; } // DevFix 100 unsigned char horselevel = from->GetHorseLevel(); // DevFix 122 if (from->GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { from->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("HORSE_HEALTH_ALREADY_FULL")); return false; } return true; }
Sonrasında "cmd_general.cpp" dosyası açılır.
Kod:
// ARA; ACMD (do_user_horse_feed) // DEĞİŞTİR; ACMD (do_user_horse_feed) // DevFix 100 { // You cannot feed the horse while your private shop is open. - [Ymir Dev Note] // Also you cannot do this while ch is dead or stun or in observer mode too. - [MT2Dev Note] if (ch->GetMyShop() || ch->IsStun() || ch->IsDead() || ch->IsObserverMode()) // DevFix 27 { return; } if (ch->GetHorse() == nullptr) { if (ch->IsHorseRiding() == false) { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("말을 먼저 소환해주세요.")); } else { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("말을 탄 상태에서는 먹이를 줄 수 없습니다.")); } return; } unsigned char horselevel = ch->GetHorseLevel(); // DevFix 122 if (ch->GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("HORSE_HEALTH_ALREADY_FULL")); return; } DWORD dwFood = ch->GetHorseGrade() + 50054 - 1; if (ch->CountSpecifyItem (dwFood) > 0) { ch->FeedHorse(); ch->RemoveSpecifyItem (dwFood, 1); ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("말에게 %s를 주었습니다."), ITEM_MANAGER::instance().GetTable (dwFood)->szLocaleName); } else { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("%s 아이템이 필요합니다"), ITEM_MANAGER::instance().GetTable (dwFood)->szLocaleName); } }
Sonrasında "questlua_horse.cpp" dosyası açılır.
Kod:
// ARA; int horse_feed (lua_State* L) // DEĞİŞTİR; int horse_feed (lua_State* L) // DevFix 100 { LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr(); if (!ch) // DevFix 111 { sys_err ("<horse_feed> CH is a NULL pointer!"); return 0; } unsigned char horselevel = ch->GetHorseLevel(); // DevFix 122 if (ch->GetHorseHealth() >= c_aHorseStat[horselevel].iMaxHealth) { ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("HORSE_HEALTH_ALREADY_FULL")); return 0; } if (ch->GetHorseLevel() > 0 && ch->GetHorseHealth() > 0) { ch->FeedHorse(); } return 0; }
Son olarak "locale_string.txt" açılarak sonuna eklenir;
Kod:
"HORSE_HEALTH_ALREADY_FULL"; "Atının canı maksimum seviyeye ulaştı, daha fazla besleyemezsin.. ";
Son bir ekleme yapmak gerekiyor, at menüsünü kullanarak yapılan besleme işlemi için bir kontrol daha eklendi, bunun için eklenti olarak konu altında bulabileceğiniz horse_menu.rar dosyasını indirin ve içerisindeki .quest dosyasını questlerinizin içine atıp okutun, işlem tamam.
[/RIGHT]
MT2Dev
Metin2 Server Geliştirme: [C++] Atın Canı Dolduğunda Beslenmesini Engelleme
Metin2 özel sunucularında C++ tabanlı sistem geliştirmeye odaklanan geliştiriciler, oyuncu deneyimini artırmak için birçok mekanizmayı yeniden yapılandırmak zorundadır. Bu mekanizmalardan birisi de at sistemi üzerinde yapılan kontrollerdir. Özellikle at canı tamamen dolduğunda beslenmesini engellemek gibi küçük ama önemli değişiklikler, sunucunuzdaki kullanıcı memnuniyetini doğrudan etkileyebilir.
At Sistemi Nedir?
Metin2 oyununda atlar, oyuncular için hem hızlı taşıma aracı hem de savaş sırasında avantaj sağlayıcı bir özelliktir. Ancak atlar belirli aralıklarla beslenmek zorundadır. Aksi takdirde canları düşer ve at kullanılamaz hale gelir. Bu durum, oyuncuların atlarını beslemeyi unutması halinde büyük dezavantaj yaratır. Ancak bazı durumlarda, atın canı doluyorken beslenmesi mantıksızdır. Bu yüzden beslenme kontrolü yapılmalıdır.
Neden Bu Kontrol Gereklidir?
Oyuncular bazen atlarını beslemek için elindeki yiyeceği fazla kullanabilir. Bu durumda atın canı zaten doluysa, atın daha fazla yiyeceği kabul etmemesi gerekir. Bu tür bir kontrol, hem kaynak israfını önler hem de kullanıcı deneyimini artırır. Bu işlem, game server tarafında C++ kodları ile kolayca yapılabilecek bir işlemdir.
C++ Koduyla At Beslenmesini Kontrol Etmek
Öncelikle game server dosyalarınızda at ile ilgili olan komutları barındıran fonksiyonlara ulaşmanız gerekir. Genellikle bu fonksiyonlar char_horse.cpp veya benzeri dosyalarda bulunur. Burada atın canının kontrol edildiği ve beslenme komutunun çalıştığı kısma müdahale edilmelidir.
Örneğin:
Yukarıdaki örnek, atın canı dolu olduğunda beslenmesini engelleyecek temel bir kontrol yapısıdır. Bu kod parçası, server src dosyanızda uygun fonksiyona entegre edildiğinde, atın canı tam doluysa beslenme işlemi gerçekleşmez ve kullanıcıya bilgi mesajı gönderilir.
Sunucu Tarafında Hata Ayıklama
Kodlara müdahale ettikten sonra mutlaka compile işlemini gerçekleştirmeniz gerekir. Compile işlemi başarısız olursa, hatalı satırları düzeltmeniz gerekir. Bu süreçte Martysama veya diğer Metin2 development kaynaklarından destek alabilirsiniz. Ayrıca, test sunucusu üzerinde bu değişikliği denemeniz önerilir.
Sonuç
Metin2 özel sunucularında at sistemi gibi detaylara yapılacak küçük ama anlamlı müdahaleler, kullanıcıların oyun deneyimini ciddi anlamda etkiler. Canı dolu olan bir atın beslenmesini engellemek gibi bir sistem, hem mantıklı hem de profesyonel bir geliştirici yaklaşımıdır. Bu tür sistemler, Metin2 lobby siteleri tarafından da sıkça tercih edilir ve kullanıcı memnuniyetini artırır.
Metin2 Server Development: Preventing Horse Feeding When HP is Full with [C++]
Developers focusing on C++-based systems in Metin2 private servers must restructure many mechanisms to enhance the player experience. One such mechanism involves controls over the horse system. Small but important changes like preventing feeding when the horse's HP is full directly impact user satisfaction on your server.
What is the Horse System?
In Metin2, horses serve both as fast transportation and provide advantages during combat. However, horses must be fed at regular intervals; otherwise their HP decreases, rendering them unusable. This situation can cause significant disadvantage if players forget to feed their horses. Yet, there are cases where it makes no sense for a horse to be fed when its HP is already full. Therefore, a feeding check should be implemented.
Why Is This Control Necessary?
Players may occasionally use too much food trying to feed their horses. In this case, if the horse’s HP is already full, it should not accept more food. Such a control prevents resource waste and improves user experience. This action can easily be implemented in the game server using C++ code.
Controlling Horse Feeding with C++ Code
First, you need to locate functions handling horse-related commands within your game server files. These functions typically reside in files like char_horse.cpp. You need to intervene where the horse's HP is checked and the feeding command runs.
For example:
The above example represents a basic control structure that prevents feeding when the horse's HP is full. Integrated into the appropriate function in your server src, this code prevents feeding when the horse is fully fed and sends an informational message to the user.
Debugging on the Server Side
After modifying the code, you must perform a compile operation. If the compilation fails, you must correct the faulty lines. During this process, you can seek help from sources like Martysama or other Metin2 development resources. Additionally, testing these changes on a test server is recommended.
Conclusion
Small but meaningful interventions like the horse system in Metin2 private servers significantly affect the gaming experience. A system that prevents feeding a horse whose HP is full reflects a logical and professional developer approach. Such systems are frequently preferred by Metin2 lobby sites and enhance user satisfaction.
Metin2 Server Geliştirme: [C++] Atın Canı Dolduğunda Beslenmesini Engelleme
Metin2 özel sunucularında C++ tabanlı sistem geliştirmeye odaklanan geliştiriciler, oyuncu deneyimini artırmak için birçok mekanizmayı yeniden yapılandırmak zorundadır. Bu mekanizmalardan birisi de at sistemi üzerinde yapılan kontrollerdir. Özellikle at canı tamamen dolduğunda beslenmesini engellemek gibi küçük ama önemli değişiklikler, sunucunuzdaki kullanıcı memnuniyetini doğrudan etkileyebilir.
At Sistemi Nedir?
Metin2 oyununda atlar, oyuncular için hem hızlı taşıma aracı hem de savaş sırasında avantaj sağlayıcı bir özelliktir. Ancak atlar belirli aralıklarla beslenmek zorundadır. Aksi takdirde canları düşer ve at kullanılamaz hale gelir. Bu durum, oyuncuların atlarını beslemeyi unutması halinde büyük dezavantaj yaratır. Ancak bazı durumlarda, atın canı doluyorken beslenmesi mantıksızdır. Bu yüzden beslenme kontrolü yapılmalıdır.
Neden Bu Kontrol Gereklidir?
Oyuncular bazen atlarını beslemek için elindeki yiyeceği fazla kullanabilir. Bu durumda atın canı zaten doluysa, atın daha fazla yiyeceği kabul etmemesi gerekir. Bu tür bir kontrol, hem kaynak israfını önler hem de kullanıcı deneyimini artırır. Bu işlem, game server tarafında C++ kodları ile kolayca yapılabilecek bir işlemdir.
C++ Koduyla At Beslenmesini Kontrol Etmek
Öncelikle game server dosyalarınızda at ile ilgili olan komutları barındıran fonksiyonlara ulaşmanız gerekir. Genellikle bu fonksiyonlar char_horse.cpp veya benzeri dosyalarda bulunur. Burada atın canının kontrol edildiği ve beslenme komutunun çalıştığı kısma müdahale edilmelidir.
Örneğin:
Kod:
if (horse_hp < horse_max_hp) {[BR][/BR] // Atın canı dolu değilse beslenebilir[BR][/BR] ApplyHorseFood();[BR][/BR]} else {[BR][/BR] // Atın canı doluysa mesaj göster[BR][/BR] ChatPacket(CHAT_TYPE_INFO, 'Atınız zaten tok!');[BR][/BR]}
Yukarıdaki örnek, atın canı dolu olduğunda beslenmesini engelleyecek temel bir kontrol yapısıdır. Bu kod parçası, server src dosyanızda uygun fonksiyona entegre edildiğinde, atın canı tam doluysa beslenme işlemi gerçekleşmez ve kullanıcıya bilgi mesajı gönderilir.
Sunucu Tarafında Hata Ayıklama
Kodlara müdahale ettikten sonra mutlaka compile işlemini gerçekleştirmeniz gerekir. Compile işlemi başarısız olursa, hatalı satırları düzeltmeniz gerekir. Bu süreçte Martysama veya diğer Metin2 development kaynaklarından destek alabilirsiniz. Ayrıca, test sunucusu üzerinde bu değişikliği denemeniz önerilir.
Sonuç
Metin2 özel sunucularında at sistemi gibi detaylara yapılacak küçük ama anlamlı müdahaleler, kullanıcıların oyun deneyimini ciddi anlamda etkiler. Canı dolu olan bir atın beslenmesini engellemek gibi bir sistem, hem mantıklı hem de profesyonel bir geliştirici yaklaşımıdır. Bu tür sistemler, Metin2 lobby siteleri tarafından da sıkça tercih edilir ve kullanıcı memnuniyetini artırır.
Metin2 Server Development: Preventing Horse Feeding When HP is Full with [C++]
Developers focusing on C++-based systems in Metin2 private servers must restructure many mechanisms to enhance the player experience. One such mechanism involves controls over the horse system. Small but important changes like preventing feeding when the horse's HP is full directly impact user satisfaction on your server.
What is the Horse System?
In Metin2, horses serve both as fast transportation and provide advantages during combat. However, horses must be fed at regular intervals; otherwise their HP decreases, rendering them unusable. This situation can cause significant disadvantage if players forget to feed their horses. Yet, there are cases where it makes no sense for a horse to be fed when its HP is already full. Therefore, a feeding check should be implemented.
Why Is This Control Necessary?
Players may occasionally use too much food trying to feed their horses. In this case, if the horse’s HP is already full, it should not accept more food. Such a control prevents resource waste and improves user experience. This action can easily be implemented in the game server using C++ code.
Controlling Horse Feeding with C++ Code
First, you need to locate functions handling horse-related commands within your game server files. These functions typically reside in files like char_horse.cpp. You need to intervene where the horse's HP is checked and the feeding command runs.
For example:
Kod:
if (horse_hp < horse_max_hp) {[BR][/BR] // Feed if the horse's HP isn't full[BR][/BR] ApplyHorseFood();[BR][/BR]} else {[BR][/BR] // Show message if HP is full[BR][/BR] ChatPacket(CHAT_TYPE_INFO, 'Your horse is already full!');[BR][/BR]}
The above example represents a basic control structure that prevents feeding when the horse's HP is full. Integrated into the appropriate function in your server src, this code prevents feeding when the horse is fully fed and sends an informational message to the user.
Debugging on the Server Side
After modifying the code, you must perform a compile operation. If the compilation fails, you must correct the faulty lines. During this process, you can seek help from sources like Martysama or other Metin2 development resources. Additionally, testing these changes on a test server is recommended.
Conclusion
Small but meaningful interventions like the horse system in Metin2 private servers significantly affect the gaming experience. A system that prevents feeding a horse whose HP is full reflects a logical and professional developer approach. Such systems are frequently preferred by Metin2 lobby sites and enhance user satisfaction.
