Merge branch 'feature/player-list' into dev

This commit is contained in:
Cooldude2606
2019-05-26 21:45:43 +01:00
37 changed files with 734 additions and 177 deletions

View File

@@ -26,19 +26,20 @@ return {
'modules.addons.chat-popups',
'modules.addons.damage-popups',
'modules.addons.death-logger',
'modules.addons.advanced-starting-items',
'modules.addons.advanced-start',
'modules.addons.spawn-area',
'modules.addons.compilatron',
'modules.addons.scorched-earth',
'modules.addons.pollution-grading',
'modules.addons.random-player-colours',
-- GUI
'modules.gui.player-list',
'modules.commands.debug',
-- Config Files
'config.command_auth_admin', -- commands tagged with admin_only are blocked for non admins
'config.command_auth_roles', -- commands must be allowed via the role config
'config.command_auth_runtime_disable', -- allows commands to be enabled and disabled during runtime
'config.expcore-commands.auth_admin', -- commands tagged with admin_only are blocked for non admins
'config.expcore-commands.auth_roles', -- commands must be allowed via the role config
'config.expcore-commands.auth_runtime_disable', -- allows commands to be enabled and disabled during runtime
'config.permission_groups', -- loads some predefined permission groups
'config.roles', -- loads some predefined roles
'expcore.gui.test'
'expcore.gui.test' -- loads multiple gui defines to test the gui system
}

192
config/action_buttons.lua Normal file
View File

@@ -0,0 +1,192 @@
local Gui = require 'expcore.gui'
local Roles = require 'expcore.roles'
local Store = require 'expcore.store'
local Game = require 'utils.game'
local Reports = require 'modules.addons.reports-control'
local Jail = require 'modules.addons.jail-control'
local format_chat_player_name = ext_require('expcore.common','format_chat_player_name')
local action_player_store = 'gui.left.player-list.action-player'
local action_name_store = 'gui.left.player-list.action-name'
local function tool_button_style(style)
Gui.set_padding_style(style,-1,-1,-1,-1)
style.height = 28
style.width = 28
end
local function auth_lower_role(player,action_player_name)
local player_highest = Roles.get_player_highest_role(player)
local action_player_highest = Roles.get_player_highest_role(action_player_name)
if player_highest.index < action_player_highest.index then
return true
end
end
local function get_action_player(player)
local action_player_name = Store.get_child(action_player_store,player.name)
local action_player = Game.get_player_from_any(action_player_name)
local action_player_name_color = format_chat_player_name(action_player)
return action_player,action_player_name_color
end
local function teleport(from_player,to_player)
local surface = to_player.surface
local position = surface.find_non_colliding_position('character',to_player.position,32,1)
if not position then return false end -- return false if no new position
if from_player.driving then from_player.driving = false end -- kicks a player out a vehicle if in one
from_player.teleport(position,surface)
return true
end
local goto_player =
Gui.new_button()
:set_sprites('utility/export')
:set_tooltip{'player-list.goto-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
local action_player = get_action_player(player)
teleport(player,action_player)
end)
local bring_player =
Gui.new_button()
:set_sprites('utility/import')
:set_tooltip{'player-list.bring-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
local action_player = get_action_player(player)
teleport(action_player,player)
end)
local kill_player =
Gui.new_button()
:set_sprites('utility/too_far')
:set_tooltip{'player-list.kill-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
local action_player = get_action_player(player)
if action_player.character then
action_player.character.die()
end
end)
local report_player =
Gui.new_button()
:set_sprites('utility/spawn_flag')
:set_tooltip{'player-list.report-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
Store.set_child(action_name_store,player.name,'command/report')
end)
local function report_player_callback(player,reason)
local action_player,action_player_name_color = get_action_player(player)
local by_player_name_color = format_chat_player_name(player)
game.print{'expcom-report.non-admin',action_player_name_color,reason}
Roles.print_to_roles_higher('Trainee',{'expcom-report.admin',action_player_name_color,by_player_name_color,reason})
Reports.report_player(action_player,reason,player.name)
end
local jail_player =
Gui.new_button()
:set_sprites('utility/item_editor_icon')
:set_tooltip{'player-list.jail-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
Store.set_child(action_name_store,player.name,'command/jail')
end)
local function jail_player_callback(player,reason)
local action_player,action_player_name_color = get_action_player(player)
local by_player_name_color = format_chat_player_name(player)
game.print{'expcom-jail.give',action_player_name_color,by_player_name_color,reason}
Jail.jail_player(action_player,player.name)
end
local temp_ban_player =
Gui.new_button()
:set_sprites('utility/clock')
:set_tooltip{'player-list.temp-ban-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
Store.set_child(action_name_store,player.name,'command/temp-ban')
end)
local function temp_ban_player_callback(player,reason)
local action_player = get_action_player(player)
Jail.temp_ban_player(action_player,player.name,reason)
end
local kick_player =
Gui.new_button()
:set_sprites('utility/warning_icon')
:set_tooltip{'player-list.kick-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
Store.set_child(action_name_store,player.name,'command/kick')
end)
local function kick_player_callback(player,reason)
local action_player = get_action_player(player)
game.kick_player(action_player,reason)
end
local ban_player =
Gui.new_button()
:set_sprites('utility/danger_icon')
:set_tooltip{'player-list.ban-player'}
:set_style('tool_button',tool_button_style)
:on_click(function(player,element)
Store.set_child(action_name_store,player.name,'command/ban')
end)
local function ban_player_callback(player,reason)
local action_player = get_action_player(player)
game.ban_player(action_player,reason)
end
return {
['command/teleport'] = {
auth=function(player,action_player_name)
return player.name ~= action_player_name
end,
goto_player,
bring_player
},
['command/kill'] = {
auth=function(player,action_player_name)
if player.name == action_player_name then
return true
elseif Roles.player_allowed(player,'command/kill/always') then
return auth_lower_role(player,action_player_name)
end
end,
kill_player
},
['command/report'] = {
auth=auth_lower_role,
reason_callback=report_player_callback,
report_player
},
['command/jail'] = {
auth=auth_lower_role,
reason_callback=jail_player_callback,
jail_player
},
['command/temp-ban'] = {
auth=auth_lower_role,
reason_callback=temp_ban_player_callback,
temp_ban_player
},
['command/kick'] = {
auth=auth_lower_role,
reason_callback=kick_player_callback,
kick_player
},
['command/ban'] = {
auth=auth_lower_role,
reason_callback=ban_player_callback,
ban_player
}
}

