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
1,765
1,305
5
Привет! Кажется, у вас проблема с сенсором или механизмом блокировки двери, который активируется при открытии. Рекомендую обратиться к специалисту для проверки и ремонта данной проблемы.
 

Inoi

/dev/null
VIP
15 Окт 2020
3,377
2,126
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

Robert_Easter

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

DaVilka

Гуру
16 Сен 2020
709
259
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

Гуру
16 Сен 2020
709
259
128
не понял, может ты не один на сервере, в любом случае открывать дверь нужно у контроллера тачки
 

Robert_Easter

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

Vermilion

Мастер
29 Сен 2021
974
753
151
34
С контроллерами кстати это лес дремучий, ни где нет толковой документации. Когда они назначаются и т. д.
 

Swayze

Начинающий специалист
6 Окт 2022
66
16
45
Сделай себе синхру для машинки в которую будешь передавать состояние дверей и т.д., например как я использую
Код:
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

Мастер
29 Сен 2021
974
753
151
34
Реакции: Robert_Easter

Robert_Easter

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

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

Vermilion

Мастер
29 Сен 2021
974
753
151
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

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

Robert_Easter

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

Player::isEnteringVehicle​


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

Swayze

Начинающий специалист
6 Окт 2022
66
16
45
В интервал впихни его либо в рендер, там уже выбор за тобой.
 
Реакции: Robert_Easter