• Из-за обновления GTA 5 (был добавлен новый патч) может временно не работать вход в RAGE Multiplayer.

    ERROR: Your game version is not supported by RAGE Multiplayer.

    Данная ошибка говорит о том, что GTA V обновилась до новой версии (GTA Online тоже). Вам необходимо обновить саму игру в главном меню вашего приложения (Steam / Epic Games / Rockstar Games).
    Если после этого RAGE:MP все равно не работает - вам нужно дождаться выхода патча для самого мультиплеера (обычно это занимает от нескольких часов до нескольких дней).

    Новости и апдейты Rockstar Games - https://www.rockstargames.com/ru/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


    Grand Theft Auto 5 (+ GTA Online) последний раз были обновлены:

Мануал Команда /alogin для администраторов (RedAge RP / NeptuneEvo)

dkycher

Начинающий специалист
Автор темы
16 Сен 2020
87
8
59
Доброе утро граждане :)
Сегодня будет мануал или же урок как хотите так и называйте команда - /alogin
Можно будет использовать на любом моде (RedAge RP / NeptuneEvo)

Первое что нужно это зайти в Command.cs и добавить:

C#:
[Command("alogin", "Используйте: /alogin [Пароль]")] // Красный админский ник (1 лвл)
public static void CMD_alogin(Player player, int number)
{
    try
    {
        if (Main.Players[player].AdminLVL >= 10 && number == 123) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 9 && number == 1234) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 8 && number == 1235) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 7 && number == 1236) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 6 && number == 1237) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 5 && number == 1238) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 4 && number == 1239) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 3 && number == 12310) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 2 && number == 12311) ProverkaNaLogin(player);
        else if (Main.Players[player].AdminLVL == 1 && number == 12312) ProverkaNaLogin(player);
        else if (player.GetSharedData<bool>("PROVERKANAPASS") == true)
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы уже вошли в админку", 3000); // Это показывает если уже вошел
            return;
        }
        else if (Main.Players[player].AdminLVL >= 1 && Main.Players[player].AdminLVL <= 100)
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы ввели не правильный пароль от админки", 3000); // Если человек не правильный пароль ввел
            return;
        }
        else
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"К сожалению вам это недоступно", 3000); //Это показывает если у игрока нет админки
            return;
        }
    }
    catch (Exception e) { Log.Write("EXCEPTION AT \"CMD\":\n" + e.ToString(), nLog.Type.Error); }
}

Ниже делаем паблик:

C#:
public static void ProverkaNaLogin(Player player)
{
    if (!player.HasSharedData("PROVERKANAPASS") || !player.GetSharedData<bool>("PROVERKANAPASS"))
    {
        player.SetSharedData("PROVERKANAPASS", true);
        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы вошли в админку", 3000);
        foreach (Player p in Main.Players.Keys.ToList())
        {
            if (!Main.Players.ContainsKey(p)) continue;
            if (Main.Players[p].AdminLVL >= 1)
            {
                p.SendChatMessage("!{#2b8234}" + $"Админ-Уведомление | :  {player.Name} ({player.Value}): Авторизовался под админкой");
            }
        }
    }
    else
    {
        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы вышли из админки", 3000);
        player.SetSharedData("PROVERKANAPASS", false);
    }
}

Далее заходим в Admin.cs и ищем строку public static bool CanUseCmd(Player player, string cmd, string args = "")
После if (command.IsAdmin) вписываем:

C#:
if (player.GetSharedData<bool>("PROVERKANAPASS") == false)
{
    Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы не вошли в админку", 3000);
    return false;
}

И еще заходим в Characters.cs и ищем public async Task Load
После foreach (DataRow Row in result.Rows)
Вставляем это:

C#:
player.SetSharedData("PROVERKANAPASS", false);

В итоге у нас получается вот это:

Screenshot_2.png
 
Последнее редактирование:

JJIGolem

