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

Проблема Vehicle::setDoorOpen

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Здраствуйте,

Когда нахожусь с наружи и открываю дверь ближайщей машины через этот Ивент; он открывается и сразу закрывается. Потом сяду в машину и все открвается нормально и не закрываестся при выходе/входе из тачки. Как это исправить ? Мне надо воздежствовать нормально с этим ивентом с машиной с НАРУЖИ а не с внутри. Пожалуйста помогите.
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
2,408
238
100
Привет! Кажется, у вас проблема с сенсором или механизмом блокировки двери, который активируется при открытии. Рекомендую обратиться к специалисту для проверки и ремонта данной проблемы.
 

Inoi

/dev/null
Команда форума
Moderator
VIP
15 Окт 2020
4,054
2,002
208
35
в рендер наверное пихать, только
игра принудительно иначе постоянно будет её закрывать

по крайней мере я вижу только такие решения, поблуждав пару минут по дискичу рейджа


Код:
export default class VehicleSync {
    private static readonly TRUNK_KEY = 'TRUNK';
    private static readonly LocalPlayer = mp.players.local;

    static OnInit() {
        mp.events.add('render', VehicleSync.UpdateStateEveryTick);
    }

    private static HasData(entity: EntityMp, key: string): boolean {
        return entity.getVariable(key) !== undefined && entity.getVariable(key) !== null;
    }

    public static UpdateStateEveryTick() {
        for (const Veh of mp.vehicles.streamed) {
            VehicleSync.HasData(Veh, VehicleSync.TRUNK_KEY) ? Veh.setDoorOpen(5, false, true) : Veh.setDoorShut(5, true);
        }
    }
}

VehicleSync.OnInit();

это просто скопированный пример, поэтому тут багажник
но глобально насколько я понимаю никакой разницы нет, их игра одинакого закрывает, если ты не открываешь каждым тиком
 

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Хорошо спасибо попробую
 

DaVilka

Старожил
BackEnd developer
16 Сен 2020
771
284
128

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
В общем при добовление ивента рендер в инвент entityStreamIn машина просто вползает в верх; да дич происходит; перевернулся и в верх сразу как магнис и то же самое проиисходит когда ставлю интервал репетиции меньше 100мс. Я думаю что рендер и есть интервал репетиции меньше 100 мс. Ну короче не помогло и такое решение ну на крайной оставлю(но я не против решить его так). А второе сразу закрывать тоже не помогает. Ну короче это синхронизация дверей машины; когда человек незнающую машину видет его сразу(с телепортом я тестил) то двери открываются и закрываются и всё хана. Но если ты в него садится будешь потом выходить вот теперь уже спокойно можешь открыть багазжники или двери с наружи без проблем. А вот если ты с наружи первый раз тачку видешь никак не откроешь сразу при открытие закрывает. Скрипт свою работу делает но какой то баг усложняет нашу жизнь опять. Пожалуйста помогите.

Server side :
Код:
mp.events.add('storeVehicleDoorState', (player, vehicle, doorIndex, doorOpen) => {
    let doorStates = vehicle.getVariable('doorStates') || {};
    doorStates[doorIndex] = doorOpen;
    vehicle.setVariable('doorStates', doorStates);
});

Client side :
Код:
mp.events.add('playerLeaveVehicle', vehicle => {
    if (vehicle === null || vehicle === undefined) return;


    for (let doorIndex = 0; doorIndex <= 7; doorIndex++) {
        const doorAngleRatio = vehicle.getDoorAngleRatio(doorIndex);
        const doorOpen = doorAngleRatio > 0.1;
        mp.events.callRemote('storeVehicleDoorState', vehicle, doorIndex, doorOpen);
    }
});


