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

Вопрос Пару вопросов по рейджу

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Заинтересовался идеей сделать сервер, но листая википедию меня с ходу поставил в тупик факт создания машины на стороне клиента и сервера одновременно.
Ссылка: https://wiki.rage.mp/index.php?title=Vehicle::Vehicle

Что будет если создать на сервере или клиенте и возможно ли что зайдя с софтом игрок сможет спавнить машины видимые для других?
И еще момент: Я искал функцию money в "server side functions" и не нашел, а при разборе РП мода нашел функционал АЗС на стороне клиента, вроде бы как деньги списывались и потом "машине добавлялся бензин". Это безопасно?

Если я что-то путаю - поправьте, идея мне пришла только вчера и с функционалом МП я еще лишь формально знаком.

P.S. Fake-Wa3Rix
 

JJIGolem

Гуру
high coder
19 Окт 2020
225
283
142
Все, что делается на стороне клиенте, остается на клиенте, пока вы не синхронизируете это с другими игроками. Тот же спавн транспорта на клиенте, транспорт будет виден лишь вам.
Деньги и прочее лучше всего держать на стороне сервера, и при их изменении просто сообщать клиенту. Держу к сведении, что тот же cheat engine спокойно может работать и менять игровые данные из памяти. Будь-то жизнь, телепорт, всё, что на клиенте. Поэтому лучше себя обезопасить и установить хорошую связь между клиентом и сервером
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Все, что делается на стороне клиенте, остается на клиенте, пока вы не синхронизируете это с другими игроками. Тот же спавн транспорта на клиенте, транспорт будет виден лишь вам.
Деньги и прочее лучше всего держать на стороне сервера, и при их изменении просто сообщать клиенту. Держу к сведении, что тот же cheat engine спокойно может работать и менять игровые данные из памяти. Будь-то жизнь, телепорт, всё, что на клиенте. Поэтому лучше себя обезопасить и установить хорошую связь между клиентом и сервером
У меня возникли траблы с автомобилем) Можно пример создания и синхронизации? (Что бы его видели все игроки)
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
У меня возникли траблы с автомобилем) Можно пример создания и синхронизации? (Что бы его видели все игроки)
чтобы его видели все, создайте авто на стороне сервера.
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
Как по мне, клиент это здравая мысль, можно реализовывать к примеру автосалоны, с просмотром авто в нем, не нагружая сервер спавном этих авто.(Как пример) Как говорится, что было создано на клиенте, остается на клиенте.
 
  • Like
Реакции: Wa3Rix

Mikhayloff

Модератор
Команда форума
high designer
9 Окт 2020
1,436
976
211
Владян, ты лучший, у тебя всё получится юхуу! <3
 
  • Like
Реакции: saveitll

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Не могу вызвать ивент для посадки в машину с сервера. Пробовал передать число, потом нагуглил тему в которой писали что передавать можно только строки.
Но всё равно передается "undefined", где тут ошибка?

Сервер
Код:
if(nearVehicle)
    {
        player.stored.hCarHack = nearVehicle;
        player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle));
        player.outputChatBox("...");
        
    }
    else
        player.outputChatBox("Рядом с Вами нет подходящей машины");


Клиент
Код:
mp.events.add("RPC_TryVehicleHack", function (vehicleid)
{
    if (carhacker_ui)
    {
        carhacker_ui.reload(false);
        carhacker_ui.active = true;
    }

    vehicle_to_hack = vehicleid;//mp.vehicles.atRemoteId(vehicleid);
    mp.gui.cursor.show(true, true);
    mp.gui.chat.push(`Начинаем взлом ${vehicleid}...`);
});
 

Harland David Sanders

Куратор портала
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,404
2,776
219
Не могу вызвать ивент для посадки в машину с сервера. Пробовал передать число, потом нагуглил тему в которой писали что передавать можно только строки.
Но всё равно передается "undefined", где тут ошибка?

Сервер
Код:
if(nearVehicle)
    {
        player.stored.hCarHack = nearVehicle;
        player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle));
        player.outputChatBox("...");
       
    }
    else
        player.outputChatBox("Рядом с Вами нет подходящей машины");


Клиент
Код:
mp.events.add("RPC_TryVehicleHack", function (vehicleid)
{
    if (carhacker_ui)
    {
        carhacker_ui.reload(false);
        carhacker_ui.active = true;
    }

    vehicle_to_hack = vehicleid;//mp.vehicles.atRemoteId(vehicleid);
    mp.gui.cursor.show(true, true);
    mp.gui.chat.push(`Начинаем взлом ${vehicleid}...`);
});

