forked from Simnation/Main
217 lines
5.9 KiB
Lua
217 lines
5.9 KiB
Lua
--[[ Main Client File]]
|
|
|
|
client = {
|
|
framework = shared.GetFrameworkObject(),
|
|
load = false,
|
|
uiLoad = false,
|
|
isBusy = false,
|
|
|
|
tabletInHand = nil,
|
|
}
|
|
|
|
--[[ require ]]
|
|
|
|
require 'modules.bridge.client'
|
|
|
|
local Utils = require 'modules.utils.client'
|
|
local Target = require 'modules.target.client'
|
|
|
|
--[[ functions ]]
|
|
|
|
function addTargetOptions()
|
|
for key, model in pairs(Config.AtmModels) do
|
|
Target.AddModel(model, {
|
|
[1] = {
|
|
label = locale('rope'),
|
|
name = locale('rope'),
|
|
icon = 'fa-solid fa-link',
|
|
distance = 1.25,
|
|
canInteract = function()
|
|
return not client.isBusy
|
|
end,
|
|
onSelect = function(data)
|
|
local entity = type(data) == 'table' and data.entity or data
|
|
Rope.CreateAtmRope(entity, model)
|
|
end
|
|
},
|
|
[2] = {
|
|
label = locale('explode'),
|
|
name = locale('explode'),
|
|
icon = 'fa-solid fa-explosion',
|
|
distance = 1.25,
|
|
canInteract = function()
|
|
return not client.isBusy
|
|
end,
|
|
onSelect = function(data)
|
|
local entity = type(data) == 'table' and data.entity or data
|
|
Explode.PlantBomb(entity, model)
|
|
end
|
|
},
|
|
})
|
|
end
|
|
end
|
|
|
|
function removeTargetOptions()
|
|
Target.RemoveModel(Config.AtmModels, { locale('rope'), locale('explode'), locale('hacking') })
|
|
end
|
|
|
|
function clearClient()
|
|
Rope.Clear()
|
|
Explode.Clear()
|
|
Hack.Clear()
|
|
removeTargetOptions()
|
|
|
|
if client.tabletInHand then
|
|
client.removeTabletFromPlayer()
|
|
end
|
|
|
|
client.setBusy(false, 'clearClient')
|
|
end
|
|
|
|
function client.setHeadingToObject(model)
|
|
local ped = cache.ped
|
|
local pedCoords = GetEntityCoords(ped)
|
|
|
|
local object = GetClosestObjectOfType(pedCoords.x, pedCoords.y, pedCoords.z, 2.0,
|
|
model, false, false, false)
|
|
|
|
if object and DoesEntityExist(object) then
|
|
local objCoords = GetEntityCoords(object)
|
|
local heading = GetHeadingFromVector_2d(objCoords.x - pedCoords.x, objCoords.y - pedCoords.y)
|
|
SetEntityHeading(ped, heading)
|
|
Citizen.Wait(100)
|
|
end
|
|
end
|
|
|
|
--[[ @ ]]
|
|
|
|
local function hideFrame()
|
|
client.SendReactMessage('ui:setVisible', false)
|
|
SetNuiFocus(false, false)
|
|
Hack.DeletePhone()
|
|
end
|
|
|
|
function client.setBusy(state, key)
|
|
if not forced and client.isBusy == state then return end
|
|
|
|
Utils.debug(('client busy state is changed. New value: %s by %s'):format(state, key))
|
|
|
|
client.isBusy = state
|
|
end
|
|
|
|
---Sends message to the ReactUI.
|
|
---@param action string
|
|
---@param data any
|
|
function client.SendReactMessage(action, data)
|
|
SendNUIMessage({ action = action, data = data })
|
|
end
|
|
|
|
--- Prepare the frontend and send the data
|
|
function client.SetupUI()
|
|
if client.uiLoad then return end
|
|
local defaultLocale = GetConvar('ox:locale', 'en')
|
|
client.SendReactMessage('ui:setupUI', {
|
|
setLocale = lib.loadJson(('locales.%s'):format(defaultLocale)).ui,
|
|
})
|
|
end
|
|
|
|
function client.onPlayerLoad(isLoggedIn)
|
|
client.load = isLoggedIn
|
|
if isLoggedIn then
|
|
addTargetOptions()
|
|
else
|
|
clearClient()
|
|
end
|
|
end
|
|
|
|
--- Starts the client resource.
|
|
function client.StartResource()
|
|
if client.IsPlayerLoaded() then
|
|
client.onPlayerLoad(true)
|
|
end
|
|
end
|
|
|
|
--[[ End @ ]]
|
|
|
|
--[[ functions ]]
|
|
|
|
function client.giveTabletToPlayer()
|
|
if client.tabletInHand then return end
|
|
|
|
local playerPedId = cache.ped
|
|
local tabletModel = 'hei_prop_dlc_tablet'
|
|
local holdTabletAnim = {
|
|
dict = 'amb@world_human_clipboard@male@idle_a',
|
|
name = 'idle_a'
|
|
}
|
|
|
|
local tabletObject = Utils.CreateObject(tabletModel, GetEntityCoords(playerPedId), nil, true, true, false)
|
|
client.tabletInHand = tabletObject
|
|
|
|
AttachEntityToEntity(tabletObject, playerPedId, GetPedBoneIndex(playerPedId, 60309),
|
|
0.0, 0.0, 0.02, 0.0, 120.0, 0.0, true, true, false, false, 2, true)
|
|
|
|
lib.playAnim(playerPedId, holdTabletAnim.dict, holdTabletAnim.name)
|
|
end
|
|
|
|
function client.givePhoneToPlayer()
|
|
if client.tabletInHand then return end
|
|
|
|
local playerPedId = cache.ped
|
|
local phoneModel = 'prop_npc_phone_02'
|
|
local holdPhoneAnim = {
|
|
dict = 'cellphone@',
|
|
name = 'cellphone_text_in'
|
|
}
|
|
|
|
local tabletObject = Utils.CreateObject(phoneModel, GetEntityCoords(playerPedId), nil, true, true, false)
|
|
client.tabletInHand = tabletObject
|
|
|
|
AttachEntityToEntity(tabletObject, playerPedId, GetPedBoneIndex(playerPedId, 28422),
|
|
0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1, 1, 0, 0, 2, 1)
|
|
|
|
lib.playAnim(playerPedId, holdPhoneAnim.dict, holdPhoneAnim.name, 3.0, 3.0, -1, 50)
|
|
end
|
|
|
|
function client.removeTabletFromPlayer()
|
|
local tabletObject = client.tabletInHand
|
|
if tabletObject and DoesEntityExist(tabletObject) then
|
|
SetEntityAsMissionEntity(tabletObject, true, true)
|
|
DeleteEntity(tabletObject)
|
|
end
|
|
client.tabletInHand = nil
|
|
ClearPedTasks(cache.ped)
|
|
end
|
|
|
|
--[[ @ ]]
|
|
|
|
RegisterNUICallback('nui:loadUI', function(_, resultCallback)
|
|
resultCallback(true)
|
|
client.SetupUI()
|
|
end)
|
|
|
|
RegisterNUICallback('nui:onLoadUI', function(_, resultCallback)
|
|
resultCallback(true)
|
|
client.uiLoad = true
|
|
end)
|
|
|
|
RegisterNUICallback('nui:hideFrame', function(_, resultCallback)
|
|
hideFrame()
|
|
resultCallback(true)
|
|
end)
|
|
|
|
AddEventHandler('onResourceStart', function(resource)
|
|
if resource == shared.resource then
|
|
Citizen.Wait(2000)
|
|
client.StartResource()
|
|
end
|
|
end)
|
|
|
|
AddEventHandler('onResourceStop', function(resource)
|
|
if resource == shared.resource then
|
|
client.onPlayerLoad(false)
|
|
Utils.HideTextUI()
|
|
end
|
|
end)
|
|
|
|
--[[ End @ ]]
|