local Keys = { ["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57, ["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177, ["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18, ["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182, ["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81, ["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70, ["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178, ["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173, ["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118 } ESX = nil INPUT_CONTEXT = 51 local isSentenced = false local communityServiceFinished = false local actionsRemaining = 0 local availableActions = {} local disable_actions = false local vassoumodel = "prop_tool_broom" local vassour_net = nil local spatulamodel = "bkr_prop_coke_spatula_04" local spatula_net = nil Citizen.CreateThread(function() while ESX == nil do TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) Citizen.Wait(0) end end) Citizen.CreateThread(function() Citizen.Wait(2000) --Wait for mysql-async TriggerServerEvent('esx_communityservice:checkIfSentenced') end) function FillActionTable(last_action) while #availableActions < 5 do local service_does_not_exist = true local random_selection = Config.ServiceLocations[math.random(1,#Config.ServiceLocations)] for i = 1, #availableActions do if random_selection.coords.x == availableActions[i].coords.x and random_selection.coords.y == availableActions[i].coords.y and random_selection.coords.z == availableActions[i].coords.z then service_does_not_exist = false end end if last_action ~= nil and random_selection.coords.x == last_action.coords.x and random_selection.coords.y == last_action.coords.y and random_selection.coords.z == last_action.coords.z then service_does_not_exist = false end if service_does_not_exist then table.insert(availableActions, random_selection) end end end RegisterNetEvent('esx_communityservice:inCommunityService') AddEventHandler('esx_communityservice:inCommunityService', function(actions_remaining) local playerPed = PlayerPedId() if isSentenced then return end actionsRemaining = actions_remaining FillActionTable() print(":: Available Actions: " .. #availableActions) ApplyPrisonerSkin() ESX.Game.Teleport(playerPed, Config.ServiceLocation) isSentenced = true communityServiceFinished = false while actionsRemaining > 0 and communityServiceFinished ~= true do if IsPedInAnyVehicle(playerPed, false) then ClearPedTasksImmediately(playerPed) end Citizen.Wait(20000) if GetDistanceBetweenCoords(GetEntityCoords(playerPed), Config.ServiceLocation.x, Config.ServiceLocation.y, Config.ServiceLocation.z) > 45 then ESX.Game.Teleport(playerPed, Config.ServiceLocation) TriggerEvent('chat:addMessage', { args = { _U('judge'), _U('escape_attempt') }, color = { 147, 196, 109 } }) TriggerServerEvent('esx_communityservice:extendService') actionsRemaining = actionsRemaining + Config.ServiceExtensionOnEscape end end TriggerServerEvent('esx_communityservice:hoodrichfinishcomserv', -1) ESX.Game.Teleport(playerPed, Config.ReleaseLocation) isSentenced = false ESX.TriggerServerCallback('esx_skin:getPlayerSkin', function(skin) TriggerEvent('skinchanger:loadSkin', skin) end) end) RegisterNetEvent('esx_communityservice:hoodrichfinishcomserv') AddEventHandler('esx_communityservice:hoodrichfinishcomserv', function(source) communityServiceFinished = true isSentenced = false actionsRemaining = 0 end) Citizen.CreateThread(function() while true do :: start_over :: Citizen.Wait(1) if actionsRemaining > 0 and isSentenced then draw2dText( _U('remaining_msg', ESX.Math.Round(actionsRemaining)), { 0.175, 0.955 } ) DrawAvailableActions() DisableViolentActions() local pCoords = GetEntityCoords(PlayerPedId()) for i = 1, #availableActions do local distance = GetDistanceBetweenCoords(pCoords, availableActions[i].coords, true) if distance < 1.5 then DisplayHelpText(_U('press_to_start')) if(IsControlJustReleased(1, 38))then tmp_action = availableActions[i] RemoveAction(tmp_action) FillActionTable(tmp_action) disable_actions = true TriggerServerEvent('esx_communityservice:completeService') actionsRemaining = actionsRemaining - 1 if (tmp_action.type == "cleaning") then local cSCoords = GetOffsetFromEntityInWorldCoords(GetPlayerPed(PlayerId()), 0.0, 0.0, -5.0) local vassouspawn = CreateObject(GetHashKey(vassoumodel), cSCoords.x, cSCoords.y, cSCoords.z, 1, 1, 1) local netid = ObjToNet(vassouspawn) ESX.Streaming.RequestAnimDict("amb@world_human_janitor@male@idle_a", function() TaskPlayAnim(PlayerPedId(), "amb@world_human_janitor@male@idle_a", "idle_a", 8.0, -8.0, -1, 0, 0, false, false, false) AttachEntityToEntity(vassouspawn,GetPlayerPed(PlayerId()),GetPedBoneIndex(GetPlayerPed(PlayerId()), 28422),-0.005,0.0,0.0,360.0,360.0,0.0,1,1,0,1,0,1) vassour_net = netid end) ESX.SetTimeout(10000, function() disable_actions = false DetachEntity(NetToObj(vassour_net), 1, 1) DeleteEntity(NetToObj(vassour_net)) vassour_net = nil ClearPedTasks(PlayerPedId()) end) end if (tmp_action.type == "gardening") then local cSCoords = GetOffsetFromEntityInWorldCoords(GetPlayerPed(PlayerId()), 0.0, 0.0, -5.0) local spatulaspawn = CreateObject(GetHashKey(spatulamodel), cSCoords.x, cSCoords.y, cSCoords.z, 1, 1, 1) local netid = ObjToNet(spatulaspawn) TaskStartScenarioInPlace(PlayerPedId(), "world_human_gardener_plant", 0, false) AttachEntityToEntity(spatulaspawn,GetPlayerPed(PlayerId()),GetPedBoneIndex(GetPlayerPed(PlayerId()), 28422),-0.005,0.0,0.0,190.0,190.0,-50.0,1,1,0,1,0,1) spatula_net = netid ESX.SetTimeout(14000, function() disable_actions = false DetachEntity(NetToObj(spatula_net), 1, 1) DeleteEntity(NetToObj(spatula_net)) spatula_net = nil ClearPedTasks(PlayerPedId()) end) end goto start_over end end end else Citizen.Wait(1000) end end end) function RemoveAction(action) local action_pos = -1 for i=1, #availableActions do if action.coords.x == availableActions[i].coords.x and action.coords.y == availableActions[i].coords.y and action.coords.z == availableActions[i].coords.z then action_pos = i end end if action_pos ~= -1 then table.remove(availableActions, action_pos) else print("User tried to remove an unavailable action") end end function DisplayHelpText(str) SetTextComponentFormat("STRING") AddTextComponentString(str) DisplayHelpTextFromStringLabel(0, 0, 1, -1) end function DrawAvailableActions() for i = 1, #availableActions do --{ r = 50, g = 50, b = 204 } --DrawMarker(21, Config.ServiceLocations[i].coords, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 255, 0, 0, 100, false, true, 2, true, false, false, true) DrawMarker(21, availableActions[i].coords, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5, 0.5, 50, 50, 204, 100, false, true, 2, true, false, false, false) --DrawMarker(20, Config.ServiceLocations[i].coords, -1, 0.0, 0.0, 0, 0.0, 0.0, 1.0, 1.0, 1.0, 0, 162, 250, 80, true, true, 2, 0, 0, 0, 0) end end function DisableViolentActions() local playerPed = PlayerPedId() if disable_actions == true then DisableAllControlActions(0) end RemoveAllPedWeapons(playerPed, true) DisableControlAction(2, 37, true) -- disable weapon wheel (Tab) DisablePlayerFiring(playerPed,true) -- Disables firing all together if they somehow bypass inzone Mouse Disable DisableControlAction(0, 106, true) -- Disable in-game mouse controls DisableControlAction(0, 140, true) DisableControlAction(0, 141, true) DisableControlAction(0, 142, true) if IsDisabledControlJustPressed(2, 37) then --if Tab is pressed, send error message SetCurrentPedWeapon(playerPed,GetHashKey("WEAPON_UNARMED"),true) -- if tab is pressed it will set them to unarmed (this is to cover the vehicle glitch until I sort that all out) end if IsDisabledControlJustPressed(0, 106) then --if LeftClick is pressed, send error message SetCurrentPedWeapon(playerPed,GetHashKey("WEAPON_UNARMED"),true) -- If they click it will set them to unarmed end end function ApplyPrisonerSkin() local playerPed = PlayerPedId() if DoesEntityExist(playerPed) then Citizen.CreateThread(function() TriggerEvent('skinchanger:getSkin', function(skin) if skin.***** == 0 then TriggerEvent('skinchanger:loadClothes', skin, Config.Uniforms['prison_wear'].male) else TriggerEvent('skinchanger:loadClothes', skin, Config.Uniforms['prison_wear'].female) end end) SetPedArmour(playerPed, 0) ClearPedBloodDamage(playerPed) ResetPedVisibleDamage(playerPed) ClearPedLastWeaponDamage(playerPed) ResetPedMovementClipset(playerPed, 0) end) end end function draw2dText(text, pos) SetTextFont(4) SetTextProportional(1) SetTextScale(0.45, 0.45) SetTextColour(255, 255, 255, 255) SetTextDropShadow(0, 0, 0, 0, 255) SetTextEdge(1, 0, 0, 0, 255) SetTextDropShadow() SetTextOutline() BeginTextCommandDisplayText('STRING') AddTextComponentSubstringPlayerName(text) EndTextCommandDisplayText(table.unpack(pos)) end
Write, Run & Share Lua code online using OneCompiler's Lua online compiler for free. It's one of the robust, feature-rich online compilers for Lua language, running the latest Lua version 5.4. Getting started with the OneCompiler's Lua editor is easy and fast. The editor shows sample boilerplate code when you choose language as Lua and start coding.
OneCompiler's Lua online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample Lua program which takes name as input and prints hello message with your name.
name = io.read("*a")
print ("Hello ", name)
Lua is a light weight embeddable scripting language which is built on top of C. It is used in almost all kind of applications like games, web applications, mobile applications, image processing etc. It's a very powerful, fast, easy to learn, open-source scripting language.
-- global variables
a = 10
-- local variables
local x = 30
Value Type | Description |
---|---|
number | Represents numbers |
string | Represents text |
nil | Differentiates values whether it has data or not |
boolean | Value can be either true or false |
function | Represents a sub-routine |
userdata | Represents arbitary C data |
thread | Represents independent threads of execution. |
table | Can hold any value except nil |
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition)
do
--code
end
Repeat-Until is also used to iterate a set of statements based on a condition. It is very similar to Do-While, it is mostly used when you need to execute the statements atleast once.
repeat
--code
until( condition )
For loop is used to iterate a set of statements based on a condition.
for init,max/min value, increment
do
--code
end
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increase re-usuability and modularity.
optional_function_scope function function_name( argument1, argument2, argument3........, argumentn)
--code
return params with comma seperated
end