mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 03:25:23 +09:00
854 lines
40 KiB
Lua
854 lines
40 KiB
Lua
|
||
entityRemoved = {}
|
||
entityCache = {}
|
||
guis = {frames={},buttons={}}
|
||
--functions can not be included in the default list or be added by code
|
||
defaults = {
|
||
itemRotated = {},
|
||
ranks={
|
||
{name='Owner',shortHand='Owner',tag='[Owner]',power=0,colour={r=170,g=0,b=0}},
|
||
{name='Community Manager',shortHand='CM',tag='[Com Mngr]',power=1,colour={r=150,g=68,b=161}},
|
||
{name='Developer',shortHand='Dev',tag='[Dev]',power=1,colour={r=179,g=125,b=46}},
|
||
{name='Admin',shortHand='Admin',tag='[Admin]',power=2,colour={r=170,g=41,b=170}},
|
||
{name='Mod',shortHand='Mod',tag='[Mod]',power=3,colour={r=233,g=63,b=233}},
|
||
{name='Donator',shortHand='P2W',tag='[P2W]',power=4,colour={r=233,g=63,b=233}},
|
||
{name='Member',shortHand='Mem',tag='[Member]',power=5,colour={r=24,g=172,b=188}},
|
||
{name='Regular',shortHand='Reg',tag='[Regukar]',power=5,colour={r=24,g=172,b=188}},
|
||
{name='Guest',shortHand='',tag='[Guest]',power=6,colour={r=255,g=159,b=27}},
|
||
{name='Jail',shortHand='Jail',tag='[Jail]',power=7,colour={r=50,g=50,b=50}}
|
||
},
|
||
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 <system>',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)
|
||
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.text)
|
||
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
|
||
else
|
||
player.print(frame.parent.rank_input.text..' is not a Rank, Ranks are:') for _,rank in pairs(ranks) do if rank.power > getRank(player).power then player.print(rank.name) 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='textfield'}
|
||
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) |