diff --git a/control.lua b/control.lua index 756609c9..567805c8 100644 --- a/control.lua +++ b/control.lua @@ -1 +1,825 @@ -entityRemoved={}entityCache={}guis={frames={},buttons={}}defaults={itemRotated={},ranks={{name='Owner',shortHand='Owner',tag='[Owner]',power=0,colour={r=170,g=0,b=0},disallow={}},{name='Community Manager',shortHand='CM',tag='[Com Mngr]',power=1,colour={r=150,g=68,b=161},disallow={}},{name='Developer',shortHand='Dev',tag='[Dev]',power=1,colour={r=179,g=125,b=46},disallow={}},{name='Admin',shortHand='Admin',tag='[Admin]',power=2,colour={r=170,g=41,b=170},disallow={'set_allow_commands','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Mod',shortHand='Mod',tag='[Mod]',power=3,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Donator',shortHand='P2W',tag='[P2W]',power=4,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Member',shortHand='Mem',tag='[Member]',power=5,colour={r=24,g=172,b=188},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Regular',shortHand='Reg',tag='[Regukar]',power=5,colour={r=24,g=172,b=188},disallow={'set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Guest',shortHand='',tag='[Guest]',power=6,colour={r=255,g=159,b=27},disallow={'build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}},{name='Jail',shortHand='Jail',tag='[Jail]',power=7,colour={r=50,g=50,b=50},disallow={'player_leave_game','build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}},autoRanks={Owner={'badgamernl'},['Community Manager']={'arty714'},Developer={'Cooldude2606'},Admin={'eissturm','PropangasEddy'},Mod={'Alanore','Aquaday','cafeslacker','CrashKonijn','Drahc_pro','Flip','freek18','Hobbitkicker','hud','Matthias','MeDDish','Mindxt20','MottledPetrel','Mr_Happy_212','Phoenix27833','Sand3r205','ScarbVis','Smou','steentje77','TopHatGaming123'},Donator={},Member={},Regular={},Guest={},Jail={}},selected={},jail={}}warningAllowed=nil;timeForRegular=180;CHUNK_SIZE=32;function loadVar(a)if a==nil then local b=nil;if game.players[1].gui.left.hidden then b=game.players[1].gui.left.hidden.caption else b=game.players[1].gui.left.add{type='frame',name='hidden',caption=table.tostring(defaults)}.caption;game.players[1].gui.left.hidden.style.visible=false end;gTable=loadstring('return '..b)()else gTable=a end;itemRotated=gTable.itemRotated;ranks=gTable.ranks;autoRanks=gTable.autoRanks;selected=gTable.selected;jail=gTable.jail end;loadVar(defaults)function saveVar()gTable.itemRotated=itemRotated;gTable.ranks=ranks;gTable.autoRanks=autoRanks;gTable.selected=selected;gTable.jail=jail;game.players[1].gui.left.hidden.caption=table.tostring(gTable)end;function getRank(c)if c then for d,rank in pairs(ranks)do if c.permission_group==game.permissions.get_group(rank.name)then return rank end end;return stringToRank('Guest')end end;function stringToRank(string)if type(string)=='string'then local e={}for d,rank in pairs(ranks)do if rank.name:lower()==string:lower()then return rank end;if rank.name:lower():find(string:lower())then table.insert(e,rank)end end;if#e==1 then return e[1]end end end;function callRank(f,rank,g)local rank=stringToRank(rank)or stringToRank('Mod')local g=g or false;for d,c in pairs(game.players)do rankPower=getRank(c).power;if g then if rankPower>=rank.power then c.print('[Everyone]: '..f)end else if rankPower<=rank.power then if rank.shortHand~=''then c.print('['..rank.shortHand..']: '..f)else c.print('[Everyone]: '..f)end end end end end;function giveRank(c,rank,h,i)local h=h or'system'local rank=stringToRank(rank)or rank;local j=getRank(c)local k='demoted'if rank.power<=j.power then k='promoted'end;if h.name then callRank(c.name..' was '..k..' to '..rank.name..' by '..h.name,j.name)else callRank(c.name..' was '..k..' to '..rank.name..' by ',j.name)end;c.permission_group=game.permissions.get_group(rank.name)drawToolbar(c)drawPlayerList()if i then else game.print(jail[c.index][1])game.print(rank.name)game.print(jail[c.index][1]and rank.name~='Jail')if rank.name=='Jail'and not jail[c.index][1]then jailPlayer(c,h)elseif jail[c.index][1]and rank.name~='Jail'then game.print('Unjail')jail[c.index][1]=false;c.character.active=true end end end;function autoRank(c)local l=getRank(c)local m=nil;for rank,n in pairs(autoRanks)do local o=false;for d,p in pairs(n)do if c.name==p then m=stringToRank(rank)o=true;break end end;if o then break end end;if m then if l.power>m.power then c.permission_group=game.permissions.get_group(m.name)end elseif ticktominutes(c.online_time)>=timeForRegular then c.permission_group=game.permissions.get_group('Regular')end;if getRank(c).power<=3 and not c.admin then callRank(c.name..' needs to be promoted.')end;if jail[c.index]==nil then jail[c.index]={false,getRank(c).name}end;if jail[c.index][1]then c.permission_group=game.permissions.get_group('Jail')if c.character then c.character.active=false end end;saveVar()end;function jailPlayer(c,q)if c.character then if c.character.active then jail[c.index][1]=true;jail[c.index][2]=getRank(c).name;giveRank(c,'Jail',q,true)c.character.active=false else jail[c.index][1]=false;local rank=jail[c.index][2]or'Guest'giveRank(c,rank,q,true)c.character.active=true end;saveVar()end end;function ticktohour(r)local s=tostring(math.floor(r/(216000*game.speed)))return s end;function ticktominutes(r)local t=math.floor(r/(3600*game.speed))return t end;function clearSelection(c)selected[c.index]={}end;function autoMessage()local u='Regular'local v='Mod'callRank('There are '..#game.connected_players..' players online',v,true)callRank('This map has been on for '..ticktohour(game.tick)..' Hours and '..ticktominutes(game.tick)-60*ticktohour(game.tick)..' Minutes',v,true)callRank('Please join us on:',u,true)callRank('Discord: https://discord.gg/RPCxzgt',u,true)callRank('Forum: explosivegaming.nl',u,true)callRank('Steam: http://steamcommunity.com/groups/tntexplosivegaming',u,true)callRank('To see these links again goto: Readme > Server Info',u,true)end;function table.val_to_str(w)if"string"==type(w)then w=string.gsub(w,"\n","\\n")if string.match(string.gsub(w,"[^'\"]",""),'^"+$')then return"'"..w.."'"end;return'"'..string.gsub(w,'"','\\"')..'"'else return"table"==type(w)and table.tostring(w)or tostring(w)end end;function table.key_to_str(x)if"string"==type(x)and string.match(x,"^[_%player][_%player%d]*$")then return x else return"["..table.val_to_str(x).."]"end end;function table.tostring(y)local z,A={},{}for x,w in ipairs(y)do table.insert(z,table.val_to_str(w))A[x]=true end;for x,w in pairs(y)do if not A[x]then table.insert(z,table.key_to_str(x).."="..table.val_to_str(w))end end;return"{"..table.concat(z,",").."}"end;function addFrame(B,rank,C,D,E)guis.frames[B]={{require=rank,caption=D,tooltip=E}}addButton('close',function(c,F)F.parent.parent.parent.destroy()end)addButton('btn_'..B,function(c,F)if c.gui.center[B]then c.gui.center[B].destroy()else drawFrame(c,B,C)end end)end;function addTab(B,G,H,I)guis.frames[B][G]={G,H,I}addButton(G,function(c,F)openTab(c,F.parent.parent.parent.name,F.parent.parent.parent.tab,F.name)end)end;function addButton(J,K)guis.buttons[J]={J,K}end;function drawButton(B,J,D,H)B.add{name=J,type="button",caption=D,tooltip=H}end;function openTab(c,L,M,G)local N=c.gui.center[L].tabBarScroll.tabBar;for d,a in pairs(guis.frames[L])do if d~=1 then if a[1]==G then N[a[1]].style.font_color={r=255,g=255,b=255,player=255}M.clear()a[3](c,M)else N[a[1]].style.font_color={r=100,g=100,b=100,player=255}end end end end;function drawFrame(c,L,G)if getRank(c).power<=guis.frames[L][1].require then if c.gui.center[L]then c.gui.center[L].destroy()end;local B=c.gui.center.add{name=L,type='frame',caption=L,direction='vertical'}local O=B.add{type="scroll-pane",name="tabBarScroll",vertical_scroll_policy="never",horizontal_scroll_policy="always"}local N=O.add{type='flow',direction='horizontal',name='tabBar'}local M=B.add{type="scroll-pane",name="tab",vertical_scroll_policy="auto",horizontal_scroll_policy="never"}for d,a in pairs(guis.frames[L])do if d~=1 then drawButton(N,a[1],a[1],a[2])end end;openTab(c,L,M,G)drawButton(N,'close','Close','Close this window')M.style.minimal_height=300;M.style.maximal_height=300;M.style.minimal_width=500;M.style.maximal_width=500;O.style.minimal_height=60;O.style.maximal_height=60;O.style.minimal_width=500;O.style.maximal_width=500 end end;function toggleVisable(B)if B then if B.style.visible==nil then B.style.visible=false else B.style.visible=not B.style.visible end end end;script.on_event(defines.events.on_player_created,function(P)local c=game.players[P.player_index]c.insert{name="iron-plate",count=8}c.insert{name="pistol",count=1}c.insert{name="firearm-magazine",count=10}c.insert{name="burner-mining-drill",count=1}c.insert{name="stone-furnace",count=1}c.force.chart(c.surface,{{c.position.x-200,c.position.y-200},{c.position.x+200,c.position.y+200}})end)script.on_event(defines.events.on_player_respawned,function(P)local c=game.players[P.player_index]drawPlayerList()c.insert{name="pistol",count=1}c.insert{name="firearm-magazine",count=10}end)script.on_event(defines.events.on_player_joined_game,function(P)loadVar()if#game.players==1 then for d,rank in pairs(ranks)do game.permissions.create_group(rank.name)for d,Q in pairs(rank.disallow)do game.permissions.get_group(rank.name).set_allows_action(defines.input_action[Q],false)end end end;local c=game.players[P.player_index]autoRank(c)c.print({"","Welcome"})if c.gui.left.PlayerList~=nil then c.gui.left.PlayerList.destroy()end;if c.gui.center.README~=nil then c.gui.center.README.destroy()end;if c.gui.top.PlayerList~=nil then c.gui.top.PlayerList.destroy()end;drawPlayerList()drawToolbar(c)local R=encode(game.players,"players",{"name","admin","online_time","connected","index"})game.write_file("players.json",R,false,0)if not c.admin and ticktominutes(c.online_time)<1 then drawFrame(c,'Readme','Rules')end end)script.on_event(defines.events.on_player_left_game,function(P)local c=game.players[P.player_index]drawPlayerList()end)script.on_event(defines.events.on_gui_click,function(P)local c=game.players[P.player_index]if P.element.type=='button'then for d,S in pairs(guis.buttons)do if S[1]==P.element.name then if S[2]then S[2](c,P.element)else callRank('Invaid Button'..S[1],'Mod')end;break end end elseif P.element.type=='checkbox'then if P.element.name=='select'then if not selected[P.player_index]then selected[P.player_index]={}end;if P.element.state then table.insert(selected[P.player_index],P.element.parent.name)else for d,T in pairs(selected[P.player_index])do if T==P.element.parent.name then table.remove(selected[P.player_index],d)break end end end end;saveVar()end end)script.on_event(defines.events.on_gui_text_changed,function(P)local c=game.players[P.player_index]if P.element.parent.name=='filterTable'then local B=P.element;local U={}local V=false;local W=false;if B.parent.parent.parent.name=='Admin'and not B.parent.sel_input then V=true;U[#U+1]='online'end;if B.parent.parent.parent.name=='Admin'and B.parent.sel_input then W=true;U[#U+1]='lower'end;if B.parent.parent.filterTable.status_input and not V then local X=B.parent.parent.filterTable.status_input.text;if X=='yes'or X=='online'or X=='true'or X=='y'then U[#U+1]='online'elseif X~=''then U[#U+1]='offline'end end;if B.parent.parent.filterTable.hours_input then local Y=B.parent.parent.filterTable.hours_input.text;if tonumber(Y)and tonumber(Y)>0 then U[#U+1]=tonumber(Y)end end;if B.parent.parent.filterTable.name_input then local Z=B.parent.parent.filterTable.name_input.text;if Z then U[#U+1]=Z end end;if B.parent.parent.filterTable.sel_input then local _=B.parent.parent.filterTable.sel_input.text;if _=='yes'or _=='online'or _=='true'or _=='y'then U[#U+1]='selected'end end;if B.parent.parent.playerTable then B.parent.parent.playerTable.destroy()end;drawPlayerTable(c,B.parent.parent,V,W,U)end end)script.on_event(defines.events.on_marked_for_deconstruction,function(P)local a0=game.players[P.player_index]if not a0.admin and ticktominutes(a0.online_time)3 then if playerRank.shortHand~=''then Plist.add{type="label",name=c.name,style="caption_label_style",caption={"",ticktohour(c.online_time)," H - ",c.name,' - '..playerRank.shortHand}}else Plist.add{type="label",name=c.name,style="caption_label_style",caption={"",ticktohour(c.online_time)," H - ",c.name}}end;Plist[c.name].style.font_color=playerRank.colour;c.tag=playerRank.tag end end end end;addButton('goto',function(c,B)local p=game.players[B.parent.name]c.teleport(game.surfaces[p.surface.name].find_non_colliding_position("player",p.position,32,1))end)addButton('bring',function(c,B)local p=game.players[B.parent.name]p.teleport(game.surfaces[c.surface.name].find_non_colliding_position("player",c.position,32,1))end)addButton('jail',function(c,B)jailPlayer(game.players[B.parent.name],c)end)addButton('kill',function(c,B)local p=game.players[B.parent.name]if p.character then p.character.die()end end)function drawPlayerTable(c,B,V,W,U)if B.playerTable then B.playerTable.destroy()end;B.add{name='playerTable',type="table",colspan=5}B.playerTable.style.minimal_width=500;B.playerTable.style.maximal_width=500;B.playerTable.style.horizontal_spacing=10;B.playerTable.add{name="id",type="label",caption="Id "}B.playerTable.add{name="Pname",type="label",caption="Name "}if V==false and W==false then B.playerTable.add{name="status",type="label",caption="Status "}end;B.playerTable.add{name="online_time",type="label",caption="Online Time "}B.playerTable.add{name="rank",type="label",caption="Rank "}if V then B.playerTable.add{name="commands",type="label",caption="Commands"}end;if W then B.playerTable.add{name="select_label",type="label",caption="Selection"}end;for a7,p in pairs(game.players)do local ab=true;for d,ac in pairs(U)do if ac=='admin'then if p.admin==false then ab=false;break end elseif ac=='online'then if p.connected==false then ab=false;break end elseif ac=='offline'then if p.connected==true then ab=false;break end elseif ac=='lower'then if getRank(p).power<=getRank(c).power then ab=false;break end elseif ac=='selected'then local o=nil;for d,T in pairs(selected[c.index])do if T==p.name then o=true;break end end;if not o then ab=false;break end elseif type(ac)=='number'then if ac>ticktominutes(p.online_time)then ab=false;break end elseif type(ac)=='string'then if p.name:lower():find(ac:lower())==nil then ab=false;break end end end;if ab==true and c.name~=p.name then if B.playerTable[p.name]==nil then B.playerTable.add{name=a7 .."id",type="label",caption=a7}B.playerTable.add{name=p.name..'_name',type="label",caption=p.name}if not V and not W then if p.connected==true then B.playerTable.add{name=p.name.."Status",type="label",caption="ONLINE"}else B.playerTable.add{name=p.name.."Status",type="label",caption="OFFLINE"}end end;B.playerTable.add{name=p.name.."Online_Time",type="label",caption=ticktohour(p.online_time)..'H '..ticktominutes(p.online_time)-60*ticktohour(p.online_time)..'M'}B.playerTable.add{name=p.name.."Rank",type="label",caption=p.tag}if V then B.playerTable.add{name=p.name,type="flow"}drawButton(B.playerTable[p.name],'goto','Tp','Goto to the players location')drawButton(B.playerTable[p.name],'bring','Br','Bring player player to your location')if getRank(p).power>getRank(c).power then drawButton(B.playerTable[p.name],'jail','Ja','Jail/Unjail player')drawButton(B.playerTable[p.name],'kill','Ki','Kill this player')end elseif W then B.playerTable.add{name=p.name,type="flow"}local ad=false;for d,T in pairs(selected[c.index])do if T==p.name then ad=true;break end end;B.playerTable[p.name].add{name='select',type="checkbox",state=ad}end end end end end;addFrame('Readme',6,'Rules','Readme','Rules, Server info, How to chat, Playerlist, Adminlist.')addTab('Readme','Rules','The rules of the server',function(c,B)local ae={"Hacking/cheating, exploiting and abusing bugs is not allowed.","Do not disrespect any player in the server (This includes staff).","Do not spam, this includes stuff such as chat spam, item spam, chest spam etc.","Do not laydown concrete with bots without permission.","Do not use active provider chests without permission.","Do not remove/move major parts of the factory without permission.","Do not walk in player random direction for no reason(to save map size).","Do not remove stuff just because you don't like it, tell people first.","Do not make train roundabouts.","Trains are Left Hand Drive (LHD) only.","Do not complain about lag, low fps and low ups or other things like that.","Do not ask for rank.","Use common sense and what an admin says goes."}for a7,af in pairs(ae)do B.add{name=a7,type="label",caption={"",a7,". ",af}}end end)addTab('Readme','Server Info','Info about the server',function(c,B)B.add{name=1,type="label",caption={"","Discord voice and chat server:"}}B.add{name=2,type='textfield',text='https://discord.gg/RPCxzgt'}.style.minimal_width=400;B.add{name=3,type="label",caption={"","Our forum:"}}B.add{name=4,type='textfield',text='https://explosivegaming.nl'}.style.minimal_width=400;B.add{name=5,type="label",caption={"","Steam:"}}B.add{name=6,type='textfield',text='http://steamcommunity.com/groups/tntexplosivegaming'}.style.minimal_width=400 end)addTab('Readme','How to chat','Just in case you dont know how to chat',function(c,B)local ag={"Chatting for new players can be difficult because it’s different than other games!","It’s very simple, the button you need to press is the “GRAVE/TILDE key”","it’s located under the “ESC key”. If you would like to change the key go to your","controls tab in options. The key you need to change is “Toggle Lua console”","it’s located in the second column 2nd from bottom."}for a7,ah in pairs(ag)do B.add{name=a7,type="label",caption={"",ah}}end end)addTab('Readme','Admins','List of all the people who can ban you :P',function(c,B)local ai={"This list contains all the people that are admin in this world. Do you want to become","an admin dont ask for it! an admin will see what you've made and the time you put","in the server."}for a7,ah in pairs(ai)do B.add{name=a7,type="label",caption={"",ah}}end;drawPlayerTable(c,B,false,false,{'admin'})end)addTab('Readme','Players','List of all the people who have been on the server',function(c,B)local n={"These are the players who have supported us in the making of this factory. Without","you the player we wouldn't have been as far as we are now."}for a7,ah in pairs(n)do B.add{name=a7,type="label",caption={"",ah}}end;B.add{name='filterTable',type='table',colspan=3}B.filterTable.add{name='name_label',type='label',caption='Name'}B.filterTable.add{name='status_label',type='label',caption='Online?'}B.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'}B.filterTable.add{name='name_input',type='textfield'}B.filterTable.add{name='status_input',type='textfield'}B.filterTable.add{name='hours_input',type='textfield'}drawPlayerTable(c,B,false,false,{})end)addFrame('Admin',2,'Player List','Admin',"All admin fuctions are here")addButton('btn_toolbar_automessage',function()autoMessage()end)addButton('tp_all',function(c,B)for a7,p in pairs(game.connected_players)do local aj=game.surfaces[c.surface.name].find_non_colliding_position("player",c.position,32,1)if p~=c then p.teleport(aj)end end end)addButton('revive_dead_entitys_range',function(c,B)if tonumber(B.parent.range.text)then local ak=tonumber(B.parent.range.text)for al,am in pairs(game.surfaces[1].find_entities_filtered({area={{c.position.x-ak,c.position.y-ak},{c.position.x+ak,c.position.y+ak}},type="entity-ghost"}))do am.revive()end end end)addButton('add_dev_items',function(c,B)c.insert{name="deconstruction-planner",count=1}c.insert{name="blueprint-book",count=1}c.insert{name="blueprint",count=20}end)addButton('sendMessage',function(c,B)local rank=stringToRank(B.parent.message.rank.text)if rank then callRank(B.parent.message.message.text,rank.name)else for d,rank in pairs(ranks)do c.print(rank.name)end end end)addButton('setRanks',function(c,B)rank=stringToRank(B.parent.rank_input.selected_index)if rank then for d,an in pairs(selected[c.index])do p=game.players[an]if getRank(c).powergetRank(c).power then giveRank(p,rank,c)else c.print('You can not edit '..p.name.."'s rank there rank is too high (or the rank you have slected is above you)")end end end end)addButton('clearSelection',function(c,B)clearSelection(c)drawPlayerTable(c,B.parent.parent,false,true,{})end)addTab('Admin','Commands','Random useful commands',function(c,B)drawButton(B,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players')drawButton(B,'add_dev_items','Get Blueprints','Get all the blueprints')drawButton(B,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range')B.add{type='textfield',name='range',text='Range'}B.add{type='flow',name='message'}B.message.add{type='textfield',name='message',text='Enter message'}B.message.add{type='textfield',name='rank',text='Enter rank'}drawButton(B,'sendMessage','Send Message','Send a message to all ranks higher than the slected')drawButton(B,'tp_all','TP All Here','Brings all players to you')end)addTab('Admin','Edit Ranks','Edit the ranks of players below you',function(c,B)clearSelection(c)B.add{name='filterTable',type='table',colspan=2}B.filterTable.add{name='name_label',type='label',caption='Name'}B.filterTable.add{name='sel_label',type='label',caption='Selected?'}B.filterTable.add{name='name_input',type='textfield'}B.filterTable.add{name='sel_input',type='textfield'}B.add{type='flow',name='rank',direction='horizontal'}B.rank.add{name='rank_label',type='label',caption='Rank'}B.rank.add{name='rank_input',type='drop-down'}for d,rank in pairs(ranks)do if rank.power>getRank(c).power then B.rank.rank_input.add_item(rank.name)end end;drawButton(B.rank,'setRanks','Set Ranks','Sets the rank of all selected players')drawButton(B.rank,'clearSelection','Clear Selection','Clears all currently selected players')drawPlayerTable(c,B,false,true,{'lower'})end)addTab('Admin','Player List','Send player message to all players',function(c,B)B.add{name='filterTable',type='table',colspan=2}B.filterTable.add{name='name_label',type='label',caption='Name'}B.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'}B.filterTable.add{name='name_input',type='textfield'}B.filterTable.add{name='hours_input',type='textfield'}drawPlayerTable(c,B,true,false,{'online'})end)addFrame('Admin+',1,'Modifiers','Admin+',"Because we are better")addButton('remove_biters',function(c,B)for al,am in pairs(game.surfaces[1].find_entities_filtered({force='enemy'}))do am.destroy()end end)addButton('toggle_cheat',function(c,B)c.cheat_mode=not c.cheat_mode end)addButton('revive_dead_entitys',function(c,B)for al,am in pairs(game.surfaces[1].find_entities_filtered({type="entity-ghost"}))do am.revive()end end)addButton("btn_Modifier_apply",function(c,B)local ao={"manual_mining_speed_modifier","manual_crafting_speed_modifier","character_running_speed_modifier","worker_robots_speed_modifier","worker_robots_storage_bonus","character_build_distance_bonus","character_item_drop_distance_bonus","character_reach_distance_bonus","character_resource_reach_distance_bonus","character_item_pickup_distance_bonus","character_loot_pickup_distance_bonus"}for a7,ap in pairs(ao)do local aq=tonumber(B.parent.parent.modifierTable[ap.."_input"].text:match("[%d]+[.%d+]"))if aq~=nil then if aq>=0 and aq<50 and aq~=c.force[ap]then c.force[ap]=aq;c.print(ap.." changed to number: "..tostring(aq))elseif aq==c.force[ap]then c.print(ap.." Did not change")else c.print(ap.." needs to be player higher number or it contains an letter")end end end end)addTab('Admin+','Commands','Random useful commands',function(c,B)drawButton(B,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players')drawButton(B,'add_dev_items','Get Blueprints','Get all the blueprints')drawButton(B,'revive_dead_entitys','Revive All Entitys','Brings all dead machines back to life')drawButton(B,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range')B.add{type='textfield',name='range',text='Range'}drawButton(B,'remove_biters','Kill Biters','Removes all biters in map')drawButton(B,'tp_all','TP All Here','Brings all players to you')drawButton(B,'toggle_cheat','Toggle Cheat Mode','Toggle your cheat mode')end)addTab('Admin+','Modifiers','Edit in game modifiers',function(c,B)local ao={"manual_mining_speed_modifier","manual_crafting_speed_modifier","character_running_speed_modifier","worker_robots_speed_modifier","worker_robots_storage_bonus","character_build_distance_bonus","character_item_drop_distance_bonus","character_reach_distance_bonus","character_resource_reach_distance_bonus","character_item_pickup_distance_bonus","character_loot_pickup_distance_bonus"}B.add{type="flow",name="flowNavigation",direction="horizontal"}B.add{name="modifierTable",type="table",colspan=3}B.modifierTable.add{name="Mname",type="label",caption="name"}B.modifierTable.add{name="input",type="label",caption="input"}B.modifierTable.add{name="current",type="label",caption="current"}for a7,ap in pairs(ao)do B.modifierTable.add{name=ap,type="label",caption=ap}B.modifierTable.add{name=ap.."_input",type="textfield",caption="inputTextField"}B.modifierTable.add{name=ap.."_current",type="label",caption=tostring(c.force[ap])}end;drawButton(B.flowNavigation,"btn_Modifier_apply","Apply","Apply the new values to the game")end) \ No newline at end of file +require("silo-script") +require "mod-gui" +local version = 1 +entityRemoved = {} +entityCache = {} +guis = {frames={},buttons={}} +--functions can not be included in the default list or be added by code +defaults = { + itemRotated = {}, + --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 + ranks={ + {name='Owner',shortHand='Owner',tag='[Owner]',power=0,colour={r=170,g=0,b=0},disallow={}}, + {name='Community Manager',shortHand='CM',tag='[Com Mngr]',power=1,colour={r=150,g=68,b=161},disallow={}}, + {name='Developer',shortHand='Dev',tag='[Dev]',power=1,colour={r=179,g=125,b=46},disallow={}}, + {name='Admin',shortHand='Admin',tag='[Admin]',power=2,colour={r=170,g=41,b=170},disallow={'set_allow_commands','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Mod',shortHand='Mod',tag='[Mod]',power=3,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Donator',shortHand='P2W',tag='[P2W]',power=4,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Member',shortHand='Mem',tag='[Member]',power=5,colour={r=24,g=172,b=188},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Regular',shortHand='Reg',tag='[Regukar]',power=5,colour={r=24,g=172,b=188},disallow={'set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Guest',shortHand='',tag='[Guest]',power=6,colour={r=255,g=159,b=27},disallow={'build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, + {name='Jail',shortHand='Jail',tag='[Jail]',power=7,colour={r=50,g=50,b=50},disallow={'open_character_gui','begin_mining','start_walking','player_leave_game','build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}} + }, + autoRanks={ + Owner={'badgamernl','BADgamerNL'}, + ['Community Manager']={'arty714'}, + Developer={'Cooldude2606'}, + Admin={'eissturm','PropangasEddy'}, + Mod={'Alanore','Aquaday','cafeslacker','CrashKonijn','Drahc_pro','Flip','freek18','Hobbitkicker','hud','Matthias','MeDDish','Mindxt20','MottledPetrel','Mr_Happy_212','Phoenix27833','Sand3r205','ScarbVis','Smou','steentje77','TopHatGaming123'}, + Donator={}, + Member={}, + Regular={}, + Guest={}, + Jail={} + }, + selected={}, + oldRanks={} +} + +warningAllowed = nil +timeForRegular = 180 +CHUNK_SIZE = 32 + +function loadVar(t) + if t == nil then + local g = nil + if game.players[1].gui.left.hidden then + g = game.players[1].gui.left.hidden.caption + else + g = game.players[1].gui.left.add{type='frame',name='hidden',caption=table.tostring(defaults)}.caption + game.players[1].gui.left.hidden.style.visible = false + end + gTable = loadstring('return '..g)() + else gTable = t end + itemRotated = gTable.itemRotated + ranks= gTable.ranks + autoRanks= gTable.autoRanks + selected= gTable.selected + oldRanks= gTable.oldRanks +end +loadVar(defaults) +function saveVar() + gTable.itemRotated = itemRotated + gTable.ranks = ranks + gTable.autoRanks = autoRanks + gTable.selected= selected + gTable.oldRanks= oldRanks + game.players[1].gui.left.hidden.caption = table.tostring(gTable) +end +---------------------------------------------------------------------------------------- +---------------------------Factorio Code Do Not Remove---------------------------------- +---------------------------------------------------------------------------------------- +script.on_init(function() + global.version = version + silo_script.init() +end) + +script.on_event(defines.events.on_rocket_launched, function(event) + silo_script.on_rocket_launched(event) +end) + +script.on_configuration_changed(function(event) + if global.version ~= version then + global.version = version + end + silo_script.on_configuration_changed(event) +end) + +silo_script.add_remote_interface() +---------------------------------------------------------------------------------------- +---------------------------------------------------------------------------------------- +---------------------------Rank functions----------------------------------------------- +---------------------------------------------------------------------------------------- +function getRank(player) + if player then + for _,rank in pairs(ranks) do + if player.permission_group == game.permissions.get_group(rank.name) then return rank end + end + return stringToRank('Guest') + end +end + +function stringToRank(string) + if type(string) == 'string' then + local Foundranks={} + for _,rank in pairs(ranks) do + if rank.name:lower() == string:lower() then return rank end + if rank.name:lower():find(string:lower()) then table.insert(Foundranks,rank) end + end + if #Foundranks == 1 then return Foundranks[1] end + end +end + +function callRank(msg, rank, inv) + local rank = stringToRank(rank) or stringToRank('Mod') -- default mod or higher + local inv = inv or false + for _, player in pairs(game.players) do + rankPower = getRank(player).power + if inv then + if rankPower >= rank.power then + player.print(('[Everyone]: '..msg)) + end + else + if rankPower <= rank.power then + if rank.shortHand ~= '' then player.print(('['..(rank.shortHand)..']: '..msg)) else player.print(('[Everyone]: '..msg)) end + end + end + end +end + +function giveRank(player,rank,byPlayer) + local byPlayer = byPlayer or 'system' + local rank = stringToRank(rank) or rank or stringToRank('Guest') + local oldRank = getRank(player) + local message = 'demoted' + if rank.power <= oldRank.power then message = 'promoted' end + if byPlayer.name then + callRank(player.name..' was '..message..' to '..rank.name..' by '..byPlayer.name,oldRank.name) + else + callRank(player.name..' was '..message..' to '..rank.name..' by ',oldRank.name) + end + player.permission_group = game.permissions.get_group(rank.name) + drawToolbar(player) + drawPlayerList() + oldRanks[player.index]=oldRank.name + saveVar() +end + +function revertRank(player,byPlayer) + local rank = stringToRank(oldRanks[player.index]) + giveRank(player,rank,byPlayer) +end + +function autoRank(player) + local currentRank = getRank(player) + local playerAutoRank = nil + local oldRank = getRank(player) + for rank,players in pairs(autoRanks) do + local Break = false + for _,p in pairs(players) do + if player.name == p then playerAutoRank = stringToRank(rank) Break = true break end + end + if Break then break end + end + if playerAutoRank then + if currentRank.power > playerAutoRank.power then + player.permission_group=game.permissions.get_group(playerAutoRank.name) + end + elseif ticktominutes(player.online_time) >= timeForRegular then giveRank(player,'Regular') end + if getRank(player).power <= 3 and not player.admin then callRank(player.name..' needs to be promoted.') end + if oldRank.name ~= getRank(player).name then oldRanks[player.index]=oldRank.name end + saveVar() +end +---------------------------------------------------------------------------------------- +---------------------------Common use functions----------------------------------------- +---------------------------------------------------------------------------------------- +function ticktohour (tick) + local hour = tostring(math.floor(tick/(216000*game.speed))) + return hour +end + +function ticktominutes (tick) + local minutes = math.floor(tick/(3600*game.speed)) + return minutes +end + +function clearSelection(player) + selected[player.index] = {} +end + +function autoMessage() + local lrank = 'Regular' + local hrank = 'Mod' + callRank('There are '..#game.connected_players..' players online',hrank,true) + callRank('This map has been on for '..ticktohour(game.tick)..' Hours and '..(ticktominutes(game.tick)-60*ticktohour(game.tick))..' Minutes',hrank,true) + callRank('Please join us on:',lrank,true) + callRank('Discord: https://discord.gg/RPCxzgt',lrank,true) + callRank('Forum: explosivegaming.nl',lrank,true) + callRank('Steam: http://steamcommunity.com/groups/tntexplosivegaming',lrank,true) + callRank('To see these links again goto: Readme > Server Info',lrank,true) +end +---------------------------------------------------------------------------------------- +---------------------------Table Functions---------------------------------------------- +---------------------------------------------------------------------------------------- +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 + 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 +---------------------------------------------------------------------------------------- +---------------------------Gui Functions------------------------------------------------ +---------------------------------------------------------------------------------------- +function addFrame(frame,rank,open,caption,tooltip,sprite) + guis.frames[frame] = {{require=rank,caption=caption,tooltip=tooltip,sprite=sprite}} + addButton('close', function(player,element) element.parent.parent.parent.destroy() end) + addButton('btn_'..frame, function(player,element) if player.gui.center[frame] then player.gui.center[frame].destroy() else drawFrame(player,frame,open) end end) +end + +function addTab(frame, tabName, describtion, drawTab) + guis.frames[frame][tabName] = {tabName, describtion, drawTab} + addButton(tabName, function(player, element) openTab(player, element.parent.parent.parent.name, element.parent.parent.parent.tab, element.name) end) +end + +function addButton(btnName, onClick) + guis.buttons[btnName] = {btnName, onClick} +end + +function drawButton(frame, btnName, caption, describtion, sprite) + if sprite then + frame.add{name=btnName, type = "sprite-button", sprite=sprite, tooltip=describtion, style = mod_gui.button_style} + else + frame.add{name=btnName, type = "button", caption=caption, tooltip=describtion, style = mod_gui.button_style} + end +end + +function openTab(player, frameName, tab, tabName) + local tabBar = player.gui.center[frameName].tabBarScroll.tabBar + for _,t in pairs(guis.frames[frameName]) do + if _ ~= 1 then + if t[1] == tabName then + tabBar[t[1]].style.font_color = {r = 255, g = 255, b = 255, player = 255} + tab.clear() + t[3](player, tab) + else + tabBar[t[1]].style.font_color = {r = 100, g = 100, b = 100, player = 255} + end + end + end +end + +function drawFrame(player, frameName, tabName) + if getRank(player).power <= guis.frames[frameName][1].require then + if player.gui.center[frameName] then player.gui.center[frameName].destroy() end + local frame = player.gui.center.add{name=frameName,type='frame',caption=frameName,direction='vertical',style=mod_gui.frame_style} + local tabBarScroll = frame.add{type = "scroll-pane", name= "tabBarScroll", vertical_scroll_policy="never", horizontal_scroll_policy="always"} + local tabBar = tabBarScroll.add{type='flow',direction='horizontal',name='tabBar'} + local tab = frame.add{type = "scroll-pane", name= "tab", vertical_scroll_policy="auto", horizontal_scroll_policy="never"} + for _,t in pairs(guis.frames[frameName]) do + if _ ~= 1 then drawButton(tabBar, t[1], t[1], t[2]) end + end + openTab(player, frameName, tab, tabName) + drawButton(tabBar, 'close', 'Close', 'Close this window') + tab.style.minimal_height = 300 + tab.style.maximal_height = 300 + tab.style.minimal_width = 500 + tab.style.maximal_width = 500 + tabBarScroll.style.minimal_height = 60 + tabBarScroll.style.maximal_height = 60 + tabBarScroll.style.minimal_width = 500 + tabBarScroll.style.maximal_width = 500 + end +end + +function toggleVisable(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 +---------------------------------------------------------------------------------------- +---------------------------Player Events------------------------------------------------ +---------------------------------------------------------------------------------------- +script.on_event(defines.events.on_player_created, function(event) + local player = game.players[event.player_index] + player.force.friendly_fire = false + player.insert{name="iron-plate", count=8} + player.insert{name="pistol", count=1} + player.insert{name="firearm-magazine", count=10} + player.insert{name="burner-mining-drill", count = 1} + player.insert{name="stone-furnace", count = 1} + player.force.chart(player.surface, {{player.position.x - 200, player.position.y - 200}, {player.position.x + 200, player.position.y + 200}}) +end) + +script.on_event(defines.events.on_player_respawned, function(event) + local player = game.players[event.player_index] + drawPlayerList() + player.insert{name="pistol", count=1} + player.insert{name="firearm-magazine", count=10} +end) + +script.on_event(defines.events.on_player_joined_game, function(event) + loadVar() + --runs when the first player joins to make the permission groups + if #game.players == 1 then + for _,rank in pairs(ranks) do + game.permissions.create_group(rank.name) + for _,toRemove in pairs(rank.disallow) do + game.permissions.get_group(rank.name).set_allows_action(defines.input_action[toRemove],false) + end + end + end + --Standard start up + local player = game.players[event.player_index] + autoRank(player) + player.print({"", "Welcome"}) + drawPlayerList() + drawToolbar(player) + local playerStringTable = encode(game.players, "players", {"name", "admin", "online_time", "connected", "index"}) + game.write_file("players.json", playerStringTable, false, 0) + if not player.admin and ticktominutes(player.online_time) < 1 then drawFrame(player,'Readme','Rules') end +end) + +script.on_event(defines.events.on_player_left_game, function(event) + local player = game.players[event.player_index] + drawPlayerList() +end) +---------------------------------------------------------------------------------------- +---------------------------Gui Events--------------------------------------------------- +---------------------------------------------------------------------------------------- +script.on_event(defines.events.on_gui_click, function(event) + silo_script.on_gui_click(event) + local player = game.players[event.player_index] + if event.element.type == 'button' or event.element.type == 'sprite-button' then + for _,btn in pairs(guis.buttons) do + if btn[1] == event.element.name then + if btn[2] then btn[2](player,event.element) else callRank('Invaid Button'..btn[1],'Mod') end + break + end + end + elseif event.element.type == 'checkbox' then + if event.element.name == 'select' then + if not selected[event.player_index] then selected[event.player_index] = {} end + if event.element.state then + table.insert(selected[event.player_index],event.element.parent.name) + else + for _,name in pairs(selected[event.player_index]) do + if name == event.element.parent.name then table.remove(selected[event.player_index],_) break end + end + end + end + saveVar() + end +end) + +script.on_event(defines.events.on_gui_text_changed, function(event) + local player = game.players[event.player_index] + if event.element.parent.name == 'filterTable' then + local frame = event.element + local filters = {} + local commands = false + local select = false + if frame.parent.parent.parent.name == 'Admin' and not frame.parent.sel_input then commands = true filters[#filters+1] = 'online' end + if frame.parent.parent.parent.name == 'Admin' and frame.parent.sel_input then select = true filters[#filters+1] = 'lower' end + if frame.parent.parent.filterTable.status_input and not commands then + local status_input = frame.parent.parent.filterTable.status_input.text + if status_input == 'yes' or status_input == 'online' or status_input == 'true' or status_input == 'y' then filters[#filters+1] = 'online' + elseif status_input ~= '' then filters[#filters+1] = 'offline' end + end if frame.parent.parent.filterTable.hours_input then + local hours_input = frame.parent.parent.filterTable.hours_input.text + if tonumber(hours_input) and tonumber(hours_input) > 0 then filters[#filters+1] = tonumber(hours_input) end + end if frame.parent.parent.filterTable.name_input then + local name_input = frame.parent.parent.filterTable.name_input.text + if name_input then filters[#filters+1] = name_input end + end if frame.parent.parent.filterTable.sel_input then + local sel_input = frame.parent.parent.filterTable.sel_input.text + if sel_input == 'yes' or sel_input == 'online' or sel_input == 'true' or sel_input == 'y' then filters[#filters+1] = 'selected' end + end + drawPlayerTable(player, frame.parent.parent, commands, select, filters) + end +end) +---------------------------------------------------------------------------------------- +---------------------------Grefer Events------------------------------------------------ +---------------------------------------------------------------------------------------- +script.on_event(defines.events.on_marked_for_deconstruction, function(event) + local eplayer = game.players[event.player_index] + if not eplayer.admin and ticktominutes(eplayer.online_time) < timeForRegular then + if event.entity.type ~= "tree" and event.entity.type ~= "simple-entity" then + event.entity.cancel_deconstruction("player") + eplayer.print("You are not allowed to do this yet, play for player bit longer. Try again in about: " .. math.floor((timeForRegular - ticktominutes(eplayer.online_time))) .. " minutes") + callRank(eplayer.name .. " tryed to deconstruced something") + end + elseif event.entity.type == "tree" or event.entity.type == "simple-entity" then + event.entity.destroy() + end +end) + +script.on_event(defines.events.on_built_entity, function(event) + local eplayer = game.players[event.player_index] + local timeForRegular = 120 + if not eplayer.admin and ticktominutes(eplayer.online_time) < timeForRegular then + if event.created_entity.type == "tile-ghost" then + event.created_entity.destroy() + eplayer.print("You are not allowed to do this yet, play for player bit longer. Try: " .. math.floor((timeForRegular - ticktominutes(eplayer.online_time))) .. " minutes") + callRank(eplayer.name .. " tryed to place concrete/stone with robots") + end + end +end) +---------------------------------------------------------------------------------------- +---------------------------Other Events------------------------------------------------- +---------------------------------------------------------------------------------------- +script.on_event(defines.events.on_tick, function(event) if (game.tick/(3600*game.speed)) % 15 == 0 then autoMessage() end end) +---------------------------------------------------------------------------------------- +---------------------------IDK What There Do Functions---------------------------------- +---------------------------------------------------------------------------------------- +function encode ( table, name, items ) + local encodeString + local encodeSubString + local encodeSubSubString + for i, keyTable in pairs(table) do + encodeSubSubString = nil + for i, keyItem in pairs(items) do + if type(keyTable[keyItem]) == "string" then + if encodeSubSubString ~= nil then + encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": \"" .. keyTable[keyItem] .. "\"" + else + encodeSubSubString = "\"" .. keyItem .. "\": \"" .. keyTable[keyItem] .. "\"" + end + elseif type(keyTable[keyItem]) == "number" then + if encodeSubSubString ~= nil then + encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) + else + encodeSubSubString = "\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) + end + elseif type(keyTable[keyItem]) == "boolean" then + if encodeSubSubString ~= nil then + encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) + else + encodeSubSubString = "\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) + end + end + end + if encodeSubSubString ~= nil and encodeSubString ~= nil then + encodeSubString = encodeSubString .. ", {" .. encodeSubSubString .. "}" + else + encodeSubString = "{" .. encodeSubSubString .. "}" + end + end + encodeString = "{" .. "\"" .. name .. "\": [" .. encodeSubString .. "]}" + return encodeString +end +---------------------------------------------------------------------------------------- +---------------------------Tool Bar----------------------------------------------------- +---------------------------------------------------------------------------------------- +addButton("btn_toolbar_playerList", function(player) toggleVisable(mod_gui.get_frame_flow(player).PlayerList) end) +function drawToolbar(player) + local frame = mod_gui.get_button_flow(player) + frame.clear() + drawButton(frame,"btn_toolbar_playerList", "Playerlist", "Adds/removes the player list to/from your game.",'entity/player') + for _,f in pairs(guis.frames) do + if getRank(player).power <= f[1].require then drawButton(frame,"btn_".._, f[1].caption, f[1].tooltip, f[1].sprite) end + end +end +---------------------------------------------------------------------------------------- +---------------------------Player List-------------------------------------------------- +---------------------------------------------------------------------------------------- +function drawPlayerList() + for i, player in pairs(game.connected_players) do + local flow = mod_gui.get_frame_flow(player) + if flow.PlayerList == nil then + flow.add{type = "frame", name= "PlayerList", direction = "vertical",style=mod_gui.frame_style} + .add{type = "scroll-pane", name= "PlayerListScroll", direction = "vertical", vertical_scroll_policy="always", horizontal_scroll_policy="never"} + end + local Plist= flow.PlayerList.PlayerListScroll + Plist.clear() + Plist.style.maximal_height = 200 + for i, player in pairs(game.connected_players) do + playerRank = getRank(player) + if playerRank.power <= 3 or playerRank.name == 'Jail' then + if playerRank.shortHand ~= '' then Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name , ' - '..playerRank.shortHand..' '}} + else Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name..' '}} end + Plist[player.name].style.font_color = playerRank.colour + player.tag = playerRank.tag + end + end + for i, player in pairs(game.connected_players) do + playerRank = getRank(player) + if playerRank.power > 3 and playerRank.name ~= 'Jail' then + if playerRank.shortHand ~= '' then Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name , ' - '..playerRank.shortHand..' '}} + else Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name..' '}} end + Plist[player.name].style.font_color = playerRank.colour + player.tag = playerRank.tag + end + end + end +end + +addButton('goto', + function(player,frame) + local p = game.players[frame.parent.name] + player.teleport(game.surfaces[p.surface.name].find_non_colliding_position("player", p.position, 32, 1)) +end) +addButton('bring', + function(player,frame) + local p = game.players[frame.parent.name] + p.teleport(game.surfaces[player.surface.name].find_non_colliding_position("player", player.position, 32, 1)) +end) +addButton('jail',function(player,frame) + local p=game.players[frame.parent.name] + if p.permission_group.name ~= 'Jail' then giveRank(p,'Jail',player) + else revertRank(p,player) end +end) +addButton('kill', + function(player,frame) + local p = game.players[frame.parent.name] + if p.character then p.character.die() end +end) +addButton('revert', + function(player,frame) + local p = game.players[frame.parent.name] + revertRank(p,player) +end) +function drawPlayerTable(player, frame, commands, select,filters) + --setup the table + if frame.playerTable then frame.playerTable.destroy() end + pTable = frame.add{name='playerTable', type="table", colspan=5} + pTable.style.minimal_width = 500 + pTable.style.maximal_width = 500 + pTable.style.horizontal_spacing = 10 + pTable.add{name="id", type="label", caption="Id"} + pTable.add{name="Pname", type="label", caption="Name"} + if commands==false and select ==false then pTable.add{name="status", type="label", caption="Status"} end + pTable.add{name="online_time", type="label", caption="Online Time"} + pTable.add{name="rank", type="label", caption="Rank"} + if commands then pTable.add{name="commands", type="label", caption="Commands"} end + if select then pTable.add{name="select_label", type="label", caption="Selection"} end + --filter checking + for i, p in pairs(game.players) do + local addPlayer = true + for _,filter in pairs(filters) do + if filter == 'admin' then if p.admin == false then addPlayer = false break end + elseif filter == 'online' then if p.connected == false then addPlayer = false break end + elseif filter == 'offline' then if p.connected == true then addPlayer = false break end + elseif filter == 'lower' then if getRank(p).power <= getRank(player).power then addPlayer = false break end + elseif filter == 'selected' then local Break = nil for _,name in pairs(selected[player.index]) do if name == p.name then Break = true break end end if not Break then addPlayer = false break end + elseif type(filter)=='number' then if filter > ticktominutes(p.online_time) then addPlayer = false break end + elseif type(filter)=='string' then if p.name:lower():find(filter:lower()) == nil then addPlayer = false break end + end + end + --addes the player to the list + if addPlayer == true and player.name ~= p.name then + if pTable[p.name] == nil then + pTable.add{name=i .. "id", type="label", caption=i} + pTable.add{name=p.name..'_name', type="label", caption=p.name} + --status + if not commands and not select then + if p.connected == true + then pTable.add{name=p.name .. "Status", type="label", caption="ONLINE"} + else pTable.add{name=p.name .. "Status", type="label", caption="OFFLINE"} + end + end + --time and rank + pTable.add{name=p.name .. "Online_Time", type="label", caption=(ticktohour(p.online_time)..'H '..(ticktominutes(p.online_time)-60*ticktohour(p.online_time))..'M')} + pTable.add{name=p.name .. "Rank", type="label", caption=getRank(p).name} + --commands + if commands then + pTable.add{name=p.name, type="flow"} + drawButton(pTable[p.name],'goto','Tp','Goto to the players location') + drawButton(pTable[p.name],'bring','Br','Bring player player to your location') + if getRank(p).power > getRank(player).power then + drawButton(pTable[p.name],'jail','Ja','Jail/Unjail player') + drawButton(pTable[p.name],'revert','Re','Set A players rank to their forma one') + drawButton(pTable[p.name],'kill','Ki','Kill this player') + end + --player slecction + elseif select then + pTable.add{name=p.name, type="flow"} + local state = false + for _,name in pairs(selected[player.index]) do if name == p.name then state = true break end end + pTable[p.name].add{name='select', type="checkbox",state=state} + end + end + end + end +end +---------------------------------------------------------------------------------------- +---------------------------Read Me Gui-------------------------------------------------- +---------------------------------------------------------------------------------------- +addFrame('Readme',6, 'Rules','Readme', 'Rules, Server info, How to chat, Playerlist, Adminlist.') + +addTab('Readme','Rules','The rules of the server', + function(player,frame) + local rules = { + "Hacking/cheating, exploiting and abusing bugs is not allowed.", + "Do not disrespect any player in the server (This includes staff).", + "Do not spam, this includes stuff such as chat spam, item spam, chest spam etc.", + "Do not laydown concrete with bots without permission.", + "Do not use active provider chests without permission.", + "Do not remove/move major parts of the factory without permission.", + "Do not walk in player random direction for no reason(to save map size).", + "Do not remove stuff just because you don't like it, tell people first.", + "Do not make train roundabouts.", + "Trains are Left Hand Drive (LHD) only.", + "Do not complain about lag, low fps and low ups or other things like that.", + "Do not ask for rank.", + "Use common sense and what an admin says goes."} + for i, rule in pairs(rules) do + frame.add{name=i, type="label", caption={"", i ,". ", rule}} + end + end) +addTab('Readme','Server Info','Info about the server', + function(player,frame) + frame.add{name=1, type="label", caption={"", "Discord voice and chat server:"}} + frame.add{name=2, type='textfield', text='https://discord.gg/RPCxzgt'}.style.minimal_width=400 + frame.add{name=3, type="label", caption={"", "Our forum:"}} + frame.add{name=4, type='textfield', text='https://explosivegaming.nl'}.style.minimal_width=400 + frame.add{name=5, type="label", caption={"", "Steam:"}} + frame.add{name=6, type='textfield', text='http://steamcommunity.com/groups/tntexplosivegaming'}.style.minimal_width=400 + end) +addTab('Readme','How to chat','Just in case you dont know how to chat', + function(player,frame) + local chat = "Chatting for new players can be difficult because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key it’s located under the “ESC key”. If you would like to change the key go to your controls tab in options. The key you need to change is “Toggle Lua console” it’s located in the second column 2nd from bottom." + frame.add{name=i, type="label", caption={"", chat}, single_line=false}.style.maximal_width=480 + end) +addTab('Readme','Admins','List of all the people who can ban you :P', + function(player,frame) + local admins = { + "This list contains all the people that are admin in this world. Do you want to become", + "an admin dont ask for it! an admin will see what you've made and the time you put", + "in the server."} + for i, line in pairs(admins) do + frame.add{name=i, type="label", caption={"", line}, single_line=false} + end + drawPlayerTable(player, frame, false, false,{'admin'}) + end) +addTab('Readme','Players','List of all the people who have been on the server', + function(player,frame) + local players = { + "These are the players who have supported us in the making of this factory. Without", + "you the player we wouldn't have been as far as we are now."} + for i, line in pairs(players) do + frame.add{name=i, type="label", caption={"", line}} + end + frame.add{name='filterTable',type='table',colspan=3} + frame.filterTable.add{name='name_label',type='label',caption='Name'} + frame.filterTable.add{name='status_label',type='label',caption='Online?'} + frame.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'} + frame.filterTable.add{name='name_input',type='textfield'} + frame.filterTable.add{name='status_input',type='textfield'} + frame.filterTable.add{name='hours_input',type='textfield'} + drawPlayerTable(player, frame, false, false, {}) + end) +---------------------------------------------------------------------------------------- +---------------------------Admin Gui---------------------------------------------------- +---------------------------------------------------------------------------------------- +addFrame('Admin',2,'Player List','Admin',"All admin fuctions are here") + +addButton('btn_toolbar_automessage',function() autoMessage() end) +addButton('tp_all',function(player,frame) for i,p in pairs(game.connected_players) do local pos = game.surfaces[player.surface.name].find_non_colliding_position("player", player.position, 32, 1) if p ~= player then p.teleport(pos) end end end) +addButton('revive_dead_entitys_range',function(player,frame) if tonumber(frame.parent.range.text) then local range = tonumber(frame.parent.range.text) for key, entity in pairs(game.surfaces[1].find_entities_filtered({area={{player.position.x-range,player.position.y-range},{player.position.x+range,player.position.y+range}},type = "entity-ghost"})) do entity.revive() end end end) +addButton('add_dev_items',function(player,frame) player.insert{name="deconstruction-planner", count = 1} player.insert{name="blueprint-book", count = 1} player.insert{name="blueprint", count = 20} end) +addButton('sendMessage',function(player,frame) local rank = stringToRank(frame.parent.message.rank.text) if rank then callRank(frame.parent.message.message.text,rank.name) else for _,rank in pairs(ranks) do player.print(rank.name) end end end) +addButton('setRanks', + function(player,frame) + rank = stringToRank(frame.parent.rank_input.items[frame.parent.rank_input.selected_index]) + if rank then + for _,playerName in pairs(selected[player.index]) do + p=game.players[playerName] + if getRank(player).power < getRank(p).power and rank.power > getRank(player).power then + giveRank(p,rank,player) + else + player.print('You can not edit '..p.name.."'s rank there rank is too high (or the rank you have slected is above you)") + end + end + end + end) +addButton('clearSelection',function(player,frame) clearSelection(player) drawPlayerTable(player, frame.parent.parent, false, true, {}) end) + +addTab('Admin', 'Commands', 'Random useful commands', + function(player, frame) + drawButton(frame,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players') + drawButton(frame,'add_dev_items','Get Blueprints','Get all the blueprints') + drawButton(frame,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range') + frame.add{type='textfield',name='range',text='Range'} + frame.add{type='flow',name='message'} + frame.message.add{type='textfield',name='message',text='Enter message'} + frame.message.add{type='textfield',name='rank',text='Enter rank'} + drawButton(frame,'sendMessage','Send Message','Send a message to all ranks higher than the slected') + drawButton(frame,'tp_all','TP All Here','Brings all players to you') + end) +addTab('Admin','Edit Ranks', 'Edit the ranks of players below you', + function(player,frame) + clearSelection(player) + frame.add{name='filterTable',type='table',colspan=2} + frame.filterTable.add{name='name_label',type='label',caption='Name'} + frame.filterTable.add{name='sel_label',type='label',caption='Selected?'} + frame.filterTable.add{name='name_input',type='textfield'} + frame.filterTable.add{name='sel_input',type='textfield'} + frame.add{type='flow',name='rank',direction='horizontal'} + frame.rank.add{name='rank_label',type='label',caption='Rank'} + frame.rank.add{name='rank_input',type='drop-down'} + for _,rank in pairs(ranks) do if rank.power > getRank(player).power then frame.rank.rank_input.add_item(rank.name) end end + drawButton(frame.rank,'setRanks','Set Ranks','Sets the rank of all selected players') + drawButton(frame.rank,'clearSelection','Clear Selection','Clears all currently selected players') + drawPlayerTable(player, frame, false, true, {'lower'}) + end) +addTab('Admin', 'Player List', 'Send player message to all players', + function(player, frame) + frame.add{name='filterTable',type='table',colspan=2} + frame.filterTable.add{name='name_label',type='label',caption='Name'} + frame.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'} + frame.filterTable.add{name='name_input',type='textfield'} + frame.filterTable.add{name='hours_input',type='textfield'} + drawPlayerTable(player, frame, true,false, {'online'}) + end) +---------------------------------------------------------------------------------------- +---------------------------Admin+ Gui--------------------------------------------------- +---------------------------------------------------------------------------------------- +addFrame('Admin+',1,'Modifiers','Admin+',"Because we are better") + +addButton('remove_biters',function(player,frame) for key, entity in pairs(game.surfaces[1].find_entities_filtered({force='enemy'})) do entity.destroy() end end) +addButton('toggle_cheat',function(player,frame) player.cheat_mode = not player.cheat_mode end) +addButton('revive_dead_entitys',function(player,frame) for key, entity in pairs(game.surfaces[1].find_entities_filtered({type = "entity-ghost"})) do entity.revive() end end) +addButton("btn_Modifier_apply", + function(player,frame) + local forceModifiers = { + "manual_mining_speed_modifier", + "manual_crafting_speed_modifier", + "character_running_speed_modifier", + "worker_robots_speed_modifier", + "worker_robots_storage_bonus", + "character_build_distance_bonus", + "character_item_drop_distance_bonus", + "character_reach_distance_bonus", + "character_resource_reach_distance_bonus", + "character_item_pickup_distance_bonus", + "character_loot_pickup_distance_bonus" + } + for i, modifier in pairs(forceModifiers) do + local number = tonumber(( frame.parent.parent.modifierTable[modifier .. "_input"].text):match("[%d]+[.%d+]")) + if number ~= nil then + if number >= 0 and number < 50 and number ~= player.force[modifier] then + player.force[modifier] = number + player.print(modifier .. " changed to number: " .. tostring(number)) + elseif number == player.force[modifier] then + player.print(modifier .. " Did not change") + else + player.print(modifier .. " needs to be player higher number or it contains an letter") + end + end + end + end) + +addTab('Admin+', 'Commands', 'Random useful commands', + function(player, frame) + drawButton(frame,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players') + drawButton(frame,'add_dev_items','Get Blueprints','Get all the blueprints') + drawButton(frame,'revive_dead_entitys','Revive All Entitys','Brings all dead machines back to life') + drawButton(frame,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range') + frame.add{type='textfield',name='range',text='Range'} + drawButton(frame,'remove_biters','Kill Biters','Removes all biters in map') + drawButton(frame,'tp_all','TP All Here','Brings all players to you') + drawButton(frame,'toggle_cheat','Toggle Cheat Mode','Toggle your cheat mode') + end) + +addTab('Admin+', 'Modifiers', 'Edit in game modifiers', + function(player,frame) + local forceModifiers = { + "manual_mining_speed_modifier", + "manual_crafting_speed_modifier", + "character_running_speed_modifier", + "worker_robots_speed_modifier", + "worker_robots_storage_bonus", + "character_build_distance_bonus", + "character_item_drop_distance_bonus", + "character_reach_distance_bonus", + "character_resource_reach_distance_bonus", + "character_item_pickup_distance_bonus", + "character_loot_pickup_distance_bonus" + } + frame.add{type = "flow", name= "flowNavigation",direction = "horizontal"} + frame.add{name="modifierTable", type="table", colspan=3} + frame.modifierTable.add{name="Mname", type="label", caption="name"} + frame.modifierTable.add{name="input", type="label", caption="input"} + frame.modifierTable.add{name="current", type="label", caption="current"} + for i, modifier in pairs(forceModifiers) do + frame.modifierTable.add{name=modifier, type="label", caption=modifier} + frame.modifierTable.add{name=modifier .. "_input", type="textfield", caption="inputTextField"} + frame.modifierTable.add{name=modifier .. "_current", type="label", caption=tostring(player.force[modifier])} + end + drawButton(frame.flowNavigation,"btn_Modifier_apply","Apply","Apply the new values to the game") +end) \ No newline at end of file diff --git a/level-init.dat b/level-init.dat deleted file mode 100644 index 55aaa6fd..00000000 Binary files a/level-init.dat and /dev/null differ diff --git a/level.dat b/level.dat deleted file mode 100644 index 3b9cac23..00000000 Binary files a/level.dat and /dev/null differ diff --git a/replay.dat b/replay.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/source.lua b/source.lua deleted file mode 100644 index 34c7e2ef..00000000 --- a/source.lua +++ /dev/null @@ -1,859 +0,0 @@ - -entityRemoved = {} -entityCache = {} -guis = {frames={},buttons={}} ---functions can not be included in the default list or be added by code -defaults = { - itemRotated = {}, - --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 - ranks={ - {name='Owner',shortHand='Owner',tag='[Owner]',power=0,colour={r=170,g=0,b=0},disallow={}}, - {name='Community Manager',shortHand='CM',tag='[Com Mngr]',power=1,colour={r=150,g=68,b=161},disallow={}}, - {name='Developer',shortHand='Dev',tag='[Dev]',power=1,colour={r=179,g=125,b=46},disallow={}}, - {name='Admin',shortHand='Admin',tag='[Admin]',power=2,colour={r=170,g=41,b=170},disallow={'set_allow_commands','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Mod',shortHand='Mod',tag='[Mod]',power=3,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Donator',shortHand='P2W',tag='[P2W]',power=4,colour={r=233,g=63,b=233},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Member',shortHand='Mem',tag='[Member]',power=5,colour={r=24,g=172,b=188},disallow={'set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Regular',shortHand='Reg',tag='[Regukar]',power=5,colour={r=24,g=172,b=188},disallow={'set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Guest',shortHand='',tag='[Guest]',power=6,colour={r=255,g=159,b=27},disallow={'build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}}, - {name='Jail',shortHand='Jail',tag='[Jail]',power=7,colour={r=50,g=50,b=50},disallow={'player_leave_game','build_terrain','remove_cables','launch_rocket','cancel_research','set_auto_launch_rocket','change_programmable_speaker_alert_parameters','reset_assembling_machine','drop_item','set_allow_commands','server_command','edit_permission_group','delete_permission_group','add_permission_group'}} - }, - autoRanks={ - Owner={'badgamernl'}, - ['Community Manager']={'arty714'}, - Developer={'Cooldude2606'}, - Admin={'eissturm','PropangasEddy'}, - Mod={'Alanore','Aquaday','cafeslacker','CrashKonijn','Drahc_pro','Flip','freek18','Hobbitkicker','hud','Matthias','MeDDish','Mindxt20','MottledPetrel','Mr_Happy_212','Phoenix27833','Sand3r205','ScarbVis','Smou','steentje77','TopHatGaming123'}, - Donator={}, - Member={}, - Regular={}, - Guest={}, - Jail={} - }, - selected={}, - jail={} -} - -warningAllowed = nil -timeForRegular = 180 -CHUNK_SIZE = 32 - -function loadVar(t) - if t == nil then - local g = nil - if game.players[1].gui.left.hidden then - g = game.players[1].gui.left.hidden.caption - else - g = game.players[1].gui.left.add{type='frame',name='hidden',caption=table.tostring(defaults)}.caption - game.players[1].gui.left.hidden.style.visible = false - end - gTable = loadstring('return '..g)() - else gTable = t end - itemRotated = gTable.itemRotated - ranks= gTable.ranks - autoRanks= gTable.autoRanks - selected= gTable.selected - jail= gTable.jail -end -loadVar(defaults) -function saveVar() - gTable.itemRotated = itemRotated - gTable.ranks = ranks - gTable.autoRanks = autoRanks - gTable.selected= selected - gTable.jail= jail - game.players[1].gui.left.hidden.caption = table.tostring(gTable) -end ----------------------------------------------------------------------------------------- ----------------------------Rank functions----------------------------------------------- ----------------------------------------------------------------------------------------- -function getRank(player) - if player then - for _,rank in pairs(ranks) do - if player.permission_group == game.permissions.get_group(rank.name) then return rank end - end - return stringToRank('Guest') - end -end - -function stringToRank(string) - if type(string) == 'string' then - local Foundranks={} - for _,rank in pairs(ranks) do - if rank.name:lower() == string:lower() then return rank end - if rank.name:lower():find(string:lower()) then table.insert(Foundranks,rank) end - end - if #Foundranks == 1 then return Foundranks[1] end - end -end - -function callRank(msg, rank, inv) - local rank = stringToRank(rank) or stringToRank('Mod') -- default mod or higher - local inv = inv or false - for _, player in pairs(game.players) do - rankPower = getRank(player).power - if inv then - if rankPower >= rank.power then - player.print(('[Everyone]: '..msg)) - end - else - if rankPower <= rank.power then - if rank.shortHand ~= '' then player.print(('['..(rank.shortHand)..']: '..msg)) else player.print(('[Everyone]: '..msg)) end - end - end - end -end - -function giveRank(player,rank,byPlayer,sys) - local byPlayer = byPlayer or 'system' - local rank = stringToRank(rank) or rank - local oldRank = getRank(player) - local message = 'demoted' - if rank.power <= oldRank.power then message = 'promoted' end - if byPlayer.name then - callRank(player.name..' was '..message..' to '..rank.name..' by '..byPlayer.name,oldRank.name) - else - callRank(player.name..' was '..message..' to '..rank.name..' by ',oldRank.name) - end - player.permission_group = game.permissions.get_group(rank.name) - drawToolbar(player) - drawPlayerList() - if sys then else - game.print(jail[player.index][1]) - game.print(rank.name) - game.print(jail[player.index][1] and rank.name ~= 'Jail') - if rank.name == 'Jail' and not jail[player.index][1] then - jailPlayer(player,byPlayer) - elseif jail[player.index][1] and rank.name ~= 'Jail' then - game.print('Unjail') - jail[player.index][1]=false - player.character.active = true - end - end -end - -function autoRank(player) - local currentRank = getRank(player) - local playerAutoRank = nil - for rank,players in pairs(autoRanks) do - local Break = false - for _,p in pairs(players) do - if player.name == p then playerAutoRank = stringToRank(rank) Break = true break end - end - if Break then break end - end - if playerAutoRank then - if currentRank.power > playerAutoRank.power then - player.permission_group=game.permissions.get_group(playerAutoRank.name) - end - elseif ticktominutes(player.online_time) >= timeForRegular then - player.permission_group=game.permissions.get_group('Regular') - end - if getRank(player).power <= 3 and not player.admin then - callRank(player.name..' needs to be promoted.') - end - if jail[player.index] == nil then - jail[player.index]={false,getRank(player).name} - end - if jail[player.index][1] then - player.permission_group=game.permissions.get_group('Jail') - if player.character then player.character.active = false end - end - saveVar() -end - -function jailPlayer(player,byplayer) - if player.character then - if player.character.active then - jail[player.index][1]=true - jail[player.index][2]=getRank(player).name - giveRank(player,'Jail',byplayer,true) - player.character.active = false - else - jail[player.index][1]=false - local rank = jail[player.index][2] or 'Guest' - giveRank(player,rank,byplayer,true) - player.character.active = true - end - saveVar() - end -end ----------------------------------------------------------------------------------------- ----------------------------Common use functions----------------------------------------- ----------------------------------------------------------------------------------------- -function ticktohour (tick) - local hour = tostring(math.floor(tick/(216000*game.speed))) - return hour -end - -function ticktominutes (tick) - local minutes = math.floor(tick/(3600*game.speed)) - return minutes -end - -function clearSelection(player) - selected[player.index] = {} -end - -function autoMessage() - local lrank = 'Regular' - local hrank = 'Mod' - callRank('There are '..#game.connected_players..' players online',hrank,true) - callRank('This map has been on for '..ticktohour(game.tick)..' Hours and '..(ticktominutes(game.tick)-60*ticktohour(game.tick))..' Minutes',hrank,true) - callRank('Please join us on:',lrank,true) - callRank('Discord: https://discord.gg/RPCxzgt',lrank,true) - callRank('Forum: explosivegaming.nl',lrank,true) - callRank('Steam: http://steamcommunity.com/groups/tntexplosivegaming',lrank,true) - callRank('To see these links again goto: Readme > Server Info',lrank,true) -end ----------------------------------------------------------------------------------------- ----------------------------Table Functions---------------------------------------------- ----------------------------------------------------------------------------------------- -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 - 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 ----------------------------------------------------------------------------------------- ----------------------------Gui Functions------------------------------------------------ ----------------------------------------------------------------------------------------- -function addFrame(frame,rank,open,caption,tooltip) - guis.frames[frame] = {{require=rank,caption=caption,tooltip=tooltip}} - addButton('close', function(player,element) element.parent.parent.parent.destroy() end) - addButton('btn_'..frame, function(player,element) if player.gui.center[frame] then player.gui.center[frame].destroy() else drawFrame(player,frame,open) end end) -end - -function addTab(frame, tabName, describtion, drawTab) - guis.frames[frame][tabName] = {tabName, describtion, drawTab} - addButton(tabName, function(player, element) openTab(player, element.parent.parent.parent.name, element.parent.parent.parent.tab, element.name) end) -end - -function addButton(btnName, onClick) - guis.buttons[btnName] = {btnName, onClick} -end - -function drawButton(frame, btnName, caption, describtion) - frame.add{name=btnName, type = "button", caption=caption, tooltip=describtion} -end - -function openTab(player, frameName, tab, tabName) - local tabBar = player.gui.center[frameName].tabBarScroll.tabBar - for _,t in pairs(guis.frames[frameName]) do - if _ ~= 1 then - if t[1] == tabName then - tabBar[t[1]].style.font_color = {r = 255, g = 255, b = 255, player = 255} - tab.clear() - t[3](player, tab) - else - tabBar[t[1]].style.font_color = {r = 100, g = 100, b = 100, player = 255} - end - end - end -end - -function drawFrame(player, frameName, tabName) - if getRank(player).power <= guis.frames[frameName][1].require then - if player.gui.center[frameName] then player.gui.center[frameName].destroy() end - local frame = player.gui.center.add{name=frameName,type='frame',caption=frameName,direction='vertical'} - local tabBarScroll = frame.add{type = "scroll-pane", name= "tabBarScroll", vertical_scroll_policy="never", horizontal_scroll_policy="always"} - local tabBar = tabBarScroll.add{type='flow',direction='horizontal',name='tabBar'} - local tab = frame.add{type = "scroll-pane", name= "tab", vertical_scroll_policy="auto", horizontal_scroll_policy="never"} - for _,t in pairs(guis.frames[frameName]) do - if _ ~= 1 then drawButton(tabBar, t[1], t[1], t[2]) end - end - openTab(player, frameName, tab, tabName) - drawButton(tabBar, 'close', 'Close', 'Close this window') - tab.style.minimal_height = 300 - tab.style.maximal_height = 300 - tab.style.minimal_width = 500 - tab.style.maximal_width = 500 - tabBarScroll.style.minimal_height = 60 - tabBarScroll.style.maximal_height = 60 - tabBarScroll.style.minimal_width = 500 - tabBarScroll.style.maximal_width = 500 - end -end - -function toggleVisable(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 ----------------------------------------------------------------------------------------- ----------------------------Player Events------------------------------------------------ ----------------------------------------------------------------------------------------- -script.on_event(defines.events.on_player_created, function(event) - local player = game.players[event.player_index] - player.insert{name="iron-plate", count=8} - player.insert{name="pistol", count=1} - player.insert{name="firearm-magazine", count=10} - player.insert{name="burner-mining-drill", count = 1} - player.insert{name="stone-furnace", count = 1} - player.force.chart(player.surface, {{player.position.x - 200, player.position.y - 200}, {player.position.x + 200, player.position.y + 200}}) -end) - -script.on_event(defines.events.on_player_respawned, function(event) - local player = game.players[event.player_index] - drawPlayerList() - player.insert{name="pistol", count=1} - player.insert{name="firearm-magazine", count=10} -end) - -script.on_event(defines.events.on_player_joined_game, function(event) - loadVar() - if #game.players == 1 then - for _,rank in pairs(ranks) do - game.permissions.create_group(rank.name) - for _,toRemove in pairs(rank.disallow) do - game.permissions.get_group(rank.name).set_allows_action(defines.input_action[toRemove],false) - end - end - end - local player = game.players[event.player_index] - autoRank(player) - player.print({"", "Welcome"}) - if player.gui.left.PlayerList ~= nil then - player.gui.left.PlayerList.destroy() - end - if player.gui.center.README ~= nil then - player.gui.center.README.destroy() - end - if player.gui.top.PlayerList ~= nil then - player.gui.top.PlayerList.destroy() - end - drawPlayerList() - drawToolbar(player) - local playerStringTable = encode(game.players, "players", {"name", "admin", "online_time", "connected", "index"}) - game.write_file("players.json", playerStringTable, false, 0) - if not player.admin and ticktominutes(player.online_time) < 1 then - drawFrame(player,'Readme','Rules') - end -end) - -script.on_event(defines.events.on_player_left_game, function(event) - local player = game.players[event.player_index] - drawPlayerList() -end) ----------------------------------------------------------------------------------------- ----------------------------Gui Events--------------------------------------------------- ----------------------------------------------------------------------------------------- -script.on_event(defines.events.on_gui_click, function(event) - local player = game.players[event.player_index] - if event.element.type == 'button' then - for _,btn in pairs(guis.buttons) do - if btn[1] == event.element.name then - if btn[2] then btn[2](player,event.element) else callRank('Invaid Button'..btn[1],'Mod') end - break - end - end - elseif event.element.type == 'checkbox' then - if event.element.name == 'select' then - if not selected[event.player_index] then selected[event.player_index] = {} end - if event.element.state then - table.insert(selected[event.player_index],event.element.parent.name) - else - for _,name in pairs(selected[event.player_index]) do - if name == event.element.parent.name then table.remove(selected[event.player_index],_) break end - end - end - end - saveVar() - end -end) - -script.on_event(defines.events.on_gui_text_changed, function(event) - local player = game.players[event.player_index] - if event.element.parent.name == 'filterTable' then - local frame = event.element - local filters = {} - local commands = false - local select = false - if frame.parent.parent.parent.name == 'Admin' and not frame.parent.sel_input then commands = true filters[#filters+1] = 'online' end - if frame.parent.parent.parent.name == 'Admin' and frame.parent.sel_input then select = true filters[#filters+1] = 'lower' end - if frame.parent.parent.filterTable.status_input and not commands then - local status_input = frame.parent.parent.filterTable.status_input.text - if status_input == 'yes' or status_input == 'online' or status_input == 'true' or status_input == 'y' then filters[#filters+1] = 'online' - elseif status_input ~= '' then filters[#filters+1] = 'offline' end - end if frame.parent.parent.filterTable.hours_input then - local hours_input = frame.parent.parent.filterTable.hours_input.text - if tonumber(hours_input) and tonumber(hours_input) > 0 then filters[#filters+1] = tonumber(hours_input) end - end if frame.parent.parent.filterTable.name_input then - local name_input = frame.parent.parent.filterTable.name_input.text - if name_input then filters[#filters+1] = name_input end - end if frame.parent.parent.filterTable.sel_input then - local sel_input = frame.parent.parent.filterTable.sel_input.text - if sel_input == 'yes' or sel_input == 'online' or sel_input == 'true' or sel_input == 'y' then filters[#filters+1] = 'selected' end - end - if frame.parent.parent.playerTable then frame.parent.parent.playerTable.destroy() end - drawPlayerTable(player, frame.parent.parent, commands, select, filters) - end -end) ----------------------------------------------------------------------------------------- ----------------------------Grefer Events------------------------------------------------ ----------------------------------------------------------------------------------------- -script.on_event(defines.events.on_marked_for_deconstruction, function(event) - local eplayer = game.players[event.player_index] - if not eplayer.admin and ticktominutes(eplayer.online_time) < timeForRegular then - if event.entity.type ~= "tree" and event.entity.type ~= "simple-entity" then - event.entity.cancel_deconstruction("player") - eplayer.print("You are not allowed to do this yet, play for player bit longer. Try again in about: " .. math.floor((timeForRegular - ticktominutes(eplayer.online_time))) .. " minutes") - callRank(eplayer.name .. " tryed to deconstruced something") - end - elseif event.entity.type == "tree" or event.entity.type == "simple-entity" then - event.entity.destroy() - end -end) - -script.on_event(defines.events.on_built_entity, function(event) - local eplayer = game.players[event.player_index] - local timeForRegular = 120 - if not eplayer.admin and ticktominutes(eplayer.online_time) < timeForRegular then - if event.created_entity.type == "tile-ghost" then - event.created_entity.destroy() - eplayer.print("You are not allowed to do this yet, play for player bit longer. Try: " .. math.floor((timeForRegular - ticktominutes(eplayer.online_time))) .. " minutes") - callRank(eplayer.name .. " tryed to place concrete/stone with robots") - end - end -end) ----------------------------------------------------------------------------------------- ----------------------------Other Events------------------------------------------------- ----------------------------------------------------------------------------------------- -script.on_event(defines.events.on_rocket_launched, function(event) - local force = event.rocket.force - if event.rocket.get_item_count("satellite") == 0 then - if (#game.players <= 1) then - game.show_message_dialog{text = {"gui-rocket-silo.rocket-launched-without-satellite"}} - else - for index, player in pairs(force.players) do - player.print({"gui-rocket-silo.rocket-launched-without-satellite"}) - end - end - return - end - if not global.satellite_sent then - global.satellite_sent = {} - end - if global.satellite_sent[force.name] then - global.satellite_sent[force.name] = global.satellite_sent[force.name] + 1 - else - game.set_game_state{game_finished=true, player_won=true, can_continue=true} - global.satellite_sent[force.name] = 1 - end - for index, player in pairs(force.players) do - if player.gui.left.rocket_score then - player.gui.left.rocket_score.rocket_count.caption = tostring(global.satellite_sent[force.name]) - else - local frame = player.gui.left.add{name = "rocket_score", type = "frame", direction = "horizontal", caption={"score"}} - frame.add{name="rocket_count_label", type = "label", caption={"", {"rockets-sent"}, ":"}} - frame.add{name="rocket_count", type = "label", caption=tostring(global.satellite_sent[force.name])} - end - end -end) - -script.on_event(defines.events.on_tick, function(event) if (game.tick/(3600*game.speed)) % 15 == 0 then autoMessage() end end) ----------------------------------------------------------------------------------------- ----------------------------IDK What There Do Functions---------------------------------- ----------------------------------------------------------------------------------------- -function encode ( table, name, items ) - local encodeString - local encodeSubString - local encodeSubSubString - for i, keyTable in pairs(table) do - encodeSubSubString = nil - for i, keyItem in pairs(items) do - if type(keyTable[keyItem]) == "string" then - if encodeSubSubString ~= nil then - encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": \"" .. keyTable[keyItem] .. "\"" - else - encodeSubSubString = "\"" .. keyItem .. "\": \"" .. keyTable[keyItem] .. "\"" - end - elseif type(keyTable[keyItem]) == "number" then - if encodeSubSubString ~= nil then - encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) - else - encodeSubSubString = "\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) - end - elseif type(keyTable[keyItem]) == "boolean" then - if encodeSubSubString ~= nil then - encodeSubSubString = encodeSubSubString .. ",\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) - else - encodeSubSubString = "\"" .. keyItem .. "\": " .. tostring(keyTable[keyItem]) - end - end - end - if encodeSubSubString ~= nil and encodeSubString ~= nil then - encodeSubString = encodeSubString .. ", {" .. encodeSubSubString .. "}" - else - encodeSubString = "{" .. encodeSubSubString .. "}" - end - end - encodeString = "{" .. "\"" .. name .. "\": [" .. encodeSubString .. "]}" - return encodeString -end ----------------------------------------------------------------------------------------- ----------------------------Tool Bar----------------------------------------------------- ----------------------------------------------------------------------------------------- -addButton("btn_toolbar_playerList", function(player) toggleVisable(player.gui.left.PlayerList) end) -function drawToolbar(player) - local frame = player.gui.top - frame.clear() - drawButton(frame,"btn_toolbar_playerList", "Playerlist", "Adds player player list to your game.") - for _,f in pairs(guis.frames) do - if getRank(player).power <= f[1].require then drawButton(frame,"btn_".._, f[1].caption, f[1].tooltip) end - end -end ----------------------------------------------------------------------------------------- ----------------------------Player List-------------------------------------------------- ----------------------------------------------------------------------------------------- -function drawPlayerList() - for i, player in pairs(game.connected_players) do - if player.gui.left.PlayerList == nil then - player.gui.left.add{type = "frame", name= "PlayerList", direction = "vertical"} - .add{type = "scroll-pane", name= "PlayerListScroll", direction = "vertical", vertical_scroll_policy="always", horizontal_scroll_policy="never"} - end - Plist= player.gui.left.PlayerList.PlayerListScroll - Plist.clear() - Plist.style.maximal_height = 200 - for i, player in pairs(game.connected_players) do - playerRank = getRank(player) - if playerRank.power <= 3 then - if playerRank.shortHand ~= '' then Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name , ' - '..playerRank.shortHand}} - else Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name}} end - Plist[player.name].style.font_color = playerRank.colour - player.tag = playerRank.tag - end - end - for i, player in pairs(game.connected_players) do - playerRank = getRank(player) - if playerRank.power > 3 then - if playerRank.shortHand ~= '' then Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name , ' - '..playerRank.shortHand}} - else Plist.add{type = "label", name=player.name, style="caption_label_style", caption={"", ticktohour(player.online_time), " H - " , player.name}} end - Plist[player.name].style.font_color = playerRank.colour - player.tag = playerRank.tag - end - end - end -end - -addButton('goto', - function(player,frame) - local p = game.players[frame.parent.name] - player.teleport(game.surfaces[p.surface.name].find_non_colliding_position("player", p.position, 32, 1)) -end) -addButton('bring', - function(player,frame) - local p = game.players[frame.parent.name] - p.teleport(game.surfaces[player.surface.name].find_non_colliding_position("player", player.position, 32, 1)) -end) -addButton('jail',function(player,frame) jailPlayer(game.players[frame.parent.name],player) end) -addButton('kill', - function(player,frame) - local p = game.players[frame.parent.name] - if p.character then p.character.die() end -end) -function drawPlayerTable(player, frame, commands, select,filters) - if frame.playerTable then frame.playerTable.destroy() end - frame.add{name='playerTable', type="table", colspan=5} - frame.playerTable.style.minimal_width = 500 - frame.playerTable.style.maximal_width = 500 - frame.playerTable.style.horizontal_spacing = 10 - frame.playerTable.add{name="id", type="label", caption="Id "} - frame.playerTable.add{name="Pname", type="label", caption="Name "} - if commands==false and select ==false then frame.playerTable.add{name="status", type="label", caption="Status "} end - frame.playerTable.add{name="online_time", type="label", caption="Online Time "} - frame.playerTable.add{name="rank", type="label", caption="Rank "} - if commands then frame.playerTable.add{name="commands", type="label", caption="Commands"} end - if select then frame.playerTable.add{name="select_label", type="label", caption="Selection"} end - for i, p in pairs(game.players) do - local addPlayer = true - for _,filter in pairs(filters) do - if filter == 'admin' then if p.admin == false then addPlayer = false break end - elseif filter == 'online' then if p.connected == false then addPlayer = false break end - elseif filter == 'offline' then if p.connected == true then addPlayer = false break end - elseif filter == 'lower' then if getRank(p).power <= getRank(player).power then addPlayer = false break end - elseif filter == 'selected' then local Break = nil for _,name in pairs(selected[player.index]) do if name == p.name then Break = true break end end if not Break then addPlayer = false break end - elseif type(filter)=='number' then if filter > ticktominutes(p.online_time) then addPlayer = false break end - elseif type(filter)=='string' then if p.name:lower():find(filter:lower()) == nil then addPlayer = false break end - end - end - if addPlayer == true and player.name ~= p.name then - if frame.playerTable[p.name] == nil then - frame.playerTable.add{name=i .. "id", type="label", caption=i} - frame.playerTable.add{name=p.name..'_name', type="label", caption=p.name} - if not commands and not select then - if p.connected == true then - frame.playerTable.add{name=p.name .. "Status", type="label", caption="ONLINE"} - else - frame.playerTable.add{name=p.name .. "Status", type="label", caption="OFFLINE"} - end - end - frame.playerTable.add{name=p.name .. "Online_Time", type="label", caption=(ticktohour(p.online_time)..'H '..(ticktominutes(p.online_time)-60*ticktohour(p.online_time))..'M')} - frame.playerTable.add{name=p.name .. "Rank", type="label", caption=p.tag} - if commands then - frame.playerTable.add{name=p.name, type="flow"} - drawButton(frame.playerTable[p.name],'goto','Tp','Goto to the players location') - drawButton(frame.playerTable[p.name],'bring','Br','Bring player player to your location') - if getRank(p).power > getRank(player).power then - drawButton(frame.playerTable[p.name],'jail','Ja','Jail/Unjail player') - drawButton(frame.playerTable[p.name],'kill','Ki','Kill this player') - end - elseif select then - frame.playerTable.add{name=p.name, type="flow"} - local state = false - for _,name in pairs(selected[player.index]) do if name == p.name then state = true break end end - frame.playerTable[p.name].add{name='select', type="checkbox",state=state} - end - end - end - end -end ----------------------------------------------------------------------------------------- ----------------------------Read Me Gui-------------------------------------------------- ----------------------------------------------------------------------------------------- -addFrame('Readme',6, 'Rules','Readme', 'Rules, Server info, How to chat, Playerlist, Adminlist.') - -addTab('Readme','Rules','The rules of the server', - function(player,frame) - local rules = { - "Hacking/cheating, exploiting and abusing bugs is not allowed.", - "Do not disrespect any player in the server (This includes staff).", - "Do not spam, this includes stuff such as chat spam, item spam, chest spam etc.", - "Do not laydown concrete with bots without permission.", - "Do not use active provider chests without permission.", - "Do not remove/move major parts of the factory without permission.", - "Do not walk in player random direction for no reason(to save map size).", - "Do not remove stuff just because you don't like it, tell people first.", - "Do not make train roundabouts.", - "Trains are Left Hand Drive (LHD) only.", - "Do not complain about lag, low fps and low ups or other things like that.", - "Do not ask for rank.", - "Use common sense and what an admin says goes."} - for i, rule in pairs(rules) do - frame.add{name=i, type="label", caption={"", i ,". ", rule}} - end - end) -addTab('Readme','Server Info','Info about the server', - function(player,frame) - frame.add{name=1, type="label", caption={"", "Discord voice and chat server:"}} - frame.add{name=2, type='textfield', text='https://discord.gg/RPCxzgt'}.style.minimal_width=400 - frame.add{name=3, type="label", caption={"", "Our forum:"}} - frame.add{name=4, type='textfield', text='https://explosivegaming.nl'}.style.minimal_width=400 - frame.add{name=5, type="label", caption={"", "Steam:"}} - frame.add{name=6, type='textfield', text='http://steamcommunity.com/groups/tntexplosivegaming'}.style.minimal_width=400 - end) -addTab('Readme','How to chat','Just in case you dont know how to chat', - function(player,frame) - local chat = { - "Chatting for new players can be difficult because it’s different than other games!", - "It’s very simple, the button you need to press is the “GRAVE/TILDE key”", - "it’s located under the “ESC key”. If you would like to change the key go to your", - "controls tab in options. The key you need to change is “Toggle Lua console”", - "it’s located in the second column 2nd from bottom."} - for i, line in pairs(chat) do - frame.add{name=i, type="label", caption={"", line}} - end - end) -addTab('Readme','Admins','List of all the people who can ban you :P', - function(player,frame) - local admins = { - "This list contains all the people that are admin in this world. Do you want to become", - "an admin dont ask for it! an admin will see what you've made and the time you put", - "in the server."} - for i, line in pairs(admins) do - frame.add{name=i, type="label", caption={"", line}} - end - drawPlayerTable(player, frame, false, false,{'admin'}) - end) -addTab('Readme','Players','List of all the people who have been on the server', - function(player,frame) - local players = { - "These are the players who have supported us in the making of this factory. Without", - "you the player we wouldn't have been as far as we are now."} - for i, line in pairs(players) do - frame.add{name=i, type="label", caption={"", line}} - end - frame.add{name='filterTable',type='table',colspan=3} - frame.filterTable.add{name='name_label',type='label',caption='Name'} - frame.filterTable.add{name='status_label',type='label',caption='Online?'} - frame.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'} - frame.filterTable.add{name='name_input',type='textfield'} - frame.filterTable.add{name='status_input',type='textfield'} - frame.filterTable.add{name='hours_input',type='textfield'} - drawPlayerTable(player, frame, false, false, {}) - end) ----------------------------------------------------------------------------------------- ----------------------------Admin Gui---------------------------------------------------- ----------------------------------------------------------------------------------------- -addFrame('Admin',2,'Player List','Admin',"All admin fuctions are here") - -addButton('btn_toolbar_automessage',function() autoMessage() end) -addButton('tp_all',function(player,frame) for i,p in pairs(game.connected_players) do local pos = game.surfaces[player.surface.name].find_non_colliding_position("player", player.position, 32, 1) if p ~= player then p.teleport(pos) end end end) -addButton('revive_dead_entitys_range',function(player,frame) if tonumber(frame.parent.range.text) then local range = tonumber(frame.parent.range.text) for key, entity in pairs(game.surfaces[1].find_entities_filtered({area={{player.position.x-range,player.position.y-range},{player.position.x+range,player.position.y+range}},type = "entity-ghost"})) do entity.revive() end end end) -addButton('add_dev_items',function(player,frame) player.insert{name="deconstruction-planner", count = 1} player.insert{name="blueprint-book", count = 1} player.insert{name="blueprint", count = 20} end) -addButton('sendMessage',function(player,frame) local rank = stringToRank(frame.parent.message.rank.text) if rank then callRank(frame.parent.message.message.text,rank.name) else for _,rank in pairs(ranks) do player.print(rank.name) end end end) -addButton('setRanks', - function(player,frame) - rank = stringToRank(frame.parent.rank_input.selected_index) - if rank then - for _,playerName in pairs(selected[player.index]) do - p=game.players[playerName] - if getRank(player).power < getRank(p).power and rank.power > getRank(player).power then - giveRank(p,rank,player) - else - player.print('You can not edit '..p.name.."'s rank there rank is too high (or the rank you have slected is above you)") - end - end - end - end) -addButton('clearSelection',function(player,frame) clearSelection(player) drawPlayerTable(player, frame.parent.parent, false, true, {}) end) - -addTab('Admin', 'Commands', 'Random useful commands', - function(player, frame) - drawButton(frame,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players') - drawButton(frame,'add_dev_items','Get Blueprints','Get all the blueprints') - drawButton(frame,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range') - frame.add{type='textfield',name='range',text='Range'} - frame.add{type='flow',name='message'} - frame.message.add{type='textfield',name='message',text='Enter message'} - frame.message.add{type='textfield',name='rank',text='Enter rank'} - drawButton(frame,'sendMessage','Send Message','Send a message to all ranks higher than the slected') - drawButton(frame,'tp_all','TP All Here','Brings all players to you') - end) -addTab('Admin','Edit Ranks', 'Edit the ranks of players below you', - function(player,frame) - clearSelection(player) - frame.add{name='filterTable',type='table',colspan=2} - frame.filterTable.add{name='name_label',type='label',caption='Name'} - frame.filterTable.add{name='sel_label',type='label',caption='Selected?'} - frame.filterTable.add{name='name_input',type='textfield'} - frame.filterTable.add{name='sel_input',type='textfield'} - frame.add{type='flow',name='rank',direction='horizontal'} - frame.rank.add{name='rank_label',type='label',caption='Rank'} - frame.rank.add{name='rank_input',type='drop-down'} - for _,rank in pairs(ranks) do if rank.power > getRank(player).power then frame.rank.rank_input.add_item(rank.name) end end - drawButton(frame.rank,'setRanks','Set Ranks','Sets the rank of all selected players') - drawButton(frame.rank,'clearSelection','Clear Selection','Clears all currently selected players') - drawPlayerTable(player, frame, false, true, {'lower'}) - end) -addTab('Admin', 'Player List', 'Send player message to all players', - function(player, frame) - frame.add{name='filterTable',type='table',colspan=2} - frame.filterTable.add{name='name_label',type='label',caption='Name'} - frame.filterTable.add{name='hours_label',type='label',caption='Online Time (minutes)'} - frame.filterTable.add{name='name_input',type='textfield'} - frame.filterTable.add{name='hours_input',type='textfield'} - drawPlayerTable(player, frame, true,false, {'online'}) - end) ----------------------------------------------------------------------------------------- ----------------------------Admin+ Gui--------------------------------------------------- ----------------------------------------------------------------------------------------- -addFrame('Admin+',1,'Modifiers','Admin+',"Because we are better") - -addButton('remove_biters',function(player,frame) for key, entity in pairs(game.surfaces[1].find_entities_filtered({force='enemy'})) do entity.destroy() end end) -addButton('toggle_cheat',function(player,frame) player.cheat_mode = not player.cheat_mode end) -addButton('revive_dead_entitys',function(player,frame) for key, entity in pairs(game.surfaces[1].find_entities_filtered({type = "entity-ghost"})) do entity.revive() end end) -addButton("btn_Modifier_apply", - function(player,frame) - local forceModifiers = { - "manual_mining_speed_modifier", - "manual_crafting_speed_modifier", - "character_running_speed_modifier", - "worker_robots_speed_modifier", - "worker_robots_storage_bonus", - "character_build_distance_bonus", - "character_item_drop_distance_bonus", - "character_reach_distance_bonus", - "character_resource_reach_distance_bonus", - "character_item_pickup_distance_bonus", - "character_loot_pickup_distance_bonus" - } - for i, modifier in pairs(forceModifiers) do - local number = tonumber(( frame.parent.parent.modifierTable[modifier .. "_input"].text):match("[%d]+[.%d+]")) - if number ~= nil then - if number >= 0 and number < 50 and number ~= player.force[modifier] then - player.force[modifier] = number - player.print(modifier .. " changed to number: " .. tostring(number)) - elseif number == player.force[modifier] then - player.print(modifier .. " Did not change") - else - player.print(modifier .. " needs to be player higher number or it contains an letter") - end - end - end - end) - -addTab('Admin+', 'Commands', 'Random useful commands', - function(player, frame) - drawButton(frame,'btn_toolbar_automessage','Auto Message','Send the auto message to all online players') - drawButton(frame,'add_dev_items','Get Blueprints','Get all the blueprints') - drawButton(frame,'revive_dead_entitys','Revive All Entitys','Brings all dead machines back to life') - drawButton(frame,'revive_dead_entitys_range','Revive Entitys','Brings all dead machines back to life in player range') - frame.add{type='textfield',name='range',text='Range'} - drawButton(frame,'remove_biters','Kill Biters','Removes all biters in map') - drawButton(frame,'tp_all','TP All Here','Brings all players to you') - drawButton(frame,'toggle_cheat','Toggle Cheat Mode','Toggle your cheat mode') - end) - -addTab('Admin+', 'Modifiers', 'Edit in game modifiers', - function(player,frame) - local forceModifiers = { - "manual_mining_speed_modifier", - "manual_crafting_speed_modifier", - "character_running_speed_modifier", - "worker_robots_speed_modifier", - "worker_robots_storage_bonus", - "character_build_distance_bonus", - "character_item_drop_distance_bonus", - "character_reach_distance_bonus", - "character_resource_reach_distance_bonus", - "character_item_pickup_distance_bonus", - "character_loot_pickup_distance_bonus" - } - frame.add{type = "flow", name= "flowNavigation",direction = "horizontal"} - frame.add{name="modifierTable", type="table", colspan=3} - frame.modifierTable.add{name="Mname", type="label", caption="name"} - frame.modifierTable.add{name="input", type="label", caption="input"} - frame.modifierTable.add{name="current", type="label", caption="current"} - for i, modifier in pairs(forceModifiers) do - frame.modifierTable.add{name=modifier, type="label", caption=modifier} - frame.modifierTable.add{name=modifier .. "_input", type="textfield", caption="inputTextField"} - frame.modifierTable.add{name=modifier .. "_current", type="label", caption=tostring(player.force[modifier])} - end - drawButton(frame.flowNavigation,"btn_Modifier_apply","Apply","Apply the new values to the game") -end) \ No newline at end of file