At Aç Değilken Yem Verilmesini Engelle

Aethre

www.pvpers.gg
Katılım
19 Haz 2024
Konular
383
Mesajlar
477
Beğeniler
789
GG Coin
14,220
Ticaret Değeri - 0%
0   0   0
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:

Gizlenmiş içeriği görüntüleyebilmek için Giriş Yap ya da Kayıt Ol
Bu işlem, 15 saniyeden az sürer.

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.";
 
Geri
Üst Alt