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

Grove Multiplayer

Scripter228

Участник портала
26 Авг 2025
46
12
20
Вкус , цвет и фломастеры)
Например тот же серверный ELS реализуется в файвМ вот так (как я сейчас сделал паттерны(!) серверные)

JavaScript:
const ELSPatterns = {
    "default": [
        [1, 3],
        [2, 4],
        [1, 3],
        [2, 4]
    ],
    "fast_strobe": [
        [1, 2],
        [],
        [1, 2],
        [],
        [3, 4],
        [],
        [3, 4],
        []
    ],
    "traffic_advisor_left": [
        [7],
        [7, 8],
        [7, 8, 9],
        [7, 8, 9, 10],
        []
    ]
};


if (IsDuplicityVersion()) {
    global.ELSPatterns = ELSPatterns;
} else {
    window.ELSPatterns = ELSPatterns;
}

И как я делал в рейджМП "серверный" ELS


JavaScript:
mp.events.add('server:siren:toggleLights', (player, state) => {
    let veh = player.vehicle;
    
    if (!veh || player.seat !== 0) return;

    veh.setVariable('isSirenOn', state);
    
    if (!state) {
        veh.setVariable('sirenTone', 0);
    }
});

mp.events.add('server:siren:setTone', (player, tone) => {
    let veh = player.vehicle;
    
    if (!veh || player.seat !== 0) return;
    
    let currentTone = veh.getVariable('sirenTone') || 0;
    
    if (currentTone === tone) {
        veh.setVariable('sirenTone', 0);
    } else {
        veh.setVariable('sirenTone', tone);
    }
});

mp.events.add('server:siren:airhorn', (player, state) => {
    let veh = player.vehicle;
    
    if (!veh || player.seat !== 0) return;

    veh.setVariable('isAirhornOn', state);
});

mp.events.add('server:siren:blip', (player) => {
    let veh = player.vehicle;
    
    if (!veh || player.seat !== 0) return;

    mp.players.callInRange(player.position, 100.0, 'client:siren:playBlip', [veh.id]);
});

И клиентский


JavaScript:
const localPlayer = mp.players.local;
let isEmergencyDriver = false;
let lastBlipTime = 0;

function updateSirenTone(entity, tone) {
    if (entity.customSirenId !== undefined) {
        mp.game.audio.stopSound(entity.customSirenId);
        mp.game.audio.releaseSoundId(entity.customSirenId);
        entity.customSirenId = undefined;
    }

    if (tone > 0) {
        entity.customSirenId = mp.game.audio.getSoundId();
        let soundName = "VEHICLES_HORNS_SIREN_1";
        if (tone === 2) soundName = "VEHICLES_HORNS_SIREN_2";
        if (tone === 3) soundName = "VEHICLES_HORNS_POLICE_WARNING";
        
        mp.game.audio.playSoundFromEntity(entity.customSirenId, soundName, entity.handle, "", false, 0);
    }
}

global.addFastTick(() => {
    const veh = localPlayer.vehicle;
    isEmergencyDriver = veh && veh.getClass() === 18 && veh.getPedInSeat(-1) === localPlayer.handle;
});

global.addRenderTick(() => {
    if (isEmergencyDriver) {
        mp.game.controls.disableControlAction(0, 86, true);
        mp.game.controls.disableControlAction(1, 86, true);
        mp.game.controls.disableControlAction(2, 86, true);
    }
});

mp.events.add('client:input:sirenBlip', () => {
    if (!isEmergencyDriver) return;
    
    const now = Date.now();
    if (now - lastBlipTime < 600) return;
    lastBlipTime = now;

    mp.events.callRemote('server:siren:blip');
});

mp.events.add('client:siren:playBlip', (vehId) => {
    const entity = mp.vehicles.atRemoteId(vehId);
    
    if (entity && entity.handle && entity.getClass() === 18) {
        const lightsOn = entity.getVariable('isSirenOn') || false;

        if (lightsOn) {
            const blipId = mp.game.audio.getSoundId();
            mp.game.audio.playSoundFromEntity(blipId, "VEHICLES_HORNS_POLICE_WARNING", entity.handle, "", false, 0);
            setTimeout(() => {
                mp.game.audio.stopSound(blipId);
                mp.game.audio.releaseSoundId(blipId);
            }, 400);
        } else {
            if (typeof entity.setSiren === 'function') entity.setSiren(true);
            mp.game.vehicle.setHasMutedSirens(entity.handle, false);
            
            mp.game.audio.blipSiren(entity.handle);
            
            setTimeout(() => {
                if (entity && entity.handle) {
                    const currentLights = entity.getVariable('isSirenOn') || false;
                    if (typeof entity.setSiren === 'function') entity.setSiren(currentLights);
                    mp.game.vehicle.setHasMutedSirens(entity.handle, true);
                }
            }, 800);
        }
    }
});

