• Из-за обновления 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) последний раз были обновлены:

Вопрос Отслеживание нужного игрока и махинации с ним

Wair

Специалист
Автор темы
26 Ноя 2020
155
27
95
Здравствуйте, в силу своего небольшого умения кодить, столкнулся с одной проблемой - не могу додумать как отслеживать игрока, севшего в машину, которую создал другой игрок.

Те как это работает - один игрок берёт заказ на машину, которую нужно будет доставить в одну точку, и нужно сделать так, чтобы другой игрок мог перехватить её и перевести в другую точку, проблема в том, что если писать двоих этих игроков как player, то вылазят неприятные ошибки по типу колшейпов, блипов и тд... Надеюсь понятно объяснил...Мне нужно объявить другого игрока ( который просто решил перехватить эту машину у заказчика ), чтобы можно было с ним проводить всякие манипуляции.

У меня были мысли сделать это через [SetData "название" , id игрока, который взял заказ]
Но пока вообще не могу додумать как это в итоге должно работать
 

XDeveluxe

Модератор
Команда форума
high coder
30 Авг 2021
2,219
1,424
191
27
Не совсем понятно, если честно, чего ты хочешь добиться со стороны кода.
.SetData работает достаточно плохо в RAGE (во всяком случае, работала плохо раньше, на счёт как сейчас - не знаю, не пробовал), я бы советовал завести какой-то словарь, в котором будут храниться объекты машин и кастомный класс со всей её временной датой (той, которую не нужно сохранять при перезапуске мода, например). В кастомном классе уже можно хранить сколько угодно информации, которую доставать будешь по самой машине.


Небольшой пример:
C#:
public class VehicleData
{
    /// <summary>
    /// Перевозчик
    /// </summary>
    public Player Carrier = null;
    /// <summary>
    /// Перехватчик
    /// </summary>
    public Player Interceptor = null;
}

Так же неплохо позаботиться о методах, которые будут добавлять, получать или удалять из нашего словаря - машину:
C#:
/// <summary>
/// Словарь с данными всех машин, которые мы поместим внутрь.
/// </summary>
private static readonly Dictionary<Vehicle, VehicleData> VehicleDatas = new Dictionary<Vehicle, VehicleData>();

/// <summary>
/// Добавить пустые данные о машине в словарь
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>Объект VehicleData с данными машины</returns>
public static VehicleData CreateVehicleData(Vehicle vehicle)
{
    if (DoesVehicleDataExists(vehicle)) return GetVehicleData(vehicle);

    VehicleData vehicleData = new VehicleData();
    VehicleDatas.Add(vehicle, vehicleData);
    return vehicleData;
}

/// <summary>
/// Удалить данные о машине из словаря
/// </summary>
/// <param name="vehicle">Объект машины</param>
public static bool DeleteVehicleData(Vehicle vehicle)
{
    if (!DoesVehicleDataExists(vehicle)) return false;

    VehicleDatas.Remove(vehicle);
    return true;
}

/// <summary>
/// Получить данные о машине из словаря
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>Объект VehicleData, если данные существуют, в противном случае null</returns>
public static VehicleData GetVehicleData(Vehicle vehicle)
{
    return DoesVehicleDataExists(vehicle) ? VehicleDatas[vehicle] : null;
}

/// <summary>
/// Проверить существуют ли данные о машине в нашем словаре
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>true, если да, в противном случае false</returns>
public static bool DoesVehicleDataExists(Vehicle vehicle)
{
    return VehicleDatas.Contains(vehicle);
}
Всё, что после этого тебе осталось - найти методы создания машин по рейджу и использовать метод CreateVehicleData передавая в аргументы объект машины и принимая в переменную данные этой машины. По этой же переменной управлять самими данными, например:

C#:
Vehicle vehicle = NAPI.Vehicle.CreateVehicle(NAPI.Util.GetHashKey("adder"), new Vector3(0, 0, 0), 0, 1, 1, "RAGEMP", 0, true, true, 0);
VehicleData vehicleData = CreateVehicleData(vehicle);
vehicleData.Carrier = target;
Теперь в .Carrier ты можешь записывать любого игрока, которого хочешь, а так же обнулять (записывая туда null, например).