View File

@@ -1,3 +0,0 @@
[command-auth]
admin-only=This command is for (game) admins only!
command-disabled=This command has been disabled by management!

View File

@@ -2,7 +2,7 @@
local Commands = require 'expcore.commands'
local Roles = require 'expcore.roles'
local auto_complete = ext_require('expcore.common','auto_complete')
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
Commands.add_parse('role',function(input,player,reject)
if not input then return end

View File

@@ -94,6 +94,8 @@ Roles.new_role('Trainee','TrMod')
'command/give-warning',
'command/get-warnings',
'command/get-reports',
'command/kick',
'command/ban',
}
--- Trusted Roles
@@ -181,6 +183,7 @@ local default = Roles.new_role('Guest','')
'command/chelp',
'command/list-roles',
'command/report',
'gui/player-list',
}
--- Jail role

View File

@@ -26,7 +26,7 @@ ext_require = require('expcore.common').ext_require
-- Please go to config/file_loader.lua to edit the files that are loaded
log('[INFO] Getting file loader config')
local files = require 'config.file_loader'
local files = require 'config._file_loader'
-- Loads all files from the config and logs that they are loaded
local total_file_count = string.format('%3d',#files)

View File

@@ -13,6 +13,8 @@ local Gui = require 'expcore.gui.core'
Gui._prototype:debug_name(name) --- Sets a debug alias for the define
Gui._prototype:set_caption(caption) --- Sets the caption for the element define
Gui._prototype:set_tooltip(tooltip) --- Sets the tooltip for the element define
Gui._prototype:set_style(style,callback) --- Sets the style for the element define
Gui._prototype:set_embeded_flow(state) --- Sets the element to be drawn inside a nameless flow, can be given a name using a function
Gui._prototype:on_element_update(callback) --- Add a hander to run on the general value update event, different classes will handle this event differently
Gui._prototype:set_pre_authenticator(callback) --- Sets an authenticator that blocks the draw function if check fails
@@ -34,6 +36,7 @@ local Gui = require 'expcore.gui.core'
Gui.toggle_enable(element) --- Will toggle the enabled state of an element
Gui.toggle_visible(element) --- Will toggle the visiblity of an element
Gui.set_padding(element,up,down,left,right) --- Sets the padding for a gui element
]]
local Instances = require 'expcore.gui.instances'
@@ -195,6 +198,7 @@ Gui.classes.left_frames = LeftFrames
LeftFrames.new_frame(permision_name) --- Creates a new left frame define
LeftFrames._prototype:set_open_by_default(state) --- Sets if the frame is visible when a player joins, can also be a function to return a boolean
LeftFrames._prototype:set_direction(direction) --- Sets the direction of the frame, either vertical or horizontal
LeftFrames._prototype:get_frame(player) --- Gets the frame for this define from the left frame flow
LeftFrames._prototype:is_open(player) --- Returns if the player currently has this define visible
LeftFrames._prototype:toggle(player) --- Toggles the visiblty of the left frame

View File

@@ -128,6 +128,8 @@
Gui._prototype:debug_name(name) --- Sets a debug alias for the define
Gui._prototype:set_caption(caption) --- Sets the caption for the element define
Gui._prototype:set_tooltip(tooltip) --- Sets the tooltip for the element define
Gui._prototype:set_style(style,callback) --- Sets the style for the element define
Gui._prototype:set_embeded_flow(state) --- Sets the element to be drawn inside a nameless flow, can be given a name using a function
Gui._prototype:on_element_update(callback) --- Add a hander to run on the general value update event, different classes will handle this event differently
Gui._prototype:set_pre_authenticator(callback) --- Sets an authenticator that blocks the draw function if check fails
@@ -149,6 +151,8 @@
Gui.toggle_enable(element) --- Will toggle the enabled state of an element
Gui.toggle_visible(element) --- Will toggle the visiblity of an element
Gui.set_padding(element,up,down,left,right) --- Sets the padding for a gui element
Gui.set_padding_style(style,up,down,left,right) --- Sets the padding for a gui style
]]
local Gui = require 'utils.gui'
local Game = require 'utils.game'
@@ -316,6 +320,28 @@ function Gui._prototype:set_tooltip(tooltip)
return self
end
--- Sets the style for the element define
-- @tparam style string the style that will be used for this element when drawn
-- @tapram[opt] callback function function is called when element is drawn to alter its style
-- @treturn self the element define to allow chaining
function Gui._prototype:set_style(style,callback)
self.draw_data.style = style
self.events.on_style = callback
return self
end
--- Sets the element to be drawn inside a nameless flow, can be given a name using a function
-- @tparam state ?boolean|function when true a padless flow is created to contain the element
-- @treturn self the element define to allow chaining
function Gui._prototype:set_embeded_flow(state)
if state == false or type(state) == 'function' then
self.embeded_flow = state
else
self.embeded_flow = true
end
return self
end
--- Sets an authenticator that blocks the draw function if check fails
-- @tparam callback function the function that will be ran to test if the element should be drawn or not
-- callback param - player LuaPlayer - the player that the element is being drawn to
@@ -358,8 +384,21 @@ function Gui._prototype:draw_to(element,...)
if not self.pre_authenticator(player,self.name) then return end
end
if self.embeded_flow then
local embeded_name
if type(self.embeded_flow) == 'function' then
embeded_name = self.embeded_flow(element,...)
end
element = element.add{type='flow',name=embeded_name}
Gui.set_padding(element)
end
local new_element = element.add(self.draw_data)
if self.events.on_style then
self.events.on_style(new_element.style)
end
if self.post_authenticator then
new_element.enabled = self.post_authenticator(player,self.name)
end
@@ -510,4 +549,17 @@ function Gui.set_padding(element,up,down,left,right)
style.right_padding = right or 0
end
--- Sets the padding for a gui style
-- @tparam element LuaStyle the element to set the padding for
-- @tparam[opt=0] up number the amount of padding on the top
-- @tparam[opt=0] down number the amount of padding on the bottom
-- @tparam[opt=0] left number the amount of padding on the left
-- @tparam[opt=0] right number the amount of padding on the right
function Gui.set_padding_style(style,up,down,left,right)
style.top_padding = up or 0
style.bottom_padding = down or 0
style.left_padding = left or 0
style.right_padding = right or 0
end
return Gui

