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

    Ошибка: Ваша версия Grand Theft Auto V не поддерживается 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/newswire/
    Статус всех служб для Rockstar Games Launcher и поддерживаемых игр: https://support.rockstargames.com/ru/servicestatus


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

Проблема C#. Сброс пола после логина.

unsubdreada

Новый участник
20 Сен 2023
16
1
40
Сделал смену пола (так же по "видео-уроку") :rolleyes:
Всё работает нормально, ввожу имя-фамилию, выбираю пол (мужской или женский) нажимаю создать - появляется мужчина или женщина, все как выбрал. После смерти персонажа - так же пол сохраняется.
Но когда переподключаюсь пол в любом случае мужской. Кто может подсказать где чего не хватает?
C#:
using GTANetworkAPI;
using MySql.Data.MySqlClient;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

public class RemoteEvents : Script
{
    [RemoteEvent("CLIENT:SERVER::CLIENT_CREATE_WAYPOINT")]
    public void OnClientCreateWaypoint(Player player, float posX, float posY, float posZ)
    {
        player.Position = new Vector3(posX, posY, posZ);
    }

    [ServerEvent(Event.PlayerConnected)]            // При подключении выдается окно регистрации
    public void OnPlayerConnected(Player player)
    {
        player.TriggerEvent("SERVER:CLIENT::AuthReady");
    }

    [ServerEvent(Event.PlayerSpawn)]            // СПАВН ПОСЛЕ СМЕРТИ
    public void OnPlayerSpawn(Player player)
    {
        player.Position = new Vector3(-209.24597, -788.7034, 30.454039);
        player.Rotation = new Vector3(0, 0, -109.61787);
        player.Dimension = player.Id;
    }

    [RemoteEvent("CLIENT:SERVER::REGISTER_BUTTON_CLICKED")]
    public async void OnCefRegisterButtonClicked(Player player, string username, string password, string email)
    {
        string selectQuery = "SELECT * FROM users WHERE username = @name";
        MySqlCommand selectCommand = new MySqlCommand(selectQuery);
        selectCommand.Parameters.AddWithValue("@name", username);

        DataTable tb = await MySQL.QueryReadAsync(selectCommand);
        if (tb.Rows.Count > 0)
        {
            NAPI.Task.Run(() =>
            {
                NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::REGISTER_USER", true);
            }, 1000);
        }
        else
        {
            string hashedPassword = Crypto.HashPassword(password);

            NAPI.Util.ConsoleOutput("Игрок НЕ существует!");
            string insertQuery = "INSERT INTO users (username, password, email) VALUES (@name, @password, @email)";
            MySqlCommand insertCommand = new MySqlCommand(insertQuery);
            insertCommand.Parameters.AddWithValue("@name", username);
            insertCommand.Parameters.AddWithValue("@password", hashedPassword);
            insertCommand.Parameters.AddWithValue("@email", email);
            MySQL.Query(insertCommand);
            NAPI.Task.Run(() =>
            {
                NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::REGISTER_USER", false);
                player.Position = new Vector3(2239.4763, -1210.3835, 149.53323);
                player.Rotation = new Vector3(0, 0, 127.00000);
                player.Dimension = player.Id;
                ResetPersonCustomiztion(player);
                player.SetData<string>("player_username", username);
            }, 1000);
        }
        
    }

  
    [RemoteEvent("CLIENT:SERVER::LOGIN_BUTTON_CLICKED")]
    public async void OnCefLoginButtonClicked(Player player, string username, string password)
    {
        string selectQuery = "SELECT * FROM users WHERE username = @name";
        MySqlCommand selectCommand = new MySqlCommand(selectQuery);
        selectCommand.Parameters.AddWithValue("@name", username);
        DataTable tb = await MySQL.QueryReadAsync(selectCommand);
        if (tb.Rows.Count == 0)
        {
            NAPI.Task.Run(() =>
            {
                NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::LOGIN_USER", true);
            }, 1000);
        }
        else
        {
            string hashedPassword = Crypto.HashPassword(password);
            string outUsername = tb.Rows[0].ItemArray[1].ToString();
            string outHashedPassword = tb.Rows[0].ItemArray[2].ToString();
            string outEmail = tb.Rows[0].ItemArray[3].ToString();
            string outPersonName = tb.Rows[0].ItemArray[4].ToString();
            //string outPersonSName = tb.Rows[0].ItemArray[5].ToString();
            //string outPersonAge = tb.Rows[0].ItemArray[6].ToString();
            //string outPersonGender = tb.Rows[0].ItemArray[7].ToString();

            if (outHashedPassword != hashedPassword)
            {
                NAPI.Task.Run(() =>
                {
                    NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::LOGIN_USER", true);
                }, 1000);
            }
            else
            {
                if (outPersonName == null || outPersonName.Length == 0)
                {
                    NAPI.Task.Run(() =>
                    {
                        NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::REGISTER_USER", false);
                        player.Position = new Vector3(2239.4763, -1210.3835, 149.53323);
                        player.Rotation = new Vector3(0, 0, 127.00000);
                        player.Dimension = player.Id;
                        ResetPersonCustomiztion(player);
                        player.SetData<string>("player_username", username);
                    }, 1000);
                }
               else
                {
                    NAPI.Task.Run(() =>
                    {
                        NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::LOGIN_USER", false);
                        player.SetData<string>("player_username", outUsername);
                        player.Position = new Vector3(-209.24597, -788.7034, 30.454039);
                        player.Rotation = new Vector3(0, 0, -109.61787);
                        player.Dimension = player.Id;
                    }, 1000);
                }
            }
        }
    }

    [RemoteEvent("CLIENT:SERVER::PERSON_CREATE_BUTTON_CLICKED")]
    public void OnCefPersonCreateButtonClicked(Player player, string name, string secondName, string age, string gender)
    {
        if(player.HasData("player_username"))
        {
            string username = player.GetData<string>("player_username");

            string updateQuery = "UPDATE users SET name = @name, sName = @sName, age = @age, gender = @gender WHERE username = @username";
            MySqlCommand updateCommand = new MySqlCommand(updateQuery);

            updateCommand.Parameters.AddWithValue("@name", name);
            updateCommand.Parameters.AddWithValue("@sname", secondName);
            updateCommand.Parameters.AddWithValue("@age", age);
            updateCommand.Parameters.AddWithValue("@gender", gender);
            updateCommand.Parameters.AddWithValue("@username", username);

            MySQL.Query(updateCommand);
            NAPI.Task.Run(() =>
            {
                NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::CREATE_PERSON", false);
                player.Position = new Vector3(-209.24597, -788.7034, 30.454039);        // СПАВН ПОСЛЕ СОЗДАНИЯ ПЕРСОНАЖА
                player.Rotation = new Vector3(0, 0, -109.61787);
                player.Dimension = player.Id;
            }, 1000);
        }
    }

    [RemoteEvent("CLIENT:SERVER::PERSON_CREATE_GENDER_SWITCH_BUTTON_CLICKED")]

    public void OnCefPersonCreateGenderSwitchButtonClicked(Player player, string gender)
    {
        HeadBlend headBlend = new HeadBlend()
        {
            ShapeFirst = 21,
            ShapeSecond = 0,
            ShapeThird = 0,
            SkinFirst = 21,
            SkinSecond = 0,
            SkinThird = 0,
            ShapeMix = 0.5f,
            SkinMix = 0.5f,
            ThirdMix = 0
        };

        Dictionary<int, HeadOverlay> headOverlays = new Dictionary<int, HeadOverlay>();

        float[] faceFeatures = new float[20]
        {
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0
        };

        bool isMale = gender == "male"; //true - если мужской, false - если женский
        player.SetCustomization(isMale, headBlend, byte.MinValue, byte.MinValue, byte.MinValue, faceFeatures, headOverlays, new Decoration[] { });
    }

