GM Yetkilerinde İsim Bazlı Sınırlama

  • Konuyu açan Konuyu açan LKW
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 394

LKW

Üye
Üye
Mesaj
8
Beğeni
6
Puan
440
Ticaret Puanı
0
GM Komut Yetki Sistemi (İsim Bazlı Koruma)
Bu değişiklik, sunucunuzdaki "Kritik" Game Master (GM) komutlarını sadece belirlediğiniz isimlerin kullanabilmesini sağlar.

================================================================================
SISTEM NASIL CALISIR?
================================================================================
Sunucu kaynak kodlarında (cmd_gm.cpp ve cmd_general.cpp), komutların en başına bir isim kontrolü eklenir. Eğer komutu yazan kişinin ismi listenizdeki isimle ([GM]TEST gibi) eşleşmiyorsa, sistem komutu çalıştırmaz ve hata mesajı verir.


tdnm5ib.png
================================================================================
KURULUM REHBERI (ADIM ADIM)
================================================================================

--------------------------------------------------------------------------------
1. DOSYA: Game Source/Server/game/src/cmd_gm.cpp
--------------------------------------------------------------------------------
Dosyanın en üstüne (Include'ların altına) ekleyin::
Genişlet Daralt Kopyala
static const char* kAUTHORIZED_EXECUTORS[] = {
    "[GM]TEST", //buradaki İSMİ KENDİNİZE GÖRE AYARLAYINIZ AYNI ŞEKİLDE ALTINA BİRDEN FAZLA İSİM YAZILABİLİR
    nullptr
};

static bool IsAuthorizedExecutor(const char* name)
{
    for (int i = 0; kAUTHORIZED_EXECUTORS[i]; ++i)
        if (strcmp(name, kAUTHORIZED_EXECUTORS[i]) == 0)
            return true;
    return false;
}
Komutlara Eklenecek kontrol:
Genişlet Daralt Kopyala
    if (!IsAuthorizedExecutor(ch->GetName()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu komut engellendi.");
        return;
    }
Örnek olarak /item Komutu İçin Uygulama::
Genişlet Daralt Kopyala
Arat:
ACMD(do_item)
{
    char arg1[256], arg2[256];

Değiştir:
ACMD(do_item)
{
    if (!IsAuthorizedExecutor(ch->GetName()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu komut engellendi.");
        return;
    }

    char arg1[256], arg2[256];
--------------------------------------------------------------------------------
2. DOSYA: Game Source/Server/game/src/cmd_general.cpp
--------------------------------------------------------------------------------

Dosyanın en üstüne (Include'ların altına) ekleyin::
Genişlet Daralt Kopyala
static const char* kAUTHORIZED_EXECUTORS[] = {
    "[GM]TEST", //buradaki İSMİ KENDİNİZE GÖRE AYARLAYINIZ AYNI ŞEKİLDE ALTINA BİRDEN FAZLA İSİM YAZILABİLİR
    nullptr
};

static bool IsAuthorizedExecutor(const char* name)
{
    for (int i = 0; kAUTHORIZED_EXECUTORS[i]; ++i)
        if (strcmp(name, kAUTHORIZED_EXECUTORS[i]) == 0)
            return true;
    return false;
}
/shutdown Komutu İçin Uygulama::
Genişlet Daralt Kopyala
Arat:
ACMD(do_shutdown)
{

Altına Ekle
    if (ch && !IsAuthorizedExecutor(ch->GetName()))
    {
        ch->ChatPacket(CHAT_TYPE_INFO, "Bu komut engellendi.");
        return;
    }



================================================================================
KORUMA ALTINA ALINABILECEK KOMUTLAR VE ISLEVLERI
================================================================================

Aşağıdaki komutları da aynı mantıkla korumaya alabilirsiniz:
Kod:
Genişlet Daralt Kopyala
KOMUT          ISLEV
-------------  -----------------------------------------------------------------
Oyun Icı Komut | Dosyadaki Kod Karşılığı | Komutun İşlevi
-------------- | ----------------------- | -----------------------------------
/shutdown      | ACMD(do_shutdown)       | Sunucuyu güvenli şekilde kapatır.
/disconnect    | ACMD(do_disconnect)     | Oyuncuyu oyundan atar (DC).
/reload        | ACMD(do_reload)         | Dosya yetki/item ayarlarını yeniler.
/set           | ACMD(do_set)            | Karakter verilerini düzenler.
/item          | ACMD(do_item)           | VNUM kodu ile eşya üretir.
/mob           | ACMD(do_mob)            | Yanınıza canavar/NPC çağırır.
|/level        | ACMD(do_level)          | Oyuncunun seviyesini değiştirir.
/advance       | ACMD(do_advance)        | Seviye atlatır.
/event_flag    | ACMD(do_event_flag)     | Etkinlik ayarlarını yönetir.
/notice        | ACMD(do_notice)         | Tüm sunucuya duyuru geçer.
/big_notice    | ACMD(do_big_notice)     | Ekran ortasında büyük duyuru yapar.
/makeguild     | ACMD(do_makeguild)      | Manuel lonca kurar.
/deleteguild   | ACMD(do_deleteguild)    | Loncayı siler.
/gwlist        | ACMD(do_gwlist)         | Savaş listesini gösterir.
/stop_guild_war| ACMD(do_stop_guild_war) | Mevcut lonca savaşını bitirir.
/xmas          | ACMD(do_xmas)           | Etkinlik süslemelerini yönetir.

.
 
tanımladığınız problemde overa kaçmadan metin2 özelinde şöyle basit bir çözüm daha iyi olur sanki;

C++:
Genişlet Daralt Kopyala
#include <algorithm>
#include <array>
#include <string_view>

using std::operator""sv;

struct AuthorityChecker
{
    static constexpr std::array authorized_names{
        "TEST"sv,
        "LWT"sv,
    };

    [[nodiscard]] constexpr bool operator()(std::string_view name) const noexcept
    {
        if (name.empty())
        {
            return false;
        }

        return std::ranges::find(authorized_names, name) != authorized_names.cend();
    }
};

inline constexpr AuthorityChecker is_authorized{};

static_assert(is_authorized("LWT")); // test
 
tanımladığınız problemde overa kaçmadan metin2 özelinde şöyle basit bir çözüm daha iyi olur sanki;

C++:
Genişlet Daralt Kopyala
#include <algorithm>
#include <array>
#include <string_view>

using std::operator""sv;

struct AuthorityChecker
{
    static constexpr std::array authorized_names{
        "TEST"sv,
        "LWT"sv,
    };

    [[nodiscard]] constexpr bool operator()(std::string_view name) const noexcept
    {
        if (name.empty())
        {
            return false;
        }

        return std::ranges::find(authorized_names, name) != authorized_names.cend();
    }
};

inline constexpr AuthorityChecker is_authorized{};

static_assert(is_authorized("LWT")); // test
Öncelikle değerli yorumunuz için teşekkürler elbette sizin öneriniz çok daha iyi . Güncel alt yapıya sahip olanlar sizin çözümünüzü tercih edebilir
 
Geri
Üst