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

Вопрос Синхронизация фаров машины между всеми игроками через entitystreamIn

Robert_Easter

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

Уже некоторое время что я попробывал синхронизировать фары тачек между игроками не получается. На самем деле всё отлично сихронизировано когда два игрока рядом друг друга; но когда какой то новый чел из далека приехал то синхрон потерян; у одного фары включены у другого нет. Я подумал как обычно использовать entitystreamIn но не получилось. Помогите пожалуйста. К сожалению фары тачек не ставится в серверской части как двигатель а в клиентксой части только они доступны. Я как то пытался синхрить с сервером через перемены но не удалось. Попробывал timeout но не помогло на entitystreamIn. Документация на фары : https://wiki.rage.mp/index.php?title=Vehicle::setLights https://wiki.rage.mp/index.php?title=Vehicle::getLightsState
Server side:
Код:
mp.events.add("storeVehicleLightsState", (player, vehicleId, lightsOn) => {
    let vehicle = mp.vehicles.atRemoteId(vehicleId);
    if (vehicle) {
        vehicle.setVariable("lightsOn", lightsOn);
    }
});
--------------------------------------------------------------------------------------------------------------------------------------------------
Client side:

Код:
mp.events.add("playerLeaveVehicle", (vehicle, seat) => {
    if (mp.players.local.vehicle) {
        let lightState = mp.players.local.vehicle.getLightsState(0, 0);
        let lightsOn = lightState.lightsOn === 1 ? 'true' : 'false';
        mp.events.callRemote("storeVehicleLightsState", vehicle.remoteId, lightsOn);
        mp.gui.chat.push(`Фары: ${lightsOn}`);
    }
});

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

    let lightsOn = entity.getVariable("lightsOn");
    if (lightsOn !== undefined) {
        let state = lightsOn === 'true' ? 0 : 1;
        if (mp.players.local.vehicle && mp.players.local.vehicle.remoteId === entity.remoteId) {
            mp.players.local.vehicle.setLights(state);
        }
    }
});
 

Jerry (ChatGPT)

AI-powered language model
VIP
helper
17 Окт 2023
1,767
1,305
5
Здравствуйте,

Для синхронизации состояния фар между игроками, вам нужно добавить механизм с использованием сетевых событий, подобно тому, как вы уже делаете. Однако, для обеспечения корректной синхронизации фар тачек, необходимо использовать дополнительные проверки и механизмы, такие как использование удаленных идентификаторов (remoteId) и проверка удаленного транспортного средства.

Предлагаю внести следующие изменения в ваш код:

1. В серверной части, передавайте состояние фар в числовом формате, а не в виде строки 'true' или 'false':
JavaScript:
mp.events.add("storeVehicleLightsState", (player, vehicleId, lightsOn) => {
    let vehicle = mp.vehicles.atRemoteId(vehicleId);
    if (vehicle) {
        vehicle.setVariable("lightsOn", lightsOn);
    }
});

2. В клиентской части, исправьте обработку события entityStreamIn и добавьте дополнительные проверки:
JavaScript:
mp.events.add('entityStreamIn', (entity) => {
    if (entity.type !== "vehicle") return;

    let lightsOn = entity.getVariable("lightsOn");
    if (lightsOn !== undefined) {
        let state = parseInt(lightsOn);
        if (mp.players.local.vehicle && mp.players.local.vehicle.remoteId === entity.remoteId) {
            mp.players.local.vehicle.setLights(state);
        }
    }
});

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

Vermilion

Мастер
29 Сен 2021
976
756
151
34
Вот тут не правильно:

JavaScript:
if (mp.players.local.vehicle && mp.players.local.vehicle.remoteId === entity.remoteId) {
            mp.players.local.vehicle.setLights(state);
        }

Ты устанавливаешь состояние фар для транспорта в котором находится игрок, а тебе нужно установит состояние фар для entity (транспорт) который появляется в стриме

JavaScript:
entity.setLights(state);

Грубо говоря вот так:
Код:
mp.events.add('entityStreamIn', entity => {
    if (entity.type !== 'vehicle') return
    
    const lightsOn = entity.getVariable('lightsOn')
    if (lightsOn) {
        entity.setLights(lightsOn)
    }
})
 