    private void ResetPersonCustomiztion(Player player)
    {
        HeadBlend headBlend = new HeadBlend()
        {
            ShapeFirst = 21,
            ShapeSecond = 0,
            ShapeThird = 0,
            SkinFirst = 21,
            SkinSecond = 0,
            SkinThird = 0,
            ShapeMix = 0.5f,
            SkinMix = 0.5f,
            ThirdMix = 0
        };

        Dictionary<int, HeadOverlay> headOverlays = new Dictionary<int, HeadOverlay>();

        float[] faceFeatures = new float[20]
        {
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0,
            0, 0, 0, 0, 0
        };

        player.SetCustomization(true, headBlend, byte.MinValue, byte.MinValue, byte.MinValue, faceFeatures, headOverlays, new Decoration[] { });
    }
}

Метод ResetPersonCustomiztion убирать полностью пробовал, не помогло.
 

Mi-Zaft

Гений
VIP
9 Окт 2020
1,877
479
175
А в БД сохраняет пол?
 

akudinov28

Старожил
24 Фев 2021
413
204
106
при спавне персонажа после авторизации нужно брать из бд его данные (в том числе и пол), и применять соответствующий скин.
P.S. Я капитан очевидность, да
 

DaVilka

Старожил
BackEnd developer
16 Сен 2020
771
284
128
У тебя при авторизации гендер никак не обрабатывается
eqQcUEw.png
 

unsubdreada

Новый участник
20 Сен 2023
16
1
40
У тебя при авторизации гендер никак не обрабатывается
eqQcUEw.png
А не подскажешь как его обработать при авторизации? Если раскомментирую эти строки ничего не выходит всё равно :rolleyes:
Если я правильно понимаю, он так же должен прописываться через player.SetData?
 

DaVilka

Старожил
BackEnd developer
16 Сен 2020
771
284
128
А не подскажешь как его обработать при авторизации? Если раскомментирую эти строки ничего не выходит всё равно :rolleyes:
Если я правильно понимаю, он так же должен прописываться через player.SetData?
Этот код я так понял не дописан,
C#:
                    NAPI.Task.Run(() =>
                    {
                        NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::LOGIN_USER", false);
                        player.SetData<string>("player_username", outUsername);
                        player.Position = new Vector3(-209.24597, -788.7034, 30.454039);
                        player.Rotation = new Vector3(0, 0, -109.61787);
                        player.Dimension = player.Id;
                    }, 1000);
Если я правильно понял то этот код срабатывает при успешной авторизации, почему SERVER:CLIENT::LOGIN_USER при успешной авторизации передает false, а не успешной true? Ответ успешной авторизации как то обрабатывается на клиенте и шлет что то не сервер. Почему player.Dimension = player.Id; везде, нигде не присваивается Dimension мира. Скорее всего ты не досмотрел видео урок, либо посмотри следующий. по теме, попробуй в этом коде при успешной авторизации добавить вызов функции
OnCefPersonCreateGenderSwitchButtonClicked(player, outPersonGender);
 
Реакции: unsubdreada

unsubdreada

Новый участник
20 Сен 2023
16
1
40
Этот код я так понял не дописан,
C#:
                    NAPI.Task.Run(() =>
                    {
                        NAPI.ClientEvent.TriggerClientEvent(player, "SERVER:CLIENT::LOGIN_USER", false);
                        player.SetData<string>("player_username", outUsername);
                        player.Position = new Vector3(-209.24597, -788.7034, 30.454039);
                        player.Rotation = new Vector3(0, 0, -109.61787);
                        player.Dimension = player.Id;
                    }, 1000);
Если я правильно понял то этот код срабатывает при успешной авторизации, почему SERVER:CLIENT::LOGIN_USER при успешной авторизации передает false, а не успешной true? Ответ успешной авторизации как то обрабатывается на клиенте и шлет что то не сервер. Почему player.Dimension = player.Id; везде, нигде не присваивается Dimension мира. Скорее всего ты не досмотрел видео урок, либо посмотри следующий. по теме, попробуй в этом коде при успешной авторизации добавить вызов функции
OnCefPersonCreateGenderSwitchButtonClicked(player, outPersonGender);
Спасибо, всё решилось вызовом функции :)
Дименшн исправил, не заметил ранее