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)
 | 