mp.events.add('entityStreamIn', entity => {
    if (entity.type !== 'vehicle') return;


    setTimeout(() => {
        const doorStates = entity.getVariable('doorStates');


        if (doorStates) {
            for (let doorIndex in doorStates) {
                const doorOpen = doorStates[doorIndex];
                const doorIndexInt = parseInt(doorIndex);
                mp.game.invoke('0x218297BF0CFD853B', entity.handle, doorIndexInt); // и без этого фигня
                entity.setDoorControl(doorIndexInt, 1, 0); // и без этого фигня


                if (doorOpen) {
                    // entity.setDoorShut(doorIndexInt, false); ничё не менялась
                    entity.setDoorOpen(doorIndexInt, false, false);
                } else {
                    entity.setDoorShut(doorIndexInt, false);
                }
            }
        }
    }, 1500);
});


mp.events.add('playerEnterVehicle', (vehicle, seat) => {
    setTimeout(() => {
        if (vehicle.getPedInSeat(-1) === mp.players.local.handle) {
            const doorStates = vehicle.getVariable('doorStates');
            if (doorStates) {
                for (let doorIndex in doorStates) {
                    const doorOpen = doorStates[doorIndex];
                    if (doorOpen) {
                        vehicle.setDoorOpen(parseInt(doorIndex), false, false);
                    } else {
                        vehicle.setDoorShut(parseInt(doorIndex), false);
                    }
                }
            }
        }
    }, 100);
});

PS : а вот когда садишься в машину все сихнронизируется спокойно
 

DaVilka

Старожил
BackEnd developer
16 Сен 2020
771
284
128
не понял, может ты не один на сервере, в любом случае открывать дверь нужно у контроллера тачки
 

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Контроллер открыл дверь; вышел из тачки оставляя дверь открытым(Визуально). Другой чел приехал должен видеть открытые двери. Типо синхра ну как с деформацией.
Скрипт работает но двери моментально закрываются
 
Последнее редактирование:

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,355
807
181
34
С контроллерами кстати это лес дремучий, ни где нет толковой документации. Когда они назначаются и т. д.
 

Swayze

Активный участник
BackEnd developer
6 Окт 2022
78
39
75
Сделай себе синхру для машинки в которую будешь передавать состояние дверей и т.д., например как я использую
Код:
mp.events.add('event', (vehicleId, door, state) => {
  const vehicle = mp.vehicles.atRemoteId(vehId);
  if (vehicle && mp.vehicles.exists(vehicle)) {
    if (state === 0) vehicle.setDoorShut(door, false);
    else if (state === 1) vehicle.setDoorOpen(door, false, false);
    else vehicle.setDoorBroken(door, true);
  }
});

Этот ивент вызываю в радиусе при изменении состояния дверей.
Ну и примерно то же самое впинхуть в стрим(entityStreamIn)
 
Реакции: Robert_Easter

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
К сожалению не смог я настроить это; что я не так сделал ? Опять же двери сразу закрываются пока игрок не сядить в машину для синхры
Client side :
Код:
mp.events.add('playerLeaveVehicle', vehicle => {
    if (vehicle === null || vehicle === undefined) return;


    for (let doorIndex = 0; doorIndex <= 7; doorIndex++) {
        const doorAngleRatio = vehicle.getDoorAngleRatio(doorIndex);
        const doorOpen = doorAngleRatio > 0.1;
        mp.events.callRemote('storeVehicleDoorState', vehicle, doorIndex, doorOpen);
        mp.events.call('syncVehicleDoorState', vehicle.remoteId, doorIndex, doorOpen ? 1 : 0);
    }
});


mp.events.add('entityStreamIn', entity => {
    if (entity.type !== 'vehicle') return;


    setTimeout(() => {
        const doorStates = entity.getVariable('doorStates');


        if (doorStates) {
            for (let doorIndex in doorStates) {
                const doorState = doorStates[doorIndex];
                mp.events.call('syncVehicleDoorState', entity.remoteId, parseInt(doorIndex), doorState ? 1 : 0);
            }
        }
    }, 1500);
});


mp.events.add('playerEnterVehicle', (vehicle, seat) => {
    setTimeout(() => {
        if (vehicle.getPedInSeat(-1) === mp.players.local.handle) {
            const doorStates = vehicle.getVariable('doorStates');
            if (doorStates) {
                for (let doorIndex in doorStates) {
                    const doorState = doorStates[doorIndex];
                    mp.events.call('syncVehicleDoorState', vehicle.remoteId, parseInt(doorIndex), doorState ? 1 : 0);
                }
            }
        }
    }, 100);
});


mp.events.add('syncVehicleDoorState', (vehicleId, doorIndex, state) => {
    const vehicle = mp.vehicles.atRemoteId(vehicleId);
    if (vehicle && mp.vehicles.exists(vehicle)) {
        if (state === 0) {
            vehicle.setDoorShut(doorIndex, false);
        } else if (state === 1) {
            vehicle.setDoorOpen(doorIndex, false, true);
        } else {
            vehicle.setDoorBroken(doorIndex, true);
        }
    }
});

Server side:
Код:
mp.events.add('storeVehicleDoorState', (player, vehicle, doorIndex, doorOpen) => {
    let doorStates = vehicle.getVariable('doorStates') || {};
    doorStates[doorIndex] = doorOpen;
    vehicle.setVariable('doorStates', doorStates);
});


PS : Это проблема новая ? ведь в 2018 год есть какой то скрипт который вроде уверенно написано что это делает https://rage.mp/files/file/8-basic-vehicle-sync/?tab=reviews&sort=newest#review-1348 но на самом деле ничего не делает. Я пока что над дверями только работаю. Спасибо за твой ответ но пока что я страдаю
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,355
807
181
34
Реакции: Robert_Easter

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Скачал только что; спавнил машину как он. Открыл дверь и сразу закрывается. Сел в машину и вышел с него. Открыл дверь нормально всё стало. А вот для синхры же сесть в машину не должно быть обезательным условием.

PS : Я всё еще больше и больше убеждаюсь что это проблема не было в 2019 год. Сделали обновление и так оставили бля и это про игру ГТА(Grand Theft AUTO). Это надо как то исправить
 

Vermilion

Высший разум
High developer
BackEnd developer
FrontEnd developer
29 Сен 2021
1,355
807
181
34
Попробуй на чистом сервере, может у тебя где то в таймауте стоит обновление состояния машины
 
Реакции: Robert_Easter

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Да проблема в моем коде прошлом но не знаю в каком в чистой сервере сработала. И да оказывается код который я последним оставил на верху нормально синхрит двери.Спасибо за ответ иду искать надеюсь найду.
 

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Нет я ошбися и на чистом сервере та же история. Брал тачку отехал открыл двери другой приехал не может их открывать/закрывать больше и не видет их
 

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Вопрос уже вот такой; как при подключение серверу; ироку сделать контроллером всех тачек. Или как отнять права контроллера при выходе из тачки. Вот это поможет думаю но какая натива
 
Последнее редактирование:

DaVilka

Старожил
BackEnd developer
16 Сен 2020
771
284
128
никак. Насколько я знаю, жонглировать контроллером можно только у педов
 

Robert_Easter

Участник портала
17 Июл 2024
103
13
28
Извини за вопрос но как это использовать вообще

Player::isEnteringVehicle​


Мне нужно взять момент когда человек пытатся садится за руль; когда он бегает. StartEnterVehicle делает тот же самое как EnterVehicle. А вот этот вообще не реагирует не за что. Нервов уже не хватает. Просто скажи мне как именно взять момент когда человек пытается садится в машину; когда нажал на кнопу бегает к машине. Спасибо
 

Swayze

Активный участник
BackEnd developer
6 Окт 2022
78
39
75
В интервал впихни его либо в рендер, там уже выбор за тобой.
 
Реакции: Robert_Easter