259 lines
7.3 KiB
Lua
259 lines
7.3 KiB
Lua
|
function Load(name)
|
||
|
local resourceName = GetCurrentResourceName()
|
||
|
local chunk = LoadResourceFile(resourceName, ('data/%s.lua'):format(name))
|
||
|
if chunk then
|
||
|
local err
|
||
|
chunk, err = load(chunk, ('@@%s/data/%s.lua'):format(resourceName, name), 't')
|
||
|
if err then
|
||
|
error(('\n^1 %s'):format(err), 0)
|
||
|
end
|
||
|
return chunk()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-------------------------------------------------------------------------------
|
||
|
-- Settings
|
||
|
-------------------------------------------------------------------------------
|
||
|
|
||
|
Config = {}
|
||
|
|
||
|
-- It's possible to interact with entities through walls so this should be low
|
||
|
Config.MaxDistance = 7.0
|
||
|
|
||
|
-- Enable debug options
|
||
|
Config.Debug = false
|
||
|
|
||
|
-- Supported values: true, false
|
||
|
Config.Standalone = false
|
||
|
|
||
|
-- Enable outlines around the entity you're looking at
|
||
|
Config.EnableOutline = false
|
||
|
|
||
|
-- Whether to have the target as a toggle or not
|
||
|
Config.Toggle = false
|
||
|
|
||
|
-- Draw a Sprite on the center of a PolyZone to hint where it's located
|
||
|
Config.DrawSprite = true -- TESTER KUN DENNE HER, DEN SKAL SLÅS FRA IGEN EFTER TEST
|
||
|
|
||
|
-- The default distance to draw the Sprite
|
||
|
Config.DrawDistance = 10.0
|
||
|
|
||
|
-- The color of the sprite in rgb, the first value is red, the second value is green, the third value is blue and the last value is alpha (opacity). Here is a link to a color picker to get these values: https://htmlcolorcodes.com/color-picker/
|
||
|
Config.DrawColor = {255, 255, 255, 255}
|
||
|
|
||
|
-- The color of the sprite in rgb when the PolyZone is targeted, the first value is red, the second value is green, the third value is blue and the last value is alpha (opacity). Here is a link to a color picker to get these values: https://htmlcolorcodes.com/color-picker/
|
||
|
Config.SuccessDrawColor = {30, 144, 255, 255}
|
||
|
|
||
|
-- The color of the outline in rgb, the first value is red, the second value is green, the third value is blue and the last value is alpha (opacity). Here is a link to a color picker to get these values: https://htmlcolorcodes.com/color-picker/
|
||
|
Config.OutlineColor = {255, 255, 255, 255}
|
||
|
|
||
|
-- Enable default options (Toggling vehicle doors)
|
||
|
Config.EnableDefaultOptions = true
|
||
|
|
||
|
-- Disable the target eye whilst being in a vehicle
|
||
|
Config.DisableInVehicle = false
|
||
|
|
||
|
-- Key to open the target eye, here you can find all the names: https://docs.fivem.net/docs/game-references/input-mapper-parameter-ids/keyboard/
|
||
|
Config.OpenKey = 'LMENU' -- Left Alt
|
||
|
|
||
|
-- Control for key press detection on the context menu, it's the Right Mouse Button by default, controls are found here https://docs.fivem.net/docs/game-references/controls/
|
||
|
Config.MenuControlKey = 238
|
||
|
|
||
|
-------------------------------------------------------------------------------
|
||
|
-- Target Configs
|
||
|
-------------------------------------------------------------------------------
|
||
|
|
||
|
-- These are all empty for you to fill in, refer to the .md files for help in filling these in
|
||
|
|
||
|
Config.CircleZones = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.BoxZones = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.PolyZones = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.TargetBones = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.TargetModels = {
|
||
|
["chickensell"] = {
|
||
|
models = {
|
||
|
"csb_chef",
|
||
|
},
|
||
|
options = {
|
||
|
{
|
||
|
type = "client",
|
||
|
event = "Chickens:sell",
|
||
|
icon = "fas fa-archive",
|
||
|
label = "Sælg kylling",
|
||
|
|
||
|
},
|
||
|
},
|
||
|
distance = 2.5,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
Config.GlobalPedOptions = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.GlobalVehicleOptions = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.GlobalObjectOptions = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.GlobalPlayerOptions = {
|
||
|
|
||
|
}
|
||
|
|
||
|
Config.Peds = {
|
||
|
{
|
||
|
model = `csb_chef`,
|
||
|
coords = vector4(-1178.16, -891.61, 12.76, 304.99),
|
||
|
gender = 'male',
|
||
|
freeze = true,
|
||
|
invincible = true,
|
||
|
blockevents = true,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
-------------------------------------------------------------------------------
|
||
|
-- Functions
|
||
|
-------------------------------------------------------------------------------
|
||
|
local function JobCheck() return true end
|
||
|
local function GangCheck() return true end
|
||
|
local function ItemCheck() return true end
|
||
|
local function CitizenCheck() return true end
|
||
|
|
||
|
CreateThread(function()
|
||
|
local state = GetResourceState('qb-core')
|
||
|
if state ~= 'missing' then
|
||
|
if state ~= 'started' then
|
||
|
local timeout = 0
|
||
|
repeat
|
||
|
timeout += 1
|
||
|
Wait(0)
|
||
|
until GetResourceState('qb-core') == 'started' or timeout > 100
|
||
|
end
|
||
|
Config.Standalone = false
|
||
|
end
|
||
|
if Config.Standalone then
|
||
|
local firstSpawn = false
|
||
|
local event = AddEventHandler('playerSpawned', function()
|
||
|
SpawnPeds()
|
||
|
firstSpawn = true
|
||
|
end)
|
||
|
-- Remove event after it has been triggered
|
||
|
while true do
|
||
|
if firstSpawn then
|
||
|
RemoveEventHandler(event)
|
||
|
break
|
||
|
end
|
||
|
Wait(1000)
|
||
|
end
|
||
|
else
|
||
|
local QBCore = exports['qb-core']:GetCoreObject()
|
||
|
local PlayerData = QBCore.Functions.GetPlayerData()
|
||
|
|
||
|
ItemCheck = function(items)
|
||
|
local isTable = type(items) == 'table'
|
||
|
local isArray = isTable and table.type(items) == 'array' or false
|
||
|
local finalcount = 0
|
||
|
local count = 0
|
||
|
if isTable then for _ in pairs(items) do finalcount += 1 end end
|
||
|
for _, v in pairs(PlayerData.items) do
|
||
|
if isTable then
|
||
|
if isArray then -- Table expected in this format {'itemName1', 'itemName2', 'etc'}
|
||
|
for _, item in pairs(items) do
|
||
|
if v and v.name == item then
|
||
|
count += 1
|
||
|
end
|
||
|
end
|
||
|
else -- Table expected in this format {['itemName'] = amount}
|
||
|
local itemAmount = items[v.name]
|
||
|
if itemAmount and v and v.amount >= itemAmount then
|
||
|
count += 1
|
||
|
end
|
||
|
end
|
||
|
if count == finalcount then -- This is to make sure it checks all items in the table instead of only one of the items
|
||
|
return true
|
||
|
end
|
||
|
else -- When items is a string
|
||
|
if v and v.name == items then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
JobCheck = function(job)
|
||
|
if type(job) == 'table' then
|
||
|
job = job[PlayerData.job.name]
|
||
|
if job and PlayerData.job.grade.level >= job then
|
||
|
return true
|
||
|
end
|
||
|
elseif job == 'all' or job == PlayerData.job.name then
|
||
|
return true
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
GangCheck = function(gang)
|
||
|
if type(gang) == 'table' then
|
||
|
gang = gang[PlayerData.gang.name]
|
||
|
if gang and PlayerData.gang.grade.level >= gang then
|
||
|
return true
|
||
|
end
|
||
|
elseif gang == 'all' or gang == PlayerData.gang.name then
|
||
|
return true
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
CitizenCheck = function(citizenid)
|
||
|
return citizenid == PlayerData.citizenid or citizenid[PlayerData.citizenid]
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
|
||
|
PlayerData = QBCore.Functions.GetPlayerData()
|
||
|
SpawnPeds()
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
|
||
|
PlayerData = {}
|
||
|
DeletePeds()
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
|
||
|
PlayerData.job = JobInfo
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('QBCore:Client:OnGangUpdate', function(GangInfo)
|
||
|
PlayerData.gang = GangInfo
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent('QBCore:Player:SetPlayerData', function(val)
|
||
|
PlayerData = val
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
function CheckOptions(data, entity, distance)
|
||
|
if distance and data.distance and distance > data.distance then return false end
|
||
|
if data.job and not JobCheck(data.job) then return false end
|
||
|
if data.gang and not GangCheck(data.gang) then return false end
|
||
|
if data.item and not ItemCheck(data.item) then return false end
|
||
|
if data.citizenid and not CitizenCheck(data.citizenid) then return false end
|
||
|
if data.canInteract and not data.canInteract(entity, distance, data) then return false end
|
||
|
return true
|
||
|
end
|