From 697b45f4639572f066e2584f4ab6483ac35c1f03 Mon Sep 17 00:00:00 2001 From: MrBolux Date: Thu, 3 Oct 2024 15:15:23 +0200 Subject: [PATCH] init push --- client/alerte.lua | 29 +++++++++++ client/blips.lua | 83 +++++++++++++++++++++++++++++++ client/boombox.lua | 113 ++++++++++++++++++++++++++++++++++++++++++ client/bossMenu.lua | 42 ++++++++++++++++ client/clothing.lua | 48 ++++++++++++++++++ client/duty.lua | 80 ++++++++++++++++++++++++++++++ client/main.lua | 24 +++++++++ client/ped.lua | 34 +++++++++++++ client/radialMenu.lua | 20 ++++++++ client/stash.lua | 54 ++++++++++++++++++++ config.lua | 3 ++ fxmanifest.lua | 36 ++++++++++++++ locales/fr.lua | 25 ++++++++++ server/alerte.lua | 3 ++ shared/utils.lua | 3 ++ 15 files changed, 597 insertions(+) create mode 100644 client/alerte.lua create mode 100644 client/blips.lua create mode 100644 client/boombox.lua create mode 100644 client/bossMenu.lua create mode 100644 client/clothing.lua create mode 100644 client/duty.lua create mode 100644 client/main.lua create mode 100644 client/ped.lua create mode 100644 client/radialMenu.lua create mode 100644 client/stash.lua create mode 100644 config.lua create mode 100644 fxmanifest.lua create mode 100644 locales/fr.lua create mode 100644 server/alerte.lua create mode 100644 shared/utils.lua diff --git a/client/alerte.lua b/client/alerte.lua new file mode 100644 index 0000000..b9241c0 --- /dev/null +++ b/client/alerte.lua @@ -0,0 +1,29 @@ +RegisterNetEvent('togolo_lib:client:showAdvancedNotification', function (data) + local params = data.params + if params.global then + params.global = nil + TriggerServerEvent('togolo_lib:server:showAdvancedNotification', data) + return + end + showAdvancedNotification(params.message, params.sender, params.subject, params.textureDict, params.iconType, params.color) +end) + +-- iconTypes: +-- 1 : Chat Box +-- 2 : Email +-- 3 : Add Friend Request +-- 4 : Nothing +-- 5 : Nothing +-- 6 : Nothing +-- 7 : Right Jumping Arrow +-- 8 : RP Icon +-- 9 : $ Icon + +function showAdvancedNotification(message, sender, subject, textureDict, iconType, color) + BeginTextCommandThefeedPost('STRING') + AddTextComponentSubstringPlayerName(message) + ThefeedNextPostBackgroundColor(color) + EndTextCommandThefeedPostMessagetext(textureDict, textureDict, true, iconType, sender, subject) + EndTextCommandThefeedPostTicker(false, false) +end +exports('showAdvancedNotification', showAdvancedNotification) \ No newline at end of file diff --git a/client/blips.lua b/client/blips.lua new file mode 100644 index 0000000..0a85efc --- /dev/null +++ b/client/blips.lua @@ -0,0 +1,83 @@ +local function createBlips(blipData, options) + local createdBlips = {} + + if options then + if options.job == PlayerData.job.name:lower() or options.gang == PlayerData.gang.name:lower() or options.player == PlayerData.source then + for name, data in pairs(blipData) do + local blip = AddBlipForCoord(data.coords) + SetBlipSprite(blip, data.sprite) + SetBlipAsShortRange(blip, true) + SetBlipScale(blip, data.scale) + SetBlipColour(blip, data.color) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(name) + EndTextCommandSetBlipName(blip) + + table.insert(createdBlips, blip) + end + end + else + for name, data in pairs(blipData) do + local blip = AddBlipForCoord(data.coords) + SetBlipSprite(blip, data.sprite) + SetBlipAsShortRange(blip, true) + SetBlipScale(blip, data.scale) + SetBlipColour(blip, data.color) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(name) + EndTextCommandSetBlipName(blip) + + table.insert(createdBlips, blip) + end + end + + return createdBlips +end + +local function createBlip(blipData, options) + local blip = nil + if options then + if options.job == PlayerData.job.name:lower() or options.gang == PlayerData.gang.name:lower() or options.player == PlayerData.source then + blip = AddBlipForCoord(blipData.coords) + SetBlipSprite(blip, blipData.sprite) + SetBlipAsShortRange(blip, true) + SetBlipScale(blip, blipData.scale) + SetBlipColour(blip, blipData.color) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(blipData.label) + EndTextCommandSetBlipName(blip) + end + if options.route then + SetBlipRoute(blip, true) + if options.routeColor then + SetBlipRouteColour(blip, options.routeColor) + end + end + else + blip = AddBlipForCoord(blipData.coords) + SetBlipSprite(blip, blipData.sprite) + SetBlipAsShortRange(blip, true) + SetBlipScale(blip, blipData.scale) + SetBlipColour(blip, blipData.color) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(blipData.label) + EndTextCommandSetBlipName(blip) + end + return blip +end + +local function deleteBlips(blipData) + for _, blip in ipairs(blipData) do + RemoveBlip(blip) + end +end + +local function deleteBlip(blip) + RemoveBlip(blip) +end + +exports('createBlips', createBlips) +exports('createBlip', createBlip) + +exports('deleteBlips', deleteBlips) +exports('deleteBlip', deleteBlip) diff --git a/client/boombox.lua b/client/boombox.lua new file mode 100644 index 0000000..b6438dc --- /dev/null +++ b/client/boombox.lua @@ -0,0 +1,113 @@ +-- CrĂ©er via xsound +-- [voice]\xsound\server\exports + +xSound = exports.xsound +-- xSound:setVolume(musicId, data.volume) +RegisterNetEvent('togolo_lib:client:boomBoxPlay', function(source, boomBoxId, data) + xSound:PlayUrlPos(boomBoxId, data.link, data.volume, data.position) +end) + + +RegisterNetEvent('togolo_lib:client:OpenBoomBoxMenu', function() + -- shownGangMenu = true + -- shownBoomBoxMenu = true + + local boomBoxMenu = { + { + header = 'Cabine DJ', + icon = 'fa-solid fa-circle-info', + isMenuHeader = true, + }, + { + txt = 'Lancer une musique', + icon = 'fa-solid fa-music', + params = { + event = 'togolo_lib:client:boomBoxPlay', + } + }, + { + txt = 'Mettre la musique sur pause', + icon = 'fa-solid fa-pause', + params = { + event = 'qb-gangmenu:client:HireMembers', + } + }, + { + txt = 'Reprendre la musique', + icon = 'fa-solid fa-play', + params = { + event = 'qb-gangmenu:client:Stash', + } + }, + { + txt = 'Changer le volume', + icon = 'fa-solid fa-volume-high', + params = { + event = 'qb-gangmenu:client:Warbobe', + } + }, + { + txt = 'ArrĂȘter la musique', + icon = 'fa-solid fa-stop', + params = { + event = 'qb-gangmenu:client:Warbobe', + } + } + } + + -- for _, v in pairs(DynamicMenuItems) do + -- boomBoxMenu[#boomBoxMenu + 1] = v + -- end + + boomBoxMenu[#boomBoxMenu + 1] = { + header = Lang:t('bodygang.exit'), + icon = 'fa-solid fa-angle-left', + params = { + event = 'qb-menu:closeMenu', + } + } + + exports['qb-menu']:openMenu(boomBoxMenu) +end) + + +local function createBoomBox(boomBoxData) + local zoneBoomBoxs = {} + for job, boomBoxs in pairs(boomBoxData) do + for key, boomBox in ipairs(boomBoxs) do + local zoneName = generateZoneName('boomBox', job, key) + local zoneParams = { + name = zoneName, + heading = boomBox.heading, + minZ = boomBox.minZ, + maxZ = boomBox.maxZ, + debugPoly = Config.debug + } + local options = { + { + type = 'client', + event = 'togolo_lib:client:OpenBoomBoxMenu', + icon = 'fas fa-hand-paper', + label = Lang:t('boomBox.play'), + job = job + } + } + local boxOptions = { + options = options, + distance = 1.5 + } + local zoneBoomBox = exports['qb-target']:AddBoxZone(zoneName, boomBox.coords, boomBox.length, boomBox.width, zoneParams, boxOptions) + table.insert(zoneBoomBoxs, zoneBoomBox.name) + end + end + return zoneBoomBoxs +end + +local function deleteBoomBox(zoneBoomBoxName) + for _, zoneName in ipairs(zoneBoomBoxName) do + exports['qb-target']:RemoveZone(zoneName) + end +end + +exports('createBoomBox', createBoomBox) +exports('deleteBoomBox', deleteBoomBox) \ No newline at end of file diff --git a/client/bossMenu.lua b/client/bossMenu.lua new file mode 100644 index 0000000..3d4a2b4 --- /dev/null +++ b/client/bossMenu.lua @@ -0,0 +1,42 @@ +local function createBossMenu(bossMenuData) + local zoneBossMenus = {} + + for job, bossMenus in pairs(bossMenuData) do + + for key, bossMenu in ipairs(bossMenus) do + local zoneName = generateZoneName('bossMenu', job, key) + local zoneParams = { + name = zoneName, + heading = bossMenu.heading, + minZ = bossMenu.minZ, + maxZ = bossMenu.maxZ, + debugPoly = Config.debug + } + local options = { + { + type = 'client', + event = 'qb-bossmenu:client:OpenMenu', + icon = 'fas fa-ring', + label = Lang:t('bossMenu.open_bossMenu'), + job = job + } + } + local boxOptions = { + options = options, + distance = 1.5 + } + local zoneBossMenu = exports['qb-target']:AddBoxZone(zoneName, bossMenu.coords, bossMenu.length, bossMenu.width, zoneParams, boxOptions) + table.insert(zoneBossMenus, zoneBossMenu.name) + end + end + return zoneBossMenus +end + +local function deleteBossMenu(zoneBossMenusName) + for _, zoneName in ipairs(zoneBossMenusName) do + exports['qb-target']:RemoveZone(zoneName) + end +end + +exports('createBossMenu', createBossMenu) +exports('deleteBossMenu', deleteBossMenu) diff --git a/client/clothing.lua b/client/clothing.lua new file mode 100644 index 0000000..01532ce --- /dev/null +++ b/client/clothing.lua @@ -0,0 +1,48 @@ +local function createClothingRoom(clothingRoomsZones, clothingRoomsOutfit) + local zonesClothingRooms = {} + for job, clothingRooms in pairs(clothingRoomsZones) do + for key, room in ipairs(clothingRooms) do + local zoneName = generateZoneName('clothingRoom', job, key) + + local zoneParams = { + name = zoneName, + heading = room.heading, + minZ = room.minZ, + maxZ = room.maxZ, + debugPoly = Config.debug, + } + + local options = {{ + action = function() + local playerPed = PlayerPedId() + local gradeLevel = PlayerData.job.grade.level + exports['qb-clothing']:getOutfits(gradeLevel, clothingRoomsOutfit[job]) + SetEntityHeading(playerPed, GetEntityHeading(playerPed) + 180) + end, + icon = "fas fa-sign-in-alt", + label = Lang:t("clothing.open_clothingRooms"), + job = job + }} + + local boxOptions = { + options = options, + distance = 1.5 + } + + local zoneClothingRoom = exports['qb-target']:AddBoxZone(zoneName, room.coords, room.length, room.width, zoneParams, boxOptions) + table.insert(zonesClothingRooms, zoneClothingRoom.name) + end + end + return zonesClothingRooms +end + + +local function deleteClothingRoom(zonesClothingRooms) + for _, zoneName in ipairs(zonesClothingRooms) do + exports['qb-target']:RemoveZone(zoneName) + end +end + +exports('createClothingRoom', createClothingRoom) +exports('deleteClothingRoom', deleteClothingRoom) + diff --git a/client/duty.lua b/client/duty.lua new file mode 100644 index 0000000..f63399a --- /dev/null +++ b/client/duty.lua @@ -0,0 +1,80 @@ +local function createDutyPed(pedsData) + local dutyPeds = {} + + for job, pedData in pairs(pedsData) do + local pedModel = pedData.pedModel + RequestModel(pedModel) + while not HasModelLoaded(pedModel) do + Wait(0) + end + local ped = CreatePed(0, pedModel, pedData.coords.x, pedData.coords.y, pedData.coords.z - 1, pedData.coords.w, false, false) + FreezeEntityPosition(ped, true) + SetEntityInvincible(ped, true) + SetBlockingOfNonTemporaryEvents(ped, true) + TaskStartScenarioInPlace(ped, "WORLD_HUMAN_CLIPBOARD", 0, true) + + local options = { + { + type = 'client', + event = 'togolo_lib:client:ToggleDuty', + icon = 'fas fa-sign-in-alt', + label = Lang:t('duty.sign_in'), + job = job, + } + } + + local targetOptions = { + options = options, + distance = 1.5, + } + + exports['qb-target']:AddTargetEntity(ped, targetOptions) + table.insert(dutyPeds, ped) + end + + return dutyPeds +end + +local function deleteDutyPed(peds) + for _, pedId in ipairs(peds) do + DeletePed(pedId) + end +end + +RegisterNetEvent('togolo_lib:client:ToggleDuty', function() + TriggerServerEvent('QBCore:ToggleDuty') +end) + +exports('createDutyPed', createDutyPed) +exports('deleteDutyPed', deleteDutyPed) + +-- Use SpawnPed next update +-- CreateThread(function() +-- for job, duty in pairs(Config.duty) do +-- local pedId = exports['qb-target']:SpawnPed({ +-- model = duty.pedModel, +-- coords = duty.coords, +-- minusOne = true, +-- freeze = true, +-- invincible = true, +-- blockevents = true, +-- target = { +-- useModel = true, +-- options = { +-- { +-- type = 'server', +-- event = 'QBCore:ToggleDuty', +-- icon = 'fas fa-sign-in-alt', +-- label = Lang:t('duty.sign_in'), +-- job = job, +-- } +-- }, +-- distance = 2.5, +-- }, +-- spawnNow = true, +-- }) + +-- print(json.encode(pedId)) +-- table.insert(dutyPed, pedId) +-- end +-- end) \ No newline at end of file diff --git a/client/main.lua b/client/main.lua new file mode 100644 index 0000000..e6397bd --- /dev/null +++ b/client/main.lua @@ -0,0 +1,24 @@ +QBCore = exports['qb-core']:GetCoreObject() +PlayerData = {} + +local function setupPlayer() + PlayerData = QBCore.Functions.GetPlayerData() +end + +RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() + setupPlayer() +end) + +RegisterNetEvent('QBCore:Client:OnPlayerUnload', function() + PlayerData = {} +end) + +RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo) + PlayerData.job = JobInfo +end) + +AddEventHandler('onResourceStart', function(resourceName) + if (GetCurrentResourceName() == resourceName) then + setupPlayer() + end +end) \ No newline at end of file diff --git a/client/ped.lua b/client/ped.lua new file mode 100644 index 0000000..380eba7 --- /dev/null +++ b/client/ped.lua @@ -0,0 +1,34 @@ +local function createInteractPed(pedData) + local pedModel = pedData.pedModel + RequestModel(pedModel) + while not HasModelLoaded(pedModel) do + Wait(0) + end + local ped = CreatePed(0, pedModel, pedData.coords.x, pedData.coords.y, pedData.coords.z - 1, pedData.coords.w, false, false) + FreezeEntityPosition(ped, true) + SetEntityInvincible(ped, true) + SetBlockingOfNonTemporaryEvents(ped, true) + + if pedData.animation then + TaskStartScenarioInPlace(ped, pedData.animation, 0, true) + end + + if pedData.options then + local targetOptions = { + options = pedData.options, + distance = 1.5, + } + + exports['qb-target']:AddTargetEntity(ped, targetOptions) + end + + + return ped +end + +local function deleteInteractPed(ped) + DeletePed(ped) +end + +exports('createInteractPed', createInteractPed) +exports('deleteInteractPed', deleteInteractPed) \ No newline at end of file diff --git a/client/radialMenu.lua b/client/radialMenu.lua new file mode 100644 index 0000000..1517961 --- /dev/null +++ b/client/radialMenu.lua @@ -0,0 +1,20 @@ +function removeRadialOptions(menuItems) + if menuItems then + for _, item in ipairs(menuItems) do + exports['qb-radialmenu']:RemoveOption(item.id) + end + end +end + +function updateRadialOption(menuItems, optionsRadialMenu) + removeRadialOptions(menuItems) + if optionsRadialMenu then + for _, item in ipairs(optionsRadialMenu) do + item.id = exports['qb-radialmenu']:AddOption(item) + end + return optionsRadialMenu + end +end + +exports('updateRadialOption', updateRadialOption) +exports('removeRadialOptions', removeRadialOptions) diff --git a/client/stash.lua b/client/stash.lua new file mode 100644 index 0000000..f00d0e0 --- /dev/null +++ b/client/stash.lua @@ -0,0 +1,54 @@ +local function createStashZones(stashData) + local stashZones = {} + for job, stashs in pairs(stashData) do + for key, stash in ipairs(stashs) do + local zoneName = generateZoneName('stash', job, key) + local stashLabel = string.format("%s %s_%s", Lang:t('stash.open_stash'), job:gsub("^%l", string.upper), key) + + local zoneParams = { + name = zoneName, + heading = stash.heading, + minZ = stash.minZ, + maxZ = stash.maxZ, + debugPoly = Config.debug + } + + local options = { + { + type = 'client', + event = 'togolo_lib:client:openStash', + icon = 'fas fa-ring', + label = stashLabel, + job = job, + args = { + stashName = zoneName, + stashOption = stash.option or nil + } + } + } + + local boxOptions = { + options = options, + distance = 1.5 + } + + local stashZone = exports['qb-target']:AddBoxZone(zoneName, stash.coords, stash.length, stash.width, zoneParams, boxOptions) + table.insert(stashZones, stashZone.name) + end + end + return stashZones +end + +local function deleteStashZones(stashZonesName) + for _, zoneName in ipairs(stashZonesName) do + exports['qb-target']:RemoveZone(zoneName) + end +end + +RegisterNetEvent('togolo_lib:client:openStash', function(data) + TriggerServerEvent('inventory:server:OpenInventory', 'stash', data.args.stashName, data.args.stashOption) + TriggerEvent('inventory:client:SetCurrentStash', data.args.stashName) +end) + +exports('createStashZones', createStashZones) +exports('deleteStashZones', deleteStashZones) diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..a911b8d --- /dev/null +++ b/config.lua @@ -0,0 +1,3 @@ +Config = {} + +Config.debug = false \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua new file mode 100644 index 0000000..767a0b1 --- /dev/null +++ b/fxmanifest.lua @@ -0,0 +1,36 @@ +fx_version 'cerulean' +game 'gta5' +lua54 'yes' + +author 'Mr.Bolux as Bob Togolo' +description 'library for TogoloScript' +version '1.0.0' + +client_scripts { + 'client/main.lua', + 'client/alerte.lua', + 'client/blips.lua', + 'client/bossMenu.lua', + 'client/stash.lua', + 'client/clothing.lua', + 'client/duty.lua', + 'client/ped.lua', + 'client/radialMenu.lua', + 'client/boombox.lua', +} + +server_scripts { + 'server/alerte.lua' +} + +shared_scripts { + 'config.lua', + 'shared/utils.lua', + '@qb-core/shared/locale.lua', + 'locales/fr.lua', +} + +dependencys { + 'qb-radialmenu', + 'qb-target' +} \ No newline at end of file diff --git a/locales/fr.lua b/locales/fr.lua new file mode 100644 index 0000000..1746b63 --- /dev/null +++ b/locales/fr.lua @@ -0,0 +1,25 @@ +local Translations = { + duty = { + sign_in = 'Prise de Service' + }, + stash = { + open_stash = 'Ouvrir le coffre' + }, + clothing = { + open_clothingRooms = 'Ouvrir le vestiaire' + }, + bossMenu = { + open_bossMenu = 'Ouvrir le menu boss' + }, + boomBox = { + play = 'Interagir' + } +} + +if GetConvar('qb_locale', 'en') == 'fr' then + Lang = Locale:new({ + phrases = Translations, + warnOnMissing = true, + fallbackLang = Lang, + }) +end \ No newline at end of file diff --git a/server/alerte.lua b/server/alerte.lua new file mode 100644 index 0000000..9bd6914 --- /dev/null +++ b/server/alerte.lua @@ -0,0 +1,3 @@ +RegisterNetEvent('togolo_lib:server:showAdvancedNotification', function (data) + TriggerClientEvent('togolo_lib:client:showAdvancedNotification', -1, data) +end) diff --git a/shared/utils.lua b/shared/utils.lua new file mode 100644 index 0000000..25a452b --- /dev/null +++ b/shared/utils.lua @@ -0,0 +1,3 @@ +function generateZoneName(zoneName, job, key) + return string.format("%s_%s_%s", zoneName, job, key) +end \ No newline at end of file