mp.events.add('client:input:sirenLights', () => {
    if (!isEmergencyDriver) return;

    mp.game.audio.playSoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", true);

    const currentState = localPlayer.vehicle.getVariable('isSirenOn') || false;
    mp.events.callRemote('server:siren:toggleLights', !currentState);
});

mp.events.add('client:input:sirenTone', (tone) => {
    if (!isEmergencyDriver) return;
    
    const veh = localPlayer.vehicle;
    if (!(veh.getVariable('isSirenOn') || false)) return;

    mp.game.audio.playSoundFrontend(-1, "NAV_UP_DOWN", "HUD_FRONTEND_DEFAULT_SOUNDSET", true);

    mp.events.callRemote('server:siren:setTone', tone);
});

mp.events.add('client:input:sirenAirhorn', (state) => {
    if (!isEmergencyDriver) return;
    mp.events.callRemote('server:siren:airhorn', state);
});

mp.events.add('entityStreamIn', (entity) => {
    if (entity.type === 'vehicle' && entity.getClass() === 18) {
        setTimeout(() => {
            if (!mp.vehicles.exists(entity) || !entity.handle) return;
            
            const isLightsOn = entity.getVariable('isSirenOn') || false;
            const currentTone = entity.getVariable('sirenTone') || 0;

            if (typeof entity.setSiren === 'function') entity.setSiren(isLightsOn);
            mp.game.vehicle.setHasMutedSirens(entity.handle, true);
            
            updateSirenTone(entity, currentTone);
        }, 200);
    }
});

mp.events.addDataHandler('isSirenOn', (entity, value) => {
    if (entity.type === 'vehicle' && entity.handle && entity.getClass() === 18) {
        if (typeof entity.setSiren === 'function') entity.setSiren(value);
        mp.game.vehicle.setHasMutedSirens(entity.handle, true);
    }
});

mp.events.addDataHandler('sirenTone', (entity, value) => {
    if (entity.type === 'vehicle' && entity.handle && entity.getClass() === 18) {
        updateSirenTone(entity, value);
    }
});

mp.events.addDataHandler('isAirhornOn', (entity, value) => {
    if (entity.type === 'vehicle' && entity.handle) {
        if (value) {
            if (entity.airhornSoundId !== undefined) {
                mp.game.audio.stopSound(entity.airhornSoundId);
                mp.game.audio.releaseSoundId(entity.airhornSoundId);
            }
            entity.airhornSoundId = mp.game.audio.getSoundId();
            mp.game.audio.playSoundFromEntity(entity.airhornSoundId, "SIRENS_AIRHORN", entity.handle, "", false, 0);
        } else {
            if (entity.airhornSoundId !== undefined) {
                mp.game.audio.stopSound(entity.airhornSoundId);
                mp.game.audio.releaseSoundId(entity.airhornSoundId);
                entity.airhornSoundId = undefined;
            }
        }
    }
});

По-сути в файвМ я могу управлять люстрой и сиреной как угодно, а в рейджМП тупо глушил её и перехватывал управление. И это только на примере мигалок )
 
Реакции: DeAAmoN

Tony_Esposito

Новый участник
22 Апр 2023
26
2
63
Ты че угараешь, ELS давно слит и сделан не тобой
 

Scripter228

Участник портала
26 Авг 2025
46
12
20
Ты че угараешь, ELS давно слит и сделан не тобой
Ну, во-первых, то, что ты скинул, там явно используется Lua. Я же пишу исключительно на JS код ) Во-вторых, где ты видишь, чтоб я кидал код того, что я написал? ) Я скинул лишь паттерны, которые я юзаю ) Следущий код я юзал в рейджМП
 

Tony_Esposito

Новый участник
22 Апр 2023
26
2
63
А, ну базару зиро тогда