Покажи больше кода..что такое nearVehicle?
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Весь код покажи.
Код:
mp.events.addCommand("test", (player, _) =>
{
    player.stored.race_step = 0;
    player.stored.is_in_race = true;
    race_winer = null;

    race_vehicles.forEach((vehicle) =>
    {
        vehicle.destroy();
    });
    race_vehicles = [];

    cp_list.forEach((cp, id) =>
    {
        let next_pos = new mp.Vector3(cp.x, cp.y, cp.z);
        if(cp_list.length > id + 1)
            next_pos = new mp.Vector3(cp_list[id + 1].x, cp_list[id + 1].y, cp_list[id + 1].z);

        cp_list[id].handle = mp.checkpoints.new(1, new mp.Vector3(cp.x, cp.y, cp.z), 5,
        {
            direction: next_pos,
            color: [ 100, 255, 0, 255 ],
            visible: false,
            dimension: 0
        });
    });

    race_vehicles.push(player.stored.vehicle = mp.vehicles.new(mp.joaat("turismor"), new mp.Vector3(-394.9336, 1215.1986, 324.8054),
    {
        locked: true,
        numberPlate: "z1",
        color: [[255, 255, 255],[0, 0, 0]]
    }));

    race_vehicles.push(player.stored.vehicle = mp.vehicles.new(mp.joaat("turismor"), new mp.Vector3(-404.4807, 1217.6987, 324.8057),
    {
        locked: true,
        numberPlate: "z1",
        color: [[0, 0, 0],[255, 255, 255]]
    }));

    cp_list[0].handle.showFor(player);
    player.position = new mp.Vector3(-418.3911, 1228.9887, 325.7583);
    player.outputChatBox("Вы приняли участие в гонке.");   
});

/*mp.events.addCommand("add_cp", (player, _, comment) =>
{
    let pos = player.position;
    if(!comment || comment.trim().length == 0)
        return player.outputChatBox(JSON.stringify(pos));

    pos.comment = comment;
    cp_list.push(pos);
    
    let fs = require("fs");
    fs.writeFileSync("checkpoints.json", JSON.stringify({"CheckPoints": cp_list}));
    player.outputChatBox(JSON.stringify(pos));
})*/

mp.events.addCommand("ch", (player, _) =>
{
    let nearDist = 10, nearVehicle = null;
    mp.vehicles.forEach((vehicle) =>
    {
        let dist = vehicle.dist(player.position);
        if(nearDist > dist)
        {
            nearDist = dist;
            nearVehicle = vehicle;
        }
    });

    if(nearVehicle)
    {
        player.stored.hCarHack = nearVehicle;
        player.call("RPC_TryVehicleHack", [nearVehicle.id]);
        player.outputChatBox("...");
        
    }
    else
        player.outputChatBox("Рядом с Вами нет подходящей машины");
});

mp.events.add("RPC_VehicleHack", (player, is_success, chanse) =>
{
    if(!is_success)
        return;

    let vehicle = player.stored.hCarHack;
    vehicle.locked = false;
    player.outputChatBox(`Mission complite (${is_success}, ${chanse})`);
});

mp.events.add("playerStartEnterVehicle", (player, vehicle) =>
{
    if(vehicle.locked)
    {
        player.outputChatBox("hey man!");
        return false;
    }
});

Код:
let carhacker_ui;
let vehicle_to_hack;

mp.events.add('guiReady', () =>
{
    if (!carhacker_ui)
    {
        carhacker_ui = mp.browsers.new('package://carhacker/carhack.html');
        carhacker_ui.active = false;
    }
});

mp.events.add("LPC_VehicleHackResult", function (is_success, chanse)
{
    if (carhacker_ui)
        carhacker_ui.active = false;

    mp.gui.cursor.show(false, false);
    mp.events.callRemote("RPC_VehicleHack", is_success, chanse);
    if(is_success)
    {
        vehicle_to_hack.setSirenSound(false); // Не работает
        //vehicle_to_hack.SetDoorsLocked(1); // Крашит
        mp.players.local.taskEnterVehicle(vehicle_to_hack.handle, 10000, -1, 2.0, 1, 0);
    }
    else vehicle_to_hack.setSirenSound(true); // не работает
});

mp.events.add("RPC_TryVehicleHack", function (vehicleid)
{
    if (carhacker_ui)
    {
        carhacker_ui.reload(false);
        carhacker_ui.active = true;
    }

    vehicleid = parseInt(vehicleid.toString(), 10);
    vehicle_to_hack = mp.vehicles.atRemoteId(vehicleid);
    mp.gui.cursor.show(true, true);
    mp.gui.chat.push("Начинаем взлом...");
});

На клиенте добавил строку на "vehicleid = parseInt(vehicleid.toString(), 10);" перед "vehicle_to_hack = mp.vehicles.atRemoteId(vehicleid);", вроде работает, хотя наверняка это не правильное использование. Но "vehicle_to_hack.SetDoorsLocked(1); // Крашит" и сирену не включает.

