--[[ Explosive Gaming This file can be used with permission but this and the credit below must remain in the file. Contact a member of management on our discord to seek permission to use our code. Any changes that you may make to the code are yours but that does not make the script yours. Discord: https://discord.gg/XSsBV6b ]] --Please Only Edit Below This Line----------------------------------------------------------- local server = {} --this command is just a way or using loadstring from in game while keeping achievements define_command('server-interface',{'server-interface.command-help'},{'command',true},function(player,event,args) if player == '' then local returned,value = pcall(loadstring(event.parameter)) if type(value) == 'table' then game.write_file('server-interface.log', '\n'..game.tick..' Ran by: Code: '..event.parameter..'\n Returned: '..table.tostring(value), true, 0) print(table.tostring(value)) else game.write_file('server-interface.log', '\n'..game.tick..' Ran by: Code: '..event.parameter..'\nReturned: '..tostring(value), true, 0) print(value) end else local returned,value = pcall(loadstring(event.parameter)) if type(value) == 'table' then game.write_file('server-interface-players.log', '\n'..game.tick..' Ran by: '..player.name..' Code: '..event.parameter..'\n Returned: '..table.tostring(value), true, 0) player.print(table.tostring(value)) else game.write_file('server-interface-players.log', '\n'..game.tick..' Ran by: '..player.name..' Code: '..event.parameter..'\nReturned: '..tostring(value), true, 0) player.print(tostring(value)) end end end) --runs a server interface command with debug on and does not return any values to the user define_command('debug',{'server-interface.debug-command-help'},{'command',true},function(player,event,args) global.exp_core.debug.state = true debug_write({'START'},game.tick..' '..event.parameter) global.exp_core.debug.triggered = false local returned,value = pcall(loadstring(event.parameter)) if global.exp_core.debug.triggered and #global.exp_core.server.callbacks == 0 then debug_write({'END'},game.tick) global.exp_core.debug.state = false end end) --this is used when changing permission groups when the person does not have permsion to, can also be used to split a large event accross multiple ticks local commands_per_iteration = 50 --number of sudo commands ran every sudo iteration local ticks_per_iteration = 1 --the number of ticks break before the next sudo iteration local temp_var_time = 1000/commands_per_iteration*ticks_per_iteration --temp vars allow sudo funnctions to share data --adds a call back function to the queue uuid can be provided function server.queue_callback(callback,args,uuid) if type(command) == 'function' then local args = args or {} local uuid = uuid or server.get_uuid(callback) debug_write({'sudo','ADD'},return_name) table.insert(global.exp_core.server.callbacks,{fun=command,args=args,uuid=uuid}) server.refresh_uuid(uuid) return uuid end end -- clears all temp values and call backs in queue function server.clear_callbacks() global.exp_core.server = {callbacks={},temp_varibles={}} end -- converts any value into the uuid the script will use function server.get_uuid(var) if type(var) == 'string' then uuid = var else uuid = tostring(var)..tostring(#global.exp_core.server.callbacks) end server.refresh_uuid(uuid) return string.tohex('uuid'..uuid) end --update the time on a temp var or add it as a new one function server.refresh_uuid(uuid,data,offset) local offset = offset or temp_var_time if global.exp_core.server.temp_varibles[uuid] and not data then global.exp_core.server.temp_varibles[uuid].remove_time = game.tick+offset else local data = data or 'temp-var-temp-value' global.exp_core.server.temp_varibles[uuid] = {data=data,remove_time=game.tick+offset} end end -- gets the data stored in a temp varible function server.get_uuid_data(uuid) if global.exp_core.server.temp_varibles[uuid] then server.refresh_uuid(uuid) debug_write({'sudo','TEMP-VAR'},uuid) return global.exp_core.server.temp_varibles[uuid].data end return nil end -- returns the lenth of the temp varible list and command queue, is string is true then it is retured as a string function server.get_callback_queue_info(string) local lenth = 0 for _,v in pairs(global.exp_core.server.temp_varibles) do lenth = lenth + 1 end if string then return {'server-interface.sudo-info',game.tick,#global.exp_core.server.callbacks,lenth} else return {tick=game.tick,commands=#global.exp_core.server.callbacks,temp_varibles=#global.exp_core.server.temp_varibles} end end --sudo main loop Event.register(defines.events.on_tick, function(event) --used with debug command will stop debuging once atleast one message is send to file and there are no commands in sudo if global.exp_core.debug.state and global.exp_core.debug.triggered and #global.exp_core.server.callbacks == 0 then debug_write({'END'},game.tick) global.exp_core.debug.state = global.exp_core.debug.focre end -- runs the commands in sudo debug_write({'sudo'},server.get_callback_queue_info(true),true) if game.tick % ticks_per_iteration == 0 and global.exp_core.server.callbacks and #global.exp_core.server.callbacks > 0 then -- gets the number of call backs to run local length = nil if #global.exp_core.server.callbacks > commands_per_iteration then length = commands_per_iteration else length = #global.exp_core.server.callbacks end -- runs the right number of commands as set for i = 1,length do local callback=table.remove(global.exp_core.server.callbacks,1) if callback and callback.fun and type(callback.fun) == 'function' then local args = {} -- retrives any temp varibles for n,value in pairs(callback.args) do if type(value) == 'string' and global.exp_core.server.temp_varibles[value] then args[n] = server.get_uuid_data(value) else args[n] = value end end -- makes new temp value and runs command local returns = {command.fun(unpack(args))} or {} server.refresh_uuid(callback.uuid,returns) end end end -- removes old temp varibles for uuid,data in pairs(global.exp_core.server.temp_varibles) do if data.remove_time <= game.tick then global.exp_core.server.temp_varibles[uuid] = nil end end end) Event.register(Event.soft_init,function() global.exp_core.server = {callbacks={},temp_varibles={}} end) return server