mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 19:45:22 +09:00
220 lines
9.2 KiB
Lua
220 lines
9.2 KiB
Lua
--- Adds a objective version to custom guis.
|
|
-- @module ExpGamingCore.Gui
|
|
-- @alias Gui
|
|
-- @author Cooldude2606
|
|
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
|
|
|
|
local Game = require('FactorioStdLib.Game')
|
|
local Color = require('FactorioStdLib.Color')
|
|
local Server -- ExpGamingCore.Server@?^4.0.0
|
|
|
|
local Gui = {}
|
|
local global = global()
|
|
--- Used to set and get data about different guis
|
|
-- @usage Gui.data[location] -- returns the gui data for that gui location ex center
|
|
-- @usage Gui.data(location,gui_name,gui_data) -- adds gui data for a gui at a location
|
|
-- @tparam string location the location to get/set the data, center left etc...
|
|
-- @tparam[opt] string key the name of the gui to set the value of
|
|
-- @param[opt] value the data that will be set can be any value but table advised
|
|
-- @treturn[1] table all the gui data that is locationed in that location
|
|
Gui.data = setmetatable({},{
|
|
__call=function(tbl,location,key,value)
|
|
if not location then return tbl end
|
|
if not key then return rawget(tbl,location) or rawset(tbl,location,{}) and rawget(tbl,location) end
|
|
if game then error('New guis cannot be added during runtime',2) end
|
|
if not rawget(tbl,location) then rawset(tbl,location,{}) end
|
|
rawset(rawget(tbl,location),key,value)
|
|
end
|
|
})
|
|
|
|
local events = {}
|
|
local order_config = require(module_path..'/order_config')
|
|
|
|
Gui.center = require(module_path..'/src/center',{Gui=Gui})
|
|
table.merge(events,Gui.center._events)
|
|
Gui.center._events = nil
|
|
|
|
Gui.inputs = require(module_path..'/src/inputs',{Gui=Gui})
|
|
table.merge(events,Gui.inputs._events)
|
|
Gui.inputs._events = nil
|
|
|
|
Gui.left = require(module_path..'/src/left',{Gui=Gui,order_config=order_config,self_global=global})
|
|
Gui.popup = require(module_path..'/src/popup',{Gui=Gui})
|
|
Gui.toolbar = require(module_path..'/src/toolbar',{Gui=Gui,order_config=order_config})
|
|
|
|
for event,callback in pairs(events) do script.on_event(event,callback) end
|
|
|
|
--- Add a white bar to any gui frame
|
|
-- @usage Gui.bar(frame,100)
|
|
-- @param frame the frame to draw the line to
|
|
-- @param[opt=10] width the width of the bar
|
|
-- @return the line that was made type is progressbar
|
|
function Gui.bar(frame,width)
|
|
local line = frame.add{
|
|
type='progressbar',
|
|
size=1,
|
|
value=1
|
|
}
|
|
line.style.height = 3
|
|
line.style.width = width or 10
|
|
line.style.color = defines.color.white
|
|
return line
|
|
end
|
|
|
|
--- Adds a lable that is centered
|
|
-- @usage Gui.centered_label(frane, 'Hello, world!')
|
|
-- @tparam LuaGuiElement frame the parent frame to add the label to
|
|
-- @tparam string string the string that the lable will have
|
|
function Gui.centered_label(frane, string)
|
|
local flow = frame.add {frame = 'flow'}
|
|
local flow_style = flow.style
|
|
flow_style.align = 'center'
|
|
flow_style.horizontally_stretchable = true
|
|
|
|
local label = flow.add {type = 'label', caption = string}
|
|
local label_style = label.style
|
|
label_style.align = 'center'
|
|
label_style.single_line = false
|
|
|
|
return label
|
|
end
|
|
|
|
--- Used to set the index of a drop down to a certian item
|
|
-- @usage Gui.set_dropdown_index(dropdown,player.name) -- will select the index with the players name as the value
|
|
-- @param dropdown the dropdown that is to be effected
|
|
-- @param _item this is the item to look for
|
|
-- @return returns the dropdown if it was successful
|
|
function Gui.set_dropdown_index(dropdown,_item)
|
|
if dropdown and dropdown.valid and dropdown.items and _item then else return end
|
|
local _index = 1
|
|
for index, item in pairs(dropdown.items) do
|
|
if item == _item then _index = index break end
|
|
end
|
|
dropdown.selected_index = _index
|
|
return dropdown
|
|
end
|
|
|
|
--- Prams for Gui.cam_link
|
|
-- @table ParametersForCamLink
|
|
-- @field entity this is the entity that the camera will follow
|
|
-- @field cam a camera that you already have in the gui
|
|
-- @field frame the frame to add the camera to, no effect if cam param is given
|
|
-- @field zoom the zoom to give the new camera
|
|
-- @field width the width to give the new camera
|
|
-- @field height the height to give the new camera
|
|
-- @field surface this will over ride the surface that the camera follows on, allowing for a 'ghost surface' while keeping same position
|
|
-- @field respawn_open if set to true then the camera will auto re link to the player after a respawn
|
|
|
|
--- Adds a camera that updates every tick (or less depeading on how many are opening) it will move to follow an entity
|
|
-- @usage Gui.cam_link{entity=game.player.character,frame=frame,width=50,hight=50,zoom=1}
|
|
-- @usage Gui.cam_link{entity=game.player.character,cam=frame.camera,surface=game.surfaces['testing']}
|
|
-- @tparam table data contains all other params given below
|
|
-- @return the camera that the function used be it made or given as a param
|
|
function Gui.cam_link(data)
|
|
if not data.entity or not data.entity.valid then return end
|
|
if is_type(data.cam,'table') and data.cam.__self and data.cam.valid then
|
|
data.cam = data.cam
|
|
elseif data.frame then
|
|
data.cam={}
|
|
data.cam.type='camera'
|
|
data.cam.name='camera'
|
|
data.cam.position= data.entity.position
|
|
data.cam.surface_index= data.surface and data.surface.index or data.entity.surface.index
|
|
data.cam.zomm = data.zoom
|
|
data.cam = data.frame.add(data.cam)
|
|
data.cam.style.width = data.width or 100
|
|
data.cam.style.height = data.height or 100
|
|
else return end
|
|
if not Server or not Server.get_thread('camera-follow') then
|
|
if not global.cams then
|
|
global.cams = {}
|
|
global.cam_index = 1
|
|
end
|
|
if data.cam then
|
|
local surface = data.surface and data.surface.index or nil
|
|
table.insert(global.cams,{cam=data.cam,entity=data.entity,surface=surface})
|
|
end
|
|
if not global.players then
|
|
global.players = {}
|
|
end
|
|
if data.respawn_open then
|
|
if data.entity.player then
|
|
if not global.players[data.entity.player.index] then global.players[data.entity.player.index] = {} end
|
|
table.insert(global.players[data.entity.player.index],data.cam)
|
|
end
|
|
end
|
|
else
|
|
local thread = Server.get_thread('camera-follow')
|
|
local surface = data.surface and data.surface.index or nil
|
|
table.insert(thread.data.cams,{cam=data.cam,entity=data.entity,surface=surface})
|
|
if data.respawn_open then
|
|
if data.entity.player then
|
|
if not thread.data.players[data.entity.player.index] then thread.data.players[data.entity.player.index] = {} end
|
|
table.insert(thread.data.players[data.entity.player.index],data.cam)
|
|
end
|
|
end
|
|
end
|
|
return data.cam
|
|
end
|
|
|
|
script.on_event('on_tick', function(event)
|
|
if Gui.left and ((event.tick+10)/(3600*game.speed)) % 15 == 0 then
|
|
Gui.left.update()
|
|
end
|
|
if loaded_modules['ExpGamingCore.Server'] then return end
|
|
|
|
if global.cams and is_type(global.cams,'table') and #global.cams > 0 then
|
|
local update = 4
|
|
if global.cam_index >= #global.cams then global.cam_index = 1 end
|
|
if update > #global.cams then update = #global.cams end
|
|
for cam_offset = 0,update do
|
|
local _cam = global.cams[global.cam_index]
|
|
if not _cam then break end
|
|
if not _cam.cam.valid then table.remove(global.cams,global.cam_index)
|
|
elseif not _cam.entity.valid then table.remove(global.cams,global.cam_index)
|
|
else _cam.cam.position = _cam.entity.position if not _cam.surface then _cam.cam.surface_index = _cam.entity.surface.index end global.cam_index = global.cam_index+1
|
|
end
|
|
end
|
|
global.cam_index = global.cam_index+update
|
|
end
|
|
end)
|
|
|
|
script.on_event('on_player_respawned',function(event)
|
|
if loaded_modules['ExpGamingCore.Server'] then return end
|
|
if global.players and is_type(global.players,'table') and #global.players > 0 and global.players[event.player_index] then
|
|
local remove = {}
|
|
for index,cam in pairs(global.players[event.player_index]) do
|
|
if cam.valid then table.insert(global.cams,{cam=cam,entity=player.character,surface=player.surface})
|
|
else table.insert(remove,index) end
|
|
end
|
|
for n,index in pairs(remove) do
|
|
table.remove(global.players[event.player_index],index-n+1)
|
|
end
|
|
end
|
|
end)
|
|
|
|
function Gui:on_init()
|
|
self.left:on_init(); self.left.on_init = nil
|
|
self.toolbar:on_init(); self.toolbar.on_init = nil
|
|
if loaded_modules['ExpGamingCore.Server@^4.0.0'] then Server = require('ExpGamingCore.Server@^4.0.0') verbose('ExpGamingCore.Server is installed; Loading server src') script.on_init(require(module_path..'/src/server',{Gui=self})) end
|
|
if loaded_modules['ExpGamingCore.Role@^4.0.0'] then
|
|
verbose('ExpGamingCore.Role is installed; Loading ranking src')
|
|
script.on_event('on_role_change',function(event)
|
|
self.toolbar.on_role_change(event)
|
|
self.center.on_role_change(event)
|
|
end)
|
|
end
|
|
script.on_event('on_player_joined_game',function(event)
|
|
self.toolbar.on_player_joined_game(event)
|
|
self.popup.on_player_joined_game(event)
|
|
self.left.on_player_joined_game(event)
|
|
end)
|
|
end
|
|
|
|
function Gui:on_post()
|
|
Gui.test = require(module_path..'/src/test',{Gui=Gui})
|
|
Gui.popup.load() Gui.popup.load = nil
|
|
end
|
|
|
|
|
|
return Gui |