1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-02-09 13:37:02 +02:00

Improved jail_data and how it handles different scenarios

This commit is contained in:
Gerkiz 2021-07-17 20:39:41 +02:00
parent 9687cc85fe
commit 64705020fd

View File

@ -10,11 +10,14 @@ local Utils = require 'utils.core'
local jailed_data_set = 'jailed' local jailed_data_set = 'jailed'
local jailed = {} local jailed = {}
local player_data = {} local player_data = {}
local terms_tbl = {}
local votejail = {} local votejail = {}
local votefree = {} local votefree = {}
local settings = { local settings = {
playtime_for_vote = 25920000, -- 5 days playtime_for_vote = 25920000, -- 5 days
playtime_for_instant_jail = 103680000, -- 20 days playtime_for_instant_jail = 103680000, -- 20 days
clear_voted_player = 36000, -- remove player from vote-tbl after 10 minutes
clear_terms_tbl = 3600,
votejail_count = 5, votejail_count = 5,
valid_surface = 'nauvis' valid_surface = 'nauvis'
} }
@ -34,7 +37,8 @@ Global.register(
votejail = votejail, votejail = votejail,
votefree = votefree, votefree = votefree,
settings = settings, settings = settings,
player_data = player_data player_data = player_data,
terms_tbl = terms_tbl
}, },
function(t) function(t)
jailed = t.jailed jailed = t.jailed
@ -42,6 +46,7 @@ Global.register(
votefree = t.votefree votefree = t.votefree
settings = t.settings settings = t.settings
player_data = t.player_data player_data = t.player_data
terms_tbl = t.terms_tbl
end end
) )
@ -55,6 +60,55 @@ local validate_entity = function(entity)
return true return true
end end
local clear_terms_tbl =
Token.register(
function(data)
local player = data.player
if not player then
return
end
if terms_tbl[player] then
terms_tbl[player] = nil
return
end
end
)
local play_alert_sound =
Token.register(
function(data)
local name = data.name
if not name then
return
end
local player = game.get_player(name)
if not player or not player.valid then
return
end
player.play_sound {path = 'utility/scenario_message', volume_modifier = 1}
end
)
local clear_jail_data_token =
Token.register(
function(data)
local griefer = data.griefer
if not griefer then
return
end
if votejail[griefer] and votejail[griefer].jailed then
return
end
local msg_two = 'You have been cleared of all accusations because not enough players voted against you.'
Utils.print_to(griefer, msg_two)
votejail[griefer] = nil
votefree[griefer] = nil
end
)
local clear_gui = local clear_gui =
Token.register( Token.register(
function(data) function(data)
@ -236,52 +290,6 @@ local teleport_player_to_gulag = function(player, action)
end end
end end
local on_player_changed_surface = function(event)
local player = game.players[event.player_index]
if not player or not player.valid then
return
end
if not jailed[player.name] then
return
end
local surface = game.surfaces['gulag']
if player.surface.index ~= surface.index then
local p_data = get_player_data(player)
if jailed[player.name] and p_data and p_data.locked then
teleport_player_to_gulag(player, 'jail')
end
end
end
local on_player_joined_game = function(event)
local player = game.players[event.player_index]
if not player or not player.valid then
return
end
if not jailed[player.name] then
return
end
local surface = game.surfaces['gulag']
if player.surface.index ~= surface.index then
local p_data = get_player_data(player)
if jailed[player.name] and p_data and p_data.locked then
teleport_player_to_gulag(player, 'jail')
end
end
local gulag = get_gulag_permission_group()
gulag.add_player(player)
if player.character and player.character.valid and player.character.driving then
player.character.driving = false
end
end
local validate_args = function(data) local validate_args = function(data)
local player = data.player local player = data.player
local griefer = data.griefer local griefer = data.griefer
@ -360,11 +368,21 @@ local validate_args = function(data)
end end
local vote_to_jail = function(player, griefer, msg) local vote_to_jail = function(player, griefer, msg)
if not griefer then
return
end
if type(griefer) == 'table' then
griefer = griefer.name
end
if not votejail[griefer] then if not votejail[griefer] then
votejail[griefer] = {index = 0, actor = player.name} votejail[griefer] = {index = 0, actor = player.name}
local message = player.name .. ' has started a vote to jail player ' .. griefer local message = player.name .. ' has started a vote to jail player ' .. griefer
Utils.print_to(nil, message) Utils.print_to(nil, message)
Task.set_timeout_in_ticks(settings.clear_voted_player, clear_jail_data_token, {griefer = griefer})
end end
if not votejail[griefer][player.name] then if not votejail[griefer][player.name] then
votejail[griefer][player.name] = true votejail[griefer][player.name] = true
votejail[griefer].index = votejail[griefer].index + 1 votejail[griefer].index = votejail[griefer].index + 1
@ -378,11 +396,20 @@ local vote_to_jail = function(player, griefer, msg)
end end
local vote_to_free = function(player, griefer) local vote_to_free = function(player, griefer)
if not griefer then
return
end
if type(griefer) == 'table' then
griefer = griefer.name
end
if not votefree[griefer] then if not votefree[griefer] then
votefree[griefer] = {index = 0, actor = player.name} votefree[griefer] = {index = 0, actor = player.name}
local message = player.name .. ' has started a vote to free player ' .. griefer local message = player.name .. ' has started a vote to free player ' .. griefer
Utils.print_to(nil, message) Utils.print_to(nil, message)
end end
if not votefree[griefer][player.name] then if not votefree[griefer][player.name] then
votefree[griefer][player.name] = true votefree[griefer][player.name] = true
votefree[griefer].index = votefree[griefer].index + 1 votefree[griefer].index = votefree[griefer].index + 1
@ -401,6 +428,7 @@ end
local jail = function(player, griefer, msg, raised) local jail = function(player, griefer, msg, raised)
player = player or 'script' player = player or 'script'
if jailed[griefer] then if jailed[griefer] then
return false return false
end end
@ -414,6 +442,7 @@ local jail = function(player, griefer, msg, raised)
end end
local g = game.players[griefer] local g = game.players[griefer]
teleport_player_to_gulag(g, 'jail') teleport_player_to_gulag(g, 'jail')
local gulag = get_gulag_permission_group() local gulag = get_gulag_permission_group()
@ -433,6 +462,10 @@ local jail = function(player, griefer, msg, raised)
Utils.print_to(nil, message) Utils.print_to(nil, message)
Utils.action_warning_embed('{Jailed}', message) Utils.action_warning_embed('{Jailed}', message)
if votejail[griefer] then
votejail[griefer].jailed = true
end
game.players[griefer].clear_console() game.players[griefer].clear_console()
Utils.print_to(griefer, message) Utils.print_to(griefer, message)
return true return true
@ -465,10 +498,10 @@ local is_jailed =
function(data) function(data)
local key = data.key local key = data.key
local value = data.value local value = data.value
if value then if value and value.jailed and value.reason then
if value.jailed then jail('script', key, value.reason, true)
jail(value.actor, key) else
end free('script', key)
end end
end end
) )
@ -546,15 +579,72 @@ function Public.get_jailed_table()
return jailed return jailed
end end
Event.add( Server.on_data_set_changed(
defines.events.on_player_joined_game, jailed_data_set,
function(event) function(data)
local player = game.get_player(event.player_index) if not data then
if not player or not player.valid then
return return
end end
Public.try_dl_data(player.name) local v = data.value
if v and v.actor then
if v.jailed then
jail(v.actor, data.key, v.reason, true)
elseif not v.jailed then
free('script', data.key)
end
end
end
)
commands.add_command(
'jail',
'Sends the player to gulag! Valid arguments are:\n/jail <LuaPlayer> <reason>',
function()
return
end
)
commands.add_command(
'free',
'Brings back the player from gulag.',
function()
return
end
)
function Public.required_playtime_for_instant_jail(value)
if value then
settings.playtime_for_instant_jail = value
end
return settings.playtime_for_instant_jail
end
function Public.set_valid_surface(value)
settings.valid_surface = value or 'nauvis'
return settings.valid_surface
end
function Public.required_playtime_for_vote(value)
if value then
settings.playtime_for_vote = value
end
return settings.playtime_for_vote
end
function Public.reset_vote_table()
for k, _ in pairs(votejail) do
votejail[k] = nil
end
for k, _ in pairs(votefree) do
votefree[k] = nil
end
end
Event.on_init(
function()
get_gulag_permission_group()
create_gulag_surface()
end end
) )
@ -604,12 +694,26 @@ Event.add(
return return
end end
local delay = 30
if game.players[griefer] then if game.players[griefer] then
griefer = game.players[griefer].name griefer = game.players[griefer].name
end end
if trusted and playtime >= settings.playtime_for_vote and playtime < settings.playtime_for_instant_jail and not player.admin then if trusted and playtime >= settings.playtime_for_vote and playtime < settings.playtime_for_instant_jail and not player.admin then
if cmd == 'jail' then if cmd == 'jail' then
if not terms_tbl[player.name] then
Utils.warning(player, 'Abusing the jail command will lead to revoked permissions. Jailing someone in case of disagreement is _NEVER_ OK!')
Utils.warning(player, 'Run this command again to if you really want to do this!')
for i = 1, 4 do
Task.set_timeout_in_ticks(delay, play_alert_sound, {name = player.name})
delay = delay + 30
end
terms_tbl[player.name] = true
Task.set_timeout_in_ticks(settings.clear_terms_tbl, clear_terms_tbl, {player = player.name})
return
end
Utils.warning(player, 'Logging your actions.')
vote_to_jail(player, griefer, message) vote_to_jail(player, griefer, message)
return return
elseif cmd == 'free' then elseif cmd == 'free' then
@ -620,9 +724,18 @@ Event.add(
if player.admin or playtime >= settings.playtime_for_instant_jail then if player.admin or playtime >= settings.playtime_for_instant_jail then
if cmd == 'jail' then if cmd == 'jail' then
if player.admin then if not terms_tbl[player.name] then
Utils.warning(player, 'Abusing the jail command will lead to revoked permissions. Jailing someone in case of disagreement is not OK!') Utils.warning(player, 'Abusing the jail command will lead to revoked permissions. Jailing someone in case of disagreement is _NEVER_ OK!')
Utils.warning(player, 'Run this command again to if you really want to do this!')
for i = 1, 4 do
Task.set_timeout_in_ticks(delay, play_alert_sound, {name = player.name})
delay = delay + 30
end
terms_tbl[player.name] = true
Task.set_timeout_in_ticks(settings.clear_terms_tbl, clear_terms_tbl, {player = player.name})
return
end end
Utils.warning(player, 'Logging your actions.')
Public.try_ul_data(griefer, true, player.name, message) Public.try_ul_data(griefer, true, player.name, message)
return return
elseif cmd == 'free' then elseif cmd == 'free' then
@ -634,67 +747,58 @@ Event.add(
end end
) )
Event.add(defines.events.on_player_joined_game, on_player_joined_game) Event.add(
Event.add(defines.events.on_player_changed_surface, on_player_changed_surface) defines.events.on_player_joined_game,
Event.on_init(create_gulag_surface) function(event)
local player = game.get_player(event.player_index)
if not player or not player.valid then
return
end
Server.on_data_set_changed( Public.try_dl_data(player.name)
jailed_data_set,
function(data) if not jailed[player.name] then
if data and data.value then return
if data.value.jailed and data.value.actor then end
jail(data.value.actor, data.key, data.value.reason, true)
local surface = game.surfaces['gulag']
if player.surface.index ~= surface.index then
local p_data = get_player_data(player)
if jailed[player.name] and p_data and p_data.locked then
teleport_player_to_gulag(player, 'jail')
end end
elseif data then end
free('script', data.key)
local gulag = get_gulag_permission_group()
gulag.add_player(player)
if player.character and player.character.valid and player.character.driving then
player.character.driving = false
end end
end end
) )
commands.add_command( Event.add(
'jail', defines.events.on_player_changed_surface,
'Sends the player to gulag! Valid arguments are:\n/jail <LuaPlayer> <reason>', function(event)
function() local player = game.players[event.player_index]
return if not player or not player.valid then
return
end
if not jailed[player.name] then
return
end
local surface = game.surfaces['gulag']
if player.surface.index ~= surface.index then
local p_data = get_player_data(player)
if jailed[player.name] and p_data and p_data.locked then
teleport_player_to_gulag(player, 'jail')
end
end
end end
) )
commands.add_command(
'free',
'Brings back the player from gulag.',
function()
return
end
)
function Public.required_playtime_for_instant_jail(value)
if value then
settings.playtime_for_instant_jail = value
end
return settings.playtime_for_instant_jail
end
function Public.set_valid_surface(value)
settings.valid_surface = value or 'nauvis'
return settings.valid_surface
end
function Public.required_playtime_for_vote(value)
if value then
settings.playtime_for_vote = value
end
return settings.playtime_for_vote
end
function Public.reset_vote_table()
for k, _ in pairs(votejail) do
votejail[k] = nil
end
for k, _ in pairs(votefree) do
votefree[k] = nil
end
end
Event.on_init(get_gulag_permission_group)
return Public return Public