175 lines
		
	
	
		
			No EOL
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			No EOL
		
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
const defaultValues = {
 | 
						|
    noactive_plugin_ui: {
 | 
						|
        usage: false,
 | 
						|
        freezeplayer: true,
 | 
						|
        style: 1,
 | 
						|
        logo: ""
 | 
						|
    },
 | 
						|
    keybinds: {
 | 
						|
        open_Radio: "O"
 | 
						|
    },
 | 
						|
    locales: {
 | 
						|
        open_Radio: "Open Radio",
 | 
						|
        no_plugin_active_header: "No plugin activated",
 | 
						|
        no_plugin_active_body: "You have no plugin active. Please activate a plugin in the settings."
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function loadConfig() {
 | 
						|
    const fileData = LoadResourceFile(GetCurrentResourceName(), "config.json")
 | 
						|
  
 | 
						|
    if (!fileData) {
 | 
						|
        return defaultValues
 | 
						|
    }
 | 
						|
  
 | 
						|
    const parsedData = JSON.parse(fileData)
 | 
						|
  
 | 
						|
    for (const key in defaultValues) {
 | 
						|
        if (!(key in parsedData)) {
 | 
						|
            console.warn(
 | 
						|
            `[YaCA-UI] Missing config value for key '${key}' setting to default value: ${defaultValues[key]}\nMissing config values can cause unexpected behavior of the script.`,
 | 
						|
            )
 | 
						|
        }
 | 
						|
    }
 | 
						|
  
 | 
						|
    for (const key in parsedData) {
 | 
						|
        if (!(key in defaultValues)) {
 | 
						|
            console.warn(`[YaCA-UI] Unknown config key '${key}' found in config file. This keys will be ignored and can be removed.`)
 | 
						|
        }
 | 
						|
    }
 | 
						|
  
 | 
						|
    return { ...defaultValues, ...parsedData }
 | 
						|
}
 | 
						|
 | 
						|
function locale(key) {
 | 
						|
    return config.locales[key]
 | 
						|
}
 | 
						|
  
 | 
						|
const config = loadConfig()
 | 
						|
registerKeybinds();
 | 
						|
 | 
						|
let isRadioOpen = false;
 | 
						|
function openRadio(state) {
 | 
						|
    SendNuiMessage(JSON.stringify({
 | 
						|
        eventName: 'webview:yaca:openState',
 | 
						|
        show: state
 | 
						|
    }))
 | 
						|
 | 
						|
    SetNuiFocus(state, state);
 | 
						|
 | 
						|
    isRadioOpen = state;
 | 
						|
}
 | 
						|
 | 
						|
exports('openRadio', openRadio)
 | 
						|
exports('isRadioOpen', () => isRadioOpen)
 | 
						|
exports('setRadioChannelData', (data) => {
 | 
						|
    SendNuiMessage(JSON.stringify({
 | 
						|
        eventName: 'webview:yaca:setChannelData',
 | 
						|
        data: data
 | 
						|
    })) 
 | 
						|
})
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:enableRadio')
 | 
						|
on('__cfx_nui:client:yaca:enableRadio', (data, cb) => {
 | 
						|
    exports['yaca-voice'].enableRadio(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:closeRadio')
 | 
						|
on('__cfx_nui:client:yaca:closeRadio', (data, cb) => {
 | 
						|
    openRadio(false);
 | 
						|
    emit('yaca:external:radioClosed');
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:changeRadioChannelStereo')
 | 
						|
on('__cfx_nui:client:yaca:changeRadioChannelStereo', (data, cb) => {
 | 
						|
    exports['yaca-voice'].changeRadioChannelStereo();
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:changeRadioFrequency')
 | 
						|
on('__cfx_nui:client:yaca:changeRadioFrequency', (data, cb) => {
 | 
						|
    exports['yaca-voice'].changeRadioFrequency(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:changeActiveRadioChannel')
 | 
						|
on('__cfx_nui:client:yaca:changeActiveRadioChannel', (data, cb) => {
 | 
						|
    exports['yaca-voice'].setActiveRadioChannel(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:changeRadioChannelVolume')
 | 
						|
on('__cfx_nui:client:yaca:changeRadioChannelVolume', (data, cb) => {
 | 
						|
    exports['yaca-voice'].changeRadioChannelVolume(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:muteRadioChannel')
 | 
						|
on('__cfx_nui:client:yaca:muteRadioChannel', (data, cb) => {
 | 
						|
    exports['yaca-voice'].muteRadioChannel(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yaca:setSecondaryChannel')
 | 
						|
on('__cfx_nui:client:yaca:setSecondaryChannel', (data, cb) => {
 | 
						|
    exports['yaca-voice'].setSecondaryRadioChannel(data[0]);
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
RegisterNuiCallbackType('client:yacaui:ready')
 | 
						|
on('__cfx_nui:client:yacaui:ready', (data, cb) => {
 | 
						|
    SendNuiMessage(JSON.stringify({
 | 
						|
        eventName: 'webview:yaca:ready',
 | 
						|
        locale: config.locales,
 | 
						|
        useNoActivePluginUI: config.noactive_plugin_ui
 | 
						|
    }))
 | 
						|
 | 
						|
    if (config.noactive_plugin_ui.usage) {
 | 
						|
        SendNuiMessage(JSON.stringify({
 | 
						|
            eventName: 'webview:yaca:isActive',
 | 
						|
            state: isPluginActive(exports['yaca-voice'].getPluginState())
 | 
						|
        }))
 | 
						|
    }
 | 
						|
 | 
						|
    cb();
 | 
						|
});
 | 
						|
 | 
						|
on("yaca:external:pluginStateChanged", state => {
 | 
						|
    if (!config.noactive_plugin_ui.usage) return;
 | 
						|
 | 
						|
    SendNuiMessage(JSON.stringify({
 | 
						|
        eventName: 'webview:yaca:isActive',
 | 
						|
        state: isPluginActive(state)
 | 
						|
    }))
 | 
						|
});
 | 
						|
 | 
						|
let pluginActive = false;
 | 
						|
function isPluginActive(state) {
 | 
						|
    const isIngame = ["IN_INGAME_CHANNEL", "IN_EXCLUDED_CHANNEL"].includes(state);
 | 
						|
 | 
						|
    if (config.noactive_plugin_ui.freezeplayer) {
 | 
						|
        FreezeEntityPosition(PlayerPedId(), !isIngame);
 | 
						|
    }
 | 
						|
 | 
						|
    pluginActive = isIngame;
 | 
						|
 | 
						|
    return isIngame
 | 
						|
}
 | 
						|
 | 
						|
/* Keybinds */
 | 
						|
function registerKeybinds() {
 | 
						|
    if (config.keybinds.open_Radio !== false) {
 | 
						|
        RegisterCommand(
 | 
						|
            '+yaca:openRadio',
 | 
						|
            () => {
 | 
						|
                if (config.noactive_plugin_ui.usage && !pluginActive) return;
 | 
						|
 | 
						|
                this.openRadio(!isRadioOpen)
 | 
						|
            },
 | 
						|
            false,
 | 
						|
        )
 | 
						|
        RegisterKeyMapping('+yaca:openRadio', locale('open_Radio'), 'keyboard', config.keybinds.open_Radio)
 | 
						|
    }
 | 
						|
} |