Последнее редактирование:

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
Спасибо за ответ; не удалось у меня смотри без ошибок скрипт работает но ничё не происходит
Server side:
Код:
mp.events.add("storeVehicleLightsState", (player, vehicleId, lightsOn) => {
    let vehicle = mp.vehicles.atRemoteId(vehicleId);
    if (vehicle) {
        vehicle.setVariable("lightsOn", lightsOn);
    }
});

Client side:
Код:
mp.events.add("playerLeaveVehicle", (vehicle, seat) => {
    if (mp.players.local.vehicle) {
        let lightState = mp.players.local.vehicle.getLightsState(0, 0);
        let lightsOn = lightState.lightsOn === 1 ? 'true' : 'false';
        mp.events.callRemote("storeVehicleLightsState", vehicle.remoteId, lightsOn);
        mp.gui.chat.push(`Фары: ${lightsOn}`);
    }
});


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


    let lightsOn = entity.getVariable("lightsOn");
    if (lightsOn !== undefined) {
        let state = lightsOn === 'true' ? 0 : 1;
        entity.setLights(state); 
    }
});

 

Swayze

Начинающий специалист
6 Окт 2022
66
16
45

Потому что передаешь данные об состоянии фар только после того как человек вышел из авто, если он не вышел, то энтити который попал в зону стрима получит данные только те которые были при последнем выходе из авто.
 
Реакции: Robert_Easter

Vermilion

Мастер
29 Сен 2021
976
756
151
34
В общем у меня получится вот такой рабочий код:

Server-Side
Код:
mp.events.add(
    'storeVehicleLightsState',
    (player, vehicle, lightsOn, highbeamsOn) => {
        vehicle.setVariables({
            lightsOn: lightsOn,
            highbeamsOn: highbeamsOn,
        })
    },
)

Client-Side
Код:
mp.events.add('playerLeaveVehicle', vehicle => {
    const { lightsOn, highbeamsOn } = vehicle.getLightsState(1, 1)
  
    mp.events.callRemote(
        'storeVehicleLightsState',
        vehicle,
        lightsOn,
        highbeamsOn,
    )
})

mp.events.add('entityStreamIn', entity => {
    if (entity.type !== 'vehicle') return
    const lightsOn: boolean = entity.getVariable('lightsOn')
    const highbeamsOn: boolean = entity.getVariable('highbeamsOn')

    if (lightsOn !== undefined && highbeamsOn !== undefined) {
        const vehicle = entity as VehicleMp
        let lightsState = 0

        if (lightsOn) {
            lightsState = highbeamsOn ? 3 : 2
        } else {
            lightsState = 0
        }
        vehicle.setLights(lightsState)
    }
})
 
Реакции: Robert_Easter и Fumarie

Robert_Easter

Активный участник
17 Июл 2024
103
13
28
Спасибо кажется работает. Там маленькие ошибки были
Server side :
Код:
mp.events.add(
    'storeVehicleLightsState',
    (player, vehicle, lightsOn, highbeamsOn) => {
        vehicle.setVariables({
            lightsOn: lightsOn,
            highbeamsOn: highbeamsOn,
        })
    },
)
Client side:
Код:
mp.events.add('playerLeaveVehicle', vehicle => {
    const { lightsOn, highbeamsOn } = vehicle.getLightsState(1, 1)


    mp.events.callRemote(
        'storeVehicleLightsState',
        vehicle,
        lightsOn,
        highbeamsOn,
    )
})


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


    const lightsOn = entity.getVariable('lightsOn');
    const highbeamsOn = entity.getVariable('highbeamsOn');


    if (typeof lightsOn !== 'undefined' && typeof highbeamsOn !== 'undefined') {
        const vehicle = entity;


        let lightsState = 0;


        if (lightsOn) {
            lightsState = highbeamsOn ? 3 : 2;
        } else {
            lightsState = 0;
        }


        vehicle.setLights(lightsState);
    }
});
 
Последнее редактирование: