mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2024-12-30 23:17:53 +02:00
minor changes
This commit is contained in:
parent
df097d7520
commit
78cba7f311
@ -6,373 +6,463 @@ local Tabs = require 'comfy_panel.main'
|
||||
|
||||
local Public = {}
|
||||
local this = {
|
||||
score_table = {},
|
||||
sort_by = {}
|
||||
score_table = {},
|
||||
sort_by = {}
|
||||
}
|
||||
|
||||
Global.register(
|
||||
this,
|
||||
function(t)
|
||||
this = t
|
||||
end
|
||||
this,
|
||||
function(t)
|
||||
this = t
|
||||
end
|
||||
)
|
||||
|
||||
local sorting_symbol = {ascending = "▲", descending = "▼"}
|
||||
local sorting_symbol = {ascending = '▲', descending = '▼'}
|
||||
local building_and_mining_blacklist = {
|
||||
["tile-ghost"] = true,
|
||||
["entity-ghost"] = true,
|
||||
["item-entity"] = true,
|
||||
['tile-ghost'] = true,
|
||||
['entity-ghost'] = true,
|
||||
['item-entity'] = true
|
||||
}
|
||||
|
||||
function Public.get_table()
|
||||
return this
|
||||
return this
|
||||
end
|
||||
|
||||
local function init_player_table(player)
|
||||
if not player then return end
|
||||
if not this.score_table[player.force.name] then this.score_table[player.force.name] = {} end
|
||||
if not this.score_table[player.force.name].players then this.score_table[player.force.name].players = {} end
|
||||
if not this.score_table[player.force.name].players[player.name] then
|
||||
this.score_table[player.force.name].players[player.name] = {
|
||||
built_entities = 0,
|
||||
deaths = 0,
|
||||
killscore = 0,
|
||||
mined_entities = 0,
|
||||
}
|
||||
end
|
||||
function Public.init_player_table(player)
|
||||
if not player then
|
||||
return
|
||||
end
|
||||
if not this.score_table[player.force.name] then
|
||||
this.score_table[player.force.name] = {}
|
||||
end
|
||||
if not this.score_table[player.force.name].players then
|
||||
this.score_table[player.force.name].players = {}
|
||||
end
|
||||
if not this.score_table[player.force.name].players[player.name] then
|
||||
this.score_table[player.force.name].players[player.name] = {
|
||||
built_entities = 0,
|
||||
deaths = 0,
|
||||
killscore = 0,
|
||||
mined_entities = 0
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local function get_score_list(force)
|
||||
local score_force = this.score_table[force]
|
||||
local score_list = {}
|
||||
for _, p in pairs(game.connected_players) do
|
||||
if score_force.players[p.name] then
|
||||
local score = score_force.players[p.name]
|
||||
table.insert(score_list, {
|
||||
name = p.name,
|
||||
killscore = score.killscore or 0,
|
||||
deaths = score.deaths or 0,
|
||||
built_entities = score.built_entities or 0,
|
||||
mined_entities = score.mined_entities or 0,
|
||||
})
|
||||
end
|
||||
end
|
||||
return score_list
|
||||
local score_force = this.score_table[force]
|
||||
local score_list = {}
|
||||
for _, p in pairs(game.connected_players) do
|
||||
if score_force.players[p.name] then
|
||||
local score = score_force.players[p.name]
|
||||
table.insert(
|
||||
score_list,
|
||||
{
|
||||
name = p.name,
|
||||
killscore = score.killscore or 0,
|
||||
deaths = score.deaths or 0,
|
||||
built_entities = score.built_entities or 0,
|
||||
mined_entities = score.mined_entities or 0
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
return score_list
|
||||
end
|
||||
|
||||
local function get_sorted_list(method, column_name, score_list)
|
||||
local comparators = {
|
||||
["ascending"] = function(a,b) return a[column_name] < b[column_name] end,
|
||||
["descending"] = function(a,b) return a[column_name] > b[column_name] end
|
||||
}
|
||||
table.sort(score_list, comparators[method])
|
||||
return score_list
|
||||
local comparators = {
|
||||
['ascending'] = function(a, b)
|
||||
return a[column_name] < b[column_name]
|
||||
end,
|
||||
['descending'] = function(a, b)
|
||||
return a[column_name] > b[column_name]
|
||||
end
|
||||
}
|
||||
table.sort(score_list, comparators[method])
|
||||
return score_list
|
||||
end
|
||||
|
||||
local biters = {"small-biter", "medium-biter", "big-biter", "behemoth-biter", "small-spitter", "medium-spitter", "big-spitter", "behemoth-spitter"}
|
||||
local biters = {
|
||||
'small-biter',
|
||||
'medium-biter',
|
||||
'big-biter',
|
||||
'behemoth-biter',
|
||||
'small-spitter',
|
||||
'medium-spitter',
|
||||
'big-spitter',
|
||||
'behemoth-spitter'
|
||||
}
|
||||
local function get_total_biter_killcount(force)
|
||||
local count = 0
|
||||
for _, biter in pairs(biters) do
|
||||
count = count + force.kill_count_statistics.get_input_count(biter)
|
||||
end
|
||||
return count
|
||||
local count = 0
|
||||
for _, biter in pairs(biters) do
|
||||
count = count + force.kill_count_statistics.get_input_count(biter)
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
local function add_global_stats(frame, player)
|
||||
local score = this.score_table[player.force.name]
|
||||
local t = frame.add { type = "table", column_count = 5}
|
||||
local score = this.score_table[player.force.name]
|
||||
local t = frame.add {type = 'table', column_count = 5}
|
||||
|
||||
local l = t.add { type = "label", caption = "Rockets launched: "}
|
||||
l.style.font = "default-game"
|
||||
l.style.font_color = {r = 175, g = 75, b = 255}
|
||||
l.style.minimal_width = 140
|
||||
local l = t.add {type = 'label', caption = 'Rockets launched: '}
|
||||
l.style.font = 'default-game'
|
||||
l.style.font_color = {r = 175, g = 75, b = 255}
|
||||
l.style.minimal_width = 140
|
||||
|
||||
local l = t.add { type = "label", caption = player.force.rockets_launched}
|
||||
l.style.font = "default-listbox"
|
||||
l.style.font_color = { r=0.9, g=0.9, b=0.9}
|
||||
l.style.minimal_width = 123
|
||||
local l = t.add {type = 'label', caption = player.force.rockets_launched}
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.9, g = 0.9, b = 0.9}
|
||||
l.style.minimal_width = 123
|
||||
|
||||
local l = t.add { type = "label", caption = "Dead bugs: "}
|
||||
l.style.font = "default-game"
|
||||
l.style.font_color = { r=0.90, g=0.3, b=0.3}
|
||||
l.style.minimal_width = 100
|
||||
local l = t.add {type = 'label', caption = 'Dead bugs: '}
|
||||
l.style.font = 'default-game'
|
||||
l.style.font_color = {r = 0.90, g = 0.3, b = 0.3}
|
||||
l.style.minimal_width = 100
|
||||
|
||||
local l = t.add { type = "label", caption = tostring(get_total_biter_killcount(player.force))}
|
||||
l.style.font = "default-listbox"
|
||||
l.style.font_color = { r=0.9, g=0.9, b=0.9}
|
||||
l.style.minimal_width = 145
|
||||
local l = t.add {type = 'label', caption = tostring(get_total_biter_killcount(player.force))}
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.9, g = 0.9, b = 0.9}
|
||||
l.style.minimal_width = 145
|
||||
|
||||
local l = t.add { type = "checkbox", caption = "Show floating numbers", state = global.show_floating_killscore[player.name], name = "show_floating_killscore_texts" }
|
||||
l.style.font_color = { r=0.8, g=0.8, b=0.8}
|
||||
local l =
|
||||
t.add {
|
||||
type = 'checkbox',
|
||||
caption = 'Show floating numbers',
|
||||
state = global.show_floating_killscore[player.name],
|
||||
name = 'show_floating_killscore_texts'
|
||||
}
|
||||
l.style.font_color = {r = 0.8, g = 0.8, b = 0.8}
|
||||
end
|
||||
|
||||
local show_score = (function (player, frame)
|
||||
frame.clear()
|
||||
local show_score = (function(player, frame)
|
||||
frame.clear()
|
||||
|
||||
init_player_table(player)
|
||||
Public.init_player_table(player)
|
||||
|
||||
-- Global stats : rockets, biters kills
|
||||
add_global_stats(frame, player)
|
||||
-- Global stats : rockets, biters kills
|
||||
add_global_stats(frame, player)
|
||||
|
||||
-- Separator
|
||||
local line = frame.add { type = "line"}
|
||||
line.style.top_margin = 8
|
||||
line.style.bottom_margin = 8
|
||||
|
||||
-- Score per player
|
||||
local t = frame.add { type = "table", column_count = 5 }
|
||||
-- Separator
|
||||
local line = frame.add {type = 'line'}
|
||||
line.style.top_margin = 8
|
||||
line.style.bottom_margin = 8
|
||||
|
||||
-- Score headers
|
||||
local headers = {
|
||||
{ name = "score_player", caption = "Player" },
|
||||
{ column = "killscore", name = "score_killscore", caption = "Killscore" },
|
||||
{ column = "deaths", name = "score_deaths", caption = "Deaths" },
|
||||
{ column = "built_entities", name = "score_built_entities", caption = "Built structures" },
|
||||
{ column = "mined_entities", name = "score_mined_entities", caption = "Mined entities" }
|
||||
}
|
||||
-- Score per player
|
||||
local t = frame.add {type = 'table', column_count = 5}
|
||||
|
||||
local sorting_pref = this.sort_by[player.name]
|
||||
for _, header in ipairs(headers) do
|
||||
local cap = header.caption
|
||||
-- Score headers
|
||||
local headers = {
|
||||
{name = 'score_player', caption = 'Player'},
|
||||
{column = 'killscore', name = 'score_killscore', caption = 'Killscore'},
|
||||
{column = 'deaths', name = 'score_deaths', caption = 'Deaths'},
|
||||
{column = 'built_entities', name = 'score_built_entities', caption = 'Built structures'},
|
||||
{column = 'mined_entities', name = 'score_mined_entities', caption = 'Mined entities'}
|
||||
}
|
||||
|
||||
-- Add sorting symbol if any
|
||||
if header.column and sorting_pref.column == header.column then
|
||||
local symbol = sorting_symbol[sorting_pref.method]
|
||||
cap = symbol .. cap
|
||||
end
|
||||
local sorting_pref = this.sort_by[player.name]
|
||||
for _, header in ipairs(headers) do
|
||||
local cap = header.caption
|
||||
|
||||
-- Header
|
||||
local label = t.add {
|
||||
type = "label",
|
||||
caption = cap,
|
||||
name = header.name
|
||||
}
|
||||
label.style.font = "default-listbox"
|
||||
label.style.font_color = { r=0.98, g=0.66, b=0.22 } -- yellow
|
||||
label.style.minimal_width = 150
|
||||
label.style.horizontal_align = "right"
|
||||
end
|
||||
-- Add sorting symbol if any
|
||||
if header.column and sorting_pref.column == header.column then
|
||||
local symbol = sorting_symbol[sorting_pref.method]
|
||||
cap = symbol .. cap
|
||||
end
|
||||
|
||||
-- Score list
|
||||
local score_list = get_score_list(player.force.name)
|
||||
-- Header
|
||||
local label =
|
||||
t.add {
|
||||
type = 'label',
|
||||
caption = cap,
|
||||
name = header.name
|
||||
}
|
||||
label.style.font = 'default-listbox'
|
||||
label.style.font_color = {r = 0.98, g = 0.66, b = 0.22} -- yellow
|
||||
label.style.minimal_width = 150
|
||||
label.style.horizontal_align = 'right'
|
||||
end
|
||||
|
||||
if #game.connected_players > 1 then
|
||||
score_list = get_sorted_list(sorting_pref.method, sorting_pref.column, score_list)
|
||||
end
|
||||
-- Score list
|
||||
local score_list = get_score_list(player.force.name)
|
||||
|
||||
-- New pane for scores (while keeping headers at same position)
|
||||
local scroll_pane = frame.add({ type = "scroll-pane", name = "score_scroll_pane", direction = "vertical", horizontal_scroll_policy = "never", vertical_scroll_policy = "auto"})
|
||||
scroll_pane.style.maximal_height = 400
|
||||
local t = scroll_pane.add { type = "table", column_count = 5}
|
||||
if #game.connected_players > 1 then
|
||||
score_list = get_sorted_list(sorting_pref.method, sorting_pref.column, score_list)
|
||||
end
|
||||
|
||||
-- Score entries
|
||||
for _, entry in pairs(score_list) do
|
||||
local p = game.players[entry.name]
|
||||
local special_color = {
|
||||
r = p.color.r * 0.6 + 0.4,
|
||||
g = p.color.g * 0.6 + 0.4,
|
||||
b = p.color.b * 0.6 + 0.4,
|
||||
a = 1
|
||||
}
|
||||
local line = {
|
||||
{ caption = entry.name, color = special_color },
|
||||
{ caption = tostring(entry.killscore) },
|
||||
{ caption = tostring(entry.deaths) },
|
||||
{ caption = tostring(entry.built_entities) },
|
||||
{ caption = tostring(entry.mined_entities) }
|
||||
}
|
||||
local default_color = { r=0.9, g=0.9, b=0.9 }
|
||||
-- New pane for scores (while keeping headers at same position)
|
||||
local scroll_pane =
|
||||
frame.add(
|
||||
{
|
||||
type = 'scroll-pane',
|
||||
name = 'score_scroll_pane',
|
||||
direction = 'vertical',
|
||||
horizontal_scroll_policy = 'never',
|
||||
vertical_scroll_policy = 'auto'
|
||||
}
|
||||
)
|
||||
scroll_pane.style.maximal_height = 400
|
||||
local t = scroll_pane.add {type = 'table', column_count = 5}
|
||||
|
||||
for _, column in ipairs(line) do
|
||||
local label = t.add {
|
||||
type = "label",
|
||||
caption = column.caption,
|
||||
color = column.color or default_color
|
||||
}
|
||||
label.style.font = "default"
|
||||
label.style.minimal_width = 150
|
||||
label.style.maximal_width = 150
|
||||
label.style.horizontal_align = "right"
|
||||
end -- foreach column
|
||||
end -- foreach entry
|
||||
end -- show_score
|
||||
)
|
||||
-- Score entries
|
||||
for _, entry in pairs(score_list) do
|
||||
local p = game.players[entry.name]
|
||||
local special_color = {
|
||||
r = p.color.r * 0.6 + 0.4,
|
||||
g = p.color.g * 0.6 + 0.4,
|
||||
b = p.color.b * 0.6 + 0.4,
|
||||
a = 1
|
||||
}
|
||||
local line = {
|
||||
{caption = entry.name, color = special_color},
|
||||
{caption = tostring(entry.killscore)},
|
||||
{caption = tostring(entry.deaths)},
|
||||
{caption = tostring(entry.built_entities)},
|
||||
{caption = tostring(entry.mined_entities)}
|
||||
}
|
||||
local default_color = {r = 0.9, g = 0.9, b = 0.9}
|
||||
|
||||
for _, column in ipairs(line) do
|
||||
local label =
|
||||
t.add {
|
||||
type = 'label',
|
||||
caption = column.caption,
|
||||
color = column.color or default_color
|
||||
}
|
||||
label.style.font = 'default'
|
||||
label.style.minimal_width = 150
|
||||
label.style.maximal_width = 150
|
||||
label.style.horizontal_align = 'right'
|
||||
end -- foreach column
|
||||
end -- foreach entry
|
||||
end) -- show_score
|
||||
|
||||
local function refresh_score_full()
|
||||
for _, player in pairs(game.connected_players) do
|
||||
local frame = Tabs.comfy_panel_get_active_frame(player)
|
||||
if frame then
|
||||
if frame.name == "Scoreboard" then
|
||||
show_score(player, frame)
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, player in pairs(game.connected_players) do
|
||||
local frame = Tabs.comfy_panel_get_active_frame(player)
|
||||
if frame then
|
||||
if frame.name == 'Scoreboard' then
|
||||
show_score(player, frame)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_joined_game(event)
|
||||
local player = game.players[event.player_index]
|
||||
init_player_table(player)
|
||||
if not this.sort_by[player.name] then
|
||||
this.sort_by[player.name] = {method = "descending", column = "killscore"}
|
||||
end
|
||||
if not global.show_floating_killscore then global.show_floating_killscore = {} end
|
||||
if not global.show_floating_killscore[player.name] then global.show_floating_killscore[player.name] = false end
|
||||
local player = game.players[event.player_index]
|
||||
Public.init_player_table(player)
|
||||
if not this.sort_by[player.name] then
|
||||
this.sort_by[player.name] = {method = 'descending', column = 'killscore'}
|
||||
end
|
||||
if not global.show_floating_killscore then
|
||||
global.show_floating_killscore = {}
|
||||
end
|
||||
if not global.show_floating_killscore[player.name] then
|
||||
global.show_floating_killscore[player.name] = false
|
||||
end
|
||||
end
|
||||
|
||||
local function on_gui_click(event)
|
||||
if not event then return end
|
||||
if not event.element then return end
|
||||
if not event.element.valid then return end
|
||||
if not event then
|
||||
return
|
||||
end
|
||||
if not event.element then
|
||||
return
|
||||
end
|
||||
if not event.element.valid then
|
||||
return
|
||||
end
|
||||
|
||||
local player = game.players[event.element.player_index]
|
||||
local frame = Tabs.comfy_panel_get_active_frame(player)
|
||||
if not frame then return end
|
||||
if frame.name ~= "Scoreboard" then return end
|
||||
|
||||
local name = event.element.name
|
||||
local player = game.players[event.element.player_index]
|
||||
local frame = Tabs.comfy_panel_get_active_frame(player)
|
||||
if not frame then
|
||||
return
|
||||
end
|
||||
if frame.name ~= 'Scoreboard' then
|
||||
return
|
||||
end
|
||||
|
||||
-- Handles click on the checkbox, for floating score
|
||||
if name == "show_floating_killscore_texts" then
|
||||
global.show_floating_killscore[player.name] = event.element.state
|
||||
return
|
||||
end
|
||||
local name = event.element.name
|
||||
|
||||
-- Handles click on a score header
|
||||
local element_to_column = {
|
||||
["score_killscore"] = "killscore",
|
||||
["score_deaths"] = "deaths",
|
||||
["score_built_entities"] = "built_entities",
|
||||
["score_mined_entities"] = "mined_entities"
|
||||
}
|
||||
local column = element_to_column[name]
|
||||
if column then
|
||||
local sorting_pref = this.sort_by[player.name]
|
||||
if sorting_pref.column == column and sorting_pref.method == "descending" then
|
||||
sorting_pref.method = "ascending"
|
||||
else
|
||||
sorting_pref.method = "descending"
|
||||
sorting_pref.column = column
|
||||
end
|
||||
show_score(player, frame)
|
||||
return
|
||||
end
|
||||
-- Handles click on the checkbox, for floating score
|
||||
if name == 'show_floating_killscore_texts' then
|
||||
global.show_floating_killscore[player.name] = event.element.state
|
||||
return
|
||||
end
|
||||
|
||||
-- No more to handle
|
||||
-- Handles click on a score header
|
||||
local element_to_column = {
|
||||
['score_killscore'] = 'killscore',
|
||||
['score_deaths'] = 'deaths',
|
||||
['score_built_entities'] = 'built_entities',
|
||||
['score_mined_entities'] = 'mined_entities'
|
||||
}
|
||||
local column = element_to_column[name]
|
||||
if column then
|
||||
local sorting_pref = this.sort_by[player.name]
|
||||
if sorting_pref.column == column and sorting_pref.method == 'descending' then
|
||||
sorting_pref.method = 'ascending'
|
||||
else
|
||||
sorting_pref.method = 'descending'
|
||||
sorting_pref.column = column
|
||||
end
|
||||
show_score(player, frame)
|
||||
return
|
||||
end
|
||||
|
||||
-- No more to handle
|
||||
end
|
||||
|
||||
local function on_rocket_launched(event)
|
||||
refresh_score_full()
|
||||
refresh_score_full()
|
||||
end
|
||||
|
||||
local entity_score_values = {
|
||||
["behemoth-biter"] = 100,
|
||||
["behemoth-spitter"] = 100,
|
||||
["behemoth-worm-turret"] = 300,
|
||||
["big-biter"] = 30,
|
||||
["big-spitter"] = 30,
|
||||
["big-worm-turret"] = 300,
|
||||
["biter-spawner"] = 200,
|
||||
["medium-biter"] = 15,
|
||||
["medium-spitter"] = 15,
|
||||
["medium-worm-turret"] = 150,
|
||||
["character"] = 1000,
|
||||
["small-biter"] = 5,
|
||||
["small-spitter"] = 5,
|
||||
["small-worm-turret"] = 50,
|
||||
["spitter-spawner"] = 200,
|
||||
["gun-turret"] = 50,
|
||||
["laser-turret"] = 150,
|
||||
["flamethrower-turret"] = 300,
|
||||
['behemoth-biter'] = 100,
|
||||
['behemoth-spitter'] = 100,
|
||||
['behemoth-worm-turret'] = 300,
|
||||
['big-biter'] = 30,
|
||||
['big-spitter'] = 30,
|
||||
['big-worm-turret'] = 300,
|
||||
['biter-spawner'] = 200,
|
||||
['medium-biter'] = 15,
|
||||
['medium-spitter'] = 15,
|
||||
['medium-worm-turret'] = 150,
|
||||
['character'] = 1000,
|
||||
['small-biter'] = 5,
|
||||
['small-spitter'] = 5,
|
||||
['small-worm-turret'] = 50,
|
||||
['spitter-spawner'] = 200,
|
||||
['gun-turret'] = 50,
|
||||
['laser-turret'] = 150,
|
||||
['flamethrower-turret'] = 300
|
||||
}
|
||||
|
||||
local function train_type_cause(event)
|
||||
local players = {}
|
||||
if event.cause.train.passengers then
|
||||
for _, player in pairs(event.cause.train.passengers) do
|
||||
players[#players + 1] = player
|
||||
end
|
||||
end
|
||||
return players
|
||||
local function train_type_cause(event)
|
||||
local players = {}
|
||||
if event.cause.train.passengers then
|
||||
for _, player in pairs(event.cause.train.passengers) do
|
||||
players[#players + 1] = player
|
||||
end
|
||||
end
|
||||
return players
|
||||
end
|
||||
|
||||
local kill_causes = {
|
||||
["character"] =
|
||||
function(event)
|
||||
if not event.cause.player then return end
|
||||
return {event.cause.player}
|
||||
end,
|
||||
["combat-robot"] =
|
||||
function(event)
|
||||
if not event.cause.last_user then return end
|
||||
if not game.players[event.cause.last_user.index] then return end
|
||||
return {game.players[event.cause.last_user.index]}
|
||||
end,
|
||||
["car"] =
|
||||
function(event)
|
||||
local players = {}
|
||||
local driver = event.cause.get_driver()
|
||||
if driver then
|
||||
if driver.player then players[#players + 1] = driver.player end
|
||||
end
|
||||
local passenger = event.cause.get_passenger()
|
||||
if passenger then
|
||||
if passenger.player then players[#players + 1] = passenger.player end
|
||||
end
|
||||
return players
|
||||
end,
|
||||
["locomotive"] = train_type_cause,
|
||||
["cargo-wagon"] = train_type_cause,
|
||||
["artillery-wagon"] = train_type_cause,
|
||||
["fluid-wagon"] = train_type_cause,
|
||||
['character'] = function(event)
|
||||
if not event.cause.player then
|
||||
return
|
||||
end
|
||||
return {event.cause.player}
|
||||
end,
|
||||
['combat-robot'] = function(event)
|
||||
if not event.cause.last_user then
|
||||
return
|
||||
end
|
||||
if not game.players[event.cause.last_user.index] then
|
||||
return
|
||||
end
|
||||
return {game.players[event.cause.last_user.index]}
|
||||
end,
|
||||
['car'] = function(event)
|
||||
local players = {}
|
||||
local driver = event.cause.get_driver()
|
||||
if driver then
|
||||
if driver.player then
|
||||
players[#players + 1] = driver.player
|
||||
end
|
||||
end
|
||||
local passenger = event.cause.get_passenger()
|
||||
if passenger then
|
||||
if passenger.player then
|
||||
players[#players + 1] = passenger.player
|
||||
end
|
||||
end
|
||||
return players
|
||||
end,
|
||||
['locomotive'] = train_type_cause,
|
||||
['cargo-wagon'] = train_type_cause,
|
||||
['artillery-wagon'] = train_type_cause,
|
||||
['fluid-wagon'] = train_type_cause
|
||||
}
|
||||
|
||||
local function on_entity_died(event)
|
||||
if not event.entity.valid then return end
|
||||
if not event.cause then return end
|
||||
if not event.cause.valid then return end
|
||||
if event.entity.force.index == event.cause.force.index then return end
|
||||
if not entity_score_values[event.entity.name] then return end
|
||||
if not kill_causes[event.cause.type] then return end
|
||||
local players_to_reward = kill_causes[event.cause.type](event)
|
||||
if not players_to_reward then return end
|
||||
if #players_to_reward == 0 then return end
|
||||
for _, player in pairs(players_to_reward) do
|
||||
init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.killscore = score.killscore + entity_score_values[event.entity.name]
|
||||
if global.show_floating_killscore[player.name] then
|
||||
event.entity.surface.create_entity({name = "flying-text", position = event.entity.position, text = tostring(entity_score_values[event.entity.name]), color = player.chat_color})
|
||||
end
|
||||
end
|
||||
end
|
||||
if not event.entity.valid then
|
||||
return
|
||||
end
|
||||
if not event.cause then
|
||||
return
|
||||
end
|
||||
if not event.cause.valid then
|
||||
return
|
||||
end
|
||||
if event.entity.force.index == event.cause.force.index then
|
||||
return
|
||||
end
|
||||
if not entity_score_values[event.entity.name] then
|
||||
return
|
||||
end
|
||||
if not kill_causes[event.cause.type] then
|
||||
return
|
||||
end
|
||||
local players_to_reward = kill_causes[event.cause.type](event)
|
||||
if not players_to_reward then
|
||||
return
|
||||
end
|
||||
if #players_to_reward == 0 then
|
||||
return
|
||||
end
|
||||
for _, player in pairs(players_to_reward) do
|
||||
Public.init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.killscore = score.killscore + entity_score_values[event.entity.name]
|
||||
if global.show_floating_killscore[player.name] then
|
||||
event.entity.surface.create_entity(
|
||||
{
|
||||
name = 'flying-text',
|
||||
position = event.entity.position,
|
||||
text = tostring(entity_score_values[event.entity.name]),
|
||||
color = player.chat_color
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_died(event)
|
||||
local player = game.players[event.player_index]
|
||||
init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.deaths = 1 + (score.deaths or 0)
|
||||
local player = game.players[event.player_index]
|
||||
Public.init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.deaths = 1 + (score.deaths or 0)
|
||||
end
|
||||
|
||||
local function on_player_mined_entity(event)
|
||||
if not event.entity.valid then return end
|
||||
if building_and_mining_blacklist[event.entity.type] then return end
|
||||
|
||||
local player = game.players[event.player_index]
|
||||
init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.mined_entities = 1 + (score.mined_entities or 0)
|
||||
if not event.entity.valid then
|
||||
return
|
||||
end
|
||||
if building_and_mining_blacklist[event.entity.type] then
|
||||
return
|
||||
end
|
||||
|
||||
local player = game.players[event.player_index]
|
||||
Public.init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.mined_entities = 1 + (score.mined_entities or 0)
|
||||
end
|
||||
|
||||
local function on_built_entity(event)
|
||||
if not event.created_entity.valid then return end
|
||||
if building_and_mining_blacklist[event.created_entity.type] then return end
|
||||
local player = game.players[event.player_index]
|
||||
init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.built_entities = 1 + (score.built_entities or 0)
|
||||
if not event.created_entity.valid then
|
||||
return
|
||||
end
|
||||
if building_and_mining_blacklist[event.created_entity.type] then
|
||||
return
|
||||
end
|
||||
local player = game.players[event.player_index]
|
||||
Public.init_player_table(player)
|
||||
local score = this.score_table[player.force.name].players[player.name]
|
||||
score.built_entities = 1 + (score.built_entities or 0)
|
||||
end
|
||||
|
||||
comfy_panel_tabs["Scoreboard"] = {gui = show_score, admin = false}
|
||||
comfy_panel_tabs['Scoreboard'] = {gui = show_score, admin = false}
|
||||
|
||||
Event.add(defines.events.on_player_mined_entity, on_player_mined_entity)
|
||||
Event.add(defines.events.on_player_died, on_player_died)
|
||||
@ -382,5 +472,4 @@ Event.add(defines.events.on_gui_click, on_gui_click)
|
||||
Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
||||
Event.add(defines.events.on_rocket_launched, on_rocket_launched)
|
||||
|
||||
|
||||
return Public
|
||||
return Public
|
||||
|
@ -1,6 +1,5 @@
|
||||
local radius = 9
|
||||
local math_random = math.random
|
||||
local math_sqrt = math.sqrt
|
||||
|
||||
local ammo_to_projectile_translation = {
|
||||
['shotgun-shell'] = 'shotgun-pellet',
|
||||
@ -12,7 +11,7 @@ local function create_projectile(surface, position, target, name)
|
||||
{
|
||||
name = name,
|
||||
position = position,
|
||||
force = force,
|
||||
force = 'player',
|
||||
source = position,
|
||||
target = target,
|
||||
max_range = 16,
|
||||
@ -45,7 +44,7 @@ local function bounce(surface, position, ammo)
|
||||
return
|
||||
end
|
||||
|
||||
for c = 1, math_random(3, 6), 1 do
|
||||
for _ = 1, math_random(3, 6), 1 do
|
||||
create_projectile(surface, position, valid_entities[math_random(1, #valid_entities)].position, ammo)
|
||||
end
|
||||
end
|
||||
|
@ -1,4 +1,4 @@
|
||||
local event = require 'utils.event'
|
||||
local Event = require 'utils.event'
|
||||
local FDT = require 'maps.fish_defender.table'
|
||||
local math_random = math.random
|
||||
|
||||
@ -24,4 +24,4 @@ local function on_entity_died(event)
|
||||
)
|
||||
end
|
||||
|
||||
event.add(defines.events.on_entity_died, on_entity_died)
|
||||
Event.add(defines.events.on_entity_died, on_entity_died)
|
||||
|
@ -103,7 +103,7 @@ end
|
||||
local function show_fd_stats(player)
|
||||
local gui_id = 'fd-stats'
|
||||
local table_id = gui_id .. 'table'
|
||||
local entity_limits = FDT.get('entity_limits')
|
||||
local this = FDT.get()
|
||||
|
||||
if player.gui.left[gui_id] then
|
||||
player.gui.left[gui_id].destroy()
|
||||
@ -127,7 +127,7 @@ local function show_fd_stats(player)
|
||||
h.style.font = 'heading-2'
|
||||
end
|
||||
|
||||
for k, v in pairs(entity_limits) do
|
||||
for k, v in pairs(this.entity_limits) do
|
||||
local name = v.str
|
||||
local placed = v.placed
|
||||
local limit = v.limit
|
||||
@ -194,16 +194,16 @@ local threat_values = {
|
||||
}
|
||||
|
||||
local function get_biter_initial_pool()
|
||||
local wave_count = FDT.get('wave_count')
|
||||
local this = FDT.get()
|
||||
local biter_pool
|
||||
if wave_count > 1750 then
|
||||
if this.wave_count > 1750 then
|
||||
biter_pool = {
|
||||
{name = 'behemoth-biter', threat = threat_values.behemoth_biter, weight = 2},
|
||||
{name = 'behemoth-spitter', threat = threat_values.behemoth_spitter, weight = 1}
|
||||
}
|
||||
return biter_pool
|
||||
end
|
||||
if wave_count > 1500 then
|
||||
if this.wave_count > 1500 then
|
||||
biter_pool = {
|
||||
{name = 'big-biter', threat = threat_values.big_biter, weight = 1},
|
||||
{name = 'behemoth-biter', threat = threat_values.behemoth_biter, weight = 2},
|
||||
@ -211,7 +211,7 @@ local function get_biter_initial_pool()
|
||||
}
|
||||
return biter_pool
|
||||
end
|
||||
if wave_count > 1250 then
|
||||
if this.wave_count > 1250 then
|
||||
biter_pool = {
|
||||
{name = 'big-biter', threat = threat_values.big_biter, weight = 2},
|
||||
{name = 'behemoth-biter', threat = threat_values.behemoth_biter, weight = 2},
|
||||
@ -219,7 +219,7 @@ local function get_biter_initial_pool()
|
||||
}
|
||||
return biter_pool
|
||||
end
|
||||
if wave_count > 1000 then
|
||||
if this.wave_count > 1000 then
|
||||
biter_pool = {
|
||||
{name = 'big-biter', threat = threat_values.big_biter, weight = 3},
|
||||
{name = 'behemoth-biter', threat = threat_values.behemoth_biter, weight = 2},
|
||||
@ -343,7 +343,11 @@ local function spawn_biter(pos, biter_pool)
|
||||
return false
|
||||
end
|
||||
|
||||
local surface = this.active_surface
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
biter_pool = shuffle(biter_pool)
|
||||
this.attack_wave_threat = this.attack_wave_threat - biter_pool[1].threat
|
||||
local valid_pos = surface.find_non_colliding_position(biter_pool[1].name, pos, 100, 2)
|
||||
@ -385,16 +389,16 @@ local function get_number_of_attack_groups()
|
||||
end
|
||||
|
||||
local function clear_corpses(surface)
|
||||
local wave_count = FDT.get('wave_count')
|
||||
local this = FDT.get()
|
||||
|
||||
if not wave_count then
|
||||
if not this.wave_count then
|
||||
return
|
||||
end
|
||||
local chance = 4
|
||||
if wave_count > 250 then
|
||||
if this.wave_count > 250 then
|
||||
chance = 3
|
||||
end
|
||||
if wave_count > 500 then
|
||||
if this.wave_count > 500 then
|
||||
chance = 2
|
||||
end
|
||||
for _, entity in pairs(surface.find_entities_filtered {type = 'corpse'}) do
|
||||
@ -406,8 +410,8 @@ end
|
||||
|
||||
local function send_unit_group(unit_group)
|
||||
local commands = {}
|
||||
local market = FDT.get('market')
|
||||
for x = unit_group.position.x, market.position.x, -48 do
|
||||
local this = FDT.get()
|
||||
for x = unit_group.position.x, this.market.position.x, -48 do
|
||||
local destination =
|
||||
unit_group.surface.find_non_colliding_position('stone-wall', {x = x, y = unit_group.position.y}, 32, 4)
|
||||
if destination then
|
||||
@ -421,13 +425,13 @@ local function send_unit_group(unit_group)
|
||||
end
|
||||
commands[#commands + 1] = {
|
||||
type = defines.command.attack_area,
|
||||
destination = {x = market.position.x, y = unit_group.position.y},
|
||||
destination = {x = this.market.position.x, y = unit_group.position.y},
|
||||
radius = 16,
|
||||
distraction = defines.distraction.by_enemy
|
||||
}
|
||||
commands[#commands + 1] = {
|
||||
type = defines.command.attack,
|
||||
target = market,
|
||||
target = this.market,
|
||||
distraction = defines.distraction.by_enemy
|
||||
}
|
||||
|
||||
@ -488,8 +492,8 @@ local function spawn_boss_units(surface)
|
||||
end
|
||||
|
||||
local function wake_up_the_biters(surface)
|
||||
local market = FDT.get('market')
|
||||
if not market or not market.valid then
|
||||
local this = FDT.get()
|
||||
if not this.market or not this.market.valid then
|
||||
return
|
||||
end
|
||||
|
||||
@ -534,7 +538,7 @@ local function wake_up_the_biters(surface)
|
||||
{
|
||||
command = {
|
||||
type = defines.command.attack,
|
||||
target = market,
|
||||
target = this.market,
|
||||
distraction = defines.distraction.none
|
||||
},
|
||||
unit_count = 16,
|
||||
@ -579,7 +583,10 @@ local function biter_attack_wave()
|
||||
if this.wave_grace_period then
|
||||
return
|
||||
end
|
||||
local surface = this.active_surface
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
clear_corpses(surface)
|
||||
wake_up_the_biters(surface)
|
||||
@ -742,13 +749,7 @@ local function get_mvps()
|
||||
end
|
||||
|
||||
local function is_game_lost()
|
||||
local market = FDT.get('market')
|
||||
if market then
|
||||
return
|
||||
end
|
||||
|
||||
local this = FDT.get()
|
||||
local l
|
||||
|
||||
for _, player in pairs(game.connected_players) do
|
||||
if player.gui.left['fish_defense_game_lost'] then
|
||||
@ -766,12 +767,15 @@ local function is_game_lost()
|
||||
f.style.font_color = {r = 0.65, g = 0.1, b = 0.99}
|
||||
|
||||
local t = f.add({type = 'table', column_count = 2})
|
||||
l = t.add({type = 'label', caption = 'Survival Time >> '})
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
|
||||
local survival_time_label = t.add({type = 'label', caption = 'Survival Time >> '})
|
||||
survival_time_label.style.font = 'default-listbox'
|
||||
survival_time_label.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
|
||||
local market_age_label
|
||||
|
||||
if this.market_age >= 216000 then
|
||||
l =
|
||||
market_age_label =
|
||||
t.add(
|
||||
{
|
||||
type = 'label',
|
||||
@ -779,42 +783,48 @@ local function is_game_lost()
|
||||
' hours ' .. math.ceil((this.market_age % 216000 / 60) / 60) .. ' minutes'
|
||||
}
|
||||
)
|
||||
l.style.font = 'default-bold'
|
||||
l.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
market_age_label.style.font = 'default-bold'
|
||||
market_age_label.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
else
|
||||
l = t.add({type = 'label', caption = math.ceil((this.market_age % 216000 / 60) / 60) .. ' minutes'})
|
||||
l.style.font = 'default-bold'
|
||||
l.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
market_age_label =
|
||||
t.add({type = 'label', caption = math.ceil((this.market_age % 216000 / 60) / 60) .. ' minutes'})
|
||||
market_age_label.style.font = 'default-bold'
|
||||
market_age_label.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
end
|
||||
|
||||
local mvp = get_mvps()
|
||||
if mvp then
|
||||
l = t.add({type = 'label', caption = 'MVP Defender >> '})
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
l = t.add({type = 'label', caption = mvp.killscore.name .. ' with a score of ' .. mvp.killscore.score})
|
||||
l.style.font = 'default-bold'
|
||||
l.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
local mvp_defender_label = t.add({type = 'label', caption = 'MVP Defender >> '})
|
||||
mvp_defender_label.style.font = 'default-listbox'
|
||||
mvp_defender_label.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
|
||||
l = t.add({type = 'label', caption = 'MVP Builder >> '})
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
l =
|
||||
local mvp_killscore_label =
|
||||
t.add({type = 'label', caption = mvp.killscore.name .. ' with a score of ' .. mvp.killscore.score})
|
||||
mvp_killscore_label.style.font = 'default-bold'
|
||||
mvp_killscore_label.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
|
||||
local mvp_builder_label = t.add({type = 'label', caption = 'MVP Builder >> '})
|
||||
mvp_builder_label.style.font = 'default-listbox'
|
||||
mvp_builder_label.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
|
||||
local mvp_built_ent_label =
|
||||
t.add(
|
||||
{
|
||||
type = 'label',
|
||||
caption = mvp.built_entities.name .. ' built ' .. mvp.built_entities.score .. ' things'
|
||||
}
|
||||
)
|
||||
l.style.font = 'default-bold'
|
||||
l.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
mvp_built_ent_label.style.font = 'default-bold'
|
||||
mvp_built_ent_label.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
|
||||
l = t.add({type = 'label', caption = 'MVP Deaths >> '})
|
||||
l.style.font = 'default-listbox'
|
||||
l.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
l = t.add({type = 'label', caption = mvp.deaths.name .. ' died ' .. mvp.deaths.score .. ' times'})
|
||||
l.style.font = 'default-bold'
|
||||
l.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
local mvp_deaths_label = t.add({type = 'label', caption = 'MVP Deaths >> '})
|
||||
mvp_deaths_label.style.font = 'default-listbox'
|
||||
mvp_deaths_label.style.font_color = {r = 0.22, g = 0.77, b = 0.44}
|
||||
|
||||
local mvp_deaths_name_label =
|
||||
t.add({type = 'label', caption = mvp.deaths.name .. ' died ' .. mvp.deaths.score .. ' times'})
|
||||
mvp_deaths_name_label.style.font = 'default-bold'
|
||||
mvp_deaths_name_label.style.font_color = {r = 0.33, g = 0.66, b = 0.9}
|
||||
|
||||
if not this.results_sent then
|
||||
local result = {}
|
||||
@ -867,9 +877,11 @@ local function damage_entities_in_radius(surface, position, radius, damage)
|
||||
end
|
||||
|
||||
local function market_kill_visuals()
|
||||
local market = FDT.get('market')
|
||||
local active_surface_index = FDT.get('active_surface_index')
|
||||
local surface = game.surfaces[active_surface_index]
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
local is_branch_18 = sub(branch_version, 3, 4)
|
||||
local get_active_version = sub(game.active_mods.base, 3, 4)
|
||||
@ -878,7 +890,7 @@ local function market_kill_visuals()
|
||||
return
|
||||
end
|
||||
|
||||
if not market or not market.valid then
|
||||
if not this.market or not this.market.valid then
|
||||
return
|
||||
end
|
||||
|
||||
@ -889,7 +901,7 @@ local function market_kill_visuals()
|
||||
surface.create_particle(
|
||||
{
|
||||
name = 'branch-particle',
|
||||
position = market.position,
|
||||
position = this.market.position,
|
||||
frame_speed = 0.1,
|
||||
vertical_speed = 0.1,
|
||||
height = 0.1,
|
||||
@ -902,7 +914,7 @@ local function market_kill_visuals()
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'branch-particle',
|
||||
position = market.position,
|
||||
position = this.market.position,
|
||||
frame_speed = 0.1,
|
||||
vertical_speed = 0.1,
|
||||
height = 0.1,
|
||||
@ -917,7 +929,7 @@ local function market_kill_visuals()
|
||||
surface.create_trivial_smoke(
|
||||
{
|
||||
name = 'smoke-fast',
|
||||
position = {market.position.x + (x * 0.35), market.position.y + (y * 0.35)}
|
||||
position = {this.market.position.x + (x * 0.35), this.market.position.y + (y * 0.35)}
|
||||
}
|
||||
)
|
||||
end
|
||||
@ -925,13 +937,13 @@ local function market_kill_visuals()
|
||||
surface.create_trivial_smoke(
|
||||
{
|
||||
name = 'train-smoke',
|
||||
position = {market.position.x + (x * 0.35), market.position.y + (y * 0.35)}
|
||||
position = {this.market.position.x + (x * 0.35), this.market.position.y + (y * 0.35)}
|
||||
}
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
surface.spill_item_stack(market.position, {name = 'raw-fish', count = 1024}, true)
|
||||
surface.spill_item_stack(this.market.position, {name = 'raw-fish', count = 1024}, true)
|
||||
end
|
||||
|
||||
local biter_splash_damage = {
|
||||
@ -1013,8 +1025,11 @@ end
|
||||
|
||||
local function on_player_joined_game(event)
|
||||
local player = game.players[event.player_index]
|
||||
local active_surface_index = FDT.get('active_surface_index')
|
||||
local surface = game.surfaces[active_surface_index]
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
if player.gui.left['fish_defense_game_lost'] then
|
||||
player.gui.left['fish_defense_game_lost'].destroy()
|
||||
@ -1035,7 +1050,7 @@ local function on_player_joined_game(event)
|
||||
|
||||
if not pos and player.online_time < 2 then
|
||||
player.teleport(game.forces['player'].get_spawn_position(surface), surface)
|
||||
elseif player.online_time < 2 or player.surface.index ~= active_surface_index then
|
||||
elseif player.online_time < 2 or player.surface.index ~= this.active_surface_index then
|
||||
player.teleport(pos, surface)
|
||||
end
|
||||
|
||||
@ -1100,17 +1115,18 @@ end
|
||||
|
||||
local function on_robot_built_entity(event)
|
||||
local entity = event.created_entity
|
||||
local entity_limits = FDT.get('entity_limits')
|
||||
if entity_limits[entity.name] then
|
||||
local this = FDT.get()
|
||||
if this.entity_limits[entity.name] then
|
||||
local surface = entity.surface
|
||||
if entity_limits[entity.name].placed < entity_limits[entity.name].limit then
|
||||
entity_limits[entity.name].placed = entity_limits[entity.name].placed + 1
|
||||
if this.entity_limits[entity.name].placed < this.entity_limits[entity.name].limit then
|
||||
this.entity_limits[entity.name].placed = this.entity_limits[entity.name].placed + 1
|
||||
surface.create_entity(
|
||||
{
|
||||
name = 'flying-text',
|
||||
position = entity.position,
|
||||
text = entity_limits[entity.name].placed ..
|
||||
' / ' .. entity_limits[entity.name].limit .. ' ' .. entity_limits[entity.name].str .. 's',
|
||||
text = this.entity_limits[entity.name].placed ..
|
||||
' / ' ..
|
||||
this.entity_limits[entity.name].limit .. ' ' .. this.entity_limits[entity.name].str .. 's',
|
||||
color = {r = 0.98, g = 0.66, b = 0.22}
|
||||
}
|
||||
)
|
||||
@ -1120,7 +1136,7 @@ local function on_robot_built_entity(event)
|
||||
{
|
||||
name = 'flying-text',
|
||||
position = entity.position,
|
||||
text = entity_limits[entity.name].str .. ' limit reached.',
|
||||
text = this.entity_limits[entity.name].str .. ' limit reached.',
|
||||
color = {r = 0.82, g = 0.11, b = 0.11}
|
||||
}
|
||||
)
|
||||
@ -1133,9 +1149,11 @@ end
|
||||
|
||||
local function on_player_changed_position(event)
|
||||
local player = game.players[event.player_index]
|
||||
local active_surface_index = FDT.get('active_surface_index')
|
||||
local surface = game.surfaces[active_surface_index]
|
||||
local map_height = FDT.get('map_height')
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
if player.position.x + player.position.y < 0 then
|
||||
return
|
||||
end
|
||||
@ -1144,7 +1162,7 @@ local function on_player_changed_position(event)
|
||||
end
|
||||
if player.position.x >= 160 then
|
||||
player.teleport({player.position.x - 1, player.position.y}, surface)
|
||||
if player.position.y > map_height or player.position.y < map_height * -1 then
|
||||
if player.position.y > this.map_height or player.position.y < this.map_height * -1 then
|
||||
player.teleport({player.position.x, 0}, surface)
|
||||
end
|
||||
if player.character then
|
||||
@ -1183,8 +1201,8 @@ local function on_research_finished(event)
|
||||
end
|
||||
|
||||
local function on_player_respawned(event)
|
||||
local market_age = FDT.get('market_age')
|
||||
if not market_age then
|
||||
local this = FDT.get()
|
||||
if not this.market_age then
|
||||
return
|
||||
end
|
||||
local player = game.players[event.player_index]
|
||||
@ -1291,11 +1309,9 @@ local function set_market_health()
|
||||
if not this.market.valid then
|
||||
return
|
||||
end
|
||||
local market_health = FDT.get('market_health')
|
||||
local market_max_health = FDT.get('market_max_health')
|
||||
local m = market_health / market_max_health
|
||||
local m = this.market_health / this.market_max_health
|
||||
this.market.health = 150 * m
|
||||
rendering.set_text(this.health_text, 'HP: ' .. market_health .. ' / ' .. market_max_health)
|
||||
rendering.set_text(this.health_text, 'HP: ' .. this.market_health .. ' / ' .. this.market_max_health)
|
||||
end
|
||||
|
||||
local function has_the_game_ended()
|
||||
@ -1360,14 +1376,18 @@ end
|
||||
function Public.on_init()
|
||||
FDT.reset_table()
|
||||
Poll.reset()
|
||||
local get_score = Score.get_table()
|
||||
local this = FDT.get()
|
||||
local is_branch_18 = sub(branch_version, 3, 4)
|
||||
local get_active_version = sub(game.active_mods.base, 3, 4)
|
||||
|
||||
Difficulty.reset_difficulty_poll()
|
||||
Difficulty.set_poll_closing_timeout = game.tick + 36000
|
||||
get_score.score_table = {}
|
||||
|
||||
local players = game.connected_players
|
||||
for i = 1, #players do
|
||||
local player = players[i]
|
||||
Score.init_player_table(player)
|
||||
end
|
||||
|
||||
local map_gen_settings = {}
|
||||
map_gen_settings.height = 2048
|
||||
@ -1394,7 +1414,10 @@ function Public.on_init()
|
||||
this.active_surface = game.surfaces[this.active_surface_index]
|
||||
end
|
||||
|
||||
local surface = this.active_surface
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
surface.peaceful_mode = false
|
||||
|
||||
@ -1451,9 +1474,11 @@ end
|
||||
|
||||
local function on_tick()
|
||||
local Diff = Difficulty.get()
|
||||
local active_surface_index = FDT.get('active_surface_index')
|
||||
local surface = game.surfaces[active_surface_index]
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
if game.tick % 30 == 0 then
|
||||
has_the_game_ended()
|
||||
if this.market then
|
||||
@ -1500,4 +1525,16 @@ Event.add(defines.events.on_robot_mined_entity, on_robot_mined_entity)
|
||||
Event.add(defines.events.on_tick, on_tick)
|
||||
Event.on_init(on_init)
|
||||
|
||||
--[[ local gmeta = getmetatable(_ENV)
|
||||
if not gmeta then
|
||||
gmeta = {}
|
||||
setmetatable(_ENV, gmeta)
|
||||
end
|
||||
gmeta.__newindex = function(_, n, v)
|
||||
log('Desync warning: attempt to write to undeclared var ' .. n)
|
||||
global[n] = v
|
||||
end
|
||||
gmeta.__index = function(_, n)
|
||||
return global[n]
|
||||
end ]]
|
||||
return Public
|
||||
|
@ -33,7 +33,8 @@ function Public.reset_table()
|
||||
this.crumbly_walls_unlocked = false
|
||||
this.vehicle_nanobots_unlocked = false
|
||||
this.game_restart_timer = nil
|
||||
this.wave_count = 1
|
||||
this.wave_count = 0
|
||||
this.attack_wave_threat = nil
|
||||
this.market = nil
|
||||
this.market_age = nil
|
||||
this.last_reset = game.tick
|
||||
|
@ -294,8 +294,11 @@ local function plankton_territory(surface, position, seed)
|
||||
end
|
||||
|
||||
local function process_chunk(left_top)
|
||||
local active_surface_index = FDT.get('active_surface_index')
|
||||
local surface = game.surfaces[active_surface_index]
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
local market = FDT.get('market')
|
||||
|
||||
if not surface or not surface.valid then
|
||||
@ -364,6 +367,9 @@ end
|
||||
local function render_market_hp()
|
||||
local this = FDT.get()
|
||||
local surface = game.surfaces[this.active_surface_index]
|
||||
if not surface or not surface.valid then
|
||||
return
|
||||
end
|
||||
|
||||
this.health_text =
|
||||
rendering.draw_text {
|
||||
@ -519,7 +525,7 @@ function Public.generate_spawn_area(surface)
|
||||
math_random(1, 3) == 1 and
|
||||
surface.can_place_entity({name = 'wooden-chest', position = pos, force = 'player'})
|
||||
then
|
||||
local chest = surface.create_entity({name = 'wooden-chest', position = pos, force = 'player'})
|
||||
surface.create_entity({name = 'wooden-chest', position = pos, force = 'player'})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -265,7 +265,7 @@ function Public.get_random_item(rarity, sell, buy)
|
||||
return items_return
|
||||
end
|
||||
|
||||
function Public.mountain_market(surface, position, rarity)
|
||||
function Public.mountain_market(surface, position, rarity, buy)
|
||||
local types = get_types()
|
||||
table.shuffle_table(types)
|
||||
local items = get_market_item_list({types[1], types[2], types[3]}, rarity)
|
||||
@ -300,9 +300,11 @@ function Public.mountain_market(surface, position, rarity)
|
||||
mrk.add_market_item(sells[i])
|
||||
end
|
||||
|
||||
local buys = get_resource_market_buys()
|
||||
for i = 1, math.random(1, 3), 1 do
|
||||
mrk.add_market_item(buys[i])
|
||||
if buy then
|
||||
local buys = get_resource_market_buys()
|
||||
for i = 1, math.random(1, 3), 1 do
|
||||
mrk.add_market_item(buys[i])
|
||||
end
|
||||
end
|
||||
|
||||
return mrk
|
||||
|
@ -562,7 +562,7 @@ local has_the_game_ended = function()
|
||||
game.print('Soft-reset is disabled. Server will restart!', {r = 0.22, g = 0.88, b = 0.22})
|
||||
local message = 'Soft-reset is disabled. Server will restart!'
|
||||
Server.to_discord_bold(table.concat {'*** ', message, ' ***'})
|
||||
Server.start_scenario('Fish_Defender')
|
||||
Server.start_scenario('Mountain_Fortress_v3')
|
||||
this.announced_message = true
|
||||
return
|
||||
end
|
||||
@ -608,10 +608,10 @@ local boost_difficulty = function()
|
||||
|
||||
if name == 'Easy' then
|
||||
rpg_extra.difficulty = 1
|
||||
game.forces.player.manual_mining_speed_modifier = 1.5
|
||||
game.forces.player.manual_mining_speed_modifier = 1
|
||||
force_mining_speed.speed = game.forces.player.manual_mining_speed_modifier
|
||||
game.forces.player.character_running_speed_modifier = 0.2
|
||||
game.forces.player.manual_crafting_speed_modifier = 0.4
|
||||
game.forces.player.manual_crafting_speed_modifier = 0.3
|
||||
WPT.get().coin_amount = 2
|
||||
WPT.get('upgrades').flame_turret.limit = 25
|
||||
WPT.get('upgrades').landmine.limit = 100
|
||||
@ -621,10 +621,10 @@ local boost_difficulty = function()
|
||||
WPT.get().bonus_xp_on_join = 700
|
||||
elseif name == 'Normal' then
|
||||
rpg_extra.difficulty = 0.5
|
||||
game.forces.player.manual_mining_speed_modifier = 1
|
||||
game.forces.player.manual_mining_speed_modifier = 0.5
|
||||
force_mining_speed.speed = game.forces.player.manual_mining_speed_modifier
|
||||
game.forces.player.character_running_speed_modifier = 0.1
|
||||
game.forces.player.manual_crafting_speed_modifier = 0.2
|
||||
game.forces.player.manual_crafting_speed_modifier = 0.1
|
||||
WPT.get().coin_amount = 1
|
||||
WPT.get('upgrades').flame_turret.limit = 10
|
||||
WPT.get('upgrades').landmine.limit = 50
|
||||
|
@ -1,94 +1,116 @@
|
||||
-- biters yield coins -- by mewmew
|
||||
|
||||
local event = require 'utils.event'
|
||||
local Event = require 'utils.event'
|
||||
local insert = table.insert
|
||||
local math_floor = math.floor
|
||||
|
||||
local coin_yield = {
|
||||
["behemoth-biter"] = 5,
|
||||
["behemoth-spitter"] = 5,
|
||||
["behemoth-worm-turret"] = 20,
|
||||
["big-biter"] = 3,
|
||||
["big-spitter"] = 3,
|
||||
["big-worm-turret"] = 16,
|
||||
["biter-spawner"] = 32,
|
||||
["medium-biter"] = 2,
|
||||
["medium-spitter"] = 2,
|
||||
["medium-worm-turret"] = 12,
|
||||
["small-biter"] = 1,
|
||||
["small-spitter"] = 1,
|
||||
["small-worm-turret"] = 8,
|
||||
["spitter-spawner"] = 32,
|
||||
['behemoth-biter'] = 5,
|
||||
['behemoth-spitter'] = 5,
|
||||
['behemoth-worm-turret'] = 20,
|
||||
['big-biter'] = 3,
|
||||
['big-spitter'] = 3,
|
||||
['big-worm-turret'] = 16,
|
||||
['biter-spawner'] = 32,
|
||||
['medium-biter'] = 2,
|
||||
['medium-spitter'] = 2,
|
||||
['medium-worm-turret'] = 12,
|
||||
['small-biter'] = 1,
|
||||
['small-spitter'] = 1,
|
||||
['small-worm-turret'] = 8,
|
||||
['spitter-spawner'] = 32
|
||||
}
|
||||
|
||||
local entities_that_earn_coins = {
|
||||
["artillery-turret"] = true,
|
||||
["gun-turret"] = true,
|
||||
["laser-turret"] = true,
|
||||
["flamethrower-turret"] = true
|
||||
}
|
||||
|
||||
['artillery-turret'] = true,
|
||||
['gun-turret'] = true,
|
||||
['laser-turret'] = true,
|
||||
['flamethrower-turret'] = true
|
||||
}
|
||||
|
||||
--extra coins for "boss" biters from biter_health_booster.lua
|
||||
local function get_coin_count(entity)
|
||||
local coin_count = coin_yield[entity.name]
|
||||
if not coin_count then return end
|
||||
if not global.biter_health_boost_units then return coin_count end
|
||||
local unit_number = entity.unit_number
|
||||
if not unit_number then return coin_count end
|
||||
if not global.biter_health_boost_units[unit_number] then return coin_count end
|
||||
if not global.biter_health_boost_units[unit_number][3] then return coin_count end
|
||||
local m = 1 / global.biter_health_boost_units[unit_number][2]
|
||||
coin_count = math_floor(coin_count * m)
|
||||
if coin_count < 1 then return 1 end
|
||||
return coin_count
|
||||
local coin_count = coin_yield[entity.name]
|
||||
if not coin_count then
|
||||
return
|
||||
end
|
||||
if not global.biter_health_boost_units then
|
||||
return coin_count
|
||||
end
|
||||
local unit_number = entity.unit_number
|
||||
if not unit_number then
|
||||
return coin_count
|
||||
end
|
||||
if not global.biter_health_boost_units[unit_number] then
|
||||
return coin_count
|
||||
end
|
||||
if not global.biter_health_boost_units[unit_number][3] then
|
||||
return coin_count
|
||||
end
|
||||
local m = 1 / global.biter_health_boost_units[unit_number][2]
|
||||
coin_count = math_floor(coin_count * m)
|
||||
if coin_count < 1 then
|
||||
return 1
|
||||
end
|
||||
return coin_count
|
||||
end
|
||||
|
||||
local function on_entity_died(event)
|
||||
local entity = event.entity
|
||||
if not entity.valid then return end
|
||||
if entity.force.index ~= 2 then return end
|
||||
|
||||
local coin_count = get_coin_count(entity)
|
||||
if not coin_count then return end
|
||||
|
||||
local players_to_reward = {}
|
||||
local reward_has_been_given = false
|
||||
|
||||
if event.cause then
|
||||
if event.cause.valid then
|
||||
if event.cause.name == "character" then
|
||||
insert(players_to_reward, event.cause)
|
||||
reward_has_been_given = true
|
||||
end
|
||||
if event.cause.type == "car" then
|
||||
local player = event.cause.get_driver()
|
||||
local passenger = event.cause.get_passenger()
|
||||
if player then insert(players_to_reward, player.player) end
|
||||
if passenger then insert(players_to_reward, passenger.player) end
|
||||
reward_has_been_given = true
|
||||
end
|
||||
if event.cause.type == "locomotive" then
|
||||
local train_passengers = event.cause.train.passengers
|
||||
if train_passengers then
|
||||
for _, passenger in pairs(train_passengers) do
|
||||
insert(players_to_reward, passenger)
|
||||
end
|
||||
reward_has_been_given = true
|
||||
end
|
||||
end
|
||||
for _, player in pairs(players_to_reward) do
|
||||
player.insert({name = "coin", count = coin_count})
|
||||
end
|
||||
end
|
||||
if entities_that_earn_coins[event.cause.name] then
|
||||
event.entity.surface.spill_item_stack(event.cause.position,{name = "coin", count = coin_count}, true)
|
||||
reward_has_been_given = true
|
||||
end
|
||||
end
|
||||
|
||||
if reward_has_been_given == false then
|
||||
event.entity.surface.spill_item_stack(event.entity.position,{name = "coin", count = coin_count}, true)
|
||||
end
|
||||
local entity = event.entity
|
||||
if not entity.valid then
|
||||
return
|
||||
end
|
||||
if entity.force.index ~= 2 then
|
||||
return
|
||||
end
|
||||
|
||||
local coin_count = get_coin_count(entity)
|
||||
if not coin_count then
|
||||
return
|
||||
end
|
||||
|
||||
local players_to_reward = {}
|
||||
local reward_has_been_given = false
|
||||
|
||||
if event.cause then
|
||||
if event.cause.valid then
|
||||
if event.cause.name == 'character' then
|
||||
insert(players_to_reward, event.cause)
|
||||
reward_has_been_given = true
|
||||
end
|
||||
if event.cause.type == 'car' then
|
||||
local player = event.cause.get_driver()
|
||||
local passenger = event.cause.get_passenger()
|
||||
if player then
|
||||
insert(players_to_reward, player.player)
|
||||
end
|
||||
if passenger then
|
||||
insert(players_to_reward, passenger.player)
|
||||
end
|
||||
reward_has_been_given = true
|
||||
end
|
||||
if event.cause.type == 'locomotive' then
|
||||
local train_passengers = event.cause.train.passengers
|
||||
if train_passengers then
|
||||
for _, passenger in pairs(train_passengers) do
|
||||
insert(players_to_reward, passenger)
|
||||
end
|
||||
reward_has_been_given = true
|
||||
end
|
||||
end
|
||||
for _, player in pairs(players_to_reward) do
|
||||
player.insert({name = 'coin', count = coin_count})
|
||||
end
|
||||
end
|
||||
if entities_that_earn_coins[event.cause.name] then
|
||||
event.entity.surface.spill_item_stack(event.cause.position, {name = 'coin', count = coin_count}, true)
|
||||
reward_has_been_given = true
|
||||
end
|
||||
end
|
||||
|
||||
if reward_has_been_given == false then
|
||||
event.entity.surface.spill_item_stack(event.entity.position, {name = 'coin', count = coin_count}, true)
|
||||
end
|
||||
end
|
||||
|
||||
event.add(defines.events.on_entity_died, on_entity_died)
|
||||
|
||||
Event.add(defines.events.on_entity_died, on_entity_died)
|
||||
|
@ -45,13 +45,23 @@ function Public.print_except(msg, player, color)
|
||||
end
|
||||
end
|
||||
|
||||
function Public.print_to(player_ident, msg)
|
||||
local player = Public.validate_player(player_ident)
|
||||
|
||||
if player then
|
||||
player.print(prefix .. msg, Color.yellow)
|
||||
else
|
||||
game.print(prefix .. msg, Color.yellow)
|
||||
end
|
||||
end
|
||||
|
||||
--- Prints a message to all online admins
|
||||
-- @param msg <string|table> table if locale is used
|
||||
-- @param source <LuaPlayer|string|nil> string must be the name of a player, nil for server.
|
||||
function Public.print_admins(msg, source)
|
||||
local source_name
|
||||
local chat_color
|
||||
if source then
|
||||
if source and game.players[source] then
|
||||
if type(source) == 'string' then
|
||||
source_name = source
|
||||
chat_color = game.players[source].chat_color
|
||||
@ -63,7 +73,7 @@ function Public.print_admins(msg, source)
|
||||
source_name = 'Server'
|
||||
chat_color = Color.yellow
|
||||
end
|
||||
local formatted_msg = {'utils_core.print_admins', prefix, source_name, msg}
|
||||
local formatted_msg = prefix .. '(ADMIN) ' .. source_name .. ': ' .. msg
|
||||
log(formatted_msg)
|
||||
for _, p in pairs(game.connected_players) do
|
||||
if p.admin then
|
||||
@ -217,6 +227,16 @@ function Public.action_warning(warning_prefix, msg)
|
||||
Server.to_discord_bold(msg)
|
||||
end
|
||||
|
||||
--- Takes msg and prints it to all players. Also prints to the log and discord
|
||||
-- @param msg <string> The message to print
|
||||
-- @param warning_prefix <string> The name of the module/warning
|
||||
function Public.action_warning_embed(warning_prefix, msg)
|
||||
game.print(prefix .. msg, Color.yellow)
|
||||
msg = format('%s %s', warning_prefix, msg)
|
||||
log(msg)
|
||||
Server.to_discord_embed(msg)
|
||||
end
|
||||
|
||||
--- Takes msg and prints it to the log and discord.
|
||||
-- @param msg <string> The message to print
|
||||
-- @param warning_prefix <string> The name of the module/warning
|
||||
|
@ -5,10 +5,12 @@ local Token = require 'utils.token'
|
||||
local Task = require 'utils.task'
|
||||
local Server = require 'utils.server'
|
||||
local Event = require 'utils.event'
|
||||
local table = require 'utils.table'
|
||||
local Utils = require 'utils.core'
|
||||
|
||||
local jailed_data_set = 'jailed'
|
||||
local jailed = {}
|
||||
local votejail = {}
|
||||
local votejail_count = 3
|
||||
local set_data = Server.set_data
|
||||
local try_get_data = Server.try_get_data
|
||||
local concat = table.concat
|
||||
@ -29,31 +31,32 @@ local valid_commands = {
|
||||
}
|
||||
|
||||
Global.register(
|
||||
jailed,
|
||||
{
|
||||
jailed = jailed,
|
||||
votejail = votejail
|
||||
},
|
||||
function(t)
|
||||
jailed = t
|
||||
jailed = t.jailed
|
||||
votejail = t.votejail
|
||||
end
|
||||
)
|
||||
|
||||
local Public = {}
|
||||
|
||||
local function admin_only_message(str)
|
||||
for _, player in pairs(game.connected_players) do
|
||||
if player.admin == true then
|
||||
player.print('Admins-only-message: ' .. str, {r = 0.88, g = 0.88, b = 0.88})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local jail = function(target_player, player)
|
||||
if jailed[target_player] then
|
||||
if player then
|
||||
game.players[player].print(target_player .. ' is already jailed!', {r = 1, g = 0.5, b = 0.1})
|
||||
Utils.print_to(player, target_player .. ' is already jailed!')
|
||||
return false
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
if not game.players[target_player] then
|
||||
return
|
||||
end
|
||||
|
||||
local permission_group = game.permissions.get_group('prisoner')
|
||||
if not permission_group then
|
||||
permission_group = game.permissions.create_group('prisoner')
|
||||
@ -82,47 +85,49 @@ local jail = function(target_player, player)
|
||||
game.players[target_player].character.driving = false
|
||||
end
|
||||
|
||||
jailed[target_player] = true
|
||||
Utils.print_to(nil, message)
|
||||
Utils.action_warning_embed('{Jailed}', message)
|
||||
Utils.print_admins('Jailed ' .. target_player, player)
|
||||
|
||||
game.print(message, {r = 0.98, g = 0.66, b = 0.22})
|
||||
Server.to_discord_embed(
|
||||
table.concat {
|
||||
message
|
||||
}
|
||||
)
|
||||
admin_only_message(target_player .. ' was jailed by ' .. player)
|
||||
game.players[target_player].clear_console()
|
||||
Utils.print_to(target_player, message)
|
||||
return true
|
||||
end
|
||||
|
||||
local free = function(target_player, player)
|
||||
if not jailed[target_player] then
|
||||
if player then
|
||||
game.players[player].print(target_player .. ' is not jailed!', {r = 1, g = 0.5, b = 0.1})
|
||||
Utils.print_to(player, target_player .. ' is not jailed!')
|
||||
return false
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
if not game.players[target_player] then
|
||||
return
|
||||
end
|
||||
|
||||
local permission_group = game.permissions.get_group('Default')
|
||||
permission_group.add_player(target_player)
|
||||
local messsage
|
||||
local message
|
||||
if player then
|
||||
messsage =
|
||||
message =
|
||||
target_player ..
|
||||
' was set free from jail by ' .. player .. '. ' .. freedom_messages[math.random(1, #freedom_messages)]
|
||||
else
|
||||
messsage = target_player .. ' was set free from jail. ' .. freedom_messages[math.random(1, #freedom_messages)]
|
||||
message = target_player .. ' was set free from jail. ' .. freedom_messages[math.random(1, #freedom_messages)]
|
||||
end
|
||||
|
||||
jailed[target_player] = nil
|
||||
game.print(messsage, {r = 0.98, g = 0.66, b = 0.22})
|
||||
Server.to_discord_embed(
|
||||
table.concat {
|
||||
messsage
|
||||
}
|
||||
)
|
||||
|
||||
admin_only_message(player .. ' set ' .. target_player .. ' free from jail')
|
||||
if votejail[target_player] then
|
||||
votejail[target_player] = nil
|
||||
end
|
||||
|
||||
Utils.print_to(nil, message)
|
||||
Utils.action_warning_embed('{Jailed}', message)
|
||||
Utils.print_admins('Free´d ' .. target_player .. ' from jail.', player)
|
||||
return true
|
||||
end
|
||||
|
||||
@ -132,8 +137,10 @@ local is_jailed =
|
||||
local key = data.key
|
||||
local value = data.value
|
||||
if value then
|
||||
jail(key)
|
||||
jailed[key] = value
|
||||
if value.jailed then
|
||||
jail(key)
|
||||
jailed[key] = {jailed = true, actor = value.actor}
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
@ -143,15 +150,13 @@ local update_jailed =
|
||||
function(data)
|
||||
local key = data.key
|
||||
local value = data.value
|
||||
local player = data.player
|
||||
local player = data.player or 'script'
|
||||
if value then
|
||||
set_data(jailed_data_set, key, value)
|
||||
jail(key, player)
|
||||
jailed[key] = value
|
||||
jail(key)
|
||||
set_data(jailed_data_set, key, {jailed = true, actor = player})
|
||||
else
|
||||
free(key)
|
||||
set_data(jailed_data_set, key, nil)
|
||||
free(key, player)
|
||||
jailed[key] = value
|
||||
end
|
||||
end
|
||||
)
|
||||
@ -160,7 +165,9 @@ local update_jailed =
|
||||
-- @param data_set player token
|
||||
function Public.try_dl_data(key)
|
||||
key = tostring(key)
|
||||
|
||||
local secs = Server.get_current_time()
|
||||
|
||||
if not secs then
|
||||
return
|
||||
else
|
||||
@ -172,23 +179,14 @@ end
|
||||
-- @param data_set player token
|
||||
function Public.try_ul_data(key, value, player)
|
||||
key = tostring(key)
|
||||
local secs = Server.get_current_time()
|
||||
|
||||
local data = {
|
||||
key = key,
|
||||
value = value,
|
||||
player = player or nil
|
||||
}
|
||||
if not secs then
|
||||
if value then
|
||||
jail(key, player)
|
||||
return true
|
||||
else
|
||||
free(key, player)
|
||||
return true
|
||||
end
|
||||
else
|
||||
Task.set_timeout_in_ticks(1, update_jailed, data)
|
||||
end
|
||||
|
||||
Task.set_timeout_in_ticks(1, update_jailed, data)
|
||||
end
|
||||
|
||||
--- Checks if a player exists within the table
|
||||
@ -220,27 +218,22 @@ Event.add(
|
||||
defines.events.on_player_joined_game,
|
||||
function(event)
|
||||
local player = game.get_player(event.player_index)
|
||||
local secs = Server.get_current_time()
|
||||
if not secs then
|
||||
return
|
||||
end
|
||||
if not player or player.valid then
|
||||
if not player or not player.valid then
|
||||
return
|
||||
end
|
||||
|
||||
if game.is_multiplayer() then
|
||||
Public.try_dl_data(player.name)
|
||||
end
|
||||
Public.try_dl_data(player.name)
|
||||
end
|
||||
)
|
||||
|
||||
Event.add(
|
||||
defines.events.on_console_command,
|
||||
function(event)
|
||||
local trusted = Session.get_trusted_table()
|
||||
local tracker = Session.get_session_table()
|
||||
local p
|
||||
local script = 'script'
|
||||
local cmd = event.command
|
||||
local _10d = 51840000 -- 10d
|
||||
local _12h = 2592000 -- 12h
|
||||
|
||||
if not valid_commands[cmd] then
|
||||
return
|
||||
@ -251,38 +244,61 @@ Event.add(
|
||||
return
|
||||
end
|
||||
|
||||
if not game.players[griefer] then
|
||||
return
|
||||
end
|
||||
|
||||
if event.player_index then
|
||||
local player = game.players[event.player_index]
|
||||
p = player.print
|
||||
|
||||
if game.players[griefer] then
|
||||
griefer = game.players[griefer].name
|
||||
end
|
||||
|
||||
if not game.players[griefer] then
|
||||
return Utils.print_to(player, 'Invalid name.')
|
||||
end
|
||||
|
||||
local playtime = player.online_time
|
||||
if tracker[player.name] then
|
||||
playtime = player.online_time + tracker[player.name]
|
||||
end
|
||||
if playtime < 25920000 then -- 5 days
|
||||
return p('You are not trusted enough to run this command.', {r = 1, g = 0.5, b = 0.1})
|
||||
|
||||
if votejail[player.name] and not player.admin then
|
||||
return Utils.print_to(player, 'You are currently being investigated since you have griefed.')
|
||||
end
|
||||
|
||||
if jailed[player.name] and not player.admin then
|
||||
return p('You are jailed, there is nothing to be done.', {r = 1, g = 0.5, b = 0.1})
|
||||
return Utils.print_to(player, 'You are jailed, you can´t run this command.')
|
||||
end
|
||||
|
||||
if not trusted[player.name] then
|
||||
if not player.admin then
|
||||
p("You're not admin nor are you trusted enough to run this command!", {r = 1, g = 0.5, b = 0.1})
|
||||
return
|
||||
end
|
||||
end
|
||||
if player.name == griefer then
|
||||
return p("You can't select yourself!", {r = 1, g = 0.5, b = 0.1})
|
||||
return Utils.print_to(player, 'You can´t select yourself.')
|
||||
end
|
||||
|
||||
if game.players[griefer].admin and not player.admin then
|
||||
return p("You can't sadly jail an admin!", {r = 1, g = 0.5, b = 0.1})
|
||||
return Utils.print_to(player, 'You can´t select an admin.')
|
||||
end
|
||||
|
||||
if playtime >= _12h and playtime < _10d and not player.admin then
|
||||
if not votejail[griefer] then
|
||||
votejail[griefer] = {}
|
||||
local message = player.name .. ' has started a vote to jail player ' .. griefer
|
||||
Utils.print_to(nil, message)
|
||||
end
|
||||
if not votejail[griefer][player.name] then
|
||||
votejail[griefer][player.name] = true
|
||||
Utils.print_to(player, 'You have voted to jail player ' .. griefer .. '.')
|
||||
if
|
||||
#votejail[griefer] >= votejail_count or
|
||||
(#votejail[griefer] == 2 and 3 == #game.connected_players)
|
||||
then
|
||||
local message = griefer .. ' has been jailed by player vote.'
|
||||
Utils.print_to(nil, message)
|
||||
Public.try_ul_data(griefer, true, script)
|
||||
end
|
||||
else
|
||||
Utils.print_to(player, 'You have already voted to kick ' .. griefer .. '.')
|
||||
end
|
||||
return
|
||||
elseif playtime < _10d and not player.admin then
|
||||
return Utils.print_to(player, 'You are not trusted enough to run this command.')
|
||||
end
|
||||
|
||||
if cmd == 'jail' then
|
||||
@ -294,10 +310,10 @@ Event.add(
|
||||
end
|
||||
else
|
||||
if cmd == 'jail' then
|
||||
Public.try_ul_data(griefer, true)
|
||||
Public.try_ul_data(griefer, true, script)
|
||||
return
|
||||
elseif cmd == 'free' then
|
||||
Public.try_ul_data(griefer, false)
|
||||
Public.try_ul_data(griefer, false, script)
|
||||
return
|
||||
end
|
||||
end
|
||||
@ -307,9 +323,11 @@ Event.add(
|
||||
Server.on_data_set_changed(
|
||||
jailed_data_set,
|
||||
function(data)
|
||||
jailed[data.key] = data.value
|
||||
if data and data.value then
|
||||
jail(data.key)
|
||||
if data.value.jailed and data.value.actor then
|
||||
jail(data.key)
|
||||
jailed[data.key] = {jailed = true, actor = data.value.actor}
|
||||
end
|
||||
else
|
||||
free(data.key)
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user