Hikayeler

Reklam vermek için turkmmo@gmail.com

[C++] Atın Canı Dolduğunda Beslenmesini Engellemek

5.00 yıldız(lar) 2 Değerlendirme Değerlendirenler

MT2Dev

Cplusplus
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Fahri Üye
TM Üye
Katılım
30 Ocak 2020
Konular
50
Mesajlar
812
Online süresi
26g 54000s
Reaksiyon Skoru
735
Altın Konu
1
Başarım Puanı
184
TM Yaşı
6 Yıl 2 Ay 21 Gün
MmoLira
8,731
DevLira
123

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

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.

horse_rider.cpp:
// 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.

char_item.cpp:
// 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.

cmd_general.cpp:
// 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.

questlua_horse.cpp:
// 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.
MT2Dev
 

Ekli dosyalar

  • horse_menu.rar
    1 KB · Görüntüleme: 0
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

paylaşım için teşekkürler
 
Ufak bir eksik giderildi, güncel halini kullanabilirsiniz.
 
Thanks
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst