Merge branch 'patch/5.7.1'

This commit is contained in:
Cooldude2606
2019-06-08 16:18:09 +01:00
10 changed files with 186 additions and 44 deletions

View File

@@ -56,6 +56,7 @@ All are welcome to make pull requests and issues for this scenario, if you are i
| Scenario Version* | Version Name | Factorio Version** | | Scenario Version* | Version Name | Factorio Version** |
|---|---|---| |---|---|---|
| [v5.7][s5.7] | Warp System | [v0.17.47][f0.17.47] |
| [v5.6][s5.6] | Information Guis | [v0.17.44][f0.17.44] | | [v5.6][s5.6] | Information Guis | [v0.17.44][f0.17.44] |
| [v5.5][s5.5] | Gui System | [v0.17.43][f0.17.43] | | [v5.5][s5.5] | Gui System | [v0.17.43][f0.17.43] |
| [v5.4][s5.4] | Admin Controls | [v0.17.32][f0.17.32] | | [v5.4][s5.4] | Admin Controls | [v0.17.32][f0.17.32] |
@@ -73,6 +74,7 @@ All are welcome to make pull requests and issues for this scenario, if you are i
\*\* Factorio versions show the version they were made for, often the minimum requirement. \*\* Factorio versions show the version they were made for, often the minimum requirement.
[s5.7]: https://github.com/explosivegaming/scenario/releases/tag/5.7.0
[s5.6]: https://github.com/explosivegaming/scenario/releases/tag/5.6.0 [s5.6]: https://github.com/explosivegaming/scenario/releases/tag/5.6.0
[s5.5]: https://github.com/explosivegaming/scenario/releases/tag/5.5.0 [s5.5]: https://github.com/explosivegaming/scenario/releases/tag/5.5.0
[s5.4]: https://github.com/explosivegaming/scenario/releases/tag/5.4.0 [s5.4]: https://github.com/explosivegaming/scenario/releases/tag/5.4.0
@@ -86,6 +88,7 @@ All are welcome to make pull requests and issues for this scenario, if you are i
[s1.0]: https://github.com/explosivegaming/scenario/releases/tag/v1.0 [s1.0]: https://github.com/explosivegaming/scenario/releases/tag/v1.0
[s0.1]: https://github.com/explosivegaming/scenario/releases/tag/v0.1 [s0.1]: https://github.com/explosivegaming/scenario/releases/tag/v0.1
[f0.17.47]: https://wiki.factorio.com/Version_history/0.17.0#0.17.47
[f0.17.44]: https://wiki.factorio.com/Version_history/0.17.0#0.17.44 [f0.17.44]: https://wiki.factorio.com/Version_history/0.17.0#0.17.44
[f0.17.43]: https://wiki.factorio.com/Version_history/0.17.0#0.17.43 [f0.17.43]: https://wiki.factorio.com/Version_history/0.17.0#0.17.43
[f0.17.32]: https://wiki.factorio.com/Version_history/0.17.0#0.17.32 [f0.17.32]: https://wiki.factorio.com/Version_history/0.17.0#0.17.32

View File

@@ -213,12 +213,13 @@ Gui.classes.left_frames = LeftFrames
LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame
LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it
LeftFrames._prototype:on_player_toggle(player,frame) --- Triggered when the player toggle the left frame
LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add
]] ]]
local CenterFrames = require 'expcore.gui.center' local CenterFrames = require 'expcore.gui.center'
Gui.get_center_flow = CenterFrames.get_flow Gui.get_center_flow = CenterFrames.get_flow
Gui.toggle_left_frame = CenterFrames.toggle_frame Gui.toggle_center_frame = CenterFrames.toggle_frame
Gui.draw_center_frame = CenterFrames.draw_frame Gui.draw_center_frame = CenterFrames.draw_frame
Gui.redraw_center_frame = CenterFrames.redraw_frames Gui.redraw_center_frame = CenterFrames.redraw_frames
Gui.new_center_frame = CenterFrames.new_frame Gui.new_center_frame = CenterFrames.new_frame

View File

@@ -45,6 +45,7 @@
LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame LeftFrames._prototype:on_draw(player,frame) --- Use to draw your elements to the new frame
LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it LeftFrames._prototype:on_update(player,frame) --- Use to edit your frame when there is no need to redraw it
LeftFrames._prototype:on_player_toggle(player,frame) --- Is triggered when the player presses the toggle button
LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add LeftFrames._prototype:event_handler(action) --- Creates an event handler that will trigger one of its functions, use with Event.add
]] ]]
local Gui = require 'expcore.gui.core' local Gui = require 'expcore.gui.core'
@@ -58,7 +59,8 @@ local LeftFrames = {
frames={}, frames={},
_prototype=Gui._prototype_factory{ _prototype=Gui._prototype_factory{
on_draw = Gui._event_factory('on_draw'), on_draw = Gui._event_factory('on_draw'),
on_update = Gui._event_factory('on_update') on_update = Gui._event_factory('on_update'),
on_player_toggle = Gui._event_factory('on_player_toggle')
} }
} }
setmetatable(LeftFrames._prototype, { setmetatable(LeftFrames._prototype, {
@@ -138,7 +140,12 @@ function LeftFrames.new_frame(permision_name)
mt.__call = self.event_handler mt.__call = self.event_handler
self:on_click(function(player,_element) self:on_click(function(player,_element)
self:toggle(player) local visible = self:toggle(player)
if self.events.on_player_toggle then
local frame = self:get_frame(player)
self.events.on_player_toggle(player,frame,visible)
end
end) end)
LeftFrames.frames[self.name] = self LeftFrames.frames[self.name] = self
@@ -258,6 +265,10 @@ Buttons.new_button()
for _,define in pairs(LeftFrames.frames) do for _,define in pairs(LeftFrames.frames) do
local frame = LeftFrames.get_frame(define.name,player) local frame = LeftFrames.get_frame(define.name,player)
frame.visible = false frame.visible = false
if define.events.on_player_toggle then
define.events.on_player_toggle(player,frame,false)
end
end end
element.visible = false element.visible = false
end) end)

View File

@@ -51,6 +51,7 @@
local Game = require 'utils.game' local Game = require 'utils.game'
local Event = require 'utils.event' local Event = require 'utils.event'
local Sudo = require 'expcore.sudo'
local Permissions_Groups = { local Permissions_Groups = {
groups={}, -- store for the different groups that are created groups={}, -- store for the different groups that are created
@@ -130,7 +131,7 @@ end
-- @treturn boolean true if the player was added successfully, false other wise -- @treturn boolean true if the player was added successfully, false other wise
function Permissions_Groups.set_player_group(player,group) function Permissions_Groups.set_player_group(player,group)
player = Game.get_player_from_any(player) player = Game.get_player_from_any(player)
local group = Permissions_Groups.get_group_by_name(group) group = Permissions_Groups.get_group_by_name(group)
if not group or not player then return false end if not group or not player then return false end
group:add_player(player) group:add_player(player)
return true return true
@@ -228,7 +229,7 @@ function Permissions_Groups._prototype:add_player(player)
player = Game.get_player_from_any(player) player = Game.get_player_from_any(player)
local group = self:get_raw() local group = self:get_raw()
if not group or not player then return false end if not group or not player then return false end
group.add_player(player) Sudo('add-player-to-permission-group',group,player)
return true return true
end end
@@ -239,7 +240,7 @@ function Permissions_Groups._prototype:remove_player(player)
player = Game.get_player_from_any(player) player = Game.get_player_from_any(player)
local group = self:get_raw() local group = self:get_raw()
if not group or not player then return false end if not group or not player then return false end
group.remove_player(player) Sudo('remove-player-from-permission-group',group,player)
return true return true
end end
@@ -279,4 +280,11 @@ Event.on_init(function()
Permissions_Groups.reload_permissions() Permissions_Groups.reload_permissions()
end) end)
Sudo.register('add-player-to-permission-group',function(permission_group,player)
permission_group.add_player(player)
end)
Sudo.register('remove-player-from-permission-group',function(permission_group,player)
permission_group.remove_player(player)
end)
return Permissions_Groups return Permissions_Groups

View File

@@ -158,6 +158,7 @@ local Game = require 'utils.game'
local Global = require 'utils.global' local Global = require 'utils.global'
local Event = require 'utils.event' local Event = require 'utils.event'
local Groups = require 'expcore.permission_groups' local Groups = require 'expcore.permission_groups'
local Sudo = require 'expcore.sudo'
local Colours = require 'resources.color_presets' local Colours = require 'resources.color_presets'
local write_json = ext_require('expcore.common','write_json') local write_json = ext_require('expcore.common','write_json')
@@ -466,7 +467,9 @@ end
-- flag param - player - the player that has had they roles changed -- flag param - player - the player that has had they roles changed
-- flag param - state - the state of the flag, aka if the flag is present -- flag param - state - the state of the flag, aka if the flag is present
function Roles.define_flag_trigger(name,callback) function Roles.define_flag_trigger(name,callback)
Roles.config.flags[name] = callback -- this can desync if there are upvalues local sudo_name = 'role-flag-'..name
Roles.config.flags[name] = sudo_name
Sudo.register(sudo_name,callback)
end end
--- Sets the default role which every player will have, this needs to be called at least once --- Sets the default role which every player will have, this needs to be called at least once
@@ -753,12 +756,9 @@ end
local function role_update(event) local function role_update(event)
local player = Game.get_player_by_index(event.player_index) local player = Game.get_player_by_index(event.player_index)
-- Updates flags given to the player -- Updates flags given to the player
for flag,callback in pairs(Roles.config.flags) do for flag,sudo_name in pairs(Roles.config.flags) do
local state = Roles.player_has_flag(player,flag) local state = Roles.player_has_flag(player,flag)
local success,err = pcall(callback,player,state) Sudo(sudo_name,player,state)
if not success then
log{'expcore-roles.error-log-format-flag',flag,err}
end
end end
-- Updates the players permission group -- Updates the players permission group
local highest = Roles.get_player_highest_role(player) local highest = Roles.get_player_highest_role(player)
@@ -766,7 +766,7 @@ local function role_update(event)
if highest.permission_group[1] then if highest.permission_group[1] then
local group = game.permissions.get_group(highest.permission_group[2]) local group = game.permissions.get_group(highest.permission_group[2])
if group then if group then
group.add_player(player) Sudo('add-player-to-permission-group',group,player)
end end
else else
Groups.set_player_group(player,highest.permission_group) Groups.set_player_group(player,highest.permission_group)

78
expcore/sudo.lua Normal file
View File

@@ -0,0 +1,78 @@
--- An extention of task and token to allow a single require to register and run functions bypassing all permissions
--[[
>>>> Usage
To use sudo you must register the allowed functions when the files are loaded, often this will just be giving access to
some functions within a module if you expect that some parts may be blocked by in game permissions or a custom system you have made
-- this will be blocked if the current player (from a command or gui) is not admin
local function make_admin(player)
player.admin = true
end
-- here we give sudo access to the function under the name "make-admin"
Sudo.register('make-admin',make_admin)
-- this will allow us to bypass this by runing one tick later outside of any player scope
Sudo.run('make-admin',game.player)
>>>> Functions
Sudo.register(name,callback) --- Registers a new callback under the given name, used to avoid desynces
Sudo.get(name) --- Gets the function that is registered under the given name
Sudo.run(name,...) --- Runs the function that is registered under the given name, you may supply any number of params as needed
]]
local Task = require 'utils.task'
local Token = require 'utils.token'
local Sudo = {
tokens={}
}
local internal_run =
Token.register(function(params)
local func = Token.get(params.token)
func(unpack(params.params))
end)
--- Registers a new callback under the given name, used to avoid desynces
-- @tparam string name the name that will be used to call this function
-- @tparam function callback the function that will be called by this name
function Sudo.register(name,callback)
if _LIFECYCLE == 8 then
error('Calling Sudo.register after on_init() or on_load() has run is a desync risk.', 2)
end
if Sudo.tokens[name] then
error(name..' is already registered',2)
end
Sudo.tokens[name] = Token.register(callback)
end
--- Gets the function that is registered under the given name
-- @tparam string name the name of the function you want to get
function Sudo.get(name)
local token = Sudo.tokens[name]
return token and Token.get(token)
end
--- Runs the function that is registered under the given name, you may supply any number of params as needed
-- @tparam name string the name of the function you want to run
-- @tparam[opt] any ... the other params that you want to pass to your function
function Sudo.run(name,...)
local token = Sudo.tokens[name]
if not token then
error('Sudo does not have access to run "'..tostring(name)..'" please make sure it is registered to sudo',2)
end
Task.set_timeout_in_ticks(1, internal_run, {
token = token,
params = {...}
})
end
return setmetatable(Sudo,{
__call = function(self,...)
self.run(...)
end
})

View File

@@ -84,7 +84,7 @@ main-caption=Warp List
main-tooltip=Warp list, must be within __1__ tiles to use main-tooltip=Warp list, must be within __1__ tiles to use
sub-tooltip=Warps can only be used every __1__ seconds and when within __2__ tiles sub-tooltip=Warps can only be used every __1__ seconds and when within __2__ tiles
too-close=Cant make warp; too close to warp: __1__ too-close=Cant make warp; too close to warp: __1__
last-edit=Last edited by __1__ at __2__ last-edit=Last edited by __1__ at __2__\nClick to view on map
add-tooltip=Add new warp add-tooltip=Add new warp
confirm-tooltip=Save changes confirm-tooltip=Save changes
cancel-tooltip=Discard changes cancel-tooltip=Discard changes

View File

@@ -11,7 +11,8 @@ local interface_modules = {
['Group']='expcore.permission_groups', ['Group']='expcore.permission_groups',
['Roles']='expcore.roles', ['Roles']='expcore.roles',
['Store']='expcore.store', ['Store']='expcore.store',
['Gui']='expcore.gui' ['Gui']='expcore.gui',
['Sudo']='expcore.sudo'
} }
-- loads all the modules given in the above table -- loads all the modules given in the above table

View File

@@ -82,7 +82,7 @@ Gui.new_button()
end) end)
:on_click(function(player,element) :on_click(function(player,element)
local reason = element.parent.entry.text or 'Non Given' local reason = element.parent.entry.text or 'Non Given'
local action_name = Store.get_child(action_name_store,player.name) local action_name = Store.get(action_name_store,player.name)
local reason_callback = config[action_name].reason_callback local reason_callback = config[action_name].reason_callback
reason_callback(player,reason) reason_callback(player,reason)
Store.clear(action_player_store,player.name) Store.clear(action_player_store,player.name)
@@ -339,6 +339,20 @@ player_list_name = player_list:uid()
Store.register(action_player_store,function(value,category) Store.register(action_player_store,function(value,category)
local player = Game.get_player_from_any(category) local player = Game.get_player_from_any(category)
update_action_bar(player) update_action_bar(player)
local frame = player_list:get_frame(player)
local data_table = frame.container.scroll.table
for _,next_player in pairs(game.connected_players) do
local element = data_table[next_player.name][open_action_bar.name]
local style = 'frame_button'
if next_player.name == value then
style = 'tool_button'
end
element.style = style
Gui.set_paddinge(element,-2,-2,-2,-2)
element.style.width = 8
element.style.height = 14
end
end) end)
--- When the action name is changed the reason input will update --- When the action name is changed the reason input will update

View File

@@ -12,16 +12,19 @@ local format_time,table_keys,table_values,table_keysort = ext_require('expcore.c
local warp_list local warp_list
local warp_name_store = 'gui.left.warps.names' local warp_name_store = 'gui.left.warps.names'
local warp_icon_store = 'gui.left.warps.tags' local warp_icon_store = 'gui.left.warps.tags'
local warp_player_in_range_store = 'gui.left.warps.allowed' local warp_player_in_range_store = 'gui.left.warps.in_range'
local warp_details = {} local warp_details = {}
local force_warps = {} local force_warps = {}
local keep_open = {}
Global.register({ Global.register({
warp_details=warp_details, warp_details=warp_details,
force_warps=force_warps force_warps=force_warps,
keep_open=keep_open
},function(tbl) },function(tbl)
force_warps = tbl.force_warps force_warps = tbl.force_warps
warp_details = tbl.warp_details warp_details = tbl.warp_details
keep_open = tbl.keep_open
end) end)
--- Returns if a player is allowed to edit the given warp --- Returns if a player is allowed to edit the given warp
@@ -236,6 +239,16 @@ local function remove_warp(warp_id)
warp_details[warp_id] = nil warp_details[warp_id] = nil
end end
--- Used on the name label to allow zoom to map
local zoom_to_map_name = Gui.uid_name()
Gui.on_click(zoom_to_map_name,function(event)
local warp_id = event.element.parent.name
local warp = warp_details[warp_id]
local position = warp.position
event.player.zoom_to_world(position,1.5)
end)
--- This timer controls when a player is able to warp, eg every 60 seconds --- This timer controls when a player is able to warp, eg every 60 seconds
local warp_timer = local warp_timer =
Gui.new_progressbar() Gui.new_progressbar()
@@ -247,7 +260,9 @@ Gui.new_progressbar()
style.color = Colors.light_blue style.color = Colors.light_blue
end) end)
:on_store_complete(function(player_name,reset) :on_store_complete(function(player_name,reset)
Store.set(warp_player_in_range_store,player_name,true) -- this is to force an update of the button
local in_range = Store.get(warp_player_in_range_store,player_name)
Store.set(warp_player_in_range_store,player_name,in_range)
end) end)
--- When the button is clicked it will teleport the player --- When the button is clicked it will teleport the player
@@ -274,7 +289,9 @@ end)
if config.bypass_warp_limits_permision and not Roles.player_allowed(player,config.bypass_warp_limits_permision) then if config.bypass_warp_limits_permision and not Roles.player_allowed(player,config.bypass_warp_limits_permision) then
warp_timer:set_store(player.name,0) warp_timer:set_store(player.name,0)
Store.set(warp_player_in_range_store,player.name,false) -- this is to force an update of the buttons
local in_range = Store.get(warp_player_in_range_store,player.name)
Store.set(warp_player_in_range_store,player.name,in_range)
end end
end) end)
@@ -453,11 +470,12 @@ function generate_warp(player,element,warp_id)
end end
-- draws/updates the warp area -- draws/updates the warp area
local element_type = warp_area.warp and warp_area.warp.type or nil local label_element = warp_area.warp or warp_area[zoom_to_map_name] or nil
local element_type = label_element and label_element.type or nil
if not editing and element_type == 'label' then if not editing and element_type == 'label' then
-- update the label already present -- update the label already present
warp_area.warp.caption = warp_name label_element.caption = warp_name
warp_area.warp.tooltip = {'warp-list.last-edit',last_edit_player,format_time(last_edit_time)} label_element.tooltip = {'warp-list.last-edit',last_edit_player,format_time(last_edit_time)}
icon_area[goto_warp.name].sprite = 'item/'..warp_icon icon_area[goto_warp.name].sprite = 'item/'..warp_icon
elseif not editing then elseif not editing then
@@ -485,7 +503,7 @@ function generate_warp(player,element,warp_id)
local label = local label =
warp_area.add{ warp_area.add{
name='warp', name=zoom_to_map_name,
type='label', type='label',
caption=warp_name, caption=warp_name,
tooltip={'warp-list.last-edit',last_edit_player,format_time(last_edit_time)} tooltip={'warp-list.last-edit',last_edit_player,format_time(last_edit_time)}
@@ -639,6 +657,9 @@ end)
generate_warp(player,data_table,warp_id) generate_warp(player,data_table,warp_id)
end end
end) end)
:on_player_toggle(function(player,element,visible)
keep_open[player.name] = visible
end)
--- When the name of a warp is updated this is triggered --- When the name of a warp is updated this is triggered
Store.register(warp_name_store,function(value,warp_id) Store.register(warp_name_store,function(value,warp_id)
@@ -691,6 +712,10 @@ Store.register(warp_player_in_range_store,function(value,player_name)
local timer = warp_timer:get_store(player_name) local timer = warp_timer:get_store(player_name)
local state = not timer and value local state = not timer and value
if not keep_open[player.name] then
Gui.toggle_left_frame(warp_list.name,player,value)
end
if force_warps[force.name] then if force_warps[force.name] then
for _,warp_id in pairs(force_warps[force.name]) do for _,warp_id in pairs(force_warps[force.name]) do
local element = table_area['icon-'..warp_id][goto_warp.name] local element = table_area['icon-'..warp_id][goto_warp.name]
@@ -717,35 +742,33 @@ Event.on_nth_tick(math.floor(60/config.update_smothing),function()
end end
for _,player in pairs(game.connected_players) do for _,player in pairs(game.connected_players) do
local timer = warp_timer:get_store(player.name) local was_in_range = Store.get(warp_player_in_range_store,player.name)
local role = config.bypass_warp_limits_permision and Roles.player_allowed(player,config.bypass_warp_limits_permision) local force = player.force
local warps = force_warps[force.name]
if not timer and not role then if warps then
local force = player.force local surface = player.surface.index
local warps = force_warps[force.name] local pos = player.position
local px,py = pos.x,pos.y
if warps then for _,warp_id in pairs(warps) do
local surface = player.surface.index local warp = warp_details[warp_id]
local pos = player.position local wpos = warp.position
local px,py = pos.x,pos.y if warp.surface.index == surface then
local dx,dy = px-wpos.x,py-wpos.y
for _,warp_id in pairs(warps) do if not warp.editing and (dx*dx)+(dy*dy) < rs2 or (dx*dx)+(dy*dy) < r2 then
local warp = warp_details[warp_id] if not was_in_range then
local wpos = warp.position
if warp.surface.index == surface then
local dx,dy = px-wpos.x,py-wpos.y
if not warp.editing and (dx*dx)+(dy*dy) < rs2 or (dx*dx)+(dy*dy) < r2 then
Store.set(warp_player_in_range_store,player.name,true) Store.set(warp_player_in_range_store,player.name,true)
return
end end
return
end end
end end
end
if was_in_range then
Store.set(warp_player_in_range_store,player.name,false) Store.set(warp_player_in_range_store,player.name,false)
end end
end end
end end
end) end)
@@ -757,6 +780,9 @@ Event.add(defines.events.on_player_created,function(event)
local allowed = config.bypass_warp_limits_permision and Roles.player_allowed(player,config.bypass_warp_limits_permision) or false local allowed = config.bypass_warp_limits_permision and Roles.player_allowed(player,config.bypass_warp_limits_permision) or false
Store.set(warp_player_in_range_store,player.name,allowed) Store.set(warp_player_in_range_store,player.name,allowed)
if allowed then
warp_timer:set_store(player.name,1)
end
if not force_warps[force_name] then if not force_warps[force_name] then
add_spawn(player) add_spawn(player)