This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

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

Wa3Rix

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

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

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

P.S. Fake-Wa3Rix
 

JJIGolem

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

Wa3Rix

Новый участник
BackEnd developer
19 Ноя 2020
32
4
30
У меня возникли траблы с автомобилем) Можно пример создания и синхронизации? (Что бы его видели все игроки)
 

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
чтобы его видели все, создайте авто на стороне сервера.
 

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
Как по мне, клиент это здравая мысль, можно реализовывать к примеру автосалоны, с просмотром авто в нем, не нагружая сервер спавном этих авто.(Как пример) Как говорится, что было создано на клиенте, остается на клиенте.
 
Реакции: Wa3Rix

Mikhayloff

⚡️UI Designer
Команда форума
Moderator
High designer
9 Окт 2020
1,572
783
211
Владян, ты лучший, у тебя всё получится юхуу! <3
 
Реакции: saveitll

Wa3Rix

Новый участник
BackEnd developer
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

🍔 ChefBurger
Команда форума
High developer
10 Сен 2020
3,668
2,841
219

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

Wa3Rix

Новый участник
BackEnd developer
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

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

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
Отлови ошибку через try{}catch(e){}
 

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30

X-Clusiv

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

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
На сервере, когда вызываете событие на клиенте нужно передавать параметры массивом.
JavaScript:
player.call("RPC_TryVehicleHack", JSON.stringify(nearVehicle)); // не верно
player.call("RPC_TryVehicleHack", [JSON.stringify(nearVehicle)]); // верно
 

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

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

X-Clusiv

Модератор
Команда форума
Moderator
BackEnd developer
4 Окт 2020
712
324
161
30
писать античит. Проверять к примеру, евентом, если игрок сел в машину а vehicle.remoteID нет. то отправляем на сервер эвент о том что игрок подозревается в читерстве и кикаем его.
 

Wa3Rix

Новый участник
BackEnd developer
19 Ноя 2020
32
4
30
Да эту опечатку я заметил, скидывал закоментирвоаную строку, но причина не в ней. Только за ПК сел, сейчас проверю её тип и отпишу.

Благодарю за разъяснение, а массив может состоять из чисел?

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

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