diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index 5cffaeb6..f59cef91 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -138,7 +138,7 @@ AddStateBagChangeHandler("VehicleProperties", nil, function(bagName, _, value) end local tries = 0 - + while not NetworkDoesEntityExistWithNetworkId(netId) do Wait(200) tries = tries + 1 @@ -499,49 +499,132 @@ RegisterNetEvent("esx:tpm", function() end) end) -local noclip = false -local noclip_pos = vector3(0, 0, 70) -local heading = 0 +local noclipActive = false +local noclipEntity = nil +local followCamMode = true +local speedIndex = 1 +local currentSpeed = 0.2 +local yOffset, zOffset, hOffset = 0.5, 0.2, 3 + +-- cached config values +local controls = Config.Noclip.controls +local speedOptions = Config.Noclip.speeds + +--- Toggles noclip state for the given entity +---@param entity number? Entity handle to apply noclip settings to +---@param isActive boolean Whether noclip should be enabled or disabled +local function toggleNoclip(entity, isActive) + if not entity or not DoesEntityExist(entity) then return end + + SetEntityAlpha(entity, isActive and 102 or 255, false) + SetEntityCollision(entity, not isActive, not isActive) + FreezeEntityPosition(entity, isActive) + SetEntityInvincible(entity, isActive) + SetEntityVisible(entity, not isActive, isActive) + + local ped = ESX.PlayerData.ped + SetEveryoneIgnorePlayer(ped, isActive) + SetPoliceIgnorePlayer(ped, isActive) + LocalPlayer.state:set('inNoclip', isActive, true) +end + +local function cycleSpeed() + if not noclipActive then return end + + speedIndex = speedIndex % #speedOptions + 1 + currentSpeed = speedOptions[speedIndex] + ESX.ShowNotification(TranslateCap("noclip_new_speed", currentSpeed)) +end + +local function handleMovement() + if not noclipEntity or not DoesEntityExist(noclipEntity) then return end + + local yMove, zMove = 0.0, 0.0 + local isForward = false + local hasMovement = false + + if IsDisabledControlPressed(0, controls.forward) then + yMove = yOffset + isForward = true + hasMovement = true + elseif IsDisabledControlPressed(0, controls.backward) then + yMove = -yOffset + hasMovement = true + end + + if not followCamMode then + if IsDisabledControlPressed(0, controls.up) then + zMove = zOffset + hasMovement = true + elseif IsDisabledControlPressed(0, controls.down) then + zMove = -zOffset + hasMovement = true + end + + if IsDisabledControlPressed(0, controls.left) then + SetEntityHeading(noclipEntity, GetEntityHeading(noclipEntity) + hOffset) + elseif IsDisabledControlPressed(0, controls.right) then + SetEntityHeading(noclipEntity, GetEntityHeading(noclipEntity) - hOffset) + end + else + if hasMovement then + local pitch = GetGameplayCamRelativePitch() + zMove = isForward and (pitch * 0.01) or (pitch * -0.01) + end + end + + if not hasMovement then return end + + local speedMult = currentSpeed + 0.3 + + local heading = GetEntityHeading(noclipEntity) + local newPos = GetOffsetFromEntityInWorldCoords(noclipEntity, 0.0, yMove * speedMult, zMove * speedMult) + + SetEntityVelocity(noclipEntity, 0.0, 0.0, 0.0) + SetEntityRotation(noclipEntity, 0.0, 0.0, 0.0, 0, false) + + if followCamMode then + SetEntityHeading(noclipEntity, GetGameplayCamRelativeHeading()) + else + SetEntityHeading(noclipEntity, heading) + end + + SetEntityCoordsNoOffset(noclipEntity, newPos.x, newPos.y, newPos.z, true, true, true) +end local function noclipThread() - while noclip do - SetEntityCoordsNoOffset(ESX.PlayerData.ped, noclip_pos.x, noclip_pos.y, noclip_pos.z, false, false, true) + CreateThread(function() + local allowedKeys = Config.Noclip.allowedKeys + local switchKey = Config.Noclip.controls.switchMode + local lastToggleTime = 0 - if IsControlPressed(1, 34) then - heading = heading + 1.5 - if heading > 360 then - heading = 0 + while noclipActive do + local currentTime = GetGameTimer() + + DisableAllControlActions(0) + + for i = 1, #allowedKeys do + local key = allowedKeys[i] + EnableControlAction(key[1], key[2], true) end - SetEntityHeading(ESX.PlayerData.ped, heading) - end - - if IsControlPressed(1, 9) then - heading = heading - 1.5 - if heading < 0 then - heading = 360 + if IsDisabledControlJustPressed(0, switchKey) then + followCamMode = not followCamMode + ESX.ShowNotification(TranslateCap("noclip_mode_toggled", followCamMode and Translate("enabled") or Translate("disabled"))) + Wait(100) end - SetEntityHeading(ESX.PlayerData.ped, heading) - end + SetLocalPlayerVisibleLocally(true); + handleMovement() - if IsControlPressed(1, 8) then - noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 1.0, 0.0) - end + if currentTime - lastToggleTime >= 1000 then + toggleNoclip(noclipEntity, true) + lastToggleTime = currentTime + end - if IsControlPressed(1, 32) then - noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, -1.0, 0.0) + Wait(0) end - - if IsControlPressed(1, 27) then - noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 0.0, 1.0) - end - - if IsControlPressed(1, 173) then - noclip_pos = GetOffsetFromEntityInWorldCoords(ESX.PlayerData.ped, 0.0, 0.0, -1.0) - end - Wait(0) - end + end) end RegisterNetEvent("esx:noclip", function() @@ -550,17 +633,18 @@ RegisterNetEvent("esx:noclip", function() return end - if not noclip then - noclip_pos = GetEntityCoords(ESX.PlayerData.ped, false) - heading = GetEntityHeading(ESX.PlayerData.ped) + if noclipActive then + noclipActive = false + toggleNoclip(noclipEntity, false) + return end - noclip = not noclip - if noclip then - CreateThread(noclipThread) - end + noclipActive = true + noclipEntity = ESX.PlayerData.vehicle or ESX.PlayerData.ped + toggleNoclip(noclipEntity, true) + noclipThread() - if noclip then + if noclipActive then ESX.ShowNotification(TranslateCap("noclip_message", Translate("enabled")), "success") else ESX.ShowNotification(TranslateCap("noclip_message", Translate("disabled")), "error") @@ -568,6 +652,9 @@ RegisterNetEvent("esx:noclip", function() end) end) +-- cycling speed +ESX.RegisterInput('cyclenoclipspeed', 'Cycle Noclip Speed', 'keyboard', Config.Noclip.controls.cycleNoclipSpeed, cycleSpeed) + RegisterNetEvent("esx:killPlayer", function() SetEntityHealth(ESX.PlayerData.ped, 0) end) @@ -598,7 +685,7 @@ ESX.RegisterClientCallback("esx:GetVehicleType", function(cb, model) end) ESX.SecureNetEvent('esx:updatePlayerData', function(key, val) - ESX.SetPlayerData(key, val) + ESX.SetPlayerData(key, val) end) ---@param command string diff --git a/[core]/es_extended/locales/de.lua b/[core]/es_extended/locales/de.lua index f32b3434..eb25cfcf 100644 --- a/[core]/es_extended/locales/de.lua +++ b/[core]/es_extended/locales/de.lua @@ -124,6 +124,8 @@ return { ["tpm_success"] = "Erfolgreich teleportiert.", ["noclip_message"] = "Noclip wurde %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~Aktiviert~s~", ["disabled"] = "~r~Deaktiviert~s~", diff --git a/[core]/es_extended/locales/el.lua b/[core]/es_extended/locales/el.lua index 365ba3a3..de56a619 100644 --- a/[core]/es_extended/locales/el.lua +++ b/[core]/es_extended/locales/el.lua @@ -122,6 +122,8 @@ return { ["tpm_success"] = "Επιτυχής τηλεμεταφορά", ["noclip_message"] = "Το Noclip έχει %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~ενεργοποιήθηκε~s~", ["disabled"] = "~r~απενεργοποιήθηκε~s~", diff --git a/[core]/es_extended/locales/en.lua b/[core]/es_extended/locales/en.lua index d9513546..b91c525c 100644 --- a/[core]/es_extended/locales/en.lua +++ b/[core]/es_extended/locales/en.lua @@ -126,6 +126,8 @@ return { ["tpm_success"] = "Successfully Teleported", ["noclip_message"] = "Noclip has been %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~enabled~s~", ["disabled"] = "~r~disabled~s~", diff --git a/[core]/es_extended/locales/es.lua b/[core]/es_extended/locales/es.lua index 5750812b..e343ce5b 100644 --- a/[core]/es_extended/locales/es.lua +++ b/[core]/es_extended/locales/es.lua @@ -124,6 +124,8 @@ return { ["tpm_success"] = "Teletransportado con éxito", ["noclip_message"] = "Noclip ha sido %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~activado~s~", ["disabled"] = "~r~desactivado~s~", diff --git a/[core]/es_extended/locales/fr.lua b/[core]/es_extended/locales/fr.lua index 47e6dcc9..726b0cf2 100644 --- a/[core]/es_extended/locales/fr.lua +++ b/[core]/es_extended/locales/fr.lua @@ -124,6 +124,8 @@ return { ["tpm_success"] = "Vous avez bien été téléporté", ["noclip_message"] = "Le mode noclip a été %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~activé~s~", ["disabled"] = "~r~désactivé~s~", diff --git a/[core]/es_extended/locales/he.lua b/[core]/es_extended/locales/he.lua index e103e8b0..6c9e43ef 100644 --- a/[core]/es_extended/locales/he.lua +++ b/[core]/es_extended/locales/he.lua @@ -121,6 +121,8 @@ return { ["tpm_success"] = "הועברת בהצלחה", ["noclip_message"] = "מצב Noclip %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~מאופשר~s~", ["disabled"] = "~r~מנוטרל~s~", diff --git a/[core]/es_extended/locales/hu.lua b/[core]/es_extended/locales/hu.lua index c515932b..71fd6ad9 100644 --- a/[core]/es_extended/locales/hu.lua +++ b/[core]/es_extended/locales/hu.lua @@ -118,6 +118,8 @@ return { ["tpm_success"] = "Sikeres teleportálás", ["noclip_message"] = "Noclip %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~engedélyezve~s~", ["disabled"] = "~r~letiltva~s~", diff --git a/[core]/es_extended/locales/id.lua b/[core]/es_extended/locales/id.lua index 17c13327..f8596117 100644 --- a/[core]/es_extended/locales/id.lua +++ b/[core]/es_extended/locales/id.lua @@ -122,6 +122,8 @@ return { ["tpm_success"] = "Berhasil Teleportasi", ["noclip_message"] = "Noclip telah %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~diaktifkan~s~", ["disabled"] = "~r~dimatikan~s~", diff --git a/[core]/es_extended/locales/it.lua b/[core]/es_extended/locales/it.lua index 8d097026..158155b1 100644 --- a/[core]/es_extended/locales/it.lua +++ b/[core]/es_extended/locales/it.lua @@ -122,6 +122,8 @@ return { ["tpm_success"] = "Teletrasportato con successo", ["noclip_message"] = "Noclip %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~abilitato~s~", ["disabled"] = "~r~disabilitato~s~", diff --git a/[core]/es_extended/locales/nl.lua b/[core]/es_extended/locales/nl.lua index 03daad47..a08afd98 100644 --- a/[core]/es_extended/locales/nl.lua +++ b/[core]/es_extended/locales/nl.lua @@ -114,6 +114,8 @@ return { ["tpm_success"] = "Successvol geteleporteerd", ["noclip_message"] = "Noclip is %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~aangezet~s~", ["disabled"] = "~r~uitgezet~s~", diff --git a/[core]/es_extended/locales/sl.lua b/[core]/es_extended/locales/sl.lua index 42a2c35e..2355ef59 100644 --- a/[core]/es_extended/locales/sl.lua +++ b/[core]/es_extended/locales/sl.lua @@ -118,6 +118,8 @@ return { ["tpm_success"] = "Uspesno teleportiran", ["noclip_message"] = "Noclip je bil %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~Vkljucen~s~", ["disabled"] = "~r~Izkljucen~s~", diff --git a/[core]/es_extended/locales/sr.lua b/[core]/es_extended/locales/sr.lua index 292e350e..80407396 100644 --- a/[core]/es_extended/locales/sr.lua +++ b/[core]/es_extended/locales/sr.lua @@ -118,6 +118,8 @@ return { ["tpm_success"] = "Teleportovani ste na lokaciju", ["noclip_message"] = "Noclip %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~upaljen~s~", ["disabled"] = "~r~ugašen~s~", diff --git a/[core]/es_extended/locales/sv.lua b/[core]/es_extended/locales/sv.lua index ac05ff7c..dd7c757b 100644 --- a/[core]/es_extended/locales/sv.lua +++ b/[core]/es_extended/locales/sv.lua @@ -122,6 +122,8 @@ return { ["tpm_success"] = "Du har teleporterat", ["noclip_message"] = "Noclip har %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~aktiverats~s~", ["disabled"] = "~r~avaktiverats~s~", diff --git a/[core]/es_extended/locales/tr.lua b/[core]/es_extended/locales/tr.lua index 5157e291..4f1adf75 100644 --- a/[core]/es_extended/locales/tr.lua +++ b/[core]/es_extended/locales/tr.lua @@ -122,6 +122,8 @@ return { ["tpm_success"] = "Başarıyla Teleport Edildi", ["noclip_message"] = "Noclip %s Yapıldı", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~Aktif Edildi~s~", ["disabled"] = "~r~Pasif Edildi~s~", diff --git a/[core]/es_extended/locales/zh-cn.lua b/[core]/es_extended/locales/zh-cn.lua index 4f55db78..235380ff 100644 --- a/[core]/es_extended/locales/zh-cn.lua +++ b/[core]/es_extended/locales/zh-cn.lua @@ -124,6 +124,8 @@ return { ["tpm_success"] = "路径点传送完成", ["noclip_message"] = "飞行模式 %s", + ["noclip_mode_toggled"] = "Noclip Camera Mode: %s", + ["noclip_new_speed"] = "New speed: %s", ["enabled"] = "~g~已激活~s~", ["disabled"] = "~r~已禁用~s~", diff --git a/[core]/es_extended/shared/config/main.lua b/[core]/es_extended/shared/config/main.lua index 0bb55117..b21725c8 100644 --- a/[core]/es_extended/shared/config/main.lua +++ b/[core]/es_extended/shared/config/main.lua @@ -26,7 +26,7 @@ Config.StartingAccountMoney = { bank = 50000 } Config.StartingInventoryItems = false -- table/false -Config.DefaultSpawns = { -- If you want to have more spawn positions and select them randomly uncomment commented code or add more locations +Config.DefaultSpawns = { -- If you want to have more spawn positions and select them randomly uncomment commented code or add more locations { x = 222.2027, y = -864.0162, z = 30.2922, heading = 1.0 }, --{x = 224.9865, y = -865.0871, z = 30.2922, heading = 1.0}, --{x = 227.8436, y = -866.0400, z = 30.2922, heading = 1.0}, @@ -40,30 +40,50 @@ Config.AdminGroups = { } Config.ValidCharacterSets = { -- Only enable additional charsets if your server is multilingual. By default everything is false. - ['el'] = false, -- Greek - ['sr'] = false, -- Cyrillic - ['he'] = false, -- Hebrew - ['ar'] = false, -- Arabic - ['zh-cn'] = false -- Chinese, Japanese, Korean + ['el'] = false, -- Greek + ['sr'] = false, -- Cyrillic + ['he'] = false, -- Hebrew + ['ar'] = false, -- Arabic + ['zh-cn'] = false -- Chinese, Japanese, Korean } -Config.EnablePaycheck = true -- enable paycheck -Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via webhook (default is false) -Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society -Config.MaxWeight = 24 -- the max inventory weight without a backpack -Config.PaycheckInterval = 7 * 60000 -- how often to receive paychecks in milliseconds -Config.SaveDeathStatus = true -- Save the death status of a player -Config.EnableDebug = false -- Use Debug options? +Config.EnablePaycheck = true -- enable paycheck +Config.LogPaycheck = false -- Logs paychecks to a nominated Discord channel via webhook (default is false) +Config.EnableSocietyPayouts = false -- pay from the society account that the player is employed at? Requirement: esx_society +Config.MaxWeight = 24 -- the max inventory weight without a backpack +Config.PaycheckInterval = 7 * 60000 -- how often to receive paychecks in milliseconds +Config.SaveDeathStatus = true -- Save the death status of a player +Config.EnableDebug = false -- Use Debug options? -Config.DefaultJobDuty = true -- A players default duty status when changing jobs +Config.DefaultJobDuty = true -- A players default duty status when changing jobs Config.OffDutyPaycheckMultiplier = 0.5 -- The multiplier for off duty paychecks. 0.5 = 50% of the on duty paycheck Config.Multichar = GetResourceState("esx_multicharacter") ~= "missing" -Config.Identity = true -- Select a character identity data before they have loaded in (this happens by default with multichar) -Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. +Config.Identity = true -- Select a character identity data before they have loaded in (this happens by default with multichar) +Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. Config.AdminLogging = false -- Logs the usage of certain commands by those with group.admin ace permissions (default is false) +Config.Noclip = { + allowedKeys = { + { 0, 1 }, -- MOUSE RIGHT + { 0, 2 }, -- MOUSE DOWN + { 0, 245 } -- T (for chat) + }, + controls = { -- https://docs.fivem.net/docs/game-references/controls/ + switchMode = 38, -- E + forward = 32, -- W + backward = 33, -- S + up = 85, -- Q + down = 210, -- LEFT CTRL + left = 34, -- A + right = 35, -- D + cycleNoclipSpeed = 'LSHIFT' -- changing noclip speed + }, + speeds = { 0.2, 0.5, 2, 5, 10, 15, 20, 30 }, + defaultSpeedIndex = 1, +} + ------------------------------------- -- DO NOT CHANGE BELOW THIS LINE !!! ------------------------------------- @@ -72,4 +92,4 @@ if GetResourceState("ox_inventory") ~= "missing" then end Config.EnableDefaultInventory = Config.CustomInventory == false -- Display the default Inventory ( F2 ) -Config.Identifier = GetConvar("esx:identifier", "license") \ No newline at end of file +Config.Identifier = GetConvar("esx:identifier", "license")