forked from StockholmCityRP/esx_celldoors
/
main.lua
123 lines (100 loc) · 3.09 KB
/
main.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
ESX = nil
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(0)
end
while not ESX.GetPlayerData().job do
Citizen.Wait(10)
end
ESX.PlayerData = ESX.GetPlayerData()
-- Update the door list
ESX.TriggerServerCallback('esx_doorlock:getDoorState', function(doorState)
for index,state in pairs(doorState) do
Config.DoorList[index].locked = state
end
end)
end)
RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job) ESX.PlayerData.job = job end)
RegisterNetEvent('esx_doorlock:setDoorState')
AddEventHandler('esx_doorlock:setDoorState', function(index, state) Config.DoorList[index].locked = state end)
Citizen.CreateThread(function()
while true do
local playerCoords = GetEntityCoords(PlayerPedId())
for k,v in ipairs(Config.DoorList) do
v.isAuthorized = isAuthorized(v)
if v.doors then
for k2,v2 in ipairs(v.doors) do
if v2.object and DoesEntityExist(v2.object) then
if k2 == 1 then
v.distanceToPlayer = #(playerCoords - GetEntityCoords(v2.object))
end
if v.locked and v2.objHeading and ESX.Math.Round(GetEntityHeading(v2.object)) ~= v2.objHeading then
SetEntityHeading(v2.object, v2.objHeading)
end
else
v.distanceToPlayer = nil
v2.object = GetClosestObjectOfType(v2.objCoords, 1.0, v2.objHash, false, false, false)
end
end
else
if v.object and DoesEntityExist(v.object) then
v.distanceToPlayer = #(playerCoords - GetEntityCoords(v.object))
if v.locked and v.objHeading and ESX.Math.Round(GetEntityHeading(v.object)) ~= v.objHeading then
SetEntityHeading(v.object, v.objHeading)
end
else
v.distanceToPlayer = nil
v.object = GetClosestObjectOfType(v.objCoords, 1.0, v.objHash, false, false, false)
end
end
end
Citizen.Wait(500)
end
end)
Citizen.CreateThread(function()
while true do
Citizen.Wait(0)
local letSleep = true
for k,v in ipairs(Config.DoorList) do
if v.distanceToPlayer and v.distanceToPlayer < 50 then
letSleep = false
if v.doors then
for k2,v2 in ipairs(v.doors) do
FreezeEntityPosition(v2.object, v.locked)
end
else
FreezeEntityPosition(v.object, v.locked)
end
end
if v.distanceToPlayer and v.distanceToPlayer < v.maxDistance then
local size, displayText = 1, _U('unlocked')
if v.size then size = v.size end
if v.locked then displayText = _U('locked') end
if v.isAuthorized then displayText = _U('press_button', displayText) end
ESX.Game.Utils.DrawText3D(v.textCoords, displayText, size)
if IsControlJustReleased(0, 38) then
if v.isAuthorized then
v.locked = not v.locked
TriggerServerEvent('esx_doorlock:updateState', k, v.locked) -- broadcast new state of the door to everyone
end
end
end
end
if letSleep then
Citizen.Wait(500)
end
end
end)
function isAuthorized(door)
if not ESX or not ESX.PlayerData.job then
return false
end
for k,job in pairs(door.authorizedJobs) do
if job == ESX.PlayerData.job.name then
return true
end
end
return false
end