{"format":1,"api":2,"id":"fr.arcanescookie.scriptorium.universe.fivem","version":"1.0.0","category":"universe","author":"Les Arcanes de Cookie","color":"#f40552","name":{"fr":"FiveM","en":"FiveM"},"description":{"fr":"Pour créer des ressources et un serveur FiveM : plus de 40 extraits Lua (événements, commandes, natives courantes, NUI, blips, animations, ESX/QBCore, oxmysql), fxmanifest.lua, et modèles prêts à l’emploi (ressource, ressource avec interface NUI, server.cfg de départ).","en":"To build FiveM resources and a server: over 40 Lua snippets (events, commands, common natives, NUI, blips, animations, ESX/QBCore, oxmysql), fxmanifest.lua, and ready-made templates (resource, resource with NUI interface, starter server.cfg)."},"contributes":{"fileTypes":[{"language":"ini","extensions":[".cfg"],"filenames":["server.cfg"]}],"snippets":[{"language":"lua","items":[{"prefix":"fxmanifest","label":"fxmanifest.lua","body":"fx_version 'cerulean'\ngame 'gta5'\n\nauthor '${1:Auteur}'\ndescription '${2:Description}'\nversion '${3:1.0.0}'\n\nlua54 'yes'\n\nshared_script 'config.lua'\nclient_script 'client/main.lua'\nserver_script 'server/main.lua'"},{"prefix":"thread","label":"Citizen.CreateThread","body":"CreateThread(function()\n\twhile true do\n\t\t$0\n\t\tWait(${1:0})\n\tend\nend)","description":"Boucle client : Wait(0) = à chaque image, plus grand = plus léger."},{"prefix":"wait","label":"Wait","body":"Wait(${1:1000})"},{"prefix":"netevent","label":"RegisterNetEvent + handler","body":"RegisterNetEvent('${1:ressource}:${2:evenement}', function(${3:data})\n\t$0\nend)"},{"prefix":"addevent","label":"AddEventHandler","body":"AddEventHandler('${1:evenement}', function(${2})\n\t$0\nend)"},{"prefix":"srvevent","label":"Événement serveur (source)","body":"RegisterNetEvent('${1:ressource}:${2:evenement}', function(${3:data})\n\tlocal src = source\n\t$0\nend)"},{"prefix":"tse","label":"TriggerServerEvent","body":"TriggerServerEvent('${1:ressource}:${2:evenement}'${3})"},{"prefix":"tce","label":"TriggerClientEvent","body":"TriggerClientEvent('${1:ressource}:${2:evenement}', ${3:src}${4})"},{"prefix":"te","label":"TriggerEvent","body":"TriggerEvent('${1:evenement}'${2})"},{"prefix":"cmd","label":"RegisterCommand","body":"RegisterCommand('${1:commande}', function(source, args, rawCommand)\n\t$0\nend, ${2:false})","description":"Le dernier paramètre : true = réservé aux administrateurs (ACE)."},{"prefix":"keymap","label":"RegisterKeyMapping","body":"RegisterCommand('${1:+action}', function() $0 end, false)\nRegisterKeyMapping('${1:+action}', '${2:Description}', 'keyboard', '${3:E}')"},{"prefix":"ped","label":"Ped du joueur","body":"local ped = PlayerPedId()"},{"prefix":"coords","label":"Coordonnées du joueur","body":"local coords = GetEntityCoords(PlayerPedId())"},{"prefix":"dist","label":"Distance entre deux points","body":"local dist = #(${1:coords} - ${2:vector3(0.0, 0.0, 0.0)})"},{"prefix":"setcoords","label":"Téléporter","body":"SetEntityCoords(${1:PlayerPedId()}, ${2:0.0}, ${3:0.0}, ${4:0.0}, false, false, false, false)"},{"prefix":"ctrl","label":"Touche pressée","body":"if IsControlJustPressed(0, ${1:38}) then -- 38 = E\n\t$0\nend"},{"prefix":"model","label":"Charger un modèle","body":"local model = joaat(${1:'adder'})\nRequestModel(model)\nwhile not HasModelLoaded(model) do Wait(0) end\n$0"},{"prefix":"anim","label":"Charger et jouer une animation","body":"local dict = '${1:amb@world_human_hang_out_street@male_a@idle_a}'\nRequestAnimDict(dict)\nwhile not HasAnimDictLoaded(dict) do Wait(0) end\nTaskPlayAnim(PlayerPedId(), dict, '${2:idle_a}', 8.0, -8.0, ${3:-1}, ${4:49}, 0, false, false, false)"},{"prefix":"vehicle","label":"Créer un véhicule","body":"local veh = CreateVehicle(model, ${1:coords.x}, ${2:coords.y}, ${3:coords.z}, ${4:heading}, true, false)\nSetVehicleNumberPlateText(veh, '${5:ARCANES}')\nSetPedIntoVehicle(PlayerPedId(), veh, -1)"},{"prefix":"blip","label":"Blip sur la carte","body":"local blip = AddBlipForCoord(${1:x}, ${2:y}, ${3:z})\nSetBlipSprite(blip, ${4:1})\nSetBlipColour(blip, ${5:2})\nSetBlipScale(blip, 0.8)\nSetBlipAsShortRange(blip, true)\nBeginTextCommandSetBlipName('STRING')\nAddTextComponentSubstringPlayerName('${6:Nom}')\nEndTextCommandSetBlipName(blip)"},{"prefix":"notify","label":"Notification à l’écran","body":"BeginTextCommandThefeedPost('STRING')\nAddTextComponentSubstringPlayerName(${1:'Message'})\nEndTextCommandThefeedPostTicker(false, false)"},{"prefix":"help","label":"Aide en haut à gauche","body":"BeginTextCommandDisplayHelp('STRING')\nAddTextComponentSubstringPlayerName(${1:'Appuyez sur ~INPUT_CONTEXT~'})\nEndTextCommandDisplayHelp(0, false, true, -1)"},{"prefix":"text3d","label":"Fonction texte 3D","body":"local function DrawText3D(x, y, z, text)\n\tSetTextScale(0.35, 0.35)\n\tSetTextFont(4)\n\tSetTextColour(255, 255, 255, 215)\n\tSetTextCentre(true)\n\tSetDrawOrigin(x, y, z, 0)\n\tBeginTextCommandDisplayText('STRING')\n\tAddTextComponentSubstringPlayerName(text)\n\tEndTextCommandDisplayText(0.0, 0.0)\n\tClearDrawOrigin()\nend"},{"prefix":"nuiopen","label":"Ouvrir une interface NUI","body":"SetNuiFocus(true, true)\nSendNUIMessage({ action = '${1:ouvrir}', data = ${2:{}} })"},{"prefix":"nuicb","label":"Callback NUI","body":"RegisterNUICallback('${1:action}', function(data, cb)\n\t$0\n\tcb('ok')\nend)"},{"prefix":"nuiclose","label":"Fermer l’interface NUI","body":"SetNuiFocus(false, false)\nSendNUIMessage({ action = 'fermer' })"},{"prefix":"export","label":"Déclarer un export","body":"exports('${1:nom}', function(${2})\n\t$0\nend)"},{"prefix":"useexport","label":"Utiliser un export","body":"exports['${1:ressource}']:${2:fonction}(${3})"},{"prefix":"resname","label":"Nom de la ressource","body":"GetCurrentResourceName()"},{"prefix":"ids","label":"Identifiants d’un joueur","body":"local identifiers = GetPlayerIdentifiers(${1:src})\nfor _, id in ipairs(identifiers) do\n\t$0\nend"},{"prefix":"drop","label":"Expulser un joueur","body":"DropPlayer(${1:src}, '${2:Raison}')"},{"prefix":"esx","label":"ESX (objet partagé)","body":"local ESX = exports['es_extended']:getSharedObject()"},{"prefix":"qb","label":"QBCore (objet partagé)","body":"local QBCore = exports['qb-core']:GetCoreObject()"},{"prefix":"sql","label":"Requête oxmysql","body":"local rows = MySQL.query.await('SELECT * FROM ${1:table} WHERE ${2:id} = ?', { ${3:valeur} })\n$0"},{"prefix":"config","label":"Fichier config.lua","body":"Config = {}\n\nConfig.Debug = ${1:false}\nConfig.Locale = '${2:fr}'"},{"prefix":"debug","label":"Message de débogage","body":"if Config.Debug then print(('[%s] ${1:message}'):format(GetCurrentResourceName())) end"}]}],"templates":[{"id":"fivem-resource","label":{"fr":"Ressource FiveM (Lua)","en":"FiveM resource (Lua)"},"description":{"fr":"fxmanifest, config, client et serveur","en":"fxmanifest, config, client and server"},"files":[{"path":"{{name}}/fxmanifest.lua","content":"fx_version 'cerulean'\ngame 'gta5'\n\nauthor 'Les Arcanes de Cookie'\ndescription '{{name}}'\nversion '1.0.0'\n\nlua54 'yes'\n\nshared_script 'config.lua'\nclient_script 'client/main.lua'\nserver_script 'server/main.lua'\n"},{"path":"{{name}}/config.lua","content":"Config = {}\n\nConfig.Debug = false\n"},{"path":"{{name}}/client/main.lua","content":"RegisterCommand('{{name}}', function()\n\tTriggerServerEvent('{{name}}:server:hello')\nend, false)\n\nRegisterNetEvent('{{name}}:client:hello', function(message)\n\tBeginTextCommandThefeedPost('STRING')\n\tAddTextComponentSubstringPlayerName(message)\n\tEndTextCommandThefeedPostTicker(false, false)\nend)\n"},{"path":"{{name}}/server/main.lua","content":"RegisterNetEvent('{{name}}:server:hello', function()\n\tlocal src = source\n\tTriggerClientEvent('{{name}}:client:hello', src, 'Bonjour depuis {{name}} !')\nend)\n\nif Config.Debug then\n\tprint(('[%s] démarrée'):format(GetCurrentResourceName()))\nend\n"}]},{"id":"fivem-nui","label":{"fr":"Ressource FiveM avec interface (NUI)","en":"FiveM resource with UI (NUI)"},"description":{"fr":"Ressource + page HTML/CSS/JS ouverte avec une commande","en":"Resource + HTML/CSS/JS page opened with a command"},"files":[{"path":"{{name}}/fxmanifest.lua","content":"fx_version 'cerulean'\ngame 'gta5'\n\nauthor 'Les Arcanes de Cookie'\ndescription '{{name}}'\nversion '1.0.0'\n\nlua54 'yes'\n\nui_page 'html/index.html'\n\nfiles {\n\t'html/index.html',\n\t'html/style.css',\n\t'html/script.js',\n}\n\nclient_script 'client/main.lua'\n"},{"path":"{{name}}/client/main.lua","content":"local open = false\n\nlocal function setOpen(state)\n\topen = state\n\tSetNuiFocus(state, state)\n\tSendNUIMessage({ action = state and 'ouvrir' or 'fermer' })\nend\n\nRegisterCommand('{{name}}', function() setOpen(not open) end, false)\n\nRegisterNUICallback('fermer', function(_, cb)\n\tsetOpen(false)\n\tcb('ok')\nend)\n"},{"path":"{{name}}/html/index.html","content":"<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<link rel=\"stylesheet\" href=\"style.css\">\n</head>\n<body>\n\t<div id=\"panneau\" hidden>\n\t\t<h1>{{name}}</h1>\n\t\t<button id=\"fermer\">Fermer</button>\n\t</div>\n\t<script src=\"script.js\"></script>\n</body>\n</html>\n"},{"path":"{{name}}/html/style.css","content":"body { margin: 0; font-family: sans-serif; }\n#panneau {\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tpadding: 1.5rem 2rem;\n\tbackground: rgba(26, 19, 37, .92);\n\tcolor: #fff;\n\tborder-radius: 12px;\n}\n"},{"path":"{{name}}/html/script.js","content":"const panneau = document.getElementById('panneau');\n\nwindow.addEventListener('message', (event) => {\n\tif (event.data.action === 'ouvrir') panneau.hidden = false;\n\tif (event.data.action === 'fermer') panneau.hidden = true;\n});\n\ndocument.getElementById('fermer').addEventListener('click', () => {\n\tfetch(`https://${GetParentResourceName()}/fermer`, { method: 'POST', body: '{}' });\n});\n"}]},{"id":"fivem-server-cfg","label":{"fr":"server.cfg de départ","en":"Starter server.cfg"},"description":{"fr":"Configuration serveur FiveM de base (la clé de licence est à ajouter vous-même)","en":"Basic FiveM server configuration (add your own license key)"},"files":[{"path":"{{name}}/server.cfg","content":"# {{name}} — configuration du serveur FiveM\nendpoint_add_tcp \"0.0.0.0:30120\"\nendpoint_add_udp \"0.0.0.0:30120\"\n\nsv_hostname \"{{name}}\"\nsets sv_projectName \"{{name}}\"\nsets sv_projectDesc \"Serveur FiveM\"\nsets locale \"fr-FR\"\nsv_maxclients 32\n\n# Clé de licence : à créer sur https://keymaster.fivem.net puis à coller ici (ne jamais la partager).\nsv_licenseKey \"A_REMPLIR\"\n\n# Ressources de base\nensure mapmanager\nensure chat\nensure spawnmanager\nensure sessionmanager\nensure hardcap\nensure baseevents\n\n# Vos ressources\n# ensure ma_ressource\n\n# Droits : ajoutez ici vos identifiants administrateur\n# add_principal identifier.fivem:XXXXXXX group.admin\n"}]}]}}