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:
parent
9687cc85fe
commit
64705020fd
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user