[C++] Block Mount On Map (Full Version)

okan4141

D E L I
MT Üye
Mesaj
179
Çözümler
8
Beğeni
199
Puan
759
Ticaret Puanı
0
Bir Önceki Konumuzda, Eğer Oyuncu Bineğin Kullanımına Yasaklı Olduğu Haritaya Girerse Binek İtemini Slottan Çıkarıyorduk. Fakat Tekrar Giyebilirdik Çünkü Bunun İçin Bir Kontrol Eklememiştik. Neden? Çünkü Sadece O Şekilde Çalışması Prensibiyle Paylaşmıştım.

Bu Versiyon'da, Önceki Versiyon Mantığı ve Extradan Haritaya Giriş Yapıldığında Binek veya Ata Binmeyi Engelledik.


ServerSource/Game/Char_Horse.cpp Aç ve Arat:

bool CHARACTER::StartRiding() İçinde:
Genişlet Daralt Kopyala
    if (IsDead() == true)
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾²·¯Áø »óÅ¿¡¼´Â ¸»¿¡ Å» ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

    if (IsPolymorphed())
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("º¯½Å »óÅ¿¡¼´Â ¸»¿¡ Å» ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

Altına Ekle:

Kod:
Genişlet Daralt Kopyala
#if defined(__ENABLE_CHECK_MOUNT__)
    if (!CUnMount::IsUnMountMap(GetMapIndex()))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot use your mount or horse here."));
        return false;
    }
#endif

Tekrar Arat:

void CHARACTER::HorseSummon(bool bSummon, bool bFromFar İçinde:
Genişlet Daralt Kopyala
        if( m_chHorse != NULL )
            return;

        if (GetHorseLevel() <= 0)
            return;

        if (IsRiding())
            return;

Altına Ekle:

C++:
Genişlet Daralt Kopyala
#if defined(__ENABLE_CHECK_MOUNT__)
        if (!CUnMount::IsUnMountMap(GetMapIndex()))
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot use your mount or horse here."));
            return;
        }
#endif

ServerSource/Game/Char_Item.cpp Aç ve Arat:

bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell) İçinde:
Genişlet Daralt Kopyala
    if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11901 && item->GetVnum() <= 11904))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼ ¿¹º¹À» ÀÔÀ» ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

    if (iWearCell != WEAR_ARROW && IsPolymorphed())
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("µĞ°© Áß¿¡´Â Âø¿ëÁßÀÎ Àåºñ¸¦ º¯°æÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

    if (FN_check_item_sex(this, item) == false)
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ºº°ÀÌ ¸ÂÁö¾Ê¾Æ ÀÌ ¾ÆÀÌÅÛÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

Altına Ekle:

C++:
Genişlet Daralt Kopyala
#if defined(__ENABLE_CHECK_MOUNT__)
    if (!CUnMount::IsUnMountMap(GetMapIndex()))
    {
        if (item->GetType() == ITEM_COSTUME && item->GetSubType() == ECostumeSubTypes::COSTUME_MOUNT)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot use your mount or horse here."));
            return false;
        }
    }
#endif

Tekar Arat:

bool CHARACTER::UseItem(TItemPos Cell, TItemPos DestCell) İçinde:
Genişlet Daralt Kopyala
    if (!item->CanUsedBy(this))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("±ºÁ÷ÀÌ ¸ÂÁö¾Ê¾Æ ÀÌ ¾ÆÀÌÅÛÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

    if (IsStun())
        return false;

    if (false == FN_check_item_sex(this, item))
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ºº°ÀÌ ¸ÂÁö¾Ê¾Æ ÀÌ ¾ÆÀÌÅÛÀ» »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù."));
        return false;
    }

Altına Ekle:

C++:
Genişlet Daralt Kopyala
#if defined(ENABLE_MOUNT_COSTUME_SYSTEM) && defined(__ENABLE_CHECK_MOUNT__)
    if (!CUnMount::IsUnMountMap(GetMapIndex()))
    {
        if (item->GetType() == ITEM_COSTUME && item->GetSubType() == ECostumeSubTypes::COSTUME_MOUNT)
        {
            ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot use your mount or horse here."));
            return false;
        }
    }
#endif

ServerSource/Game/Char.cpp Aç ve En Alta Ekle:

C++:
Genişlet Daralt Kopyala
#if defined(__ENABLE_CHECK_MOUNT__)
void CHARACTER::UnMount(LPCHARACTER ch)
{
    if (!ch)
        return;

    const uint32_t mapIndex = ch->GetMapIndex();
    if (!CUnMount::IsUnMountMap(mapIndex))
    {
        if (ch->IsHorseRiding())
        {
            ch->StopRiding();
            ch->HorseSummon(false);
        }

        ch->RemoveAffect(AFFECT_MOUNT);
        ch->RemoveAffect(AFFECT_MOUNT_BONUS);

#ifdef ENABLE_MOUNT_COSTUME_SYSTEM
        auto* cMount = ch->GetWear(WEAR_COSTUME_MOUNT);
        if (cMount && cMount->IsEquipped())
        {
            ch->UnequipItem(cMount);
        }
#endif
    }
}
#endif

ServerSource/Game/Char.h Aç ve Arat:

C++:
Genişlet Daralt Kopyala
};

ESex GET_SEX(LPCHARACTER ch);

#endif

Üstüne Ekle:

C++:
Genişlet Daralt Kopyala
#if defined(__ENABLE_CHECK_MOUNT__)
    public:
        void                UnMount(LPCHARACTER ch);
#endif

ServerSource/Common/Lenght.h Ekle:

C++:
Genişlet Daralt Kopyala
enum MapTypes
{
    MAP_OX_EVENT                 = 113,    //                                 map_ox_event
    MAP_PVP_ARENA                 = 90,    //                                 metin2_map_pvp_arena
};

Dosyayı İndirmek İstemeyenler İçin:

UnMount_Map.cpp

C++:
Genişlet Daralt Kopyala
#include "stdafx.h"

#if defined(__ENABLE_CHECK_MOUNT__)
#    include "unmount_map.h"
#    include "../../common/length.h"

bool CUnMount::IsUnMountMap(uint32_t mapIndex)
{
    if (mapIndex >= 10000)
    {
        mapIndex /= 10000;
    }

    switch (mapIndex)
    {
        /* Dungeon Map */

        /*
        case 355:
        case 356:
        */

        /* Normal Map */
        case MapTypes::MAP_OX_EVENT:
        case MapTypes::MAP_PVP_ARENA:
            return false;

        default:
            return true;
    }
}
#endif

UnMount_Map.h

C++:
Genişlet Daralt Kopyala
#pragma once

#include "../../common/CommonDefines.h"

#if defined(__ENABLE_CHECK_MOUNT__)
class CUnMount
{
    public:
        static bool IsUnMountMap(uint32_t mapIndex);
};
#endif

Bilgi:

Kod Bloğu Etiket Başlıklarında Hangi Dosya'da Arama veya Ekleme Yapılacağı Eklenmiştir.

Dikkat Edilmesi Gerekenler:

1: Kullanmıyorsanız Silin:

void CHARACTER::UnMount(LPCHARACTER ch) İçerisinde:
Genişlet Daralt Kopyala
        ch->RemoveAffect(AFFECT_MOUNT);
        ch->RemoveAffect(AFFECT_MOUNT_BONUS);

Dosyayı Aşağıdaki Ekten İndirebilirsiniz.

Kanıt:


 

Dosya Eklentileri

Son düzenleme:
Küçük Birşeyi Gözden Kaçırmışım 2dk. Güncelliyorum. :)

- Güncellendi. (HorseSummon Eksik Kalmış. :))

Ama Şuna Gülüyorum Videoyu İzleyince Fark Ettim. Atı Çağırıyorum At Geliyor Binmeye Çalışıyorum Binmiyor Ya Hani Bak Binemiyorum Kod Çalışıyor Evet Oldu Dostum İşte Bu :) Ama Öyle Değil Atın Yanına Hiç Spawn Olmaması Lazımdı. :) Şuan Bir Eksiği Yok Gibi.... Neyse İyi Kullanmalar. :)
 
Son düzenleme:
Küçük Birşeyi Gözden Kaçırmışım 2dk. Güncelliyorum. :)

- Güncellendi. (HorseSummon Eksik Kalmış. :))

Ama Şuna Gülüyorum Videoyu İzleyince Fark Ettim. Atı Çağırıyorum At Geliyor Binmeye Çalışıyorum Binmiyor Ya Hani Bak Binemiyorum Kod Çalışıyor Evet Oldu Dostum İşte Bu :) Ama Öyle Değil Atın Yanına Hiç Spawn Olmaması Lazımdı. :) Şuan Bir Eksiği Yok Gibi.... Neyse İyi Kullanmalar. :)
Emeğin için eline sağlık. Ek olarak istemci üzerinden index alıp type'ı use engelleyebilirsiniz her iki veri de geliyor istemciye biliyorsunuz At veya bineğin gelmesini kökten çözebilirsiniz. Paylaştığım düello dosyalarımın içerisinde item tipine göre kullanım örneği var, isteyen kişiler uyarlayabilir.
 
Son düzenleme:
Üst