136 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.8 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
---@diagnostic disable: inject-field
 | 
						|
---@type table?
 | 
						|
Config.DoorList = {}
 | 
						|
 | 
						|
local utils = require 'server.utils'
 | 
						|
 | 
						|
local function flattenTableToArray(tbl)
 | 
						|
	if type(tbl) == 'table' then
 | 
						|
		if table.type(tbl) == 'array' then return tbl end
 | 
						|
 | 
						|
		local array = {}
 | 
						|
 | 
						|
		for k in pairs(tbl) do
 | 
						|
			array[#array + 1] = k
 | 
						|
		end
 | 
						|
 | 
						|
		return array
 | 
						|
	end
 | 
						|
end
 | 
						|
 | 
						|
MySQL.ready(function()
 | 
						|
	local files, fileCount = utils.getFilesInDirectory('convert', '%.lua')
 | 
						|
 | 
						|
	if fileCount > 0 then
 | 
						|
		print(('^3Found %d nui_doorlock config files.^0'):format(fileCount))
 | 
						|
	end
 | 
						|
 | 
						|
	local query =
 | 
						|
	'INSERT INTO `ox_doorlock` (`name`, `data`) SELECT ?, ? WHERE NOT EXISTS (SELECT 1 FROM `ox_doorlock` WHERE `name` = ?)'
 | 
						|
	local queries = {}
 | 
						|
 | 
						|
	for i = 1, fileCount do
 | 
						|
		local fileName = files[i]
 | 
						|
		local file = LoadResourceFile('ox_doorlock', ('convert/%s.lua'):format(fileName))
 | 
						|
 | 
						|
		if file then
 | 
						|
			load(file)()
 | 
						|
 | 
						|
			if next(Config.DoorList) then
 | 
						|
				local size = 0
 | 
						|
 | 
						|
				for k, door in pairs(Config.DoorList) do
 | 
						|
					size += 1
 | 
						|
					local double = door.doors
 | 
						|
					local qb = door.objName or (double and double[1].objName)
 | 
						|
 | 
						|
					if qb then
 | 
						|
						if double then
 | 
						|
							for j = 1, 2 do
 | 
						|
								double[j].objHash = double[j].objName
 | 
						|
								double[j].objHeading = double[j].objYaw or 0
 | 
						|
							end
 | 
						|
						else
 | 
						|
							door.objHash = door.objName
 | 
						|
							door.objHeading = door.objYaw or 0
 | 
						|
						end
 | 
						|
 | 
						|
						local groups = door.authorizedJobs or {}
 | 
						|
 | 
						|
						if door.authorizedGangs then
 | 
						|
							for gang, grade in pairs(door.authorizedGangs) do
 | 
						|
								groups[gang] = grade
 | 
						|
							end
 | 
						|
						end
 | 
						|
 | 
						|
						door.authorizedJobs = next(groups) and groups
 | 
						|
						door.lockpick = door.pickable
 | 
						|
						door.showNUI = not door.hideLabel
 | 
						|
						door.characters = flattenTableToArray(door.authorizedCitizenIDs)
 | 
						|
					end
 | 
						|
 | 
						|
					local data = {
 | 
						|
						auto = door.slides or door.garage or door.sliding or door.doublesliding,
 | 
						|
						autolock = (door.autolock and door.autolock / 1000) or (door.autoLock and door.autoLock / 1000),
 | 
						|
						coords = door.objCoords,
 | 
						|
						heading = door.objHeading and math.floor(door.objHeading + 0.5),
 | 
						|
						model = door.objHash,
 | 
						|
						characters = door.characters,
 | 
						|
						groups = door.authorizedJobs,
 | 
						|
						items = door.items,
 | 
						|
						lockpick = door.lockpick,
 | 
						|
						hideUi = door.showNUI ~= nil and not door.showNUI or false,
 | 
						|
						lockSound = door.audioLock?.file and door.audioLock.file:gsub('%.ogg', ''),
 | 
						|
						unlockSound = door.audioUnlock?.file and door.audioUnlock.file:gsub('%.ogg', ''),
 | 
						|
						maxDistance = door.maxDistance or door.distance,
 | 
						|
						doorRate = door.doorRate and door.doorRate + 0.0 or nil,
 | 
						|
						state = door.locked and 1 or 0,
 | 
						|
						passcode = door.passcode,
 | 
						|
						doors = double and {
 | 
						|
							{
 | 
						|
								coords = double[1].objCoords,
 | 
						|
								heading = math.floor(double[1].objHeading + 0.5),
 | 
						|
								model = double[1].objHash,
 | 
						|
							},
 | 
						|
							{
 | 
						|
								coords = double[2].objCoords,
 | 
						|
								heading = math.floor(double[2].objHeading + 0.5),
 | 
						|
								model = double[2].objHash,
 | 
						|
							},
 | 
						|
						},
 | 
						|
					}
 | 
						|
 | 
						|
					if data.auto and not data.lockSound then
 | 
						|
						if door.audioRemote then
 | 
						|
							data.lockSound = 'button-remote'
 | 
						|
						end
 | 
						|
					end
 | 
						|
 | 
						|
					if double and not data.coords then
 | 
						|
						double = data.doors
 | 
						|
						data.coords = double[1].coords - ((double[1].coords - double[2].coords) / 2)
 | 
						|
					end
 | 
						|
 | 
						|
					local name = ('%s %s'):format(fileName, k)
 | 
						|
 | 
						|
					queries[size] = {
 | 
						|
						query = query, values = { name, json.encode(data), name }
 | 
						|
					}
 | 
						|
				end
 | 
						|
 | 
						|
				print(('^3Loaded %d doors from convert/%s.lua.^0'):format(size, fileName))
 | 
						|
 | 
						|
				if MySQL.transaction.await(queries) then
 | 
						|
					SaveResourceFile('ox_doorlock', ('convert/%s.lua'):format(fileName),
 | 
						|
						'-- This file has already been converted for ox_doorlock and should be removed.\r\ndo return end\r\n\r\n' ..
 | 
						|
						file, -1)
 | 
						|
				end
 | 
						|
 | 
						|
				table.wipe(Config.DoorList)
 | 
						|
				table.wipe(queries)
 | 
						|
			end
 | 
						|
		end
 | 
						|
	end
 | 
						|
 | 
						|
	Config.DoorList = nil
 | 
						|
end)
 |