Гуру
high coder
19 Окт 2020
217
275
142
Метод "ProverkaNaPass" необходимо использовать английские слова для наименования. Да даже если бы и перевел на английский, то, все равно, внутри методв нет никакой проверки какого-либо пароля. Тупо выдача и взятия прав и уведомление другим.
 

JJIGolem

Гуру
high coder
19 Окт 2020
217
275
142
Старайся использовать "return" в своих условиях, чтобы не идти цепью "else if`ов"
C#:
[Command("alogin", "Используйте: /alogin [Пароль]")]
    private void AuthorizeAdminRights(Player player, string number)
    {
        if (!Main.Players.TryGetValue(player, out Character character))
            return;

        if (player.GetSharedData<bool>("PROVERKANAPASS"))
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы уже вошли в админку", 3000);
            return;
        }

        if (_adminAuthorizeCodes.TryGetValue(character.AdminLVL, out string code))
        {
            if (number == code)
                AllowAccessToAdminRights(player);
            else
                Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы ввели не правильный пароль от админки", 3000);
            return;
        }

        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "К сожалению вам это недоступно", 3000);
    }

    private void AllowAccessToAdminRights(Player player)
    {
        player.SetSharedData("PROVERKANAPASS", true); // нужно ли нам это синхронизовать между всеми игроками?
        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы вошли в админку", 3000);
        foreach (Player p in Main.Players.Where(x => x.Value.AdminLVL > 0).Select(x => x.Key))
            p?.SendChatMessage("!{#2b8234}" + $"Админ-Уведомление | :  {player.Name} ({player.Value}): Авторизовался под админкой");
    }

    // лучше, конечно, это все подгружать откуда-то
    private readonly Dictionary<int, string> _adminAuthorizeCodes = new Dictionary<int, string>()
    {
        [1] = "qwerty", // также не использовать прямой текст, а воспользоваться каким-то хешированием
        [2] = "12345",
        [3] = "asasa",
    };
 

dkycher

Начинающий специалист
Автор темы
16 Сен 2020
87
8
59
Старайся использовать "return" в своих условиях, чтобы не идти цепью "else if`ов"
C#:
[Command("alogin", "Используйте: /alogin [Пароль]")]
    private void AuthorizeAdminRights(Player player, string number)
    {
        if (!Main.Players.TryGetValue(player, out Character character))
            return;

        if (player.GetSharedData<bool>("PROVERKANAPASS"))
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы уже вошли в админку", 3000);
            return;
        }

        if (_adminAuthorizeCodes.TryGetValue(character.AdminLVL, out string code))
        {
            if (number == code)
                AllowAccessToAdminRights(player);
            else
                Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы ввели не правильный пароль от админки", 3000);
            return;
        }

        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "К сожалению вам это недоступно", 3000);
    }

    private void AllowAccessToAdminRights(Player player)
    {
        player.SetSharedData("PROVERKANAPASS", true); // нужно ли нам это синхронизовать между всеми игроками?
        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы вошли в админку", 3000);
        foreach (Player p in Main.Players.Where(x => x.Value.AdminLVL > 0).Select(x => x.Key))
            p?.SendChatMessage("!{#2b8234}" + $"Админ-Уведомление | :  {player.Name} ({player.Value}): Авторизовался под админкой");
    }

    // лучше, конечно, это все подгружать откуда-то
    private readonly Dictionary<int, string> _adminAuthorizeCodes = new Dictionary<int, string>()
    {
        [1] = "qwerty", // также не использовать прямой текст, а воспользоваться каким-то хешированием
        [2] = "12345",
        [3] = "asasa",
    };
Cпасибо учту❤️
 

Deja-vu

