diff --git a/control.lua b/control.lua index 5bfc172c..20633dc7 100644 --- a/control.lua +++ b/control.lua @@ -36,3 +36,7 @@ ExpGui.add_frame.popup('Message','Message','Just A ToolTip',5, function(player,frame,args) frame.add{name='Message',type='label',caption=args[1]..' '..args[2]} end) +ExpGui.add_frame.tab('player_table','Player Table','Just Like any other',5,'Test',function(player,tab) + ExpGui.player_table.draw_filters(player,tab,{'player_name','online_time','rank'}) + ExpGui.player_table.draw(player,tab,{{'online',true}},tab) +end) \ No newline at end of file diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Modlue Setup.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Modlue Setup.lua index a1697239..0117bbbb 100644 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Modlue Setup.lua +++ b/locale/ExpGaming-Core/GUI/ExpGaming - Modlue Setup.lua @@ -38,11 +38,17 @@ ExpGui = { --draw_text }, toolbar={ - buttons={} + buttons={} + --draw + --add_button + }, + player_table={ + filters={} --draw - --add_button + --draw_filters + --get_filters + --player_match }, - --add_player_table inputs={ buttons={}, text={} diff --git a/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua b/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua index c0e1633b..326db4d2 100644 --- a/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua +++ b/locale/ExpGaming-Core/GUI/ExpGaming - Player Table.lua @@ -9,15 +9,113 @@ Discord: https://discord.gg/XSsBV6b The credit below may be used by another script do not remove. ]] local credits = {{ - name='File Header - ExpGaming-Core-GUI', + name='ExpGaming - Player Table', owner='Explosive Gaming', dev='Cooldude2606', - description='Just A File Header To Organise Code', + description='Allows addition of a player table with filters', factorio_version='0.15.23', show=false }} local function credit_loop(reg) for _,cred in pairs(reg) do table.insert(credits,cred) end end --Please Only Edit Below This Line----------------------------------------------------------- +local player_table_functions = ExpGui.player_table +local yes = {'yes','y','true','ye'} +local no = {'no','false','nay'} +--filters that are used fell free to add more +player_table_functions.filters = { + --{name,is_text,function(player,input) return true end} + {'is_admin',false,function(player) return player.admin end}, + {'player_name',true,function(player,input) if input and player.name:lower():find(input:lower()) then return true end end}, + {'online',false,function(player) return player.connected end}, + {'offline',false,function(player) return not player.connected end}, + {'online_time',true,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}, + {'rank',true,function(player,input) if input and string_to_rank(input) and get_rank(player).power <= string_to_rank(input).power then return true end end} +} +--set up all the text inputs +for _,filter in pairs(player_table_functions.filters) do + if filter[2] then + ExpGui.add_input.text(filter[1],'Enter '..filter[1]: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) + 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[1] == 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[1]] then + if frame.input_bar[filter[1]].text ~= 'Enter '..filter[1]:gsub('_',' ') or not frame.input_bar[filter[1]].text:find('%S') then + table.insert(filters,{filter[1],frame.input_bar[filter[1]].text}) + end + end + end + return filters +end +--used to test if a player matches filter critria +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[3] and type(filter[3]) == 'function' then return filter[3](player,input) end +end +--used by script on filter texts +function player_table_functions.redraw(player,element) + local frame = global.current_filters[player.index][2] + local filters = global.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 leanth is 2 then it will not atemp to get a user input +function player_table_functions.draw(player,frame,filters,input_location) + global.current_filters[player.index] = {filters,frame} + --setup the table + if frame.player_table then frame.player_table.destroy() end + 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="Id"} + player_table.add{name="player_name", type="label", caption="Name"} + player_table.add{name="status", type="label", caption="Status"} + player_table.add{name="online_time", type="label", caption="Online Time"} + player_table.add{name="rank", type="label", caption="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 + local result = player_table_functions.player_match(p,filter[1],filter[2]) + if not result and filter[2] == true then result = filter[2] end + add = result or false + end + end + for _,filter in pairs(player_table_functions.get_filters(input_location)) do + if add then + add = player_table_functions.player_match(p,filter[1],filter[2]) or false + end + end + --add the player + if add then--and player.name ~= p.name then + 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_hour(p.online_time)..'H '..(tick_to_min(p.online_time)-60*tick_to_hour(p.online_time))..'M')} + player_table.add{name=p.name.."rank", type="label", caption=get_rank(p).shortHand} + end + end +end +Event.register(-1,function() global.current_filters = {} end) --Please Only Edit Above This Line----------------------------------------------------------- return credits \ No newline at end of file