Однако в таком случае нельзя забывать, что перед тем как удалить машину, тебе так же нужно удалить её данные с помощью метода DeleteVehicleData, иначе ты будешь заполнять память мода, а оперативной памяти у тебя не бесконечное количество.
 
Последнее редактирование:
  • Like
Реакции: stage

Wair

Специалист
Автор темы
26 Ноя 2020
155
27
95
Не совсем понятно, если честно, чего ты хочешь добиться со стороны кода.
.SetData работает достаточно плохо в RAGE (во всяком случае, работала плохо раньше, на счёт как сейчас - не знаю, не пробовал), я бы советовал завести какой-то словарь, в котором будут храниться объекты машин и кастомный класс со всей её временной датой (той, которую не нужно сохранять при перезапуске мода, например). В кастомном классе уже можно хранить сколько угодно информации, которую доставать будешь по самой машине.


Небольшой пример:
C#:
public class VehicleData
{
    /// <summary>
    /// Перевозчик
    /// </summary>
    public Player Carrier = null;
    /// <summary>
    /// Перехватчик
    /// </summary>
    public Player Interceptor = null;
}

Так же неплохо позаботиться о методах, которые будут добавлять, получать или удалять из нашего словаря - машину:
C#:
/// <summary>
/// Словарь с данными всех машин, которые мы поместим внутрь.
/// </summary>
private static readonly Dictionary<Vehicle, VehicleData> VehicleDatas = new Dictionary<Vehicle, VehicleData>();

/// <summary>
/// Добавить пустые данные о машине в словарь
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>Объект VehicleData с данными машины</returns>
public static VehicleData CreateVehicleData(Vehicle vehicle)
{
    if (DoesVehicleDataExists(vehicle)) return GetVehicleData(vehicle);

    VehicleData vehicleData = new VehicleData();
    VehicleDatas.Add(vehicle, vehicleData);
    return vehicleData;
}

/// <summary>
/// Удалить данные о машине из словаря
/// </summary>
/// <param name="vehicle">Объект машины</param>
public static bool DeleteVehicleData(Vehicle vehicle)
{
    if (!DoesVehicleDataExists(vehicle)) return false;

    VehicleDatas.Remove(vehicle);
    return true;
}

/// <summary>
/// Получить данные о машине из словаря
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>Объект VehicleData, если данные существуют, в противном случае null</returns>
public static VehicleData GetVehicleData(Vehicle vehicle)
{
    return DoesVehicleDataExists(vehicle) ? VehicleDatas[vehicle] : null;
}

/// <summary>
/// Проверить существуют ли данные о машине в нашем словаре
/// </summary>
/// <param name="vehicle">Объект машины</param>
/// <returns>true, если да, в противном случае false</returns>
public static bool DoesVehicleDataExists(Vehicle vehicle)
{
    return VehicleDatas.Contains(vehicle);
}
Всё, что после этого тебе осталось - найти методы создания машин по рейджу и использовать метод CreateVehicleData передавая в аргументы объект машины и принимая в переменную данные этой машины. По этой же переменной управлять самими данными, например:

C#:
Vehicle vehicle = NAPI.Vehicle.CreateVehicle(NAPI.Util.GetHashKey("adder"), new Vector3(0, 0, 0), 0, 1, 1, "RAGEMP", 0, true, true, 0);
VehicleData vehicleData = CreateVehicleData(vehicle);
vehicleData.Carrier = target;
Теперь в .Carrier ты можешь записывать любого игрока, которого хочешь, а так же обнулять (записывая туда null, например).

Однако в таком случае нельзя забывать, что перед тем как удалить машину, тебе так же нужно удалить её данные с помощью метода DeleteVehicleData, иначе ты будешь заполнять память мода, а оперативной памяти у тебя не бесконечное количество.
спасибо, попробую применить эти знания