Специалист
29 Сен 2020
412
54
95
Старайся использовать "return" в своих условиях, чтобы не идти цепью "else if`ов"
C#:
[Command("alogin", "Используйте: /alogin [Пароль]")]
    private void AuthorizeAdminRights(Player player, string number)
    {
        if (!Main.Players.TryGetValue(player, out Character character))
            return;

        if (player.GetSharedData<bool>("PROVERKANAPASS"))
        {
            Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы уже вошли в админку", 3000);
            return;
        }

        if (_adminAuthorizeCodes.TryGetValue(character.AdminLVL, out string code))
        {
            if (number == code)
                AllowAccessToAdminRights(player);
            else
                Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "Вы ввели не правильный пароль от админки", 3000);
            return;
        }

        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, "К сожалению вам это недоступно", 3000);
    }

    private void AllowAccessToAdminRights(Player player)
    {
        player.SetSharedData("PROVERKANAPASS", true); // нужно ли нам это синхронизовать между всеми игроками?
        Notify.Send(player, NotifyType.Alert, NotifyPosition.BottomCenter, $"Вы вошли в админку", 3000);
        foreach (Player p in Main.Players.Where(x => x.Value.AdminLVL > 0).Select(x => x.Key))
            p?.SendChatMessage("!{#2b8234}" + $"Админ-Уведомление | :  {player.Name} ({player.Value}): Авторизовался под админкой");
    }

    // лучше, конечно, это все подгружать откуда-то
    private readonly Dictionary<int, string> _adminAuthorizeCodes = new Dictionary<int, string>()
    {
        [1] = "qwerty", // также не использовать прямой текст, а воспользоваться каким-то хешированием
        [2] = "12345",
        [3] = "asasa",
    };
Все равно же автор постарался), ведь /alogin по-моему только в сампе да и существует)
 

Deja-vu

Специалист
29 Сен 2020
412
54
95
А как на счет админ меню, как сделать чтоб они не открывались до авторизации?
 
  • Like
Реакции: Harland David Sanders

dkycher

Начинающий специалист
Автор темы
16 Сен 2020
87
8
59

EzHelp

Участник портала
10 Май 2022
25
-1
13
Столько мароки(код делал давно , не обесуйте, этому скрипту с момента выхода 1.1 редаги в общий доступ)

Открываешь Character.cs
В строке -
public void Spawn(Player player) ищешь
player.SetSharedData("IS_ADMIN", true); и удаляешь

Дальше открываешь main.cs(или любой другой cs файл) и создаешь туда публичный статический стринг
C#:
public static string APassword = "123";

И дальше сама команда


C#:
[Command("alogin")]
        public static void CMD_alogin(Player player, string password)
        {
            if (password == Main.APassword)
            {
                if (Main.Players[player].AdminLVL > 0)
                {
                    player.SetSharedData("IS_ADMIN", true);
                    player.SetSharedData("ALVL", Main.Players[player].AdminLVL);
                }
                else
                {
                    Notify.Send(player, NotifyType.Error, NotifyPosition.BottomCenter, $"Данная опция к сожалению недоступна для вас", 3000);
                    Notify.Send(player, NotifyType.Error, NotifyPosition.BottomCenter, $"Ты Лох По Жизни, понял?", 3000);
                    return;
                }
            }
            else
            {
                Notify.Send(player, NotifyType.Error, NotifyPosition.BottomCenter, $"Ты не угадал пароль", 3000);
                return;
            }
        }

Самое простое и детское решение
 

Amazingevich

Гуру
27 Апр 2021
667
487
124
Все равно же автор постарался), ведь /alogin по-моему только в сампе да и существует)
Хоть оттуда и начали тянуть это, но и сейчас используется на многих GTA V проектах (и не только GTA V)
Хотя с возможностями GTA V уже можно что-то более практичное придумать (а нужно ли????)
 

mippoosedev

Гуру
2 Мар 2021
294
139
100
В /alogin смысла в gta 5 нет особого. На 99% серверах проверка на сошиал id стоит. Ну и добавлю -> если уж решили делать "доп проверку", то подключите гугл 2фа