Задумка была такая что бы при взломе машины открывалась браузерная мини игра, при прохождении её машину открывало, а при провале включало сигнализацию.
Но что-то пошло не так
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
Почему код не работает с дверями?
let vehicle = mp.vehicles.atRemoteId(vehicleid);
vehicle_to_hack.SetDoorsLocked(1);
я функции с вики взял, есть нюансы какие-то? vehicleid соответствует ID машины на сервере, я проверял
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
Код:
mp.events.addCommand("test", (player, _) =>
{
    player.stored.race_step = 0;
    player.stored.is_in_race = true;
    race_winer = null;

    race_vehicles.forEach((vehicle) =>
    {
        vehicle.destroy();
    });
    race_vehicles = [];

    cp_list.forEach((cp, id) =>
    {
        let next_pos = new mp.Vector3(cp.x, cp.y, cp.z);
        if(cp_list.length > id + 1)
            next_pos = new mp.Vector3(cp_list[id + 1].x, cp_list[id + 1].y, cp_list[id + 1].z);

        cp_list[id].handle = mp.checkpoints.new(1, new mp.Vector3(cp.x, cp.y, cp.z), 5,
        {
            direction: next_pos,
            color: [ 100, 255, 0, 255 ],
            visible: false,
            dimension: 0
        });
    });

    race_vehicles.push(player.stored.vehicle = mp.vehicles.new(mp.joaat("turismor"), new mp.Vector3(-394.9336, 1215.1986, 324.8054),
    {
        locked: true,
        numberPlate: "z1",
        color: [[255, 255, 255],[0, 0, 0]]
    }));

    race_vehicles.push(player.stored.vehicle = mp.vehicles.new(mp.joaat("turismor"), new mp.Vector3(-404.4807, 1217.6987, 324.8057),
    {
        locked: true,
        numberPlate: "z1",
        color: [[0, 0, 0],[255, 255, 255]]
    }));

    cp_list[0].handle.showFor(player);
    player.position = new mp.Vector3(-418.3911, 1228.9887, 325.7583);
    player.outputChatBox("Вы приняли участие в гонке.");  
});

/*mp.events.addCommand("add_cp", (player, _, comment) =>
{
    let pos = player.position;
    if(!comment || comment.trim().length == 0)
        return player.outputChatBox(JSON.stringify(pos));

    pos.comment = comment;
    cp_list.push(pos);
   
    let fs = require("fs");
    fs.writeFileSync("checkpoints.json", JSON.stringify({"CheckPoints": cp_list}));
    player.outputChatBox(JSON.stringify(pos));
})*/

mp.events.addCommand("ch", (player, _) =>
{
    let nearDist = 10, nearVehicle = null;
    mp.vehicles.forEach((vehicle) =>
    {
        let dist = vehicle.dist(player.position);
        if(nearDist > dist)
        {
            nearDist = dist;
            nearVehicle = vehicle;
        }
    });

    if(nearVehicle)
    {
        player.stored.hCarHack = nearVehicle;
        player.call("RPC_TryVehicleHack", [nearVehicle.id]);
        player.outputChatBox("...");
       
    }
    else
        player.outputChatBox("Рядом с Вами нет подходящей машины");
});

mp.events.add("RPC_VehicleHack", (player, is_success, chanse) =>
{
    if(!is_success)
        return;

    let vehicle = player.stored.hCarHack;
    vehicle.locked = false;
    player.outputChatBox(`Mission complite (${is_success}, ${chanse})`);
});

mp.events.add("playerStartEnterVehicle", (player, vehicle) =>
{
    if(vehicle.locked)
    {
        player.outputChatBox("hey man!");
        return false;
    }
});

Код:
let carhacker_ui;
let vehicle_to_hack;

mp.events.add('guiReady', () =>
{
    if (!carhacker_ui)
    {
        carhacker_ui = mp.browsers.new('package://carhacker/carhack.html');
        carhacker_ui.active = false;
    }
});

mp.events.add("LPC_VehicleHackResult", function (is_success, chanse)
{
    if (carhacker_ui)
        carhacker_ui.active = false;

    mp.gui.cursor.show(false, false);
    mp.events.callRemote("RPC_VehicleHack", is_success, chanse);
    if(is_success)
    {
        vehicle_to_hack.setSirenSound(false); // Не работает
        //vehicle_to_hack.SetDoorsLocked(1); // Крашит
        mp.players.local.taskEnterVehicle(vehicle_to_hack.handle, 10000, -1, 2.0, 1, 0);
    }
    else vehicle_to_hack.setSirenSound(true); // не работает
});

