- Discord
- pvpers.gg
At Aç Değilken Yem Verilmesini Engelle
GİRİŞ & SORUN
Oyundaki at sisteminde, oyuncular atlarını sınırsız kez besleyebiliyor. Kod tarafındaki kontroller taşma (overflow) hatalarını engellese de, canı zaten dolu olan bir atı tekrar beslemek oyuncuya herhangi bir fayda sağlamıyor.
NEDEN / NELER DEĞİŞTİ?
Atın canı azami seviyeye ulaştığında yemeyi reddetmesi sağlandı ve oyuncuya bilgilendirici bir mesaj gösteriliyor. Ayrıca ek güvenlik kontrolleri eklendi.
NASIL YAPILIR?
Öncelikle
horse_rider.cpp
dosyası açılır:Ardından
char_item.cpp
dosyası düzenlenir:
Kod:
// BUL;
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 ("Ölü bir ata yem verilemez."));
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;
}
Aynı mantık ITEM_HORSE_FOOD_2 ve ITEM_HORSE_FOOD_3 bloklarına da uygulanır; yalnızca Korece mesajlar Türkçeye çevrilir ve sağlık kontrolü eklenir.
Şimdi
cmd_general.cpp
dosyası açılır:
Kod:
// BUL;
ACMD (do_user_horse_feed)
// DEĞİŞTİR;
ACMD (do_user_horse_feed) // DevFix 100
{
// Özel dükkân açıksa ya da karakter sersem / ölü / gözlem modundaysa at beslenemez. - [MT2Dev Notu]
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 ("Önce atınızı çağırın."));
}
else
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("Attayken yem verilemez."));
}
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 ("Ata %s verdiniz."), ITEM_MANAGER::instance().GetTable (dwFood)->szLocaleName);
}
else
{
ch->ChatPacket (CHAT_TYPE_INFO, LC_TEXT ("%s eşyasına ihtiyacınız var."), ITEM_MANAGER::instance().GetTable (dwFood)->szLocaleName);
}
}
questlua_horse.cpp
dosyasında horse_feed fonksiyonu güncellenir:
Kod:
// BUL;
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;
}
horse_menu.quest
dosyasında ilgili kısım aşağıdaki gibi düzenlenir:
Kod:
-- BUL;
local food = horse.get_grade() + 50054 - 1
if pc.countitem(food) > 0 then
pc.removeitem(food, 1)
horse.feed()
-- DEĞİŞTİR;
local food = horse.get_grade() + 50054 - 1
if pc.countitem(food) > 0 then
-- Canı dolu atı beslemeyi engelleyen düzeltme [HF]White
if horse.get_health_pct() >= 100 then
syschat("Atınızın canı maksimum seviyeye ulaştı, daha fazla besleyemezsiniz.")
else
pc.removeitem(food, 1)
horse.feed()
end
Son olarak
locale_string.txt
dosyasının sonuna şu satırlar eklenir:
Kod:
"HORSE_HEALTH_ALREADY_FULL";
"Atınızın canı maksimum seviyeye ulaştı, artık besleyemezsiniz.";