1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-06-30 22:51:22 +02:00
commit 5b1100803f
11 changed files with 895 additions and 1 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 KiB

View file

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>yaca-systems UI</title>
<script type="module" crossorigin src="./assets/index-CTefETlP.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-_IdvlNEH.css">
</head>
<body>
<div id="app"></div>
</body>
</html>

View file

@ -0,0 +1,175 @@
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)
}
}

View file

@ -0,0 +1,16 @@
{
"noactive_plugin_ui": {
"usage": false,
"freezeplayer": true,
"style": 1,
"logo": ""
},
"keybinds": {
"open_Radio": "O"
},
"locales": {
"open_Radio": "Open Radio",
"no_plugin_active_header": "Plugin",
"no_plugin_active_body": "Das Yaca Plugin muss auf dein Teamspeak Aktiv sein!"
}
}

View file

@ -0,0 +1,11 @@
games { 'gta5', 'rdr3' }
fx_version 'cerulean'
ui_page 'assets/index.html'
files {
'config.json',
'assets/**/*'
}
client_script 'client.js'

View file

@ -81,7 +81,7 @@
* - "Direct": The radio system is based on the distance between the players.
* - "None": The radio always works no matter the distance.
*/
"mode": "Tower",
"mode": "Direct",
// The maximum distance between two players or to the tower to be able to hear each other.
"maxDistance": 5000
},