mp.events.add("RPC_TryVehicleHack", function (vehicleid)
{
    if (carhacker_ui)
    {
        carhacker_ui.reload(false);
        carhacker_ui.active = true;
    }

    vehicleid = parseInt(vehicleid.toString(), 10);
    vehicle_to_hack = mp.vehicles.atRemoteId(vehicleid);
    mp.gui.cursor.show(true, true);
    mp.gui.chat.push("Начинаем взлом...");
});

На клиенте добавил строку на "vehicleid = parseInt(vehicleid.toString(), 10);" перед "vehicle_to_hack = mp.vehicles.atRemoteId(vehicleid);", вроде работает, хотя наверняка это не правильное использование. Но "vehicle_to_hack.SetDoorsLocked(1); // Крашит" и сирену не включает.

Задумка была такая что бы при взломе машины открывалась браузерная мини игра, при прохождении её машину открывало, а при провале включало сигнализацию.
Но что-то пошло не так
Отлови ошибку через try{}catch(e){}
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
JavaScript:
let vehicle = mp.vehicles.atRemoteId(vehicleid);
vehicle_to_hack.SetDoorsLocked(1);
И здесь вы указали что создаете переменную vehicle а не vehicle_to_hack
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
Не могу вызвать ивент для посадки в машину с сервера. Пробовал передать число, потом нагуглил тему в которой писали что передавать можно только строки.
Но всё равно передается "undefined", где тут ошибка?

Сервер
Код:
if(nearVehicle)
    {
        player.stored.hCarHack = nearVehicle;
        player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle));
        player.outputChatBox("...");
     
    }
    else
        player.outputChatBox("Рядом с Вами нет подходящей машины");


Клиент
Код:
mp.events.add("RPC_TryVehicleHack", function (vehicleid)
{
    if (carhacker_ui)
    {
        carhacker_ui.reload(false);
        carhacker_ui.active = true;
    }

    vehicle_to_hack = vehicleid;//mp.vehicles.atRemoteId(vehicleid);
    mp.gui.cursor.show(true, true);
    mp.gui.chat.push(`Начинаем взлом ${vehicleid}...`);
});
На сервере, когда вызываете событие на клиенте нужно передавать параметры массивом.
JavaScript:
player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle)); // не верно
player.call("RPC_TryVehicleHack", [JSON.stringify(nearVehicle)]); // верно
 

Евгений Бусько

Начинающий специалист
16 Янв 2021
35
9
48
чтобы его видели все, создайте авто на стороне сервера.
Как синхронизировать машины между клиентов и сервером? Пример: чел на клиенте создал машину и поехал куда ему надо, да, ее не видно никому, но он выполнил свою задачу - доехал до места назначения. Как это будет выглядеть у других игроков, машины не видно(ведь она создана читом на клиенте), но игрок двигается быстро.
 

X-Clusiv

Модератор
Команда форума
high coder
4 Окт 2020
680
336
161
29
Как синхронизировать машины между клиентов и сервером? Пример: чел на клиенте создал машину и поехал куда ему надо, да, ее не видно никому, но он выполнил свою задачу - доехал до места назначения. Как это будет выглядеть у других игроков, машины не видно(ведь она создана читом на клиенте), но игрок двигается быстро.
писать античит. Проверять к примеру, евентом, если игрок сел в машину а vehicle.remoteID нет. то отправляем на сервер эвент о том что игрок подозревается в читерстве и кикаем его.
 

Wa3Rix

Активный участник
high coder
19 Ноя 2020
32
4
30
JavaScript:
let vehicle = mp.vehicles.atRemoteId(vehicleid);
vehicle_to_hack.SetDoorsLocked(1);
И здесь вы указали что создаете переменную vehicle а не vehicle_to_hack
Да эту опечатку я заметил, скидывал закоментирвоаную строку, но причина не в ней. Только за ПК сел, сейчас проверю её тип и отпишу.

На сервере, когда вызываете событие на клиенте нужно передавать параметры массивом.
JavaScript:
player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle)); // не верно
player.call("RPC_TryVehicleHack", [JSON.stringify(nearVehicle)]); // верно
Благодарю за разъяснение, а массив может состоять из чисел?

писать античит. Проверять к примеру, евентом, если игрок сел в машину а vehicle.remoteID нет. то отправляем на сервер эвент о том что игрок подозревается в читерстве и кикаем его.
Вообще лучше не доверять клиенту, т.к. он может поставить нопы на ивенты и кататься на созданных софтом машинах. Но вообще интересно, как выглядит это со стороны?
К примеру в SAMP'e если создать машину софтом, то игрок отправляет синхру с ног каждый тик обусловленный стоянием (в 10 раз реже чем при движении вроде бы), хоть и движется. События входа/выхода в машину, анимации, клавиши и аналогичные данные существующие в синхронизации машин не передаются.

А что в рейдже, будет ли это как простой телепорт с ног, отправка какой-то инфы или клиент просто будет стоять на месте пока не выйдет из фейк такси?