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 @ ]]
 |