View File

@@ -33,6 +33,7 @@
LeftFrames.new_frame(permision_name) --- Creates a new left frame define
LeftFrames._prototype:set_open_by_default(state) --- Sets if the frame is visible when a player joins, can also be a function to return a boolean
LeftFrames._prototype:set_direction(direction) --- Sets the direction of the frame, either vertical or horizontal
LeftFrames._prototype:get_frame(player) --- Gets the frame for this define from the left frame flow
LeftFrames._prototype:is_open(player) --- Returns if the player currently has this define visible
LeftFrames._prototype:toggle(player) --- Toggles the visiblty of the left frame
@@ -159,6 +160,13 @@ function LeftFrames._prototype:set_open_by_default(state)
return self
end
--- Sets the direction of the frame, either vertical or horizontal
-- @tparam direction string the direction to have the elements be added to thef frame
function LeftFrames._prototype:set_direction(direction)
self.direction = direction
return self
end
--- Gets the frame for this define from the left frame flow
-- @tparam player LuaPlayer the player to get the frame of
-- @treturn LuaGuiElement the frame in the left frame flow for this define
@@ -212,7 +220,7 @@ end
-- @tparam player LuaPlayer the player to update the frame of
function LeftFrames._prototype:redraw(player)
local frame = self:get_frame(player)
frame.claer()
frame.clear()
if self.events.on_draw then
self.events.on_draw(player,frame)
end
@@ -232,14 +240,17 @@ end
function LeftFrames._prototype:event_handler(action)
action = action or 'update'
return function(event)
local player = Game.get_player_by_index(event.player_index)
local player
if event.player_index then
player = Game.get_player_by_index(event.player_index)
end
self[action](self,player)
end
end
LeftFrames.toggle_button =
Buttons.new_button()
:set_tooltip('Close Windows')
:set_tooltip{'expcore-gui.left-button-tooltip'}
:set_caption('<')
:on_click(function(player,element)
for _,define in pairs(LeftFrames.frames) do
@@ -263,7 +274,8 @@ Event.add(defines.events.on_player_created,function(event)
for _,define in pairs(LeftFrames.frames) do
local frame = flow.add{
type='frame',
name=define.name
name=define.name,
direction=define.direction
}
if define.events.on_draw then

View File

@@ -1,9 +0,0 @@
[expcore-commands]
unauthorized=401 - Unbefugt: Zugang verweigert. Du hast keinen Zugriff auf diese Befehle!
reject-number-range=ungültige Reichweite, Min: __1__, Max: __2__
reject-string-max-length=ungültige Länge, Max: __1__
reject-player=ungültiger Spieler Name, __1__ , Versuche "Tab" zu benutzen, damit sich der Name automatisch vervollständigt.
reject-player-online=Der betroffene Spieler ist offline, Befehl konnte nicht ausgeführt werden.
reject-player-alive=Der betroffene Spieler ist Tod, Befehl konnte nicht ausgeführt werden.
invalid-inputs=ungültige Eingabe, /__1__ __2__
command-ran=Befehl ausgeführt.

View File

@@ -1,32 +0,0 @@
time-symbol-days-short=__1__d
[expcore-commands]
unauthorized=Unauthorized, Access is denied due to invalid credentials
reject-string-options=Invalid Option, Must be one of: __1__
reject-string-max-length=Invalid Length, Max: __1__
reject-number=Invalid Number.
reject-number-range=Invalid Range, Min (inclusive): __1__, Max (inclusive): __2__
reject-player=Invaild Player Name, __1__ ,try using tab key to auto-complete the name
reject-player-online=Player is offline.
reject-player-alive=Player is dead.
reject-force=Invaild Force Name.
reject-surface=Invaild Surface Name.
invalid-inputs=Invalid Input, /__1__ __2__
invalid-param=Invalid Param "__1__"; __2__
command-help=__1__ - __2__
command-ran=Command Complete
command-fail=Command failed to run: __1__
command-error-log-format=[ERROR] command/__1__ :: __2__
[expcore-roles]
error-log-format-flag=[ERROR] roleFlag/__1__ :: __2__
error-log-format-promote=[ERROR] rolePromote/__1__ :: __2__
game-message-assign=__1__ has been assigned to __2__ by __3__
game-message-unassign=__1__ has been unassigned from __2__ by __3__
reject-role=Invalid Role Name.
reject-player-role=Player has a higher role.
[gui_util]
button_tooltip=Shows / hides the Toolbar Gui buttons.
[expcore-gui]

View File

@@ -1,9 +0,0 @@
[expcore-commands]
unauthorized=401 - Onbevoegd: toegang wordt geweigerd vanwege ongeldige inloggegevens
reject-number-range=Onjuiste radius, Min: __1__, Max: __2__
reject-string-max-length=Onjuiste lengte, Max: __1__
reject-player=Onjuiste naam, __1__ , probeer tab te gebruiken om de naam automatisch in te vullen
reject-player-online=Speler is offline.
reject-player-alive=Speler is dood.
invalid-inputs=Onjuiste invoer, /__1__ __2__
command-ran=Commando uitgevoerd.

View File

@@ -1,9 +0,0 @@
[expcore-commands]
unauthorized=401 - Otillåten: Tillgång nekas på grund av otillräcklig säkerhetsprövning.
reject-number-range=Invalid räckvid, Min: __1__, Max: __2__
reject-string-max-length=ogiltig längd, Max: __1__
reject-player=Ogiltigt spelarnamn, __1__ , försök använda tab-tangenten för att auto-slutföra namn.
reject-player-online=Spelare är offline. Kommando misslyckades med att köras.
reject-player-alive=Spelare är död. Kommando misslyckades med att köras.
invalid-inputs=Igiltig inmatning, /__1__ __2__
command-ran=Kommandot slutfört

View File

@@ -1,38 +1,56 @@
[exp-commands]
kill-already-dead=You are already dead.
admin-chat-format=[Admin Chat] __1__: __2__
tp-no-position-found=No position to teleport to was found, please try again later.
tp-to-self=Player can not be teleported to themselves.
chelp-title=Help results for "__1__":
chelp-footer=[__1__ results found; page __2__ of __3__]
chelp-format=/__1__ __2__ - __3__ __4__
chelp-alias=Alias: __1__
chelp-out-of-range=__1__ is an invalid page number.
roles-higher-role=The role you tried to assign is higher than your highest.
roles-list=All roles are: __1__
roles-list-player=__1__ has: __2__
roles-list-element=__1__, __2__
jail-give=__1__ was jailed by __2__. Reason: __3__
jail-remove=__1__ was unjailed by __2__.
jail-already-jailed=__1__ is already in jail.
jail-not-jailed=__1__ is not currently in jail.
jail-temp-ban=__1__ was temp banned until next reset by __2__. Reason: __3__
jail-temp-ban-clear=__1__ was cleared from temp banned by __2__.
jail-not-temp-banned=__1__ is not currently temp banned.
jail-already-banned=__1__ is already banned.
report-player-immune=This player can not be reported.
report-non-admin=__1__ was reported for __2__.
report-admin=__1__ was reported by __2__ for __3__.
report-already-reported=You can only report a player once, you can ask a moderator to clear this report.
report-not-reported=The player had no reports on them.
report-player-count-title=The following players have reports against them:
report-player-report-title=__1__ has the following reports agasinst them:
report-list=__1__: __2__
report-removed=__1__ has one or more reports removed by __2__.
warnings-received=__1__ recived a warning from __2__ for __3__.
warnings-player=__1__ has __2__ warnings and __3__/__4__ script warnings.
warnings-list-tilte=The following player have this many warnings (and this many script warnings):
warnings-list=__1__: __2__ (__3__/__4__)
warnings-cleared=__1__ had all they warnings cleared by __2__.
spawn-unavailable=They was a problem getting you to spawn, please try again later.
repair-result=__1__ entites were revived and __2__ were healed to max health.
[expcom-kill]
already-dead=You are already dead.
[expcom-admin-chat]
format=[Admin Chat] __1__: __2__
[expcom-tp]
no-position-found=No position to teleport to was found, please try again later.
to-self=Player can not be teleported to themselves.
[expcom-chelp]
title=Help results for "__1__":
footer=[__1__ results found; page __2__ of __3__]
format=/__1__ __2__ - __3__ __4__
alias=Alias: __1__
out-of-range=__1__ is an invalid page number.
[expcom-roles]
higher-role=The role you tried to assign is higher than your highest.
list=All roles are: __1__
list-player=__1__ has: __2__
list-element=__1__, __2__
[expcom-jail]
give=__1__ was jailed by __2__. Reason: __3__
remove=__1__ was unjailed by __2__.
already-jailed=__1__ is already in jail.
not-jailed=__1__ is not currently in jail.
temp-ban=__1__ was temp banned until next reset by __2__. Reason: __3__
temp-ban-clear=__1__ was cleared from temp banned by __2__.
not-temp-banned=__1__ is not currently temp banned.
already-banned=__1__ is already banned.
[expcom-report]
player-immune=This player can not be reported.
non-admin=__1__ was reported for __2__.
admin=__1__ was reported by __2__ for __3__.
already-reported=You can only report a player once, you can ask a moderator to clear this report.
not-reported=The player had no reports on them.
player-count-title=The following players have reports against them:
player-report-title=__1__ has the following reports agasinst them:
list=__1__: __2__
removed=__1__ has one or more reports removed by __2__.
[expcom-warnings]
received=__1__ recived a warning from __2__ for __3__.
player=__1__ has __2__ warnings and __3__/__4__ script warnings.
list-tilte=The following player have this many warnings (and this many script warnings):
list=__1__: __2__ (__3__/__4__)
cleared=__1__ had all they warnings cleared by __2__.
[expcom-spawn]
unavailable=They was a problem getting you to spawn, please try again later.
[expcom-repair]
result=__1__ entites were revived and __2__ were healed to max health.

View File

@@ -1,4 +1,9 @@
time-symbol-days-short=__1__d
color-tag=[color=__1__]__2__[/color]
[time-format]
simple-format-tagged=__1__ __2__
simple-format-div=__1__:__2__
[expcore-commands]
unauthorized=Unauthorized, Access is denied due to invalid credentials
@@ -27,6 +32,7 @@ reject-role=Invalid Role Name.
reject-player-role=Player has a higher role.
[gui_util]
button_tooltip=Shows / hides the Toolbar Gui buttons.
button_tooltip=Shows/hides the toolbar.
[expcore-gui]
left-button-tooltip=Hide all open windows.

14
locale/en/gui.cfg Normal file
View File

@@ -0,0 +1,14 @@
[player-list]
open-action-bar=Options
close-action-bar=Close Options
reason-confirm=Confirm Reason
reason-entry=Enter Reason
goto-player=Goto player
bring-player=Bring player
kill-player=Kill player
report-player=Report player
jail-player=Jail player
temp-ban-player=Temp ban player
kick-player=Kick player
ban-player=Ban player
afk-time=__1__% of total map time\nLast moved __2__ ago

View File

@@ -1,7 +1,7 @@
--- Adds a better method of player starting items based on production levels.
local Event = require 'utils.event'
local Game = require 'utils.game'
local config = require 'config.advanced_starting_items'
local config = require 'config.advanced_start'
local items = config.items
Event.add(defines.events.on_player_created, function(event)

View File

@@ -9,15 +9,13 @@ Global.register(config,function(tbl)
config = tbl
end)
local white = Colours.white
local black = Colours.black
Event.add(defines.events.on_player_created,function(event)
local player = Game.get_player_by_index(event.player_index)
local color = 'white'
if config.players[player.name] then
color = config.players[player.name]
else
while not config.disallow[color] do
while config.disallow[color] do
color = table.get_random_dictionary_entry(Colours,true)
end
color = Colours[color]

View File

@@ -1,6 +1,6 @@
local Commands = require 'expcore.commands'
local format_chat_player_name = ext_require('expcore.common','format_chat_player_name')
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
Commands.new_command('admin-chat','Sends a message in chat that only admins can see.')
:add_param('message',false) -- the message to send in the admin chat
@@ -11,7 +11,7 @@ Commands.new_command('admin-chat','Sends a message in chat that only admins can
local player_name_colour = format_chat_player_name(player)
for _,return_player in pairs(game.connected_players) do
if return_player.admin then
return_player.print{'exp-commands.admin-chat-format',player_name_colour,message}
return_player.print{'expcom-admin-chat.format',player_name_colour,message}
end
end
return Commands.success -- prevents command complete message from showing

View File

@@ -1,5 +1,5 @@
local Commands = require 'expcore.commands'
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
Commands.new_command('toggle-cheat-mode','Toggles cheat mode for your player, or another player.')
:add_param('player',true,'player') -- player to toggle chest mode of, can be nil for self

View File

@@ -1,6 +1,6 @@
local Commands = require 'expcore.commands'
local move_items = ext_require('expcore.common','move_items')
require 'config.command_parse_roles'
require 'config.expcore-commands.parse_roles'
Commands.new_command('clear-inventory','Clears a players inventory')
:add_param('player',false,'player-role-alive')

View File

@@ -1,6 +1,6 @@
local Commands = require 'expcore.commands'
local Global = require 'utils.global'
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
local results_per_page = 5
@@ -42,9 +42,9 @@ Commands.new_command('chelp','Searches for a keyword in all commands you are all
-- adds the new command to the page
page_count = page_count + 1
found = found + 1
local alias_format = #command_data.aliases > 0 and {'exp-commands.chelp-alias',table.concat(command_data.aliases,', ')} or ''
local alias_format = #command_data.aliases > 0 and {'expcom-chelp.alias',table.concat(command_data.aliases,', ')} or ''
table.insert(pages[current_page],{
'exp-commands.chelp-format',
'expcom-chelp.format',
command_data.name,
command_data.description,
command_data.help,
@@ -60,15 +60,15 @@ Commands.new_command('chelp','Searches for a keyword in all commands you are all
end
-- print the requested page
keyword = keyword == '' and '<all>' or keyword
Commands.print({'exp-commands.chelp-title',keyword},'cyan')
Commands.print({'expcom-chelp.title',keyword},'cyan')
if pages[page] then
for _,command in pairs(pages[page]) do
Commands.print(command)
end
Commands.print({'exp-commands.chelp-footer',found,page,#pages},'cyan')
Commands.print({'expcom-chelp.footer',found,page,#pages},'cyan')
else
Commands.print({'exp-commands.chelp-footer',found,page,#pages},'cyan')
return Commands.error{'exp-commands.chelp-out-of-range',page}
Commands.print({'expcom-chelp.footer',found,page,#pages},'cyan')
return Commands.error{'expcom-chelp.out-of-range',page}
end
-- blocks command complete message
return Commands.success

View File

@@ -1,7 +1,7 @@
local Commands = require 'expcore.commands'
local JailControl = require 'modules.addons.jail-control'
local format_chat_player_name = ext_require('expcore.common','format_chat_player_name')
require 'config.command_parse_roles'
require 'config.expcore-commands.parse_roles'
Commands.new_command('jail','Puts a player into jail and removes all other roles.')
:add_param('player',false,'player-role')
@@ -12,9 +12,9 @@ Commands.new_command('jail','Puts a player into jail and removes all other roles
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
if JailControl.jail_player(action_player,player.name) then
game.print{'exp-commands.jail-give',action_player_name_color,by_player_name_color,reason}
game.print{'expcom-jail.give',action_player_name_color,by_player_name_color,reason}
else
return Commands.error{'exp-commands.jail-already-jailed',action_player_name_color}
return Commands.error{'expcom-jail.already-jailed',action_player_name_color}
end
end)
@@ -26,9 +26,9 @@ Commands.new_command('unjail','Puts a player into jail and removes all other rol
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
if JailControl.unjail_player(action_player,player.name) then
game.print{'exp-commands.jail-remove',action_player_name_color,by_player_name_color}
game.print{'expcom-jail.remove',action_player_name_color,by_player_name_color}
else
return Commands.error{'exp-commands.jail-not-jailed',action_player_name_color}
return Commands.error{'expcom-jail.not-jailed',action_player_name_color}
end
end)
@@ -40,9 +40,9 @@ Commands.new_command('temp-ban','Temp bans a player until the next reset; this r
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
if JailControl.temp_ban_player(action_player,player.name,reason) then
game.print{'exp-commands.jail-temp-ban',action_player_name_color,by_player_name_color,reason}
game.print{'expcom-jail.temp-ban',action_player_name_color,by_player_name_color,reason}
else
return Commands.error{'exp-commands.jail-already-banned',action_player_name_color}
return Commands.error{'expcom-jail.already-banned',action_player_name_color}
end
end)
@@ -54,8 +54,8 @@ Commands.new_command('clear-temp-ban','Removes temp ban from a player; this will
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
if JailControl.clear_temp_ban_player(action_player,player.name) then
game.print{'exp-commands.jail-temp-ban-clear',action_player_name_color,by_player_name_color}
game.print{'expcom-jail.temp-ban-clear',action_player_name_color,by_player_name_color}
else
return Commands.error{'exp-commands.jail-not-temp-banned',action_player_name_color}
return Commands.error{'expcom-jail.not-temp-banned',action_player_name_color}
end
end)

View File

@@ -1,7 +1,7 @@
local Commands = require 'expcore.commands'
local Roles = require 'expcore.roles'
require 'config.command_parse_general'
require 'config.command_parse_roles'
require 'config.expcore-commands.parse_general'
require 'config.expcore-commands.parse_roles'
Commands.new_command('kill','Kills yourself or another player.')
:add_param('player',true,'player-role-alive') -- the player to kill, must be alive to be valid
@@ -14,7 +14,7 @@ end}
:register(function(player,action_player,raw)
if not action_player then
-- can only be nil if no player given and the user is dead
return Commands.error{'exp-commands.kill-already-dead'}
return Commands.error{'expcom-kill.already-dead'}
end
if player == action_player then
action_player.character.die()

View File

@@ -1,6 +1,6 @@
local Commands = require 'expcore.commands'
local config = require 'config.repair'
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
local max_time_to_live = 4294967295 -- unit32 max
Commands.new_command('repair','Repairs entities on your force around you')
@@ -40,5 +40,5 @@ Commands.new_command('repair','Repairs entities on your force around you')
end
end
end
return Commands.success{'exp-commands.repair-result',revive_count,heal_count}
return Commands.success{'expcom-repair.result',revive_count,heal_count}
end)

View File

@@ -2,14 +2,14 @@ local Roles = require 'expcore.roles'
local Commands = require 'expcore.commands'
local ReportsControl = require 'modules.addons.reports-control'
local format_chat_player_name = ext_require('expcore.common','format_chat_player_name')
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
Commands.new_command('report','Reports a player and notifies moderators')
:add_param('player',false,function(input,player,reject)
input = Commands.parse('player',input,player,reject)
if not input then return end
if Roles.player_has_flag(input,'report-immune') then
return reject{'exp-commands.report-player-immune'}
return reject{'expcom-report.player-immune'}
else
return input
end
@@ -21,10 +21,10 @@ end)
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
if ReportsControl.report_player(action_player,reason,player.name) then
game.print{'exp-commands.report-non-admin',action_player_name_color,reason}
Roles.print_to_roles_higher('Trainee',{'exp-commands.report-admin',action_player_name_color,by_player_name_color,reason})
game.print{'expcom-report.non-admin',action_player_name_color,reason}
Roles.print_to_roles_higher('Trainee',{'expcom-report.admin',action_player_name_color,by_player_name_color,reason})
else
return Commands.error{'exp-commands.report-already-reported'}
return Commands.error{'expcom-report.already-reported'}
end
end)
@@ -35,18 +35,18 @@ Commands.new_command('get-reports','Gets a list of all reports that a player has
if action_player then
local reports = ReportsControl.get_player_reports(action_player)
local action_player_name_color = format_chat_player_name(action_player)
Commands.print{'exp-commands.report-player-report-title',action_player_name_color}
Commands.print{'expcom-report.player-report-title',action_player_name_color}
for player_name,reason in pairs(reports) do
local by_player_name_color = format_chat_player_name(player_name)
Commands.print{'exp-commands.report-list',by_player_name_color,reason}
Commands.print{'expcom-report.list',by_player_name_color,reason}
end
else
local user_reports = ReportsControl.user_reports
Commands.print{'exp-commands.report-player-count-title'}
Commands.print{'expcom-report.player-count-title'}
for player_name,reports in pairs(user_reports) do
local player_name_color = format_chat_player_name(player_name)
local report_count = ReportsControl.count_player_reports(player_name)
Commands.print{'exp-commands.report-list',player_name_color,report_count}
Commands.print{'expcom-report.list',player_name_color,report_count}
end
end
end)
@@ -57,14 +57,14 @@ Commands.new_command('clear-reports','Clears all reports from a player or just t
:register(function(player,action_player,from_player,raw)
if from_player then
if not ReportsControl.remove_player_report(action_player,from_player.name) then
return Commands.error{'exp-commands.report-not-reported'}
return Commands.error{'expcom-report.not-reported'}
end
else
if not ReportsControl.clear_player_reports(action_player) then
return Commands.error{'exp-commands.report-not-reported'}
return Commands.error{'expcom-report.not-reported'}
end
end
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
game.print{'exp-commands.report-removed',action_player_name_color,by_player_name_color}
game.print{'expcom-report.removed',action_player_name_color,by_player_name_color}
end)

View File

@@ -16,7 +16,7 @@ Commands.new_command('assign-role','Assigns a role to a player')
if player_highest.index < role.index then
Roles.assign_player(action_player,role,player.name)
else
return Commands.error{'exp-commands.roles-higher-role'}
return Commands.error{'expcom-roles.higher-role'}
end
end)
@@ -30,7 +30,7 @@ Commands.new_command('unassign-role','Unassigns a role from a player')
if player_highest.index < role.index then
Roles.unassign_player(action_player,role,player.name)
else
return Commands.error{'exp-commands.roles-higher-role'}
return Commands.error{'expcom-roles.higher-role'}
end
end)
@@ -39,7 +39,7 @@ Commands.new_command('list-roles','Lists all roles in they correct order')
:add_alias('lsroles','roles')
:register(function(player,action_player,raw)
local roles = Roles.config.order
local message = {'exp-commands.roles-list'}
local message = {'expcom-roles.list'}
if action_player then
roles = Roles.get_player_roles(action_player)
end
@@ -48,13 +48,13 @@ Commands.new_command('list-roles','Lists all roles in they correct order')
local colour = role.custom_color or Colours.white
local role_name = format_chat_colour_localized(role.name,colour)
if index == 1 then
message = {'exp-commands.roles-list',role_name}
message = {'expcom-roles.list',role_name}
if action_player then
local player_name_colour = format_chat_player_name(action_player)
message = {'exp-commands.roles-list-player',player_name_colour,role_name}
message = {'expcom-roles.list-player',player_name_colour,role_name}
end
else
message = {'exp-commands.roles-list-element',message,role_name}
message = {'expcom-roles.list-element',message,role_name}
end
end
return Commands.success(message)

View File

@@ -23,14 +23,14 @@ Commands.new_command('go-to-spawn','Teleport to spawn')
:add_alias('spawn','tp-spawn')
:register(function(player,action_player)
if not action_player then
return Commands.error{'exp-commands.spawn-unavailable'}
return Commands.error{'expcom-spawn.unavailable'}
elseif action_player == player then
if not teleport(player) then
return Commands.error{'exp-commands.spawn-unavailable'}
return Commands.error{'expcom-spawn.unavailable'}
end
elseif Roles.player_allowed(player,'command/go-to-spawn/always') then
if not teleport(action_player) then
return Commands.error{'exp-commands.spawn-unavailable'}
return Commands.error{'expcom-spawn.unavailable'}
end
else
return Commands.error{'expcore-commands.unauthorized'}

View File

@@ -1,7 +1,7 @@
local Commands = require 'expcore.commands'
local Roles = require 'expcore.roles'
require 'config.command_parse_general'
require 'config.command_parse_roles'
require 'config.expcore-commands.parse_general'
require 'config.expcore-commands.parse_roles'
Commands.new_command('tag','Sets your player tag.')
:add_param('tag',false,'string-max-length',20) -- new tag for your player max 20 char

View File

@@ -1,5 +1,5 @@
local Commands = require 'expcore.commands'
require 'config.command_parse_general'
require 'config.expcore-commands.parse_general'
local function teleport(from_player,to_player)
local surface = to_player.surface
@@ -18,11 +18,11 @@ Commands.new_command('teleport','Teleports a player to another player.')
:register(function(player,from_player,to_player,raw)
if from_player.index == to_player.index then
-- return if attempting to teleport to self
return Commands.error{'exp-commands.tp-to-self'}
return Commands.error{'expcom-tp.to-self'}
end
if not teleport(from_player,to_player) then
-- return if the teleport failed
return Commands.error{'exp-commands.tp-no-position-found'}
return Commands.error{'expcom-tp.no-position-found'}
end
end)
@@ -32,11 +32,11 @@ Commands.new_command('bring','Teleports a player to you.')
:register(function(player,from_player,raw)
if from_player.index == player.index then
-- return if attempting to teleport to self
return Commands.error{'exp-commands.tp-to-self'}
return Commands.error{'expcom-tp.to-self'}
end
if not teleport(from_player,player) then
-- return if the teleport failed
return Commands.error{'exp-commands.tp-no-position-found'}
return Commands.error{'expcom-tp.no-position-found'}
end
end)
@@ -47,10 +47,10 @@ Commands.new_command('goto','Teleports you to a player.')
:register(function(player,to_player,raw)
if to_player.index == player.index then
-- return if attempting to teleport to self
return Commands.error{'exp-commands.tp-to-self'}
return Commands.error{'expcom-tp.to-self'}
end
if not teleport(player,to_player) then
-- return if the teleport failed
return Commands.error{'exp-commands.tp-no-position-found'}
return Commands.error{'expcom-tp.no-position-found'}
end
end)

View File

@@ -2,7 +2,7 @@ local Commands = require 'expcore.commands'
local WarningsControl = require 'modules.addons.warnings-control'
local format_chat_player_name = ext_require('expcore.common','format_chat_player_name')
local config = require 'config.warnings'
require 'config.command_parse_roles'
require 'config.expcore-commands.parse_roles'
Commands.new_command('give-warning','Gives a warning to a player; may lead to automatic script action.')
:add_param('player',false,'player-role')
@@ -13,7 +13,7 @@ Commands.new_command('give-warning','Gives a warning to a player; may lead to au
WarningsControl.add_warnings(action_player,player.name)
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
game.print{'exp-commands.warnings-received',action_player_name_color,by_player_name_color,reason}
game.print{'expcom-warnings.received',action_player_name_color,by_player_name_color,reason}
end)
Commands.new_command('get-warnings','Gets the number of warnings a player has. If no player then lists all players and the number of warnings they have.')
@@ -24,7 +24,7 @@ Commands.new_command('get-warnings','Gets the number of warnings a player has. I
local warnings = WarningsControl.get_warnings(action_player)
local script_warnings = WarningsControl.get_temp_warnings(action_player)
local action_player_name_color = format_chat_player_name(action_player)
Commands.print{'exp-commands.warnings-player',action_player_name_color,warnings,script_warnings,config.temp_warning_limit}
Commands.print{'expcom-warnings.player',action_player_name_color,warnings,script_warnings,config.temp_warning_limit}
else
local rtn = {}
local user_warnings = WarningsControl.user_warnings
@@ -38,10 +38,10 @@ Commands.new_command('get-warnings','Gets the number of warnings a player has. I
end
rtn[player_name][2] = #warnings
end
Commands.print{'exp-commands.warnings-list-tilte'}
Commands.print{'expcom-warnings.list-tilte'}
for player_name,warnings in pairs(rtn) do
local player_name_color = format_chat_player_name(player_name)
Commands.print{'exp-commands.warnings-list',player_name_color,warnings[1],warnings[2],config.temp_warning_limit}
Commands.print{'expcom-warnings.list',player_name_color,warnings[1],warnings[2],config.temp_warning_limit}
end
end
end)
@@ -53,5 +53,5 @@ Commands.new_command('clear-warnings','Clears all warnings (and script warnings)
WarningsControl.clear_temp_warnings(action_player,player.name)
local action_player_name_color = format_chat_player_name(action_player)
local by_player_name_color = format_chat_player_name(player)
game.print{'exp-commands.warnings-cleared',action_player_name_color,by_player_name_color}
game.print{'expcom-warnings.cleared',action_player_name_color,by_player_name_color}
end)

319
modules/gui/player-list.lua Normal file
View File

@@ -0,0 +1,319 @@
--- Gui left frame define for a player list
local Gui = require 'expcore.gui'
local Roles = require 'expcore.roles'
local Store = require 'expcore.store'
local Game = require 'utils.game'
local Event = require 'utils.event'
local format_time = ext_require('expcore.common','format_time')
local config = require 'config.action_buttons'
local Colors = require 'resources.color_presets'
local action_player_store = 'gui.left.player-list.action-player'
local action_name_store = 'gui.left.player-list.action-name'
--- Button used to open the action bar
local open_action_bar =
Gui.new_button()
:set_sprites('utility/expand_dots_white')
:set_tooltip{'player-list.open-action-bar'}
:set_embeded_flow(function(element,action_player_name)
return action_player_name
end)
:set_style('frame_button',function(style)
Gui.set_padding_style(style,-2,-2,-2,-2)
style.width = 8
style.height = 14
end)
:on_click(function(player,element)
Store.set_child(action_player_store,player.name,element.parent.name)
end)
--- Button used to close the action bar
local close_action_bar =
Gui.new_button()
:set_sprites('utility/close_black')
:set_tooltip{'player-list.close-action-bar'}
:set_style('tool_button',function(style)
Gui.set_padding_style(style,-1,-1,-1,-1)
style.height = 28
style.width = 28
end)
:on_click(function(player,element)
Store.set_child(action_player_store,player.name,nil)
Store.set_child(action_name_store,player.name,nil)
end)
--- Button used to confirm a reason
local reasonc_confirm =
Gui.new_button()
:set_sprites('utility/confirm_slot')
:set_tooltip{'player-list.reason-confirm'}
:set_style('tool_button',function(style)
Gui.set_padding_style(style,-1,-1,-1,-1)
style.height = 28
style.width = 28
end)
:on_click(function(player,element)
local reason = element.parent.entry.text or 'Non Given'
local action_name = Store.get_child(action_name_store,player.name)
local reason_callback = config[action_name].reason_callback
reason_callback(player,reason)
Store.set_child(action_player_store,player.name,nil)
Store.set_child(action_name_store,player.name,nil)
element.parent.entry.text = ''
end)
--[[ Creates the main gui areas for the player list
element
> container
>> scroll
>>> table
>> action_bar
]]
local function generate_container(player,element)
Gui.set_padding(element,2,2,2,2)
element.style.minimal_width = 200
-- main container which contains the other elements
local container =
element.add{
name='container',
type='frame',
direction='vertical',
style='window_content_frame_packed'
}
Gui.set_padding(container)
-- a scroll bar which allows 8 players to be seen at once
local list_scroll =
container.add{
name='scroll',
type='scroll-pane',
direction='vertical',
horizontal_scroll_policy='never',
vertical_scroll_policy='auto-and-reserve-space'
}
Gui.set_padding(list_scroll,1,1,2,2)
list_scroll.style.horizontally_stretchable = true
list_scroll.style.maximal_height = 200
-- 3 wide table to contain: action button, player name, and play time
local list_table =
list_scroll.add{
name='table',
type='table',
column_count=3
}
Gui.set_padding(list_table)
list_table.style.horizontally_stretchable = true
list_table.style.vertical_align = 'center'
list_table.style.cell_padding = 0
-- action bar which contains the different action buttons
local action_bar =
container.add{
name='action_bar',
type='frame',
style='subfooter_frame'
}
Gui.set_padding(action_bar,1,1,3,3)
action_bar.style.horizontally_stretchable = true
action_bar.style.height = 35
-- reason bar which contains the reason text field and confirm button
local reason_bar =
container.add{
name='reason_bar',
type='frame',
style='subfooter_frame'
}
Gui.set_padding(reason_bar,-1,-1,3,3)
reason_bar.style.horizontally_stretchable = true
reason_bar.style.height = 35
local action_name = Store.get_child(action_name_store,player.name)
reason_bar.visible = action_name ~= nil
-- text entry for the reason bar
local reason_field =
reason_bar.add{
name='entry',
type='textfield',
style='stretchable_textfield',
tooltip={'player-list.reason-entry'}
}
Gui.set_padding(reason_field)
reason_field.style.height = 28
reason_field.style.minimal_width = 160
reasonc_confirm(reason_bar)
return list_table, action_bar
end
--- Adds buttons and permission flows to the action bar
local function generate_action_bar(player,element)
close_action_bar(element)
local action_player = Store.get_child(action_player_store,player.name)
for action_name,buttons in pairs(config) do
local permission_flow =
element.add{
type='flow',
name=action_name
}
for _,button in ipairs(buttons) do
button(permission_flow)
end
if not Roles.player_allowed(player,action_name) then
permission_flow.visible = false
end
if buttons.auth and action_player and not buttons.auth(player,action_player) then
permission_flow.visible = false
end
end
if not action_player then
element.visible = false
end
end
--- Updates the action bar
local player_list_name
local function update_action_bar(player)
local frame = Gui.classes.left_frames.get_frame(player_list_name,player)
local element = frame.container.action_bar
local action_player = Store.get_child(action_player_store,player.name)
if not action_player then
element.visible = false
else
element.visible = true
for action_name,buttons in pairs(config) do
if buttons.auth and not buttons.auth(player,action_player) then
element[action_name].visible = false
else
element[action_name].visible = true
end
end
end
end
local function add_player(list_table,player,role_name)
open_action_bar(list_table,player.name)
-- player name with the tooltip of their highest role and in they colour
local player_name =
list_table.add{
type='label',
caption=player.name,
tooltip=player.name..' '..player.tag..'\n'..role_name
}
Gui.set_padding(player_name,0,0,0,2)
player_name.style.font_color = player.chat_color
-- flow which allows right align for the play time
local time_flow =
list_table.add{
name='player-time-'..player.index,
type='flow'
}
Gui.set_padding(time_flow)
time_flow.style.horizontal_align = 'right'
time_flow.style.horizontally_stretchable = true
-- time given in Xh Ym and is right aligned
local tick = game.tick > 0 and game.tick or 1
local percent = math.round(player.online_time/tick,3)*100
local time =
time_flow.add{
name='label',
type='label',
caption=format_time(player.online_time),
tooltip={'player-list.afk-time',percent,format_time(player.afk_time,{minutes=true,long=true})}
}
Gui.set_padding(time)
end
--- Adds fake players to the player list
local function add_fake_players(list_table,count)
local role_name = 'Fake Player'
for i = 1,count do
add_player(list_table,{
name='Player '..i,
online_time=math.random(0,game.tick),
afk_time=math.random(0,game.tick),
chat_color=table.get_random_dictionary_entry(Colors)
},role_name)
end
end
--- Registers the player list
local player_list =
Gui.new_left_frame('gui/player-list')
:set_sprites('entity/character')
:set_open_by_default()
:set_direction('vertical')
:on_draw(function(player,element)
local list_table,action_bar = generate_container(player,element)
generate_action_bar(player,action_bar)
local players = {}
for _,next_player in pairs(game.connected_players) do
local highest_role = Roles.get_player_highest_role(next_player)
if not players[highest_role.name] then
players[highest_role.name] = {}
end
table.insert(players[highest_role.name],next_player)
end
for _,role_name in pairs(Roles.config.order) do
if players[role_name] then
for _,next_player in pairs(players[role_name]) do
add_player(list_table,next_player,role_name)
end
end
end
--add_fake_players(list_table,20)
end)
:on_update(function(player,element)
local list = element.container.scroll.table
for _,next_player in pairs(game.connected_players) do
local time_element_name = 'player-time-'..next_player.index
local time_element = list[time_element_name]
if time_element and time_element.valid then
time_element.label.caption = format_time(next_player.online_time)
local tick = game.tick > 0 and game.tick or 1
local percent = math.round(player.online_time/tick,3)*100
time_element.label.tooltip = {'player-list.afk-time',percent,format_time(player.afk_time,{minutes=true,long=true})}
end
end
end)
player_list_name = player_list:uid()
--- When the action player is changed the action bar will update
Store.register(action_player_store,function(value,category)
local player = Game.get_player_from_any(category)
update_action_bar(player)
end)
--- When the action name is changed the reason input will update
Store.register(action_name_store,function(value,category)
local player = Game.get_player_from_any(category)
local frame = Gui.classes.left_frames.get_frame(player_list_name,player)
local element = frame.container.reason_bar
element.visible = value ~= nil
end)
--- Many events which trigger the gui to be re drawn, it will also update the times every 30 seconds
Event.on_nth_tick(1800,player_list 'update_all')
Event.add(defines.events.on_player_joined_game,player_list 'redraw_all')
Event.add(defines.events.on_player_left_game,player_list 'redraw_all')
Event.add(Roles.player_role_assigned,player_list 'redraw_all')
Event.add(Roles.player_role_unassigned,player_list 'redraw_all')
return player_list