From 023c25ba2f31f3909864912b40a439a998ce0c70 Mon Sep 17 00:00:00 2001 From: Cooldude2606 Date: Wed, 29 Nov 2017 19:42:24 +0000 Subject: [PATCH] WIP --- control.lua | 32 -- locale/ExpGaming-Core/Core Help File.md | 124 ----- .../ExpGaming - Command Maker.lua | 111 ----- locale/ExpGaming-Core/ExpGaming - Lib.lua | 121 ----- .../ExpGaming - Rank Control.lua | 205 -------- .../ExpGaming-Core/ExpGaming - Rank Table.lua | 279 ----------- .../ExpGaming - Server Interface.lua | 142 ------ .../GUI/ExpGaming - Center Gui.lua | 82 ---- .../ExpGaming-Core/GUI/ExpGaming - Inputs.lua | 74 --- .../GUI/ExpGaming - Left Gui.lua | 67 --- .../GUI/ExpGaming - Module Setup.lua | 64 --- .../GUI/ExpGaming - Player Table.lua | 114 ----- .../ExpGaming-Core/GUI/ExpGaming - Popup.lua | 71 --- .../GUI/ExpGaming - Toolbar.lua | 35 -- locale/ExpGaming-Core/GUI/file-header.lua | 18 - locale/ExpGaming-Core/file-header.lua | 17 - locale/Stand-Alone/file-header.lua | 9 - .../file-header.lua => StdLib/StdLib.lua} | 17 +- locale/StdLib/table.lua | 455 ++++++++++++++++++ locale/en/exp_core.cfg | 35 -- 20 files changed, 471 insertions(+), 1601 deletions(-) delete mode 100644 locale/ExpGaming-Core/Core Help File.md delete mode 100644 locale/ExpGaming-Core/ExpGaming - Command Maker.lua delete mode 100644 locale/ExpGaming-Core/ExpGaming - Lib.lua delete mode 100644 locale/ExpGaming-Core/ExpGaming - Rank Control.lua delete mode 100644 locale/ExpGaming-Core/ExpGaming - Rank Table.lua delete mode 100644 locale/ExpGaming-Core/ExpGaming - Server Interface.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Center Gui.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Inputs.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Left Gui.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Module Setup.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Popup.lua delete mode 100644 locale/ExpGaming-Core/GUI/ExpGaming - Toolbar.lua delete mode 100644 locale/ExpGaming-Core/GUI/file-header.lua delete mode 100644 locale/ExpGaming-Core/file-header.lua delete mode 100644 locale/Stand-Alone/file-header.lua rename locale/{ExpGaming-Addons/file-header.lua => StdLib/StdLib.lua} (51%) create mode 100644 locale/StdLib/table.lua delete mode 100644 locale/en/exp_core.cfg diff --git a/control.lua b/control.lua index d9142525..f2b6e152 100644 --- a/control.lua +++ b/control.lua @@ -7,35 +7,3 @@ Any changes that you may make to the code are yours but that does not make the s Discord: https://discord.gg/r6dC2uK ]] --Please Only Edit Below This Line----------------------------------------------------------- ---set up to run other code and events -require("mod-gui") -Event = require("locale/StdLib/event") ---this is the main code that starts the softmod -Event.soft_init = script.generate_event_name() -local function init() if not global.soft_init then global.exp_core = {} script.raise_event(Event.soft_init,{tick=game.tick}) global.soft_init = true end end -Event.register(defines.events.on_player_joined_game,init) -Event.register(defines.events.on_tick,init) -Event.register(-1,init) ---below 'game.tick/(3600*game.speed)) % 15 == 0' raises the gui_update event every 15 minutes - feel free to change the update time -Event.gui_update = script.generate_event_name() -Event.register(defines.events.on_tick, function(event) - if (event.tick/(3600*game.speed)) % 15 == 0 then - -- updates the guis for every player (if gui is linked to gui_update) - local online_players = #game.connected_players - for i,player in pairs(game.connected_players) do - script.raise_event(Event.gui_update,{tick=event.tick,player=player,player_loop_index=i,players_online=online_players}) - end - elseif ((event.tick/(3600*game.speed))+(15/2))% 15 == 0 then - -- this is the system to auto rank players - for i,player in pairs(game.connected_players) do - server.queue_callback(ranking.find_new_rank,{player,event.tick}) - end - end -end) ---loads core files -ranking,ExpGui,server = unpack(require("locale/ExpGaming-Core/file-header")) ---loads all the other scripts -require("locale/Stand-Alone/file-header") -require("locale/ExpGaming-Addons/file-header") ---call from command maker -load_commands() \ No newline at end of file diff --git a/locale/ExpGaming-Core/Core Help File.md b/locale/ExpGaming-Core/Core Help File.md deleted file mode 100644 index 3af0e487..00000000 --- a/locale/ExpGaming-Core/Core Help File.md +++ /dev/null @@ -1,124 +0,0 @@ -# Functions added in core -See code for more details. (may not be upto date as im lazy) -## GUI -### Defining -* ExpGui.add_frame.center(name,default_display,default_tooltip,tabs,event) - * tabs (opt) = {{name},{...},...} - * event (opt) = on draw -> function(player,frame) -* ExpGui.add_frame.tab(name,default_display,default_tooltip,frame,event) - * frame = 'frame name' - * event = on draw -> function(player,frame) -* ExpGui.add_frame.left(name,default_display,default_tooltip,vis,event) - * vis = player on join -> true/false - * event = on draw -> function(player,frame) -* ExpGui.add_frame.popup(style,default_display,default_tooltip,on_click,event) - * on_click = on draw for toolbar -> function(player,element) - * event = on draw for popup -> function(player,frame,args) -* ExpGui.toolbar.add_button(name,default_display,default_tooltip,event) - * event = on click -> function(player,element) -* ExpGui.add_input.button(name,default_display,default_tooltip,event) - * event = on click -> function(player,element) -* ExpGui.add_input.text(name,default_display,event) - * event = on text change -> function(player,element) -### Drawing -* ExpGui.toggle_visible(frame) - * Toggles the visibility of a frame -* ExpGui.player_table.draw_filters(player,frame,filters) - * filters = {filter-name,...} -* ExpGui.player_table.draw(player,frame,filters,input_location) - * filters = {{'filter name',value},{'filter name'},{...},...} - * input_location = GUI element -> draw_filters frame -* ExpGui.draw_frame.left(player,element,update) - * element = 'frame name' - * update = true -* ExpGui.draw_frame.popup(style,args) - * style = 'style name' - * args = {...} -* ExpGui.add_input.draw_button(frame,name,display,tooltip) - * display (opt) - * tooltip (opt) -* ExpGui.add_input.draw_text(frame,name,display) - * display (opt) -## Ranks -* ranking.get_player_rank(player) - * Get the players rank -* ranking.string_to_rank(string) - * Convert a rank name to the rank object -* ranking.rank_print(msg, rank, inv) - * rank = 'rank name' - * inv = lower ranks rather than higher -> true/false/nil -* ranking.give_rank(player,rank,by_player) - * rank = 'rank name' - * by_player = player or nil -* ranking.revert_rank(player,by_player) - * by_player = player or nil -* ranking.find_new_rank(player) - * Looks in presets if play time under 5 minutes - * Otherwise looks at play time -* Event.rank_change - * event is raised upon rank change -> event = {player,by_player,new_rank,old_rank} -## Lib -* Factorio StdLib game, event and core -* tick_to_display_format(tick) - * output -> 0H 0M or 0.00M when less than 10 -* tick_to_hour (tick) - * Convert ticks to hours based on game speed -* tick_to_min (tick) - * Convert ticks to minutes based on game speed -* table.tostring(tbl) - * We stole this but we don't know from where, just google it - * output -> table as a string -## Get Commands -* server.get_uuid_data(uuid) - * uuid = value retured by callback - * returnd the data stored here -* server.get_callback_queue_info(string) - * return either a list or string based on the string boliean -* ranking.get_ranks(part) - * returns a list of all the ranks - * part (opt) = part of the rank you want to return ie name -* ranking.get_player_rank_presets(rank) - * returns the current rank presets - * rank (opt) = rank name if only one rank is needed -* ranking.get_ranked_players(rank) - * returns the ranks and online time of every player - * rank (opt) = limits it to only this rank -* get_commands(rank) - * returns all commands that are useable - * rank (opt) = rank name to limt it to what that rank can use -## Server -* server.queue_callback(command,args,uuid) - * Ask server to run a script function at a diffrent time - * command = function to be ran - * args (as function needs) = {...} - * uuid (opt) = the uuid that it will return (use with get_uuid_data) - * returns the uuid -* server.add_callback(callback,uuid) - * Sets a function in memory - * used with /socket to run - * callbacl = function to save to memory - * uuid = sting for a custom uuid -* server.refresh_uuid(uuid,value,offset) - * uuid = location of the data to be refreshed - * value (opt) = new value if making a new temp varible - * offset (opt) = if the base time is too short, for very big commands -* server.get_uuid(string) - * returns the same value that queue_callback would when given a custom return name - * will return the same as callback but cant be used to get the value of a previous callback -* server.emit(code, callback) - * you dont see this i was just asked to add it -## Other -* server.clear_callbacks() - * resets the callback system -* define_command(name,help,inputs,event) - * Add game commands in a way it does not cause crashes - * name = 'test' -> /test - * help = 'help message' - * inputs = {'input name',...,true/nil} last value being true means no cap on the length - * event = on command -> function(player,event,args) -* command: /server-interface - * Run loadstring on lua code given like /c but does not break achievements -* command: /debug - * same as server-interface but runs in debug mode -* command: /socket - * its just magic ok, its for server sync \ No newline at end of file diff --git a/locale/ExpGaming-Core/ExpGaming - Command Maker.lua b/locale/ExpGaming-Core/ExpGaming - Command Maker.lua deleted file mode 100644 index 8dac51c7..00000000 --- a/locale/ExpGaming-Core/ExpGaming - Command Maker.lua +++ /dev/null @@ -1,111 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local Exp_commands = {} ---Used mainly by the code to convert the inputs into a string -local function command_inputs_to_string(command) - local str_inputs = '' - for _,input in pairs(command.inputs) do - if input == true then break end - str_inputs = str_inputs..'<'..input..'> ' - end - return str_inputs -end ---Can be used to ensure the right number of inputs are given -local function get_command_args(event,command,allow_invaild) - local args = {} - if not event.parameter then - if #command.inputs > 0 then - if allow_invaild then return args end - return 'Invalid' - end - return args - end - for word in event.parameter:gmatch('%S+') do table.insert(args,word) end - if allow_invaild then return args end - if command.inputs[#command.inputs] == true then - if #args < #command.inputs-1 then return 'Invalid' end - else - if #args ~= #command.inputs then return 'Invalid' end - end return args -end ---name is what is used in /command ---help is the help info given ---inputs is a list i.e. {'name','message',true} the last value being true opposed to a string allows a variable number of words for the last input i.e. message can be multiple words long ---event(player,event,args) if the function that will be ran on the command use -function define_command(name,help,inputs,event) - if not name then error('Command requires a name') end - local help = help or {'commands.no-help'} - local inputs = inputs or {true} - if not event or type(event) ~= 'function' then error('Command requires a function') end - Exp_commands[name]={name=name,help=help,inputs=inputs,event=event} -end ---The magic for the commands. It is a hard bit of code so GL; but it will call the command event have some sanitisaion of the input -local function load_command(command_data) - --is the command all ready loaded - if commands.commands[command_data.name] then return end - --start loading command - debug_write({'COMMAND','LOAD'},command_data.name) - --add command to game - debug_write({'COMMAND','LOAD'},command_data) - commands.add_command(command_data.name,{'commands.help-format',command_inputs_to_string(command_data),command_data.help},function(event) - --gets the command data - local command = Exp_commands[event.name] - debug_write({'COMMAND','RUN','START'},command.name) - debug_write({'COMMAND','RUN','PLAYER-INDEX'},event.player_index) - if event.player_index then - --player ran command so authoriz it - local player = game.players[event.player_index] - if not ranking.rank_allowed(ranking.get_player_rank(player),command.name) then - debug_write({'COMMAND','RUN','ALLOWED'},false) - player.print({'commands.unauthorized'}) - game.write_file('commands.log','\n'..game.tick..' Player: '..player.name..' Failed to use command (Unauthorized): '..command.name..' With args of: '..table.tostring(get_command_args(event,command,true)), true, 0) - return - end - --start prossessing command inputs, check if valid - debug_write({'COMMAND','RUN','ALLOWED'},true) - local args = get_command_args(event,command) - debug_write({'COMMAND','RUN','ARGS'},args) - if args == 'Invalid' then - player.print({'commands.invalid-inputs',command.name,command_inputs_to_string(command)}) - game.write_file('commands.log','\n'..game.tick..' Player: '..player.name..' Failed to use command (Invalid Args): '..command.name..' With args of: '..table.tostring(get_command_args(event,command,true)), true, 0) - return - end - --run the callback function of the command - debug_write({'COMMAND','RUN','FUNCTION'},command.name) - command.event(player,event,args) - player.print({'commands.command-ran'}) - game.write_file('commands.log','\n'..game.tick..' Player: '..player.name..' Used command: '..command.name..' With args of: '..table.tostring(args), true, 0) - else - --server ran command so skip authorizion - local args = get_command_args(event,command) - if args == 'Invalid' then print('Invalid Input, /'..command.name..' '..command_inputs_to_string(command)) return end - debug_write({'COMMAND','RUN','ARGS'},args) - --run the callback function of the command - debug_write({'COMMAND','RUN','FUNCTION'},command.name) - command.event('',event,args) - print('Command Complete') - game.write_file('commands.log','\n'..game.tick..' Player: Used command: '..command.name..' With args of: '..table.tostring(args), true, 0) - end - debug_write({'COMMAND','RUN','END'},command.name,true) - end) -end --- returns all the commands in a certain rank restriction -function get_commands(rank) - local rank = rank or 'Owner' - local to_return = {} - for command_name,command in pairs(Exp_commands) do - if ranking.rank_allowed(ranking.string_to_rank(rank),command_name) then table.insert(to_return,command) end - end - return to_return -end --- loads all the commands, call once all script have been loaded -function load_commands() - for command_name,command in pairs(Exp_commands) do load_command(command) end -end \ No newline at end of file diff --git a/locale/ExpGaming-Core/ExpGaming - Lib.lua b/locale/ExpGaming-Core/ExpGaming - Lib.lua deleted file mode 100644 index db52c9b6..00000000 --- a/locale/ExpGaming-Core/ExpGaming - Lib.lua +++ /dev/null @@ -1,121 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- ---Convert ticks to 12H 34M format or 8.97M when less than 10 -function tick_to_display_format(tick) - if tick_to_min(tick) < 10 then - return string.format('%.2f M',tick/(3600*game.speed)) - else - return string.format('%d H %d M',tick_to_hour(tick),tick_to_min(tick)-60*tick_to_hour(tick)) - end -end ---Convert ticks into hours based on game speed -function tick_to_hour (tick) - return math.floor(tick/(216000*game.speed)) -end ---Convert ticks into minutes based on game speed -function tick_to_min (tick) - return math.floor(tick/(3600*game.speed)) -end ---used to make uuids but may be useful else where -function string.tohex(str) - return (str:gsub('.', function (c) - return string.format('%02X', string.byte(c)) - end)) -end ---I stole this from somewhere a long time ago but this and the other two functions convert a table into a string -function table.val_to_str ( v ) - if "string" == type( v ) then - v = string.gsub( v, "\n", "\\n" ) - if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then - return "'" .. v .. "'" - end - return '"' .. string.gsub(v,'"', '\\"' ) .. '"' - else - return "table" == type( v ) and table.tostring( v ) or - "function" == type( v ) and '"cant-display-function"' or - "userdata" == type( v ) and '"cant-display-userdata"' or - tostring( v ) - end -end - -function table.key_to_str ( k ) - if "string" == type( k ) and string.match( k, "^[_%player][_%player%d]*$" ) then - return k - else - return "[" .. table.val_to_str( k ) .. "]" - end -end - -function table.tostring( tbl ) - local result, done = {}, {} - for k, v in ipairs( tbl ) do - table.insert( result, table.val_to_str( v ) ) - done[ k ] = true - end - for k, v in pairs( tbl ) do - if not done[ k ] then - table.insert( result, - table.key_to_str( k ) .. "=" .. table.val_to_str( v ) ) - end - end - return "{" .. table.concat( result, "," ) .. "}" -end --- converts a table to json and logs it to a file -function json_log(lua_table,no_log) - local result, done, only_indexs = {}, {}, true - for key,value in ipairs(lua_table) do - done[key] = true - if type(value) == 'table' then table.insert(result,json_log(value,true)) - elseif type(value) == 'string' then table.insert(result,'"'..value..'"') - elseif type(value) == 'number' then table.insert(result,value) - elseif type(value) == 'boolean' then table.insert(result,tostring(value)) - else table.insert(result,'null') end - end - for key,value in pairs(lua_table) do - if not done[key] then - only_indexs = false - if type(value) == 'table' then table.insert(result,'"'..key..'":'..json_log(value,true)) - elseif type(value) == 'string' then table.insert(result,'"'..key..'":"'..value..'"') - elseif type(value) == 'number' then table.insert(result,'"'..key..'":'..value) - elseif type(value) == 'boolean' then table.insert(result,'"'..key..'":'..tostring(value)) - else table.insert(result,'"'..key..'":null') end - end - end - if only_indexs then - if no_log then return "["..table.concat(result,",").."]" - else game.write_file('json.data',"["..table.concat(result,",").."]\n",true,0) end - else - if no_log then return "{"..table.concat(result,",").."}" - else game.write_file('json.data',"{"..table.concat(result,",").."}\n",true,0) end - end -end ---this will long the value of all varibles in script - will most lickely lag - useful for fixing desyncs -function log_G() - local index = 0 - for k,v in pairs(_G) do - index = index + 1 - if index ~= 26 and index ~= 1 then - if type(v) == 'table' then log(k..' '..table.tostring(v)) - elseif type(v) == 'function' then log(k..' function') - else log(k..' '..tostring(v)) end - end - end -end --- allows a simple way to debug code; idenitys = {'string1','string2'}; string will be writen to file; no_trigger dissables the trigger useful for on_tick events -function debug_write(idenitys,string,no_trigger) - if global.exp_core and global.exp_core.debug.state then - if type(string) == 'table' then string = table.tostring(string) - elseif type(string) ~= 'string' then string = tostring(string) end - if not no_trigger or global.exp_core.debug.triggered then game.write_file('debug.log', '\n['..table.concat(idenitys, " " )..'] '..string, true, 0) end - if not no_trigger then global.exp_core.debug.triggered = true end - end -end -Event.register(defines.events.on_tick,function() debug_write({'NEW TICK'},game.tick,true) end) -Event.register(Event.soft_init,function() global.exp_core.debug={state=false,triggered=false,force=false} end) \ No newline at end of file diff --git a/locale/ExpGaming-Core/ExpGaming - Rank Control.lua b/locale/ExpGaming-Core/ExpGaming - Rank Control.lua deleted file mode 100644 index 2580015d..00000000 --- a/locale/ExpGaming-Core/ExpGaming - Rank Control.lua +++ /dev/null @@ -1,205 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ranking = {} -ranking.get_ranks,ranking.get_rank_groups = unpack(require("ExpGaming - Rank Table")) ---Return the rank of a given player -function ranking.get_player_rank(player) - if player then - debug_write({'RANK','PLAYER-GET'},player.name) - for _,rank in pairs(ranking.get_ranks()) do - if player.permission_group == game.permissions.get_group(rank.name) then return rank end - end - return ranking.string_to_rank_group('User').lowest_rank - end -end ---Convert the name of a rank into the rank object -function ranking.string_to_rank(string) - if type(string) == 'string' then - local found_ranks={} - for _,rank in pairs(ranking.get_ranks()) do - if rank.name:lower() == string:lower() then return rank end - if rank.name:lower():find(string:lower()) then table.insert(found_ranks,rank) end - end - if #found_ranks == 1 then return found_ranks[1] end - end -end ---converts the name of a group to the group object -function ranking.string_to_rank_group(string) - if type(string) == 'string' then - local found_groups={} - for _,group in pairs(ranking.get_rank_groups()) do - if group.name:lower() == string:lower() then return group end - if group.name:lower():find(string:lower()) then table.insert(found_groups,group) end - end - if #found_groups == 1 then return found_groups[1] end - end -end --- surches the rank for a certain allow command -function ranking.rank_allowed(rank,is_allowed) - for _,allow in pairs(rank.allow) do - if allow == is_allowed then return true end - end - return false -end ---Send a message to all members of this rank and above, if no rank given default is mod ---inv sends message to all lower ranks rather than higher -function ranking.rank_print(msg, rank, inv) - local rank = ranking.string_to_rank(rank) or ranking.string_to_rank_group('Moderation').lowest_rank -- default mod or higher - local inv = inv or false - debug_write({'RANK','PRINT'},rank.name..': '..tostring(msg)) - for _, player in pairs(game.players) do - --this part uses sudo to soread it other many ticks - local player_rank_power = ranking.get_player_rank(player).power - if inv then - server.queue_callback(function(player_rank_power,rank) - if player_rank_power >= rank.power then player.print({'ranking.all-rank-print',msg}) end - end,{player_rank_power,rank}) - else - server.queue_callback(function(player_rank_power,rank) - if player_rank_power <= rank.power then - if rank.short_hand ~= '' then player.print{'ranking.rank-print',rank.short_hand,msg} else player.print{'ranking.all-rank-print',msg} end - end - end,{player_rank_power,rank}) - end - end -end ---Give the user their new rank and raise the Event.rank_change event -function ranking.give_rank(player,rank,by_player,tick) - if not player or not player.valid then return end - local tick = tick or game.tick - local by_player = by_player or 'server' - local rank = ranking.string_to_rank(rank) or rank or ranking.string_to_rank_group('User').lowest_rank - local old_rank = ranking.get_player_rank(player) - -- to reducse lag if the ranks are all ready given it does not cheak - if old_rank == rank then return end - --messaging - local message = 'ranking.rank-down' - if rank.power <= old_rank.power then message = 'ranking.rank-up' end - if by_player.name then - debug_write({'RANK','GIVE'},'player: '..player.name..' by player: '..by_player.name..' new rank: '..rank.name..' old rank: '..old_rank.name) - ranking.rank_print({message,player.name,rank.name,by_player.name},'Guest') - else - debug_write({'RANK','GIVE'},'player: '..player.name..' by player: new rank: '..rank.name..' old rank: '..old_rank.name) - ranking.rank_print({message,player.name,rank.name,''},'Guest') - end - if rank.name ~= ranking.string_to_rank_group('User').lowest_rank.name then player.print({'ranking.rank-given',rank.name}) end - if player.tag ~= old_rank.tag and player.tag ~= '' then player.print({'ranking.tag-reset'}) end - --rank change - player.permission_group = game.permissions.get_group(rank.name) - player.tag = ranking.get_player_rank(player).tag - if old_rank.name ~= 'Jail' then global.exp_core.old_ranks[player.index]=old_rank.name end - script.raise_event(Event.rank_change, {tick=tick, player=player, by_player=by_player, new_rank=rank, old_rank=old_rank}) -end ---Revert the user's rank to what it was before the lastest change -function ranking.revert_rank(player,by_player) - local rank = ranking.string_to_rank(global.exp_core.old_ranks[player.index]) - ranking.give_rank(player,rank,by_player) -end ---Give the player a new rank based on playtime and/or preset ranks -function ranking.find_new_rank(player,tick) - debug_write({'RANK','NEW-RANK','START'},player.name) - local function loop_preset_rank(players,rank) - debug_write({'RANK','NEW-RANK','LOOP-PRESET'},rank) - for _,p in pairs(players) do - if player.name:lower() == p:lower() then return rank end - end - end - local tick = tick or game.tick - local player_rank = ranking.get_player_rank(player) - local possible_ranks = {player_rank} - --Loop through preset ranks only if playtime is less than 5 minutes - debug_write({'RANK','NEW-RANK','PRESET-CHEAK'},tick_to_min(player.online_time)) - if tick_to_min(player.online_time) < 5 then - debug_write({'RANK','NEW-RANK','PRESET-START'},player.name) - for rank,players in pairs(ranking.get_player_rank_presets()) do - local found_rank = loop_preset_rank(players, rank) - if found_rank then debug_write({'RANK','NEW-RANK','ADD'},found_rank) table.insert(possible_ranks,ranking.string_to_rank(found_rank)) break end - end - end - -- to reduce lag if the player is already higher than any time rank then it does not cheak - -- also there play time must be higher than the lowest required for a rank - debug_write({'RANK','NEW-RANK','TIME-CHEAK'},tick_to_min(player.online_time)) - if player_rank.power > global.exp_core.ranks.highest_timed_rank.power and tick_to_min(player.online_time) >= global.exp_core.ranks.lowest_timed_rank.time then - debug_write({'RANK','NEW-RANK','TIME-START'},player.name) - --Loop through rank times - for _,rank in pairs(ranking.get_ranks()) do - if rank.time then debug_write({'RANK','NEW-RANK','START'},rank.name..' '..rank.time) end - if rank.time and tick_to_min(player.online_time) >= rank.time then debug_write({'RANK','NEW-RANK','ADD'},rank.name) table.insert(possible_ranks,rank) end - end - end - --Loop through possible ranks - debug_write({'RANK','NEW-RANK','JAIL-CHEAK'},player_rank.name) - if player_rank.name ~='Jail' then - debug_write({'RANK','NEW-RANK','GIVE','START'},possible_ranks) - local highest_rank = possible_ranks[1] - for _,rank in pairs(possible_ranks) do - debug_write({'RANK','NEW-RANK','GIVE','POSSIBLE-CHEAK'},rank.name) - if rank.power < highest_rank.power then highest_rank = rank end - end - debug_write({'RANK','NEW-RANK','GIVE','HIGHEST'},highest_rank.name) - --Give player new rank if availble - if highest_rank.name == ranking.string_to_rank_group('User').lowest_rank.name then - -- to avoid spam in chat - debug_write({'RANK','NEW-RANK','GIVE','VIA-SERVER'},player.name..' '..highest_rank.name) - player.tag = highest_rank.tag - player.permission_group=game.permissions.get_group('Guest') - ExpGui.toolbar.draw(player) - else - debug_write({'RANK','NEW-RANK','GIVE','VIA-GIVE-RANK'},player.name..' '..highest_rank.name) - if highest_rank ~= player_rank then ranking.give_rank(player,highest_rank,nil,tick) end - end - debug_write({'RANK','NEW-RANK','GIVE','END'},player.name) - end - --Lose ends - if ranking.get_player_rank(player).power <= ranking.string_to_rank_group('Moderation').lowest_rank.power and not player.admin then ranking.rank_print(player.name..' needs to be promoted.') end - if player_rank.name ~= ranking.get_player_rank(player).name then global.exp_core.old_ranks[player.index]=player_rank.name end - debug_write({'RANK','NEW-RANK','END'},player.name) -end --- returns a list with every players current rank, or just the players of the rank given, includes online time -function ranking.get_ranked_players(rank) - local to_return = {} - for _,player in pairs(game.players) do - if not rank or rank == ranking.get_player_rank(player).name then - table.insert(to_return,{player.name,tick_to_display_format(player.online_time),ranking.get_player_rank(player).name}) - end - end - return to_return -end ---Event handlers -Event.rank_change = script.generate_event_name() -Event.register(Event.rank_change,function(event) - debug_write({'RANK','EVENT'},event) - if event.new_rank.name == event.old_rank.name then return end - if not event.by_player == 'server' then - game.write_file('rank-change.log','\n'..game.tick..' Player: '..event.player.name..' Was given rank: '..event.new_rank.name..' By: '..event.by_player.name..' Their rank was: '..event.old_rank.name, true, 0) - end - if event.new_rank.name == 'Jail' then - local by_name = ''; if event.by_player == 'server' then by_name = '' else by_name = event.by_player.name end - if global.temp_bans and global.temp_bans[event.player.name] then else - json_log({type='JAIL',colour='#ff5400',tick=game.tick,online=#game.connected_players,onlineMods=online_mods,username=event.player.name,by=by_name}) - end - end -end) -Event.register(Event.soft_init,function() - debug_write({'RANK','SETUP'},'start') - global.exp_core.old_ranks = {} - global.exp_core.preset_ranks = {} - for _,rank in pairs(ranking.get_ranks()) do - debug_write({'RANK','SETUP'},'added: '..rank.name) - game.permissions.create_group(rank.name) - for _,toRemove in pairs(rank.disallow) do - debug_write({'RANK','SETUP'},'blocked: '..toRemove) - game.permissions.get_group(rank.name).set_allows_action(defines.input_action[toRemove],false) - end - end -end) -Event.register(defines.events.on_player_joined_game,function(event) ranking.find_new_rank(game.players[event.player_index]) end) - -return ranking \ No newline at end of file diff --git a/locale/ExpGaming-Core/ExpGaming - Rank Table.lua b/locale/ExpGaming-Core/ExpGaming - Rank Table.lua deleted file mode 100644 index 9b8109a2..00000000 --- a/locale/ExpGaming-Core/ExpGaming - Rank Table.lua +++ /dev/null @@ -1,279 +0,0 @@ ---[[ -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/r6dC2uK ---Please Only Edit Below This Line----------------------------------------------------------- -How to use groups: -name the name that you can use to refence it. -colour if present then all ranks in this group will have this colour. -disallow if present then all ranks in this group will have this added to their disallow. -allow if present then all ranks in this group will have this added to their allow. -highest_rank is asigned by the script to show the highest rank in this group. -lowest_rank is asigned by the script to show the lowest rank in this group. -How to add ranks: -Name is what will be used in the scripts and is often the best choice for display in text. -short_hand is what can be used when short on space but the rank still need to be displayed. -tag is the tag the player will gain when moved to the rank, it can be nil. -time is used for auto-rank feature where you are moved to the rank after a certain play time in minutes. -colour is the RGB value that can be used to emphasise GUI elements based on rank. -power is not in the list below as it is auto-defined by index but allows comparison between ranks. -group is the groups that this rank is apart of can be nil, group allow and disallow are non-inheritable. -disallow is a list containing input actions that the user can not perform. -allow is a list of custom commands and effects that that rank can use, all defined in the sctips. -For disallow, add to the list the end part of the input action -Example: defines.input_action.drop_item -> 'drop_item' -http://lua-api.factorio.com/latest/defines.html#defines.input_action ---]] -local ranks = { - --these are asigned during the rank set up - highest_timed_rank=nil, - lowest_timed_rank=nil, - number_of_ranks=0, - groups={ - --note dont remove these groups but you may add more - --all but the management group is used to indentiy ranks by the script - {name='Management', - allow={'cheat-mode','debug'} - }, - - {name='Moderation', - disallow={ - 'set_allow_commands', - 'edit_permission_group', - 'delete_permission_group', - 'add_permission_group'}, - allow={ - 'temp-ban', - 'rank_changer', - 'clear-reports', - 'limitless_tags', - 'map-changes'} - }, - - {name='User', - allow={ - 'kill', - 'tag', - 'report', - 'task_list', - 'science_list', - 'rocket_list', - 'player_list', - 'readme', - 'rules_tab', - 'chat_tab', - 'commands_tab', - 'players_tab', - 'info', - 'links_tab', - 'servers_tab', - 'warp-points'} - }, - - {name='Jail', - disallow={ - 'open_character_gui', - 'begin_mining', - 'start_walking', - 'player_leave_game', - 'rotate_entity', - 'reverse_rotate_entity', - 'select_gun', - 'open_technology_gui', - 'start_research', - 'open_blueprint_library_gui', - 'open_trains_gui', - 'open_train_station_gui', - 'use_item', - 'build_item'} - } - }, - ranks={ - {name='Owner', - short_hand='Owner', - tag='[Owner]', - time=nil, - colour={r=170,g=0,b=0}, - group='Management', - disallow={}, - allow={}}, - - {name='Community Manager', - short_hand='Com Mngr', - tag='[Com Mngr]', - time=nil, - colour={r=150,g=68,b=161}, - group='Management', - disallow={}, - allow={}}, - - {name='Developer', - short_hand='Dev', - tag='[Dev]', - time=nil, - colour={r=179,g=125,b=46}, - group='Management', - disallow={}, - allow={'cheat-mode'} - }, - - {name='Admin', - short_hand='Admin', - tag='[Admin]', - time=nil, - colour={r=233,g=63,b=233}, - group='Moderation', - disallow={}, - allow={ - 'server-interface', - 'tp-all', - 'announcement', - 'admin', - 'force_modifiers_tab', - 'player_modifiers_tab', - 'adv_repair', - 'free-warp'} - }, - - {name='Mod', - short_hand='Mod', - tag='[Mod]', - time=nil, - colour={r=0,g=170,b=0}, - group='Moderation', - disallow={'server_command'}, - allow={} - }, - - {name='Donator', - short_hand='P2W', - tag='[P2W]', - time=nil, - colour={r=233,g=63,b=233}, - group='User', - disallow={}, - allow={ - 'tp', - 'repair', - 'tree_remover', - 'report_protection'} - }, - - {name='Veteran', - short_hand='Vet', - tag='[Veteran]', - time=600, - colour={r=140,g=120,b=200}, - group='User', - disallow={}, - allow={}}, - - {name='Member', - short_hand='Mem', - tag='[Member]', - time=nil, - colour={r=24,g=172,b=188}, - group='User', - disallow={}, - allow={'trusted_reporter','warp-point'}}, - - {name='Regular', - short_hand='Reg', - tag='[Regular]', - time=180, - colour={r=24,g=172,b=188}, - group='User', - disallow={ - 'set_auto_launch_rocket', - 'change_programmable_speaker_alert_parameters', - 'drop_item'}, - allow={'decon','edit_tasks'} - }, - - {name='Guest', - short_hand='', - tag='', - time=nil, - colour={r=255,g=159,b=27}, - group='User', - disallow={ - 'build_terrain', - 'remove_cables', - 'launch_rocket', - 'reset_assembling_machine', - 'cancel_research'}, - allow={} - }, - - {name='Jail', - short_hand='Jail', - tag='[Jail]', - time=nil, - colour={r=50,g=50,b=50}, - group='Jail', - disallow={}, - allow={} - } - } -} --- rank table setup --- group setup -for n,rank in pairs(ranks.ranks) do - local group = nil; for _,g in pairs(ranks.groups) do if g.name == rank.group then group = g break end end - if group and not group.highest_rank then group.highest_rank=rank end - if group then group.lowest_rank=rank end - if group and group.colour then rank.colour = group.colour end -end --- group to rank setup -for n,group in pairs(ranks.groups) do - if group.allow and group.lowest_rank then - for _,allow in pairs(group.allow) do table.insert(group.lowest_rank.allow,allow) end - end - if group.disallow and group.highest_rank then - for _,disallow in pairs(group.disallow) do table.insert(group.highest_rank.disallow,disallow) end - end -end --- rank setup -for n,rank in pairs(ranks.ranks) do - rank.power = n - if ranks.ranks[n-1] then - for _,disallow in pairs(ranks.ranks[n-1].disallow) do - table.insert(rank.disallow,disallow) - end - end - if rank.time and not ranks.highest_timed_rank then ranks.highest_timed_rank=rank end - if rank.time then ranks.lowest_timed_rank=rank end - ranks.number_of_ranks=ranks.number_of_ranks+1 -end - -for n = #ranks.ranks, 1, -1 do - local rank = ranks.ranks[n] - if ranks.ranks[n+1] then - for _,allow in pairs(ranks.ranks[n+1].allow) do - table.insert(rank.allow,allow) - end - end -end --- returns a list off all the ranks, return only one part if given -local function get_ranks(part) - local to_return = {} - if part then - for _,rank in pairs(global.exp_core.ranks.ranks) do table.insert(to_return,rank[part]) end - else to_return = global.exp_core.ranks.ranks end - return to_return -end --- returns a list off all the groups, return only one part if given -local function get_rank_groups(part) - local to_return = {} - if part then - for _,group in pairs(global.exp_core.ranks.groups) do table.insert(to_return,group[part]) end - else to_return = global.exp_core.ranks.groups end - return to_return -end --- Move the ranks to the global array -Event.register(Event.soft_init,function() global.exp_core.ranks = ranks end) - -return {get_ranks, get_rank_groups} \ No newline at end of file diff --git a/locale/ExpGaming-Core/ExpGaming - Server Interface.lua b/locale/ExpGaming-Core/ExpGaming - Server Interface.lua deleted file mode 100644 index a7a4dd7b..00000000 --- a/locale/ExpGaming-Core/ExpGaming - Server Interface.lua +++ /dev/null @@ -1,142 +0,0 @@ ---[[ -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/r6dC2uK -]] ---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.server-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.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.callback_queue == 0 then debug_write({'END'},game.tick) global.exp_core.debug.state = false end -end) ---runs the preset callback with the uuid -define_command('socket',{'server.socket-command-help'},{'uuid','args'},function(player,event,args) - if global.exp_core.server.callbacks[args[1]] then - server.queue_callback(global.exp_core.server.callbacks[args[1]].fun,{unpack(args,2)},args[1]) - 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 callback commands ran every callback iteration -local ticks_per_iteration = 1 --the number of ticks break before the next callback iteration -local temp_var_time = 1000/commands_per_iteration*ticks_per_iteration --temp vars allow callback funnctions to share data ---adds a callback and saves code to a file -function server.emit(code, callback) - if type(callback) == 'function' then - local uuid = server.add_callback(callback) - json_log({type='JS',id=uuid,code=code}) - end -end ---adds a call back that can be ran with a command -function server.add_callback(callback,uuid) - if type(callback) == 'function' then - local args = args or {} - local uuid = uuid or server.get_uuid(callback) - debug_write({'callback','ADD'},uuid) - global.exp_core.server.callbacks[uuid]={fun=callback,uuid=uuid} - server.refresh_uuid(uuid) - return uuid - end -end ---adds a call back function to the queue uuid can be provided -function server.queue_callback(callback,args,uuid) - if type(callback) == 'function' then - local args = args or {} - local uuid = uuid or server.get_uuid(callback) - debug_write({'CALLBACK','QUEUE'},uuid) - table.insert(global.exp_core.server.callback_queue,{fun=callback,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 = {callback_queue={},callbacks={},temp_varibles={}} -end --- converts any value into the uuid the script will use -function server.get_uuid(var) - local uuid = nil - if type(var) == 'string' then uuid = var - else uuid = tostring(global.exp_core.uuids()) end - uuid = string.tohex('uuid'..uuid) - server.refresh_uuid(uuid) - return 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({'CALLBACK','TEMP-VAR'},uuid) - if global.exp_core.server.temp_varibles[uuid].data == 'temp-var-temp-value' then return nil end - 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.callback-info',game.tick,#global.exp_core.server.callback_queue,lenth} - else return {tick=game.tick,commands=#global.exp_core.server.callback_queue,temp_varibles=#global.exp_core.server.temp_varibles} end -end ---callback 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 callback - if global.exp_core.debug.state and global.exp_core.debug.triggered and #global.exp_core.server.callback_queue == 0 then debug_write({'END'},game.tick) global.exp_core.debug.state = global.exp_core.debug.focre end - -- runs the commands in callback - debug_write({'CALLBACK'},server.get_callback_queue_info(),true) - if game.tick % ticks_per_iteration == 0 and global.exp_core.server.callback_queue and #global.exp_core.server.callback_queue > 0 then - -- gets the number of call backs to run - local length = nil - if #global.exp_core.server.callback_queue > commands_per_iteration then length = commands_per_iteration else length = #global.exp_core.server.callback_queue end - -- runs the right number of commands as set - for i = 1,length do - local callback=table.remove(global.exp_core.server.callback_queue,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 = callback.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 = {callback_queue={},callbacks={},temp_varibles={}} global.exp_core.uuids = game.create_random_generator() end) -return server \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Center Gui.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Center Gui.lua deleted file mode 100644 index 211bea9e..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Center Gui.lua +++ /dev/null @@ -1,82 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local add_frame = ExpGui.add_frame -local frames = ExpGui.frames -local draw_frame = ExpGui.draw_frame ---Add a frame in the center ---tabs {{name},{...}} is a list that can contain already defined tabs ---event(player,element) is an option to have a custom GUI in the center -function add_frame.center(name,default_display,default_tooltip,tabs,event) - if not name then error('Frame requires a name') end - local tabs = tabs or {} - frames.center[name] = {name=name,display=default_display,tabs=tabs,event=event} - ExpGui.toolbar.add_button(name,default_display,default_tooltip,draw_frame.center) -end ---Define a tab; frame is needed as every tab must be used once; event(player,tab) is the draw function -function add_frame.tab(name,default_display,default_tooltip,frame,event) - if not name then error('Tab requires a name') end - if not frame then error('Tab requires a frame') end - frames.tabs[name] = {name=name,display=default_display,frame=frame,event=event} - table.insert(frames.center[frame].tabs,name) - ExpGui.add_input.button(name,default_display,default_tooltip,draw_frame.tab) -end ---Draw the center GUI for the player; do not call manually, must use other functions to call -ExpGui.add_input.button('close_center',{'expgui.close-button'},{'expgui.close-button-tooltip'},function(player,element) element.parent.parent.parent.destroy() end) -function draw_frame.center(player,element) - local frame_data = frames.center[element.name] - debug_write({'GUI','CENTER'},player.name..' '..frame_data.name) - --setup so nothing will break (name is set as caption if display a sprite) - if player.gui.is_valid_sprite_path(frame_data.display) then frame_data.display = frame_data.name end - if player.gui.center[frame_data.name] then player.gui.center.clear() return else player.gui.center.clear() end - -- start drawing - local frame = player.gui.center.add{name=frame_data.name,type='frame',caption=frame_data.display,direction='vertical',style=mod_gui.frame_style} - if frame_data.event and type(frame_data.event) == 'function' then frame_data.event(player,frame) return end - -- if a custom draw is not set then it will do the default - local tab_bar_scroll = frame.add{type = "scroll-pane", name= "tab_bar_scroll", vertical_scroll_policy="never", horizontal_scroll_policy="always"} - local tab_bar = tab_bar_scroll.add{type='flow',direction='horizontal',name='tab_bar'} - local tab = frame.add{type = "scroll-pane", name= "tab", vertical_scroll_policy="auto", horizontal_scroll_policy="never"} - -- draw tabs buttons for allowed tabs - local first_tab = nil - for n,tab_name in pairs(frame_data.tabs) do - if ranking.rank_allowed(ranking.get_player_rank(player),tab_name..'_tab') then - first_tab = first_tab or tab_name - debug_write({'GUI','CENTER','ADD'},tab_name) - ExpGui.add_input.draw_button(tab_bar,tab_name) - end - end - draw_frame.tab(player,tab_bar[first_tab]) - ExpGui.add_input.draw_button(tab_bar,'close_center') - --sets the size of the gui - tab.style.minimal_height = 300 - tab.style.maximal_height = 300 - tab.style.minimal_width = 500 - tab.style.maximal_width = 500 - tab_bar_scroll.style.minimal_height = 60 - tab_bar_scroll.style.maximal_height = 60 - tab_bar_scroll.style.minimal_width = 500 - tab_bar_scroll.style.maximal_width = 500 - player.gui.center.add{type='frame',name='temp'}.destroy()--recenter the GUI -end ---Draw the tab into the center GUI for the player; do not call manually, must use other functions to call -function draw_frame.tab(player,element) - debug_write({'GUI','CENTER','OPEN-TAB'},element.name) - for _,btn in pairs(element.parent.children) do if btn.name == 'close_center' or btn.name == element.name then - btn.style.font_color = {r = 255, g = 255, b = 255,a=255} - else - btn.style.font_color = {r = 100, g = 100, b = 100,a=255} - end end - element.parent.parent.parent.tab.clear() - frames.tabs[element.name].event(player,element.parent.parent.parent.tab) -end - -Event.register(Event.rank_change,function(event) event.player.gui.center.clear() end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Inputs.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Inputs.lua deleted file mode 100644 index ce1a80c2..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Inputs.lua +++ /dev/null @@ -1,74 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local add_input = ExpGui.add_input -local inputs = ExpGui.inputs ---allows defining of new buttons;;name how to call button;;default_display what is shown on the button;;default_tooltip the tooltip display;;event function(player,element) that runs on click -function add_input.button(name,default_display,default_tooltip,event) - if not name then error('Button requires a name') end - inputs.buttons[name] = {name=name,display=default_display,tooltip=default_tooltip,event=event} -end ---allows defining of text box inputs;;name how to call button;;default_display what is shown on the button;;event function(player,element) that runs on text change -function add_input.text(name,default_display,event) - if not name then error('Text Filed requires a name') end - inputs.text[name] = {name=name,display=default_display,event=event} -end ---draws the button into a gui;;frame the frame to draw to;;name name of button to draw;;display(opptinal) overrides the default;;tooltip(opptinal) overrides the default -function add_input.draw_button(frame,name,display,tooltip) - if not frame or not frame.valid then error('No frame to draw to') end - if not name then error('No button to draw') end - debug_write({'GUI','INPUT'},name) - if inputs.buttons[name] then - local button = inputs.buttons[name] - local display = display or button.display or {'expgui.button-no-display'} - local tooltip = tooltip or button.tooltip or {'expgui.button-no-tooltip'} - if type(display) == 'string' and frame.gui.is_valid_sprite_path(display) then - frame.add{name=name, type = "sprite-button", sprite=display, tooltip=tooltip, style = mod_gui.button_style} - else - frame.add{name=name, type = "button", caption=display, tooltip=tooltip, style = mod_gui.button_style} - end return - end - error('No Button by the name of '..name) -end ---draws the text into a gui;;frame the frame to draw to;;name name of button to draw;;display(opptinal) overrides the default;;tooltip(opptinal) overrides the default -function add_input.draw_text(frame,name,display) - if not frame or not frame.valid then error('No frame to draw to') end - if not name then error('No text filed to draw') end - debug_write({'GUI','INPUT'},name) - if inputs.text[name] then - local text = inputs.text[name] - local display = display or text.display or {'expgui.text-no-display'} - frame.add{name=name, type='textfield'} - frame[name].caption=display - return - end - error('No Text by the name of '..name) -end ---the magic behind the buttons -Event.register(defines.events.on_gui_click, function(event) - local player = game.players[event.player_index] - if event.element.type == 'button' or event.element.type == 'sprite-button' then - if inputs.buttons[event.element.name] then - local button = inputs.buttons[event.element.name] - if button.event then button.event(player,event.element) - else ranking.rank_print('Button without Function '..button.name,'Mod') end - end - end -end) ---the magic behind the text inputs -Event.register(defines.events.on_gui_text_changed, function(event) - local player = game.players[event.player_index] - if inputs.text[event.element.name] then - local text = inputs.text[event.element.name] - if text.event then text.event(player,event.element) end - end -end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Left Gui.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Left Gui.lua deleted file mode 100644 index 95dd0f8a..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Left Gui.lua +++ /dev/null @@ -1,67 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local add_frame = ExpGui.add_frame -local frames = ExpGui.frames -local draw_frame = ExpGui.draw_frame ---left GUIs are always present and only have their visibility toggled ---Add a frame to the left bar; event(player,frame) must be present for left GUIs as there is no default ---vis should be true or false based on the player join game state of the GUI -function add_frame.left(name,default_display,default_tooltip,vis,event) - if not name then error('Frame requires a name') end - if not event or type(event) ~= 'function' then error('Frame requires a draw function') end - local vis = vis or false - frames.left[name] = {name=name,display=default_display,event=event,vis=vis} - ExpGui.toolbar.add_button(name,default_display,default_tooltip,draw_frame.left) -end ---draw the left GUI for the player; called via script, only call manually when update is true and element is the name of the GUI -function draw_frame.left(player,element,update) - debug_write({'GUI','LEFT'},player.name) - local frame = nil - local frame_data = nil - local left = mod_gui.get_frame_flow(player) - debug_write({'GUI','LEFT','UPDATE'},update) - if not update then - -- either toggels visabilty or makes the gui - frame_data = frames.left[element.name] - if left[frame_data.name] then ExpGui.toggle_visible(left[frame_data.name]) return end - frame = left.add{name=frame_data.name,type='frame',caption=frame_data.display,direction='vertical',style=mod_gui.frame_style} - frame.style.visible = frame_data.vis - else - -- only clears the gui - frame_data = frames.left[element] - frame = left[frame_data.name] - end - -- draws the gui elements - if frame then frame.clear() frame_data.event(player,frame) end -end ---used to load all left GUIs -Event.register(defines.events.on_player_joined_game,function(event) - local player = game.players[event.player_index] - for _,frame_data in pairs(frames.left) do - local left = mod_gui.get_frame_flow(player) - if left[frame_data.name] then - -- if it has been made already then it updates it - ExpGui.draw_frame.left(player,frame_data.name,true) - else - -- makes the gui if its not made - ExpGui.draw_frame.left(player,{name=frame_data.name}) - end - end -end) ---resets visabilty of guis on rank change -Event.register(Event.rank_change,function(event) - for _,frame_data in pairs(frames.left) do - local left = mod_gui.get_frame_flow(event.player) - if left[frame_data.name] then left[frame_data.name].style.visible = frame_data.vis end - end -end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Module Setup.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Module Setup.lua deleted file mode 100644 index b303e26a..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Module Setup.lua +++ /dev/null @@ -1,64 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- --- Mainly used as a plan for how the gui is stored also as a header for the credit -local ExpGui = { - add_frame={ - --center - --tab - --left - --popup - }, - draw_frame={ - --center - --tab - --left - --popup - }, - add_input={ - --button - --text - --draw_button - --draw_text - }, - toolbar={ - buttons={} - --draw - --add_button - }, - player_table={ - filters={} - --draw - --draw_filters - --get_filters - --player_match - }, - inputs={ - buttons={}, - text={} - }, - frames={ - center={}, - tabs={}, - left={}, - popup={} - } -} ---simple function to toggle the visibility of a frame -function ExpGui.toggle_visible(frame) - if frame then - if frame.style.visible == nil then - frame.style.visible = false - else - frame.style.visible = not frame.style.visible - end - end -end ---Please Only Edit Above This Line----------------------------------------------------------- -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua deleted file mode 100644 index 42023219..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua +++ /dev/null @@ -1,114 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local player_table_functions = ExpGui.player_table ---filters that are used. Feel free to add more -player_table_functions.filters = { - --{name,is_text,function(player,input) return true/false end} - {name='is_admin',is_text=false,test=function(player) return player.admin end}, - {name='player_name',is_text=true,test=function(player,input) if input and player.name:lower():find(input:lower()) then return true end end}, - {name='online',is_text=false,test=function(player) return player.connected end}, - {name='offline',is_text=false,test=function(player) return not player.connected end}, - {name='online_time',is_text=true,test=function(player,input) if input and tonumber(input) and tonumber(input) < tick_to_min(player.online_time) then return true elseif not input or not tonumber(input) then return true end end}, - {name='rank',is_text=true,test=function(player,input) if input and ranking.string_to_rank(input) and ranking.get_player_rank(player).power <= ranking.string_to_rank(input).power then return true elseif not input or not ranking.string_to_rank(input) then return true end end} -} ---set up all the text inputs -for _,filter in pairs(player_table_functions.filters) do - if filter.is_text then - ExpGui.add_input.text(filter.name,{'expgui.player-table-enter',filter.name:gsub('_',' ')},function(player,element) ExpGui.player_table.redraw(player,element) end) - end -end ---used to draw filters from the list above -function player_table_functions.draw_filters(player,frame,filters) - debug_write({'GUI','PLAYER-TABLE','DRAW-FILTERS'},player.name) - local input_bar = frame.add{type='flow',name='input_bar',direction='horizontal'} - for _,name in pairs(filters) do - local filter_data = nil - for _,filter in pairs(player_table_functions.filters) do if filter.name == name then filter_data = filter break end end - if filter_data and filter_data[2] then - ExpGui.add_input.draw_text(input_bar,name) - end - end -end ---used by script to get the values for the any inputs given by the user -function player_table_functions.get_filters(frame) - local filters = {} - for _,filter in pairs(player_table_functions.filters) do - if frame.input_bar[filter.name] then - if frame.input_bar[filter.name].text:find('%S') then - table.insert(filters,{filter.name,frame.input_bar[filter.name].text}) - end - end - end - return filters -end ---used to test if a player matches filter criteria -function player_table_functions.player_match(player,filter,input) - for _,f in pairs(player_table_functions.filters) do - if filter == f or filter == f[1] then if filter == f[1] then filter = f break end end - end - if filter.test and type(filter.test) == 'function' then return filter.test(player,input) end -end ---used by script on filter texts -function player_table_functions.redraw(player,element) - local frame = global.exp_core.current_filters[player.index][2] - local filters = global.exp_core.current_filters[player.index][1] - player_table_functions.draw(player,frame,filters,element.parent.parent) -end ---used to draw the player table with filter that you want ---filter = {{'is_admin',true},{'offline',true},{'player_name'}} ; if the length is 2 then it will not attempt to get a user input -function player_table_functions.draw(player,frame,filters,input_location) - debug_write({'GUI','PLAYER-TABLE','START'},player.name) - global.exp_core.current_filters[player.index] = {filters,frame} - --setup the table - if frame.player_table then frame.player_table.destroy() end - local player_table = frame.add{name='player_table', type="table", colspan=5} - player_table.style.minimal_width = 500 - player_table.style.maximal_width = 500 - player_table.style.horizontal_spacing = 10 - player_table.add{name="id", type="label", caption={"expgui.player-table-id"}} - player_table.add{name="player_name", type="label", caption={"expgui.player-table-name"}} - player_table.add{name="status", type="label", caption={"expgui.player-table-status"}} - player_table.add{name="online_time", type="label", caption={"expgui.player-table-online-time"}} - player_table.add{name="rank", type="label", caption={"expgui.player-table-rank"}} - for i,p in pairs(game.players) do - --filter cheaking - local add=true - for _,filter in pairs(filters) do - if #filter == 2 and add then - debug_write({'GUI','PLAYER-TABLE','CHEAK'},p.name..' '..fliter.name) - local result = player_table_functions.player_match(p,filter.name,filter.is_text) - if not result and filter.is_text == true then result = filter.is_text end - add = result or false - end - end - for _,filter in pairs(player_table_functions.get_filters(input_location)) do - if add then - debug_write({'GUI','PLAYER-TABLE','CHEAK'},p.name..' '..fliter.name) - add = player_table_functions.player_match(p,filter.name,filter.is_text) or false - end - end - --add the player - if add and not player_table[p.name.."_id"] then - debug_write({'GUI','PLAYER-TABLE','ADD'},p.name) - player_table.add{name=p.name.."_id", type="label", caption=i} - player_table.add{name=p.name..'_name', type="label", caption=p.name} - if p.connected == true - then player_table.add{name=p.name.."status", type="label", caption="Online"} - else player_table.add{name=p.name.."s", type="label", caption="Offline"} end - player_table.add{name=p.name.."online_time", type="label", caption=tick_to_display_format(p.online_time)} - player_table.add{name=p.name.."rank", type="label", caption=ranking.get_player_rank(p).short_hand} - end - end -end - -Event.register(Event.soft_init,function() global.exp_core.current_filters = {} end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Popup.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Popup.lua deleted file mode 100644 index 538fee84..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Popup.lua +++ /dev/null @@ -1,71 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local add_frame = ExpGui.add_frame -local frames = ExpGui.frames -local draw_frame = ExpGui.draw_frame ---used to draw the next popup frame -ExpGui.add_input.button('close_popup','X',{'expgui.popup-close-tooltip'},function(player,element) element.parent.destroy() end) -local function get_next_popup(popups,name) - if name then - local flow = popups.add{type='frame',name=name..'_on_click',direction='horizontal',style=mod_gui.frame_style} - local frame = flow.add{name='popup_frame',type='flow',direction='vertical'} - ExpGui.add_input.draw_button(flow,'close_popup') return frame - end - local current = 0 - while true do if popups['popup'..current] then current = current+1 else break end end - local flow = popups.add{type='frame',name='popup'..current,direction='horizontal',style=mod_gui.frame_style} - local frame = flow.add{name='popup_frame',type='flow',direction='vertical'} - ExpGui.add_input.draw_button(flow,'close_popup') - return frame -end ---adds a frame to the popup flow ---on_click(player,element) is what is called when button is clicked if nil no button is made ---event(player,frame,args) ---frame is where it will be drawn to; args is any info you want to pass in -function add_frame.popup(style,default_display,default_tooltip,on_click,event) - if not style then error('Popup style requires a name') end - if not event or type(event) ~= 'function' then error('Popup style requires a draw function') end - frames.popup[style] = {style=style,display=default_display,on_click=on_click,event=event} - if on_click and type(on_click) == 'function' then - ExpGui.toolbar.add_button(style,default_display,default_tooltip,draw_frame.popup_button) - end -end ---draw the popup on_click GUI for the player; do not call manually must use other functions to call -function draw_frame.popup_button(player,element) - debug_write({'GUI','POPUP-BUTTON'},player.name) - local frame_data = frames.popup[element.name] - local popups = mod_gui.get_frame_flow(player).popups - if popups[frame_data.style..'_on_click'] then popups[frame_data.style..'_on_click'].destroy() return end - local frame = get_next_popup(popups,frame_data.style) - frame_data.on_click(player,frame) -end ---used to draw a popup style can be called at any time; can not be called from a button directly -function draw_frame.popup(style,args) - local args = args or {} - local frame_data = frames.popup[style] - debug_write({'GUI','POPUP','STYLE'},style) - debug_write({'GUI','POPUP','ARGS'},args) - game.write_file('popups.log','\n'..game.tick..' Popup Style: '..style..' Was made with args of: '..table.tostring(args), true, 0) - for _,player in pairs(game.connected_players) do - debug_write({'GUI','POPUP','PLAYERS'},player.name) - local popups = mod_gui.get_frame_flow(player).popups - local frame = get_next_popup(popups) - frame_data.event(player,frame,args) - end -end ---used to make the popup area -Event.register(defines.events.on_player_joined_game,function(event) - if not mod_gui.get_frame_flow(game.players[event.player_index]).popups then - mod_gui.get_frame_flow(game.players[event.player_index]).add{name='popups',type='flow',direction='vertical'} - end -end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Toolbar.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Toolbar.lua deleted file mode 100644 index 20bfda87..00000000 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Toolbar.lua +++ /dev/null @@ -1,35 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local ExpGui = require("ExpGaming - Module Setup") -local toolbar = ExpGui.toolbar ---similar to ExpGui.add_input.button but it also accepts a restriction and button is drawn to the toolbar -function toolbar.add_button(name,default_display,default_tooltip,event) - if not name then error('Button requires a name') end - table.insert(toolbar.buttons,name) - ExpGui.add_input.button(name,default_display,default_tooltip,event) -end ---draw the toolbar to the player only showing buttons within their restriction -function toolbar.draw(player) - debug_write({'GUI','TOOLBAR'},player.name) - if not player then error('Need a player to draw to') end - local toolbar_frame = mod_gui.get_button_flow(player) - toolbar_frame.clear() - for _,button in pairs(toolbar.buttons) do - local rank = ranking.get_player_rank(player) - if ranking.rank_allowed(ranking.get_player_rank(player),button) then - debug_write({'GUI','TOOLBAR','ADD'},button) - ExpGui.add_input.draw_button(toolbar_frame,button) - end - end -end ---auto-redraw toolbar after new rank is given -Event.register(Event.rank_change,function(event) toolbar.draw(event.player) end) - -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/file-header.lua b/locale/ExpGaming-Core/GUI/file-header.lua deleted file mode 100644 index c27f1eab..00000000 --- a/locale/ExpGaming-Core/GUI/file-header.lua +++ /dev/null @@ -1,18 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- -local function merge(first_table,second_table) for k,v in pairs(second_table) do first_table[k] = v end end -local ExpGui = require("ExpGaming - Module Setup") -merge(ExpGui,require("ExpGaming - Inputs")) -merge(ExpGui,require("ExpGaming - Toolbar")) -merge(ExpGui,require("ExpGaming - Center Gui")) -merge(ExpGui,require("ExpGaming - Left Gui")) -merge(ExpGui,require("ExpGaming - Popup")) -merge(ExpGui,require("ExpGaming - Player Table")) -return ExpGui \ No newline at end of file diff --git a/locale/ExpGaming-Core/file-header.lua b/locale/ExpGaming-Core/file-header.lua deleted file mode 100644 index bab45c7d..00000000 --- a/locale/ExpGaming-Core/file-header.lua +++ /dev/null @@ -1,17 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- ---As this is the core file, the order in which the files are loaded does matter. Do not change! -require("ExpGaming - Lib") -local ranking = require("ExpGaming - Rank Control") -local ExpGui = require("GUI/file-header") -require("ExpGaming - Command Maker") -local server = require("ExpGaming - Server Interface") ---Please Only Edit Above This Line----------------------------------------------------------- -return {ranking,ExpGui,server} \ No newline at end of file diff --git a/locale/Stand-Alone/file-header.lua b/locale/Stand-Alone/file-header.lua deleted file mode 100644 index f2b6e152..00000000 --- a/locale/Stand-Alone/file-header.lua +++ /dev/null @@ -1,9 +0,0 @@ ---[[ -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/r6dC2uK -]] ---Please Only Edit Below This Line----------------------------------------------------------- diff --git a/locale/ExpGaming-Addons/file-header.lua b/locale/StdLib/StdLib.lua similarity index 51% rename from locale/ExpGaming-Addons/file-header.lua rename to locale/StdLib/StdLib.lua index f2b6e152..9b591a46 100644 --- a/locale/ExpGaming-Addons/file-header.lua +++ b/locale/StdLib/StdLib.lua @@ -6,4 +6,19 @@ 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/r6dC2uK ]] ---Please Only Edit Below This Line----------------------------------------------------------- + +--[[ +StdLib + +This file allow you to only require this one file to return the diffent libarys. +The array returned contains the stdlib modules so there can be decleared after the file require +]] + +local StdLib = {} + +require 'core' +require 'game' +require 'table' +StdLib.Event = require 'event' + +return StdLib \ No newline at end of file diff --git a/locale/StdLib/table.lua b/locale/StdLib/table.lua new file mode 100644 index 00000000..d3f7995c --- /dev/null +++ b/locale/StdLib/table.lua @@ -0,0 +1,455 @@ +--- Extends Lua 5.2 table. +-- @module table +-- @see table + +-- luacheck: globals table (Allow mutating global table) + +--- Given a mapping function, creates a transformed copy of the table +--- by calling the function for each element in the table, and using +--- the result as the new value for the key. Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.map(a, function(v) return v * 10 end) --produces: { 10, 20, 30, 40, 50 } +--- @usage a = {1, 2, 3, 4, 5} +---table.map(a, function(v, k, x) return v * k + x end, 100) --produces { 101, 104, 109, 116, 125} +-- @tparam table tbl the table to be mapped to the transform +-- @tparam function func the function to transform values +-- @param[opt] ... additional arguments passed to the function +-- @treturn table a new table containing the keys and mapped values +function table.map(tbl, func, ...) + local newtbl = {} + for i, v in pairs(tbl) do + newtbl[i] = func(v, i, ...) + end + return newtbl +end + +--- Given a filter function, creates a filtered copy of the table +--- by calling the function for each element in the table, and +--- filtering out any key-value pairs for non-true results. Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.filter(a, function(v) return v % 2 == 0 end) --produces: { 2, 4 } +--- @usage a = {1, 2, 3, 4, 5} +---table.filter(a, function(v, k, x) return k % 2 == 1 end) --produces: { 1, 3, 5 } +-- @tparam table tbl the table to be filtered +-- @tparam function func the function to filter values +-- @param[opt] ... additional arguments passed to the function +-- @treturn table a new table containing the filtered key-value pairs +function table.filter(tbl, func, ...) + local newtbl = {} + local insert = #tbl > 0 + for k, v in pairs(tbl) do + if func(v, k, ...) then + if insert then table.insert(newtbl, v) + else newtbl[k] = v end + end + end + return newtbl +end + +--- Given a candidate search function, iterates over the table, calling the function +--- for each element in the table, and returns the first element the search function returned true. +--- Passes the index as second argument to the function. +--- @usage a= { 1, 2, 3, 4, 5} +---table.find(a, function(v) return v % 2 == 0 end) --produces: 2 +--- @usage a = {1, 2, 3, 4, 5} +---table.find(a, function(v, k, x) return k % 2 == 1 end) --produces: 1 +-- @tparam table tbl the table to be searched +-- @tparam function func the function to use to search for any matching element +-- @param[opt] ... additional arguments passed to the function +-- @treturn ?|nil|Mixed the first found value, or nil if none was found +function table.find(tbl, func, ...) + for k, v in pairs(tbl) do + if func(v, k, ...) then + return v, k + end + end + return nil +end + +--- Given a candidate search function, iterates over the table, calling the function +-- for each element in the table, and returns true if search function returned true. +-- Passes the index as second argument to the function. +-- @see table.find +--- @usage a= { 1, 2, 3, 4, 5} +---table.any(a, function(v) return v % 2 == 0 end) --produces: true +--- @usage a = {1, 2, 3, 4, 5} +---table.any(a, function(v, k, x) return k % 2 == 1 end) --produces: true +-- @tparam table tbl the table to be searched +-- @tparam function func the function to use to search for any matching element +-- @param[opt] ... additional arguments passed to the function +-- @treturn boolean true if an element was found, false if none was found +function table.any(tbl, func, ...) + return table.find(tbl, func, ...) ~= nil +end + +--- Given a function, apply it to each element in the table. +-- Passes the index as the second argument to the function. +--

Iteration is aborted if the applied function returns true for any element during iteration. +-- @usage +-- a = {10, 20, 30, 40} +-- table.each(a, function(v) game.print(v) end) --prints 10, 20, 30, 40, 50 +-- @tparam table tbl the table to be iterated +-- @tparam function func the function to apply to elements +-- @param[opt] ... additional arguments passed to the function +-- @treturn table the table where the given function has been applied to its elements +function table.each(tbl, func, ...) + for k, v in pairs(tbl) do + if func(v, k, ...) then + break + end + end + return tbl +end + +--- Returns a new array that is a one-dimensional recursive flattening of the given array. +-- For every element that is an array, extract its elements into the new array. +--

The optional level argument determines the level of recursion to flatten. +--> This function flattens an integer-indexed array, but not an associative array. +-- @tparam array tbl the array to be flattened +-- @tparam[opt] uint level recursive levels, or no limit to recursion if not supplied +-- @treturn array a new array that represents the flattened contents of the given array +function table.flatten(tbl, level) + local flattened = {} + table.each(tbl, + function(value) + if type(value) == "table" and #value > 0 then + if level then + if level > 0 then + table.merge(flattened, table.flatten(value, level - 1), true) + else + table.insert(flattened, value) + end + else + table.merge(flattened, table.flatten(value), true) + end + else + table.insert(flattened, value) + end + end + ) + return flattened +end + +--- Given an array, returns the first element or nil if no element exists. +-- @tparam array tbl the array +-- @treturn ?|nil|Mixed the first element +function table.first(tbl) + return tbl[1] +end + +--- Given an array, returns the last element or nil if no elements exist. +-- @tparam array tbl the array +-- @treturn ?|nil|Mixed the last element or nil +function table.last(tbl) + local size = #tbl + if size == 0 then return nil end + return tbl[size] +end + +--- Given an array of only numeric values, returns the minimum or nil if no element exists. +-- @tparam {number,...} tbl the array with only numeric values +-- @treturn ?|nil|number the minimum value +function table.min(tbl) + if #tbl == 0 then return nil end + + local min = tbl[1] + for _, num in pairs(tbl) do + min = num < min and num or min + end + return min +end + +---Given an array of only numeric values, returns the maximum or nil if no element exists. +-- @tparam {number,...} tbl the array with only numeric values +-- @treturn ?|nil|number the maximum value +function table.max(tbl) + if #tbl == 0 then return nil end + + local max = tbl[1] + for _, num in pairs(tbl) do + max = num > max and num or max + end + return max +end + +--- Given an array of only numeric values, return the sum of all values, or 0 for empty arrays. +-- @tparam {number,...} tbl the array with only numeric values +-- @treturn number the sum of the numbers or zero if the given array was empty +function table.sum(tbl) + local sum = 0 + for _, num in pairs(tbl) do + sum = sum + num + end + return sum +end + +--- Given an array of only numeric values, returns the average or nil if no element exists. +-- @tparam {number,...} tbl the array with only numeric values +-- @treturn ?|nil|number the average value +function table.avg(tbl) + local cnt = #tbl + return cnt ~= 0 and table.sum(tbl) / cnt or nil +end + +--- Merges two tables — values from first get overwritten by the second. +--- @usage +-- function some_func(x, y, args) +-- args = table.merge({option1=false}, args) +-- if opts.option1 == true then return x else return y end +-- end +-- some_func(1,2) -- returns 2 +-- some_func(1,2,{option1=true}) -- returns 1 +-- @tparam table tblA first table +-- @tparam table tblB second table +-- @tparam[opt=false] boolean array_merge set to true to merge the tables as an array or false for an associative array +-- @treturn array|table an array or an associated array where tblA and tblB have been merged +function table.merge(tblA, tblB, array_merge) + if not tblB then + return tblA + end + if array_merge then + for _, v in pairs(tblB) do + table.insert(tblA, v) + end + + else + for k, v in pairs(tblB) do + tblA[k] = v + end + end + return tblA +end + +-- copied from factorio/data/core/luablib/util.lua + +--- Creates a deep copy of table without copying Factorio objects. +-- @usage local copy = table.deepcopy[data.raw.["stone-furnace"]["stone-furnace"]] -- returns a copy of the stone furnace entity +-- @tparam table object the table to copy +-- @treturn table a copy of the table +function table.deepcopy(object) + local lookup_table = {} + local function _copy(this_object) + if type(this_object) ~= "table" then + return this_object + elseif this_object.__self then + return this_object + elseif lookup_table[this_object] then + return lookup_table[this_object] + end + local new_table = {} + lookup_table[this_object] = new_table + for index, value in pairs(this_object) do + new_table[_copy(index)] = _copy(value) + end + return setmetatable(new_table, getmetatable(this_object)) + end + return _copy(object) +end + +--- Returns a copy of all of the values in the table. +-- @tparam table tbl the table to copy the keys from, or an empty table if tbl is nil +-- @tparam[opt] boolean sorted whether to sort the keys (slower) or keep the random order from pairs() +-- @tparam[opt] boolean as_string whether to try and parse the values as strings, or leave them as their existing type +-- @treturn array an array with a copy of all the values in the table +function table.values(tbl, sorted, as_string) + if not tbl then return {} end + local valueset = {} + local n = 0 + if as_string then --checking as_string /before/ looping is faster + for _, v in pairs(tbl) do + n = n + 1 + valueset[n] = tostring(v) + end + else + for _, v in pairs(tbl) do + n = n + 1 + valueset[n] = v + end + end + if sorted then + table.sort(valueset, + function(x, y) --sorts tables with mixed index types. + local tx = type(x) == 'number' + local ty = type(y) == 'number' + if tx == ty then + return x < y and true or false --similar type can be compared + elseif tx == true then + return true --only x is a number and goes first + else + return false --only y is a number and goes first + end + end + ) + end + return valueset +end + +--- Returns a copy of all of the keys in the table. +-- @tparam table tbl the table to copy the keys from, or an empty table if tbl is nil +-- @tparam[opt] boolean sorted whether to sort the keys (slower) or keep the random order from pairs() +-- @tparam[opt] boolean as_string whether to try and parse the keys as strings, or leave them as their existing type +-- @treturn array an array with a copy of all the keys in the table +function table.keys(tbl, sorted, as_string) + if not tbl then return {} end + local keyset = {} + local n = 0 + if as_string then --checking as_string /before/ looping is faster + for k, _ in pairs(tbl) do + n = n + 1 + keyset[n] = tostring(k) + end + else + for k, _ in pairs(tbl) do + n = n + 1 + keyset[n] = k + end + end + if sorted then + table.sort(keyset, + function(x, y) --sorts tables with mixed index types. + local tx = type(x) == 'number' + local ty = type(y) == 'number' + if tx == ty then + return x < y and true or false --similar type can be compared + elseif tx == true then + return true --only x is a number and goes first + else + return false --only y is a number and goes first + end + end + ) + end + return keyset +end + +--- Removes keys from a table by setting the values associated with the keys to nil. +-- @usage local a = {1, 2, 3, 4} +--table.remove_keys(a, {1,3}) --returns {nil, 2, nil, 4} +-- @usage local b = {k1 = 1, k2 = 'foo', old_key = 'bar'} +--table.remove_keys(b, {'old_key'}) --returns {k1 = 1, k2 = 'foo'} +-- @tparam table tbl the table to remove the keys from +-- @tparam {Mixed,...} keys an array of keys that exist in the given table +-- @treturn table tbl without the specified keys +function table.remove_keys(tbl, keys) + for i = 1, #keys do + tbl[keys[i]] = nil + end + return tbl +end + +--- Returns the number of keys in a table, if func is passed only count keys when the function is true. +-- @tparam table tbl to count keys +-- @tparam[opt] function func to incremement counter +-- @param[optchain] ... additional arguments passed to the function +-- @treturn number The number of keys matching the function or the number of all keys if func isn't passed +-- @treturn number The total number of keys +-- @usage local a = { 1, 2, 3, 4, 5} +-- table.count_keys(a) -- produces: 5, 5 +-- @usage local a = {1, 2, 3, 4, 5} +-- table.count_keys(a, function(v, k) return k % 2 == 1 end) -- produces: 3, 5 +function table.count_keys(tbl, func, ...) + if type(tbl) ~= 'table' then return 0, 0 end + local count, total = 0, 0 + for k, v in pairs(tbl) do + total = total + 1 + if func then + if func(v, k, ...) then + count = count + 1 + end + else + count = count + 1 + end + end + return count, total +end + +--- Returns an inverted (***{[value] = key,...}***) copy of the given table. If the values are not unique, the assigned key depends on the order of pairs(). +-- @usage local a = {k1 = 'foo', k2 = 'bar'} +--table.invert(a) --returns {'foo' = k1, 'bar' = k2} +-- @usage local b = {k1 = 'foo', k2 = 'bar', k3 = 'bar'} +--table.invert(b) --returns {'foo' = k1, 'bar' = ?} +-- @tparam table tbl the table to invert +-- @treturn table a new table with inverted mapping +function table.invert(tbl) + local inverted = {} + for k, v in pairs(tbl) do + inverted[v] = k + end + return inverted +end + +--- Return the size of a table using built in table_size function +-- @function size +-- @tparam table table to use +-- @treturn int size of the table +table.size = table_size + +--- For all string or number values in an array map them to a key = true table +-- @usage local a = {"v1", "v2"} +-- table.array_to_dict_bool(a) -- return {["v1"] = true, ["v2"]= true} +-- @tparam table tbl the table to convert +-- @treturn table the converted table +function table.arr_to_bool(tbl) + local newtbl = {} + for _, v in pairs(tbl) do + if type(v) == "string" or type(v) == "number" then + newtbl[v] = true + end + end + return newtbl +end + +-- Any thing below here i (cooldude2606) have added and was not here by default +--- Returns a value in a form able to be read as a value +-- @usage local a = 'value' +-- table.val_to_str(a) -- return '"value"' +-- @param v value to convert +-- @treturn string the converted value +function table.val_to_str(v) + if "string" == type( v ) then + v = string.gsub(v,"\n","\\n") + if string.match(string.gsub(v,"[^'\"]",""),'^"+$') then + return "'"..v.."'" + end + return '"'..string.gsub(v,'"', '\\"' )..'"' + else + return "table" == type( v) and table.tostring(v) or + "function" == type(v) and '"cant-display-function"' or + "userdata" == type(v) and '"cant-display-userdata"' or + tostring(v) + end +end + +--- Returns a value in a form able to be read as a key +-- @usage local a = 'key' +-- table.key_to_str(a) -- return '["key"]' +-- @param k key to convert +-- @treturn string the converted key +function table.key_to_str (k) + if "string" == type(k) and string.match(k,"^[_%player][_%player%d]*$") then + return k + else + return "["..table.val_to_str(k).."]" + end +end + +--- Returns a table in a form able to be read as a table +-- @usage local a = {k1='foo',k2='bar'} +-- table.tostring(a) -- return '"value"' +-- @param tbl table to convert +-- @treturn string the converted table +function table.to_string(tbl) + local result, done = {}, {} + for k, v in ipairs(tbl) do + table.insert(result,table.val_to_str(v)) + done[k] = true + end + for k, v in pairs(tbl) do + if not done[k] then + table.insert(result, + table.key_to_str(k).."="..table.val_to_str(v)) + end + end + return "{"..table.concat(result,",") .."}" +end + diff --git a/locale/en/exp_core.cfg b/locale/en/exp_core.cfg deleted file mode 100644 index ecf4752c..00000000 --- a/locale/en/exp_core.cfg +++ /dev/null @@ -1,35 +0,0 @@ -[ranking] -all-rank-print=[Everyone]: __1__ -rank-print=[__1__]: __2__ -rank-up=__1__ was promoted to __2__ by __3__ -rank-down=__1__ was demoted to __2__ by __3__ -rank-given=You have been given the __1__ Rank! -tag-reset=Your Tag was reset due to a Rank change - -[commands] -no-help=No Help Given -help-format= __1__ __2__ -unauthorized=401 - Unauthorized: Access is denied due to invalid credentials -invalid-inputs=Invalid Input, /__1__ __2__ -command-ran=Command Complete - -[server] -server-command-help=For use of the highest staff only -debug-command-help=For use of the highest staff only, this will lag A LOT -socket-command-help=For use out side of factorio to run predefinded functions -callback-info=At game tick: __1__ Queue Lenth: __2__ Number of temp vars: __3__ - -[expgui] -button-no-display=No name -button-no-tooltip=Ask some one what this does -text-no-display=BLANK -close-button=Close -close-button-tooltip=Close this GUI -popup-close-tooltip=Close this Popup -player-table-enter=Enter __1__ -player-table-id=ID -player-table-name=Name -player-table-status=Status -player-table-online-time=Online Time -player-table-rank=Rank -