1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-03-29 21:47:08 +02:00

More porting for 2.0

This commit is contained in:
Gerkiz 2024-10-25 21:56:34 +02:00
parent 8942a5714a
commit 93cdb0fb54
33 changed files with 574 additions and 444 deletions

View File

@ -17,12 +17,10 @@ require 'utils.chatbot'
require 'utils.common_commands' require 'utils.common_commands'
require 'utils.antigrief' require 'utils.antigrief'
require 'utils.debug.command' require 'utils.debug.command'
require 'modules.corpse_markers'
require 'modules.floaty_chat' require 'modules.floaty_chat'
require 'modules.show_inventory' require 'modules.show_inventory'
require 'modules.inserter_drops_pickup' require 'modules.inserter_drops_pickup'
require 'modules.autostash' require 'modules.autostash'
require 'modules.blueprint_requesting'
require 'utils.gui.init' require 'utils.gui.init'
require 'utils.freeplay' require 'utils.freeplay'

View File

@ -143,7 +143,7 @@ win_conditions=Win conditions
season=[font=default-bold]Season: [/font] season=[font=default-bold]Season: [/font]
rounds_survived=[font=default-bold]Rounds survived: [/font] rounds_survived=[font=default-bold]Rounds survived: [/font]
win_streak=[font=default-bold]Current win streak: [/font] current_streak=[font=default-bold]Current win streak: [/font]
buffs=[font=default-bold]Buffs: [/font] buffs=[font=default-bold]Buffs: [/font]
zone=[font=default-bold]Breach zones: [/font] zone=[font=default-bold]Breach zones: [/font]
wave=[font=default-bold]Survive until wave: [/font] wave=[font=default-bold]Survive until wave: [/font]
@ -164,6 +164,7 @@ research=[font=default-bold]Research __1__: [/font]
season_tooltip=Whenever a new season starts, all buffs are reset.\nGerkiz tries to add new content for each season that starts.\nSeason resets in __1__ days. season_tooltip=Whenever a new season starts, all buffs are reset.\nGerkiz tries to add new content for each season that starts.\nSeason resets in __1__ days.
rounds_survived_tooltip=Winning the game increases this number by 1.\nThis number resets as of now every 2 months. rounds_survived_tooltip=Winning the game increases this number by 1.\nThis number resets as of now every 2 months.
current_streak_tooltip=How many rounds will you survive?\nThis number resets when the game is lost.
buff_tooltip=Each buff that is given to the players is listed here.\nClick the icon to the right to view the buffs. buff_tooltip=Each buff that is given to the players is listed here.\nClick the icon to the right to view the buffs.
buff_tooltip_click=Click the icon view the buffs. buff_tooltip_click=Click the icon view the buffs.
zone_tooltip=Complete this objective by breaching/moving forward until you've reached the given zone. zone_tooltip=Complete this objective by breaching/moving forward until you've reached the given zone.

View File

@ -291,7 +291,7 @@ local compare_player_and_train = function (player, entity)
color = color, color = color,
} }
) )
player.print(msg, color) player.print(msg, { color = color })
elseif locomotive_distance_too_far then elseif locomotive_distance_too_far then
local msg = 'Warning! You are too far away from the train! TURN BACK!' local msg = 'Warning! You are too far away from the train! TURN BACK!'
player.create_local_flying_text( player.create_local_flying_text(
@ -301,7 +301,7 @@ local compare_player_and_train = function (player, entity)
color = color, color = color,
} }
) )
player.print(msg, color) player.print(msg, { color = color })
if entity.health then if entity.health then
if car and car.health_pool and car.health_pool.health then if car and car.health_pool and car.health_pool.health then
car.health_pool.health = car.health_pool.health - 500 car.health_pool.health = car.health_pool.health - 500

View File

@ -6,7 +6,7 @@ local WD = require 'modules.wave_defense.table'
local Discord = require 'utils.discord_handler' local Discord = require 'utils.discord_handler'
local Commands = require 'utils.commands' local Commands = require 'utils.commands'
local mapkeeper = '[color=blue]Mapkeeper:[/color]' local mapkeeper = '[color=blue]Mapkeeper:[/color]'
local scenario_name = Public.scenario_name local scenario_name = 'Mtn Fortress'
local gather_time_token = local gather_time_token =
Task.register( Task.register(

View File

@ -264,6 +264,7 @@ local function set_train_final_health(final_damage_amount, repair)
locomotive.destructible = false locomotive.destructible = false
locomotive.health = 1 locomotive.health = 1
Public.set('game_lost', true) Public.set('game_lost', true)
Public.set_stateful('current_streak', 0)
Public.loco_died() Public.loco_died()
end end

View File

@ -969,6 +969,8 @@ local function on_primary_target_missing()
end end
WD.set('target', locomotive) WD.set('target', locomotive)
local target_settings = WD.get_es('target_settings')
target_settings.main_target = locomotive
WD.set_main_target(locomotive) WD.set_main_target(locomotive)
end end
@ -1552,7 +1554,6 @@ function Public.is_creativity_mode_on()
local creative_enabled = Misc.get('creative_enabled') local creative_enabled = Misc.get('creative_enabled')
if creative_enabled then if creative_enabled then
WD.set('next_wave', 1000) WD.set('next_wave', 1000)
Collapse.start_now(true)
Public.set_difficulty() Public.set_difficulty()
end end
end end
@ -1746,7 +1747,7 @@ function Public.on_research_finished(event)
local research_name = research.name local research_name = research.name
local force = research.force local force = research.force
if event.tick > 100 then if event.tick > 2000 then
if Public.get('print_tech_to_discord') and force.name == 'player' then if Public.get('print_tech_to_discord') and force.name == 'player' then
Server.to_discord_embed_raw('<a:Modded:835932131036364810> ' .. research_name:gsub('^%l', string.upper) .. ' has been researched!') Server.to_discord_embed_raw('<a:Modded:835932131036364810> ' .. research_name:gsub('^%l', string.upper) .. ' has been researched!')
end end
@ -1756,7 +1757,7 @@ function Public.on_research_finished(event)
Public.set('toolbelt_researched_count', 10) Public.set('toolbelt_researched_count', 10)
end end
if script.feature_flags.quality then if script.active_mods.quality then
local quality_list = Public.get('quality_list') local quality_list = Public.get('quality_list')
if research.name == 'quality-module' then if research.name == 'quality-module' then
quality_list[#quality_list + 1] = 'uncommon' quality_list[#quality_list + 1] = 'uncommon'

View File

@ -1028,7 +1028,7 @@ local function gui_opened(event)
} }
) )
if script.feature_flags.quality then if script.active_mods.quality then
if game.forces.player.technologies['quality-module'].researched then if game.forces.player.technologies['quality-module'].researched then
local quality_list = Public.get('quality_list') local quality_list = Public.get('quality_list')
local bg_right = bottom_grid.add({ type = 'label', caption = ({ 'locomotive.quality_text' }) }) local bg_right = bottom_grid.add({ type = 'label', caption = ({ 'locomotive.quality_text' }) })

View File

@ -277,7 +277,7 @@ function Public.reset_map()
wave_defense_table.game_lost = false wave_defense_table.game_lost = false
wave_defense_table.spawn_position = { x = 0, y = 84 } wave_defense_table.spawn_position = { x = 0, y = 84 }
WD.alert_boss_wave(true) WD.alert_boss_wave(true)
WD.enable_side_target(true) WD.enable_side_target(false)
WD.remove_entities(true) WD.remove_entities(true)
WD.enable_threat_log(false) -- creates waaaay to many entries in the global table WD.enable_threat_log(false) -- creates waaaay to many entries in the global table
WD.check_collapse_position(true) WD.check_collapse_position(true)
@ -668,9 +668,9 @@ Event.add(
Event.on_init(function () Event.on_init(function ()
local nauvis = game.surfaces.nauvis local nauvis = game.surfaces.nauvis
-- nauvis.clear(true) nauvis.clear(true)
-- nauvis.request_to_generate_chunks({ 0, 0 }, 3) nauvis.request_to_generate_chunks({ 0, 0 }, 3)
-- nauvis.force_generate_chunk_requests() nauvis.force_generate_chunk_requests()
end) end)
return Public return Public

View File

@ -79,6 +79,45 @@ local function pretty_format(input)
return result return result
end end
local function final_arena_disabled()
if stateful.collection.final_arena_disabled then
game.print('[color=yellow][Mtn v3][/color] Game won!')
game.print('[color=yellow][Mtn v3][/color] Final battle arena is currently being tweaked.')
collection.game_won = true
stateful.collection.gather_time = 0
stateful.collection.gather_time_timer = 0
collection.survive_for = 0
collection.survive_for_timer = 0
refresh_frames()
local reversed = Public.get_stateful_settings('reversed')
if reversed then
Public.set_stateful_settings('reversed', false)
else
Public.set_stateful_settings('reversed', true)
end
collection.game_won_notified = true
refresh_boss_frame()
play_game_won()
WD.disable_spawning_biters(true)
Collapse.start_now(false)
WD.nuke_wave_gui()
Server.to_discord_embed('Game won!')
stateful.rounds_survived = stateful.rounds_survived + 1
stateful.selected_objectives = nil
local buff = Stateful.save_settings()
notify_won_to_discord(buff)
local locomotive = Public.get('locomotive')
if locomotive and locomotive.valid then
locomotive.surface.spill_item_stack({ position = locomotive.position, stack = { name = 'coin', count = 512, quality = 'normal' } })
end
Public.set('game_reset_tick', 5400)
return true
end
return false
end
local function notify_won_to_discord(buff) local function notify_won_to_discord(buff)
if not buff then if not buff then
return error('Buff is required when sending message to discord.', 2) return error('Buff is required when sending message to discord.', 2)
@ -113,26 +152,31 @@ local function notify_won_to_discord(buff)
inline = 'false' inline = 'false'
}, },
field3 = { field3 = {
text1 = 'Current winning streak:',
text2 = stateful.current_streak,
inline = 'false'
},
field4 = {
text1 = 'Wave:', text1 = 'Wave:',
text2 = format_number(wave, true), text2 = format_number(wave, true),
inline = 'false' inline = 'false'
}, },
field4 = { field5 = {
text1 = 'Total connected players:', text1 = 'Total connected players:',
text2 = total_players, text2 = total_players,
inline = 'false' inline = 'false'
}, },
field5 = { field6 = {
text1 = 'Pickaxe Upgrade:', text1 = 'Pickaxe Upgrade:',
text2 = pick_tier .. ' (' .. upgrades.pickaxe_tier .. ')', text2 = pick_tier .. ' (' .. upgrades.pickaxe_tier .. ')',
inline = 'false' inline = 'false'
}, },
field6 = { field7 = {
text1 = 'Connected players:', text1 = 'Connected players:',
text2 = total_connected_players, text2 = total_connected_players,
inline = 'false' inline = 'false'
}, },
field7 = { field8 = {
text1 = 'Buff granted:', text1 = 'Buff granted:',
text2 = buff.discord, text2 = buff.discord,
inline = 'false' inline = 'false'
@ -547,6 +591,22 @@ local function boss_frame(player, alert)
data.rounds_survived_label = rounds_survived_right_flow.add({ type = 'label', caption = stateful.rounds_survived }) data.rounds_survived_label = rounds_survived_right_flow.add({ type = 'label', caption = stateful.rounds_survived })
spacer(frame) spacer(frame)
local current_streak_tbl = frame.add { type = 'table', column_count = 2 }
current_streak_tbl.style.horizontally_stretchable = true
local current_streak_flow = current_streak_tbl.add({ type = 'flow' })
current_streak_flow.style.horizontal_align = 'left'
current_streak_flow.style.horizontally_stretchable = true
current_streak_flow.add({ type = 'label', caption = { 'stateful.current_streak' }, tooltip = { 'stateful.current_streak_tooltip' } })
frame.add({ type = 'line', direction = 'vertical' })
local current_streak_right_flow = current_streak_tbl.add({ type = 'flow' })
current_streak_right_flow.style.horizontal_align = 'right'
current_streak_right_flow.style.horizontally_stretchable = true
data.current_streak_label = current_streak_right_flow.add({ type = 'label', caption = stateful.current_streak })
spacer(frame)
frame.add({ type = 'line' }) frame.add({ type = 'line' })
spacer(frame) spacer(frame)
@ -664,6 +724,22 @@ main_frame = function (player)
data.rounds_survived_label = rounds_survived_right_flow.add({ type = 'label', caption = stateful.rounds_survived }) data.rounds_survived_label = rounds_survived_right_flow.add({ type = 'label', caption = stateful.rounds_survived })
spacer(frame) spacer(frame)
local current_streak_tbl = frame.add { type = 'table', column_count = 2 }
current_streak_tbl.style.horizontally_stretchable = true
local current_streak_flow = current_streak_tbl.add({ type = 'flow' })
current_streak_flow.style.horizontal_align = 'left'
current_streak_flow.style.horizontally_stretchable = true
current_streak_flow.add({ type = 'label', caption = { 'stateful.current_streak' }, tooltip = { 'stateful.current_streak_tooltip' } })
frame.add({ type = 'line', direction = 'vertical' })
local current_streak_right_flow = current_streak_tbl.add({ type = 'flow' })
current_streak_right_flow.style.horizontal_align = 'right'
current_streak_right_flow.style.horizontally_stretchable = true
data.current_streak_label = current_streak_right_flow.add({ type = 'label', caption = stateful.current_streak })
spacer(frame)
frame.add({ type = 'line' }) frame.add({ type = 'line' })
spacer(frame) spacer(frame)
@ -819,6 +895,10 @@ local function update_data()
if data.rounds_survived_label and data.rounds_survived_label.valid then if data.rounds_survived_label and data.rounds_survived_label.valid then
data.rounds_survived_label.caption = stateful.rounds_survived data.rounds_survived_label.caption = stateful.rounds_survived
end end
if data.current_streak_label and data.current_streak_label.valid then
data.current_streak_label.caption = stateful.current_streak
end
if data.randomized_zone_label and data.randomized_zone_label.valid and stateful.objectives.randomized_zone then if data.randomized_zone_label and data.randomized_zone_label.valid and stateful.objectives.randomized_zone then
if breached_wall >= stateful.objectives.randomized_zone then if breached_wall >= stateful.objectives.randomized_zone then
data.randomized_zone_label.caption = breached_wall .. '/' .. stateful.objectives.randomized_zone .. ' [img=utility/check_mark_green]' data.randomized_zone_label.caption = breached_wall .. '/' .. stateful.objectives.randomized_zone .. ' [img=utility/check_mark_green]'
@ -938,6 +1018,10 @@ local function update_data()
data_boss.rounds_survived_label.caption = stateful.rounds_survived data_boss.rounds_survived_label.caption = stateful.rounds_survived
end end
if data_boss.current_streak_label and data_boss.current_streak_label.valid then
data_boss.current_streak_label.caption = stateful.current_streak
end
if collection.survive_for and data_boss.survive_for and data_boss.survive_for.valid then if collection.survive_for and data_boss.survive_for and data_boss.survive_for.valid then
if not stateful.objectives_completed.warn_players then if not stateful.objectives_completed.warn_players then
stateful.objectives_completed.warn_players = true stateful.objectives_completed.warn_players = true
@ -1173,39 +1257,7 @@ local function update_raw()
Alert.alert_all_players(300, 'All objectives has been completed!') Alert.alert_all_players(300, 'All objectives has been completed!')
Alert.alert_all_players(300, 'Take your time to prepare for the final push!') Alert.alert_all_players(300, 'Take your time to prepare for the final push!')
if stateful.collection.final_arena_disabled then if final_arena_disabled() then
game.print('[color=yellow][Mtn v3][/color] Game won!')
game.print('[color=yellow][Mtn v3][/color] Final battle arena is currently being tweaked.')
collection.game_won = true
stateful.collection.gather_time = 0
stateful.collection.gather_time_timer = 0
collection.survive_for = 0
collection.survive_for_timer = 0
refresh_frames()
local reversed = Public.get_stateful_settings('reversed')
if reversed then
Public.set_stateful_settings('reversed', false)
else
Public.set_stateful_settings('reversed', true)
end
collection.game_won_notified = true
refresh_boss_frame()
play_game_won()
WD.disable_spawning_biters(true)
Collapse.start_now(false)
WD.nuke_wave_gui()
Server.to_discord_embed('Game won!')
stateful.rounds_survived = stateful.rounds_survived + 1
stateful.selected_objectives = nil
local buff = Stateful.save_settings()
notify_won_to_discord(buff)
local locomotive = Public.get('locomotive')
if locomotive and locomotive.valid then
locomotive.surface.spill_item_stack({ position = locomotive.position, stack = { name = 'coin', count = 512, quality = 'normal' } })
end
Public.set('game_reset_tick', 5400)
return return
end end

View File

@ -20,6 +20,7 @@ local Difficulty = require 'modules.difficulty_vote_by_amount'
local this = { local this = {
enabled = false, enabled = false,
rounds_survived = 0, rounds_survived = 0,
current_streak = 0,
season = 1, season = 1,
buffs = {}, buffs = {},
reset_after = 60, reset_after = 60,
@ -1408,6 +1409,8 @@ function Public.save_settings()
local granted_buff = grant_non_limit_reached_buff() local granted_buff = grant_non_limit_reached_buff()
this.buffs[#this.buffs + 1] = granted_buff this.buffs[#this.buffs + 1] = granted_buff
this.current_streak = this.current_streak + 1
local settings = { local settings = {
objectives_time_spent = this.objectives_time_spent, objectives_time_spent = this.objectives_time_spent,
rounds_survived = this.rounds_survived, rounds_survived = this.rounds_survived,

View File

@ -9,7 +9,7 @@ local random = math.random
Global.register( Global.register(
this, this,
function(tbl) function (tbl)
this = tbl this = tbl
end end
) )
@ -19,9 +19,9 @@ init - Initialize claim system.
@param names - Table of entity names that should be used as a marker. @param names - Table of entity names that should be used as a marker.
@param max_distance - Maximal distance allowed between markers @param max_distance - Maximal distance allowed between markers
--]] --]]
Public.init = function(names, max_distance) Public.init = function (names, max_distance)
if type(names) ~= 'table' then if type(names) ~= 'table' then
names = {names} names = { names }
end end
this._claims_info = {} this._claims_info = {}
@ -112,7 +112,7 @@ end
on_build_entity - Event processing function. on_build_entity - Event processing function.
@param ent - Entity @param ent - Entity
--]] --]]
Public.on_built_entity = function(ent) Public.on_built_entity = function (ent)
if not claims_in_markers(ent.name) then if not claims_in_markers(ent.name) then
return return
end end
@ -153,7 +153,7 @@ end
on_entity_died - Event processing function. on_entity_died - Event processing function.
@param ent - Entity @param ent - Entity
--]] --]]
Public.on_entity_died = function(ent) Public.on_entity_died = function (ent)
if not claims_in_markers(ent.name) then if not claims_in_markers(ent.name) then
return return
end end
@ -164,7 +164,7 @@ end
on_player_mined_entity - Event processing function. on_player_mined_entity - Event processing function.
@param ent - Entity @param ent - Entity
--]] --]]
Public.on_player_mined_entity = function(ent) Public.on_player_mined_entity = function (ent)
Public.on_entity_died(ent) Public.on_entity_died(ent)
end end
@ -172,18 +172,18 @@ end
on_player_died - Event processing function on_player_died - Event processing function
@param player - Player @param player - Player
--]] --]]
Public.on_player_died = function(player) Public.on_player_died = function (player)
this._claims_info[player.name] = nil this._claims_info[player.name] = nil
end end
Public.clear_player_base = function(player) Public.clear_player_base = function (player)
if not player or not player.valid then if not player or not player.valid then
return return
end end
local position = player.position local position = player.position
local x, y = position.x, position.y local x, y = position.x, position.y
local entities = player.surface.find_entities_filtered {force = player.force, area = {{x - 50, y - 50}, {x + 50, y + 50}}} local entities = player.surface.find_entities_filtered { force = player.force, area = { { x - 50, y - 50 }, { x + 50, y + 50 } } }
for i = 1, #entities do for i = 1, #entities do
local e = entities[i] local e = entities[i]
@ -202,7 +202,7 @@ end
get_claims - Get all claims data points for given force. get_claims - Get all claims data points for given force.
@param f_name - Force name. @param f_name - Force name.
--]] --]]
Public.get_claims = function(f_name) Public.get_claims = function (f_name)
if this._claims_info[f_name] == nil then if this._claims_info[f_name] == nil then
return {} return {}
end end
@ -236,7 +236,7 @@ end
set_visibility_to - Specifies who can see the claims and redraws. set_visibility_to - Specifies who can see the claims and redraws.
@param name - Name of a player. @param name - Name of a player.
--]] --]]
Public.set_visibility_to = function(name) Public.set_visibility_to = function (name)
for _, p in pairs(this._claims_visible_to) do for _, p in pairs(this._claims_visible_to) do
if p == name then if p == name then
return return
@ -251,7 +251,7 @@ end
remove_visibility_from - Remove the claim visibility from the player. remove_visibility_from - Remove the claim visibility from the player.
@param name - Name of a player. @param name - Name of a player.
--]] --]]
Public.remove_visibility_from = function(name) Public.remove_visibility_from = function (name)
for i = 1, #this._claims_visible_to do for i = 1, #this._claims_visible_to do
local p = this._claims_visible_to[i] local p = this._claims_visible_to[i]
if p == name then if p == name then

View File

@ -167,8 +167,8 @@ remove_character = function (unit_number)
if data.entity and data.entity.valid then if data.entity and data.entity.valid then
data.entity.destroy() data.entity.destroy()
end end
if rendering.is_valid(data.render_id) then if data.render_id then
rendering.destroy(data.render_id) data.render_id.destroy()
end end
remove(this.characters, index) remove(this.characters, index)
end end

View File

@ -8,7 +8,7 @@ local this = {
Global.register( Global.register(
this, this,
function(t) function (t)
this = t this = t
end end
) )
@ -44,24 +44,23 @@ local function compute_fullness(player, position)
local damage = ceil((warn_player.count / 2) * warn_player.count) local damage = ceil((warn_player.count / 2) * warn_player.count)
if player.character.health >= damage then if player.character.health >= damage then
player.character.damage(damage, 'player', 'explosion') player.character.damage(damage, 'player', 'explosion')
player.character.surface.create_entity({name = 'water-splash', position = player.position}) player.character.surface.create_entity({ name = 'water-splash', position = player.position })
local messages = { local messages = {
'Ouch.. That hurt! Better be careful now.', 'Ouch.. That hurt! Better be careful now.',
'Just a fleshwound.', 'Just a fleshwound.',
'Better keep those hands to yourself or you might loose them.' 'Better keep those hands to yourself or you might loose them.'
} }
player.surface.create_entity( player.create_local_flying_text(
{ {
name = 'flying-text', position = { position.x, position.y + 0.6 },
position = {position.x, position.y + 0.6},
text = messages[random(1, #messages)], text = messages[random(1, #messages)],
color = {r = 0.75, g = 0.0, b = 0.0} color = { r = 0.75, g = 0.0, b = 0.0 }
} }
) )
else else
player.character.die('enemy') player.character.die('enemy')
is_player_warned(player, true) is_player_warned(player, true)
game.print(player.name .. ' should have emptied their pockets.', {r = 0.75, g = 0.0, b = 0.0}) game.print(player.name .. ' should have emptied their pockets.', { r = 0.75, g = 0.0, b = 0.0 })
return free_slots return free_slots
end end
end end
@ -70,12 +69,11 @@ local function compute_fullness(player, position)
end end
if free_slots > 1 then if free_slots > 1 then
if floor(inventory_size / free_slots) == 10 then -- When player has 10% free slots if floor(inventory_size / free_slots) == 10 then -- When player has 10% free slots
player.surface.create_entity( player.create_local_flying_text(
{ {
name = 'flying-text', position = { position.x, position.y + 0.6 },
position = {position.x, position.y + 0.6},
text = 'You are feeling heavy', text = 'You are feeling heavy',
color = {r = 1.0, g = 0.5, b = 0.0} color = { r = 1.0, g = 0.5, b = 0.0 }
} }
) )
end end
@ -113,7 +111,7 @@ local check_fullness = Public.check_fullness
Event.add( Event.add(
defines.events.on_player_mined_entity, defines.events.on_player_mined_entity,
function(event) function (event)
local entity = event.entity local entity = event.entity
if not entity or not entity.valid then if not entity or not entity.valid then
return return

View File

@ -12,7 +12,7 @@ local this = {
} }
Global.register( Global.register(
this, this,
function(tbl) function (tbl)
this = tbl this = tbl
end end
) )
@ -25,7 +25,7 @@ local direction_reverse = {
} }
local directions = { local directions = {
['north'] = function(position, reverse) ['north'] = function (position, reverse)
local surface_index = this.surface_index local surface_index = this.surface_index
if not surface_index then if not surface_index then
return return
@ -45,14 +45,14 @@ local directions = {
local a = width * 0.5 + 4 local a = width * 0.5 + 4
if not reverse then if not reverse then
this.vector = {0, -1} this.vector = { 0, -1 }
this.area = {{position.x - a, position.y - 1}, {position.x + a, position.y}} this.area = { { position.x - a, position.y - 1 }, { position.x + a, position.y } }
else else
this.reverse_vector = {0, -1} this.reverse_vector = { 0, -1 }
this.reverse_area = {{position.x - a, position.y - 1}, {position.x + a, position.y}} this.reverse_area = { { position.x - a, position.y - 1 }, { position.x + a, position.y } }
end end
end, end,
['south'] = function(position, reverse) ['south'] = function (position, reverse)
local surface_index = this.surface_index local surface_index = this.surface_index
if not surface_index then if not surface_index then
return return
@ -71,14 +71,14 @@ local directions = {
end end
local a = width * 0.5 local a = width * 0.5
if not reverse then if not reverse then
this.vector = {0, 1} this.vector = { 0, 1 }
this.area = {{position.x - a, position.y}, {position.x + a, position.y + 1}} this.area = { { position.x - a, position.y }, { position.x + a, position.y + 1 } }
else else
this.reverse_vector = {0, 1} this.reverse_vector = { 0, 1 }
this.reverse_area = {{position.x - a, position.y}, {position.x + a, position.y + 1}} this.reverse_area = { { position.x - a, position.y }, { position.x + a, position.y + 1 } }
end end
end, end,
['west'] = function(position, reverse) ['west'] = function (position, reverse)
local surface_index = this.surface_index local surface_index = this.surface_index
if not surface_index then if not surface_index then
return return
@ -97,14 +97,14 @@ local directions = {
end end
local a = width * 0.5 + 1 local a = width * 0.5 + 1
if not reverse then if not reverse then
this.vector = {-1, 0} this.vector = { -1, 0 }
this.area = {{position.x - 1, position.y - a}, {position.x, position.y + a}} this.area = { { position.x - 1, position.y - a }, { position.x, position.y + a } }
else else
this.reverse_vector = {-1, 0} this.reverse_vector = { -1, 0 }
this.reverse_area = {{position.x - 1, position.y - a}, {position.x, position.y + a}} this.reverse_area = { { position.x - 1, position.y - a }, { position.x, position.y + a } }
end end
end, end,
['east'] = function(position, reverse) ['east'] = function (position, reverse)
local surface_index = this.surface_index local surface_index = this.surface_index
if not surface_index then if not surface_index then
return return
@ -123,11 +123,11 @@ local directions = {
end end
local a = width * 0.5 + 1 local a = width * 0.5 + 1
if not reverse then if not reverse then
this.vector = {1, 0} this.vector = { 1, 0 }
this.area = {{position.x, position.y - a}, {position.x + 1, position.y + a}} this.area = { { position.x, position.y - a }, { position.x + 1, position.y + a } }
else else
this.reverse_vector = {1, 0} this.reverse_vector = { 1, 0 }
this.reverse_area = {{position.x, position.y - a}, {position.x + 1, position.y + a}} this.reverse_area = { { position.x, position.y - a }, { position.x + 1, position.y + a } }
end end
end end
} }
@ -144,7 +144,7 @@ local function set_collapse_tiles(surface)
print_debug(45) print_debug(45)
end end
game.forces.player.chart(surface, this.area) game.forces.player.chart(surface, this.area)
this.tiles = surface.find_tiles_filtered({area = this.area, name = 'out-of-map', invert = true}) this.tiles = surface.find_tiles_filtered({ area = this.area, name = 'out-of-map', invert = true })
if not this.tiles then if not this.tiles then
return return
@ -153,11 +153,11 @@ local function set_collapse_tiles(surface)
if this.size_of_tiles > 0 then if this.size_of_tiles > 0 then
table_shuffle_table(this.tiles) table_shuffle_table(this.tiles)
end end
this.position = {x = this.position.x + this.vector[1], y = this.position.y + this.vector[2]} this.position = { x = this.position.x + this.vector[1], y = this.position.y + this.vector[2] }
local v = this.vector local v = this.vector
local area = this.area local area = this.area
this.area = {{area[1][1] + v[1], area[1][2] + v[2]}, {area[2][1] + v[1], area[2][2] + v[2]}} this.area = { { area[1][1] + v[1], area[1][2] + v[2] }, { area[2][1] + v[1], area[2][2] + v[2] } }
local chart_area = {{area[1][1] + v[1] - 4, area[1][2] + v[2] - 4}, {area[2][1] + v[1] + 4, area[2][2] + v[2] + 4}} local chart_area = { { area[1][1] + v[1] - 4, area[1][2] + v[2] - 4 }, { area[2][1] + v[1] + 4, area[2][2] + v[2] + 4 } }
game.forces.player.chart(surface, chart_area) game.forces.player.chart(surface, chart_area)
end end
@ -166,7 +166,7 @@ local function set_reverse_collapse_tiles(surface)
if not surface or surface.valid then if not surface or surface.valid then
print_debug(45) print_debug(45)
end end
this.reverse_tiles = surface.find_tiles_filtered({area = this.reverse_area, name = 'out-of-map', invert = true}) this.reverse_tiles = surface.find_tiles_filtered({ area = this.reverse_area, name = 'out-of-map', invert = true })
if not this.reverse_tiles then if not this.reverse_tiles then
return return
@ -175,11 +175,11 @@ local function set_reverse_collapse_tiles(surface)
if this.reverse_size_of_tiles > 0 then if this.reverse_size_of_tiles > 0 then
table_shuffle_table(this.reverse_tiles) table_shuffle_table(this.reverse_tiles)
end end
this.reverse_position = {x = this.reverse_position.x + this.reverse_vector[1], y = this.reverse_position.y + this.reverse_vector[2]} this.reverse_position = { x = this.reverse_position.x + this.reverse_vector[1], y = this.reverse_position.y + this.reverse_vector[2] }
local v = this.reverse_vector local v = this.reverse_vector
local area = this.reverse_area local area = this.reverse_area
this.reverse_area = {{area[1][1] + v[1], area[1][2] + v[2]}, {area[2][1] + v[1], area[2][2] + v[2]}} this.reverse_area = { { area[1][1] + v[1], area[1][2] + v[2] }, { area[2][1] + v[1], area[2][2] + v[2] } }
local chart_area = {{area[1][1] + v[1] - 4, area[1][2] + v[2] - 10}, {area[2][1] + v[1] + 4, area[2][2] + v[2] + 10}} local chart_area = { { area[1][1] + v[1] - 4, area[1][2] + v[2] - 10 }, { area[2][1] + v[1] + 4, area[2][2] + v[2] + 10 } }
local force = game.forces.player local force = game.forces.player
force.chart(surface, chart_area) force.chart(surface, chart_area)
@ -221,9 +221,9 @@ local function progress()
return return
end end
if this.specific_entities.enabled then if this.specific_entities.enabled then
local position = {tile.position.x + 0.5, tile.position.y + 0.5} local position = { tile.position.x + 0.5, tile.position.y + 0.5 }
local entities = this.specific_entities.entities local entities = this.specific_entities.entities
for _, e in pairs(surface.find_entities_filtered({area = {{position[1] - 4, position[2] - 2}, {position[1] + 4, position[2] + 2}}})) do for _, e in pairs(surface.find_entities_filtered({ area = { { position[1] - 4, position[2] - 2 }, { position[1] + 4, position[2] + 2 } } })) do
if entities[e.name] and e.valid and e.health then if entities[e.name] and e.valid and e.health then
e.die() e.die()
elseif e.valid then elseif e.valid then
@ -232,14 +232,14 @@ local function progress()
end end
end end
if this.kill then if this.kill then
local position = {tile.position.x + 0.5, tile.position.y + 0.5} local position = { tile.position.x + 0.5, tile.position.y + 0.5 }
for _, e in pairs(surface.find_entities_filtered({area = {{position[1] - 4, position[2] - 2}, {position[1] + 4, position[2] + 2}}})) do for _, e in pairs(surface.find_entities_filtered({ area = { { position[1] - 4, position[2] - 2 }, { position[1] + 4, position[2] + 2 } } })) do
if e.valid and e.health then if e.valid and e.health then
e.die() e.die()
end end
end end
end end
surface.set_tiles({{name = 'out-of-map', position = tile.position}}, true) surface.set_tiles({ { name = 'out-of-map', position = tile.position } }, true)
end end
end end
@ -278,9 +278,9 @@ local function progress_reverse()
return return
end end
if this.specific_entities.enabled then if this.specific_entities.enabled then
local position = {tile.position.x + 0.5, tile.position.y + 0.5} local position = { tile.position.x + 0.5, tile.position.y + 0.5 }
local entities = this.specific_entities.entities local entities = this.specific_entities.entities
for _, e in pairs(surface.find_entities_filtered({area = {{position[1] - 4, position[2] - 2}, {position[1] + 4, position[2] + 2}}})) do for _, e in pairs(surface.find_entities_filtered({ area = { { position[1] - 4, position[2] - 2 }, { position[1] + 4, position[2] + 2 } } })) do
if entities[e.name] and e.valid and e.health then if entities[e.name] and e.valid and e.health then
e.die() e.die()
elseif e.valid then elseif e.valid then
@ -289,14 +289,14 @@ local function progress_reverse()
end end
end end
if this.kill then if this.kill then
local position = {tile.position.x + 0.5, tile.position.y + 0.5} local position = { tile.position.x + 0.5, tile.position.y + 0.5 }
for _, e in pairs(surface.find_entities_filtered({area = {{position[1] - 4, position[2] - 2}, {position[1] + 4, position[2] + 2}}})) do for _, e in pairs(surface.find_entities_filtered({ area = { { position[1] - 4, position[2] - 2 }, { position[1] + 4, position[2] + 2 } } })) do
if e.valid and e.health then if e.valid and e.health then
e.die() e.die()
end end
end end
end end
surface.set_tiles({{name = 'out-of-map', position = tile.position}}, true) surface.set_tiles({ { name = 'out-of-map', position = tile.position } }, true)
end end
end end
@ -351,7 +351,7 @@ function Public.set_reverse_position(position)
if position.y then if position.y then
y = position.y y = position.y
end end
this.reverse_position = {x = x, y = y} this.reverse_position = { x = x, y = y }
end end
function Public.set_reverse_direction() function Public.set_reverse_direction()
@ -419,7 +419,7 @@ function Public.set_position(position)
if position.y then if position.y then
y = position.y y = position.y
end end
this.position = {x = x, y = y} this.position = { x = x, y = y }
end end
function Public.get_position() function Public.get_position()
@ -504,7 +504,7 @@ end
local function on_init() local function on_init()
Public.set_surface_index(game.surfaces.nauvis.index) Public.set_surface_index(game.surfaces.nauvis.index)
Public.set_position({0, 32}) Public.set_position({ 0, 32 })
Public.set_max_line_size(256) Public.set_max_line_size(256)
Public.set_direction('north') Public.set_direction('north')
Public.set_kill_entities(true) Public.set_kill_entities(true)

View File

@ -1,98 +0,0 @@
local function draw_map_tag(surface, force, position, name)
local t = force.add_chart_tag(surface, {icon = {type = 'item', name = 'heavy-armor'}, position = position, text = ' '})
if t and name then
t.last_user = name
end
end
local function is_tag_valid(tag)
if not tag.icon then
return
end
if tag.icon.type ~= 'item' then
return
end
if tag.icon.name ~= 'heavy-armor' then
return
end
if tag.text ~= ' ' then
return
end
return true
end
local function get_corpse_force(corpse)
if corpse.character_corpse_player_index then
if game.players[corpse.character_corpse_player_index] then
return game.players[corpse.character_corpse_player_index].force
end
end
return game.forces.neutral
end
local function destroy_all_tags()
for _, force in pairs(game.forces) do
for _, surface in pairs(game.surfaces) do
for _, tag in pairs(force.find_chart_tags(surface)) do
if is_tag_valid(tag) then
tag.destroy()
end
end
end
end
end
local function redraw_all_tags()
for _, surface in pairs(game.surfaces) do
for _, corpse in pairs(surface.find_entities_filtered({name = 'character-corpse'})) do
if corpse.character_corpse_player_index then
local player = game.get_player(corpse.character_corpse_player_index)
if player and player.valid then
draw_map_tag(corpse.surface, get_corpse_force(corpse), corpse.position, player.name)
end
else
draw_map_tag(corpse.surface, get_corpse_force(corpse), corpse.position)
end
end
end
end
local function find_and_destroy_tag(corpse)
local force = get_corpse_force(corpse)
for _, tag in pairs(force.find_chart_tags(corpse.surface, {{corpse.position.x - 0.1, corpse.position.y - 0.1}, {corpse.position.x + 0.1, corpse.position.y + 0.1}})) do
if is_tag_valid(tag) then
tag.destroy()
return true
end
end
return false
end
local function on_player_died(event)
local player = game.players[event.player_index]
draw_map_tag(player.surface, player.force, player.position, player.name)
end
local function on_character_corpse_expired(event)
if find_and_destroy_tag(event.corpse) then
return
end
destroy_all_tags()
redraw_all_tags()
end
local function on_pre_player_mined_item(event)
if event.entity.name ~= 'character-corpse' then
return
end
if find_and_destroy_tag(event.entity) then
return
end
destroy_all_tags()
redraw_all_tags()
end
local event = require 'utils.event'
event.add(defines.events.on_player_died, on_player_died)
event.add(defines.events.on_character_corpse_expired, on_character_corpse_expired)
event.add(defines.events.on_pre_player_mined_item, on_pre_player_mined_item)

View File

@ -212,7 +212,7 @@ local function damage_area(cell)
end end
end end
local tile = surface.get_tile(cell.position) local tile = surface.get_tile(cell.position.x, cell.position.y)
if not tile or not tile.valid then return end if not tile or not tile.valid then return end
if this.explosives.destructible_tiles[tile.name] then if this.explosives.destructible_tiles[tile.name] then
local key = pos_to_key(tile.position) local key = pos_to_key(tile.position)

View File

@ -27,7 +27,7 @@ local function on_console_chat(event)
local y_offset = -4 local y_offset = -4
if this.player_floaty_chat[player.index] then if this.player_floaty_chat[player.index] then
rendering.get_object_by_id(this.player_floaty_chat[player.index]).destroy() this.player_floaty_chat[player.index].destroy()
this.player_floaty_chat[player.index] = nil this.player_floaty_chat[player.index] = nil
end end

View File

@ -25,7 +25,6 @@ local item_worths = {
['inserter'] = 4, ['inserter'] = 4,
['long-handed-inserter'] = 8, ['long-handed-inserter'] = 8,
['fast-inserter'] = 16, ['fast-inserter'] = 16,
['bulk-inserter'] = 128,
['bulk-inserter'] = 160, ['bulk-inserter'] = 160,
['small-electric-pole'] = 2, ['small-electric-pole'] = 2,
['medium-electric-pole'] = 32, ['medium-electric-pole'] = 32,
@ -240,7 +239,7 @@ local function roll_item_stack(entity, wave)
end end
end end
entity.surface.spill_item_stack(entity.position, { name = item_name, count = random(1, item_count) }, true) entity.surface.spill_item_stack({ position = entity.position, stack = { item_name = entity.name, count = random(1, item_count), quality = 'normal' } })
return { name = item_name, count = item_count } return { name = item_name, count = item_count }
end end

View File

@ -57,7 +57,7 @@ function Public:new_render()
end end
if self.render_id then if self.render_id then
rendering.destroy(self.render_id) self.render_id.destroy()
end end
self.render_id = rendering.draw_sprite { target = self.position, sprite = self.sprite, surface = surface } self.render_id = rendering.draw_sprite { target = self.position, sprite = self.sprite, surface = surface }
@ -107,16 +107,9 @@ function Public:set_render_scalar_size()
return self:validate() return self:validate()
end end
rendering.set_y_scale(self.render_id, 3.5) -- 1.5 self.render_id.y_scale = 3.5 -- 1.5
rendering.set_x_scale(self.render_id, 7) -- 2 self.render_id.x_scale = 7 -- 2
rendering.set_color( self.render_id.color = { r = 1, g = 0.7, b = 0.7 }
self.render_id,
{
r = 1,
g = 0.7,
b = 0.7
}
)
end end
--- Gets a random position. --- Gets a random position.
@ -227,7 +220,7 @@ function Public:set_new_position()
end end
if self:validate() then if self:validate() then
rendering.set_target(self.render_id, self.position) self.render_id.target = self.position
self:set_render_scalar_size() self:set_render_scalar_size()
end end
end end
@ -290,7 +283,7 @@ function Public:validate()
self:new_render() self:new_render()
return false return false
end end
if rendering.is_valid(self.render_id) then if self.render_id.valid then
return true return true
end end
return false return false
@ -298,8 +291,8 @@ end
--- Destroys a render. --- Destroys a render.
function Public:destroy_render() function Public:destroy_render()
if rendering.is_valid(self.render_id) then if self.render_id and self.render_id.valid then
rendering.destroy(self.render_id) self.render_id.destroy()
end end
return self return self
end end

View File

@ -77,10 +77,19 @@ local tier_damage = {
} }
local commands = { local commands = {
['flee'] = 'goto', ['flee'] = 'attack',
['goto'] = 'attack_area', ['goto'] = 'attack_area',
['attack'] = 'attack', ['attack'] = 'flee',
['attack_area'] = 'attack_area', ['attack_area'] = 'goto',
}
local pf_flags = {
allow_destroy_friendly_entities = true,
allow_paths_through_own_entities = true,
cache = true,
prefer_straight_paths = false,
low_priority = false,
no_break = false,
} }
--- A token to register tasks that entities are given --- A token to register tasks that entities are given
@ -502,7 +511,7 @@ local function on_entity_damaged(event)
state:spawn_children() state:spawn_children()
end end
if random(1, 128) == 1 then if random(1, 64) == 1 then
state:flee_command() state:flee_command()
end end
@ -514,7 +523,7 @@ local function on_entity_damaged(event)
end end
end end
--- Creates a new state for a boss unit.
---@param data table ---@param data table
---@return table|nil ---@return table|nil
function Public.new(data) function Public.new(data)
@ -535,6 +544,7 @@ function Public.new(data)
state.teleported = 0 state.teleported = 0
state.uid = uid state.uid = uid
state.command = 'goto' state.command = 'goto'
state.last_command = 0
state.id = state.entity.unit_number state.id = state.entity.unit_number
state.update_rate = this.settings.update_rate + (10 * state.uid) state.update_rate = this.settings.update_rate + (10 * state.uid)
state.ttl = data.ttl or tick + (5 * 3600) -- 5 minutes duration state.ttl = data.ttl or tick + (5 * 3600) -- 5 minutes duration
@ -860,7 +870,7 @@ function Public._esp:find_targets()
self.commands[#self.commands + 1] = { self.commands[#self.commands + 1] = {
type = defines.command.attack, type = defines.command.attack,
target = obstacles[ii], target = obstacles[ii],
distraction = defines.distraction.none distraction = defines.distraction.by_anything
} }
end end
end end
@ -983,11 +993,26 @@ function Public._esp:go_to_location_command()
self:check_unit_group() self:check_unit_group()
end end
self.group.set_command { local group_commands = {}
group_commands[#group_commands + 1] = {
type = defines.command.go_to_location, type = defines.command.go_to_location,
destination_entity = unit, pathfind_flags = pf_flags,
radius = 3 destination = unit.position,
distraction = defines.distraction.by_enemy
} }
if not self.command_added then
self.command_added = true
self.group.set_command(
{
type = defines.command.compound,
structure_type = defines.compound_command.return_last,
commands = group_commands
}
)
end
end end
function Public._esp:attack_command() function Public._esp:attack_command()
@ -1000,10 +1025,27 @@ function Public._esp:attack_command()
self:check_unit_group() self:check_unit_group()
end end
self.group.set_command { local group_commands = {}
group_commands[#group_commands + 1] = {
type = defines.command.go_to_location,
pathfind_flags = pf_flags,
destination = unit.position,
distraction = defines.distraction.by_enemy
}
group_commands[#group_commands + 1] = {
type = defines.command.attack, type = defines.command.attack,
target = unit target = unit
} }
self.group.set_command(
{
type = defines.command.compound,
structure_type = defines.compound_command.return_last,
commands = group_commands
}
)
end end
function Public._esp:attack_area_command() function Public._esp:attack_area_command()
@ -1016,12 +1058,29 @@ function Public._esp:attack_area_command()
self:check_unit_group() self:check_unit_group()
end end
self.group.set_command { local group_commands = {}
group_commands[#group_commands + 1] = {
type = defines.command.go_to_location,
pathfind_flags = pf_flags,
destination = unit.position,
distraction = defines.distraction.by_enemy
}
group_commands[#group_commands + 1] = {
type = defines.command.attack_area, type = defines.command.attack_area,
destination = { x = unit.position.x, y = unit.position.y }, destination = { x = unit.position.x, y = unit.position.y },
radius = 30, radius = 30,
distraction = defines.distraction.none distraction = defines.distraction.by_anything
} }
self.group.set_command(
{
type = defines.command.compound,
structure_type = defines.compound_command.return_last,
commands = group_commands
}
)
end end
function Public._esp:flee_command() function Public._esp:flee_command()
@ -1034,10 +1093,25 @@ function Public._esp:flee_command()
self:check_unit_group() self:check_unit_group()
end end
self.group.set_command { local group_commands = {}
group_commands[#group_commands + 1] = {
type = defines.command.flee, type = defines.command.flee,
from = unit, from = unit,
} }
group_commands[#group_commands + 1] = {
type = defines.command.flee,
from = unit,
}
self.group.set_command(
{
type = defines.command.compound,
structure_type = defines.compound_command.return_last,
commands = group_commands
}
)
end end
function Public._esp:work(tick) function Public._esp:work(tick)
@ -1045,12 +1119,21 @@ function Public._esp:work(tick)
self:set_frenzy() self:set_frenzy()
end end
if self.command == 'goto' then if self.last_command < tick then
self:go_to_location_command() if self.command == 'goto' then
elseif self.command == 'attack' then self:go_to_location_command()
self:attack_command() elseif self.command == 'attack' then
elseif self.command == 'attack_area' then -- self:attack_command()
self:attack_area_command() -- self:go_to_location_command()
elseif self.command == 'attack_area' then
self:attack_area_command()
-- self:go_to_location_command()
end
self.last_command = tick + 500
if this.target_settings.main_target and this.target_settings.main_target.valid and this.target_settings.main_target.name == 'character' then
Event.raise(Public.events.on_primary_target_missing)
end
end end
if self.go_havoc and self.clear_go_havoc > tick then if self.go_havoc and self.clear_go_havoc > tick then

View File

@ -173,10 +173,12 @@ local function get_spawn_pos()
local located_position = find_initial_spot(surface, initial_position) local located_position = find_initial_spot(surface, initial_position)
local valid_position = surface.find_non_colliding_position('stone-furnace', located_position, 32, 1) local valid_position = surface.find_non_colliding_position('stone-furnace', located_position, 32, 1)
local debug = Public.get('debug') local debug = Public.get('debug')
if valid_position then if debug then
local x = valid_position.x if valid_position then
local y = valid_position.y local x = valid_position.x
game.print('[gps=' .. x .. ',' .. y .. ',' .. surface.name .. ']') local y = valid_position.y
game.print('[gps=' .. x .. ',' .. y .. ',' .. surface.name .. ']')
end
end end
if not valid_position then if not valid_position then
@ -330,7 +332,6 @@ local function set_main_target()
local target = Public.get('target') local target = Public.get('target')
if target then if target then
if target.valid then if target.valid then
raise(Public.events.on_target_aquired, { target = target })
return return
end end
end end
@ -346,7 +347,6 @@ local function set_main_target()
sec_target = get_random_character() sec_target = get_random_character()
end end
if not sec_target then if not sec_target then
raise(Public.events.on_target_aquired, { target = target })
return return
end end
@ -893,6 +893,7 @@ local function get_main_command(group)
local target = Public.get('target') local target = Public.get('target')
if not valid(target) then if not valid(target) then
Event.raise(Public.events.on_primary_target_missing)
return return
end end
@ -1058,6 +1059,7 @@ local function give_side_commands_to_group()
local target = Public.get('target') local target = Public.get('target')
if not valid(target) then if not valid(target) then
Event.raise(Public.events.on_primary_target_missing)
return return
end end
@ -1076,9 +1078,13 @@ end
local function give_main_command_to_group() local function give_main_command_to_group()
local target = Public.get('target') local target = Public.get('target')
if not valid(target) then if not valid(target) then
Event.raise(Public.events.on_primary_target_missing)
return return
end end
-- This is called even if the target is valid
Event.raise(Public.events.on_primary_target_missing)
local generated_units = Public.get('generated_units') local generated_units = Public.get('generated_units')
for _, group in pairs(generated_units.unit_groups) do for _, group in pairs(generated_units.unit_groups) do
if type(group) ~= 'number' then if type(group) ~= 'number' then
@ -1337,6 +1343,7 @@ local function check_group_positions()
local generated_units = Public.get('generated_units') local generated_units = Public.get('generated_units')
local target = Public.get('target') local target = Public.get('target')
if not valid(target) then if not valid(target) then
Event.raise(Public.events.on_primary_target_missing)
return return
end end
@ -1437,9 +1444,6 @@ Event.on_nth_tick(
return return
end end
-- local generated_units = Public.get('generated_units')
-- game.print(serpent.block(generated_units.unit_groups))
local paused = Public.get('paused') local paused = Public.get('paused')
if paused then if paused then
local players = game.connected_players local players = game.connected_players

View File

@ -177,7 +177,7 @@ local function damage_player(player, kill, print_to_all)
'Just a fleshwound.', 'Just a fleshwound.',
'Better keep those hands to yourself or you might loose them.' 'Better keep those hands to yourself or you might loose them.'
} }
player.print(messages[random(1, #messages)], Color.yellow) player.print(messages[random(1, #messages)], { color = Color.yellow })
if player.character.health <= 0 then if player.character.health <= 0 then
player.character.die('enemy') player.character.die('enemy')
game.print(player.name .. msg, Color.yellow) game.print(player.name .. msg, Color.yellow)
@ -235,7 +235,7 @@ local function on_marked_for_deconstruction(event)
end end
if playtime < this.required_playtime then if playtime < this.required_playtime then
event.entity.cancel_deconstruction(game.get_player(event.player_index).force.name) event.entity.cancel_deconstruction(game.get_player(event.player_index).force.name)
player.print('You have not grown accustomed to this technology yet.', { r = 0.22, g = 0.99, b = 0.99 }) player.print('You have not grown accustomed to this technology yet.', { color = { r = 0.22, g = 0.99, b = 0.99 } })
end end
end end
@ -350,7 +350,7 @@ local function on_built_entity(event)
if playtime < this.required_playtime then if playtime < this.required_playtime then
created_entity.destroy() created_entity.destroy()
player.print('You have not grown accustomed to this technology yet.', { r = 0.22, g = 0.99, b = 0.99 }) player.print('You have not grown accustomed to this technology yet.', { color = { r = 0.22, g = 0.99, b = 0.99 } })
end end
end end
end end

View File

@ -11,7 +11,7 @@ local this = {
Global.register( Global.register(
this, this,
function(tbl) function (tbl)
this = tbl this = tbl
end end
) )
@ -19,14 +19,14 @@ Global.register(
local Public = {} local Public = {}
local brain = { local brain = {
[1] = {'Our Discord server is at: https://getcomfy.eu/discord'}, [1] = { 'Our Discord server is at: https://getcomfy.eu/discord' },
[2] = { [2] = {
'Need an admin? Join our discord at: https://getcomfy.eu/discord,', 'Need an admin? Join our discord at: https://getcomfy.eu/discord,',
'and report it in #i-need-halp', 'and report it in #i-need-halp',
'If you have played for more than 5h in our maps then,', 'If you have played for more than 5h in our maps then,',
'you are eligible to run the command /jail and /free' 'you are eligible to run the command /jail and /free'
}, },
[3] = {'Scenario repository for download:', 'https://github.com/ComfyFactory/ComfyFactorio'}, [3] = { 'Scenario repository for download:', 'https://github.com/ComfyFactory/ComfyFactorio' },
[4] = { [4] = {
'If you feel like the server is lagging, run the following command:', 'If you feel like the server is lagging, run the following command:',
'/server-ups', '/server-ups',
@ -65,12 +65,12 @@ local links = {
local function on_player_created(event) local function on_player_created(event)
local player = game.get_player(event.player_index) local player = game.get_player(event.player_index)
if this.settings.enable_classic_print then if this.settings.enable_classic_print then
player.print('[font=default-game]' .. 'Join the comfy discord >> getcomfy.eu/discord <<' .. '[/font]', {r = 150, g = 100, b = 255, a = 255}) player.print('[font=default-game]' .. 'Join the comfy discord >> getcomfy.eu/discord <<' .. '[/font]', { color = { r = 150, g = 100, b = 255, a = 255 } })
else else
player.print( player.print(
'[font=heading-1]' .. '[font=heading-1]' ..
'[color=#E99696]J[/color][color=#E9A296]o[/color][color=#E9AF96]i[/color][color=#E9BB96]n[/color] [color=#E9C896]t[/color][color=#E9D496]h[/color][color=#E9E096]e[/color] ☕[color=#E5E996]c[/color][color=#D8E996]o[/color][color=#CCE996]m[/color][color=#BFE996]f[/color][color=#B3E996]y[/color] [color=#A6E996]d[/color][color=#9AE996]i[/color][color=#96E99E]s[/color][color=#96E9AB]c[/color][color=#96E9B7]o[/color][color=#96E9C3]r[/color][color=#96E9D0]d[/color] [color=#96E9DC]>[/color][color=#96E9E9]>[/color] [color=#96DCE9]g[/color][color=#96D0E9]e[/color][color=#96C3E9]t[/color][color=#96B7E9]c[/color][color=#96ABE9]o[/color][color=#969EE9]m[/color][color=#9A96E9]f[/color][color=#A696E9]y[/color][color=#B396E9].[/color][color=#BF96E9]e[/color][color=#CC96E9]u[/color][color=#D896E9]/[/color][color=#E596E9]d[/color][color=#E996E0]i[/color][color=#E996D4]s[/color][color=#E996C8]c[/color][color=#E996BB]o[/color][color=#E996AF]r[/color][color=#E996A2]d[/color]' .. '[color=#E99696]J[/color][color=#E9A296]o[/color][color=#E9AF96]i[/color][color=#E9BB96]n[/color] [color=#E9C896]t[/color][color=#E9D496]h[/color][color=#E9E096]e[/color] ☕[color=#E5E996]c[/color][color=#D8E996]o[/color][color=#CCE996]m[/color][color=#BFE996]f[/color][color=#B3E996]y[/color] [color=#A6E996]d[/color][color=#9AE996]i[/color][color=#96E99E]s[/color][color=#96E9AB]c[/color][color=#96E9B7]o[/color][color=#96E9C3]r[/color][color=#96E9D0]d[/color] [color=#96E9DC]>[/color][color=#96E9E9]>[/color] [color=#96DCE9]g[/color][color=#96D0E9]e[/color][color=#96C3E9]t[/color][color=#96B7E9]c[/color][color=#96ABE9]o[/color][color=#969EE9]m[/color][color=#9A96E9]f[/color][color=#A696E9]y[/color][color=#B396E9].[/color][color=#BF96E9]e[/color][color=#CC96E9]u[/color][color=#D896E9]/[/color][color=#E596E9]d[/color][color=#E996E0]i[/color][color=#E996D4]s[/color][color=#E996C8]c[/color][color=#E996BB]o[/color][color=#E996AF]r[/color][color=#E996A2]d[/color]' ..
'[/font]' '[/font]'
) )
end end
end end
@ -85,7 +85,7 @@ local function process_bot_answers(event)
for word in string.gmatch(message, '%g+') do for word in string.gmatch(message, '%g+') do
if links[word] then if links[word] then
for _, bot_answer in pairs(links[word]) do for _, bot_answer in pairs(links[word]) do
player.print('[font=heading-1]' .. bot_answer .. '[/font]', Color.warning) player.print('[font=heading-1]' .. bot_answer .. '[/font]', { color = Color.warning })
end end
return return
end end

View File

@ -72,16 +72,25 @@ Event.add(defines.events.on_console_command, on_console_command)
Event.add( Event.add(
defines.events.on_player_promoted, defines.events.on_player_promoted,
function(event) function (event)
local admins = Server.get_admins_data()
local player = game.get_player(event.player_index) local player = game.get_player(event.player_index)
local server_name = Server.get_server_name() or 'CommandHandler' local server_name = Server.get_server_name() or 'CommandHandler'
Discord.send_notification_raw(server_name, player.name .. ' was promoted.') Discord.send_notification_raw(server_name, player.name .. ' was promoted.')
if not game.is_multiplayer() then
return
end
if not admins[player.name] then
player.admin = false
return
end
end end
) )
Event.add( Event.add(
defines.events.on_player_demoted, defines.events.on_player_demoted,
function(event) function (event)
local player = game.get_player(event.player_index) local player = game.get_player(event.player_index)
local server_name = Server.get_server_name() or 'CommandHandler' local server_name = Server.get_server_name() or 'CommandHandler'
Discord.send_notification_raw(server_name, player.name .. ' was demoted.') Discord.send_notification_raw(server_name, player.name .. ' was demoted.')
@ -90,7 +99,7 @@ Event.add(
Event.add( Event.add(
defines.events.on_player_kicked, defines.events.on_player_kicked,
function(event) function (event)
local player = game.get_player(event.player_index) local player = game.get_player(event.player_index)
local server_name = Server.get_server_name() or 'CommandHandler' local server_name = Server.get_server_name() or 'CommandHandler'
Discord.send_notification_raw(server_name, player.name .. ' was kicked.') Discord.send_notification_raw(server_name, player.name .. ' was kicked.')

View File

@ -498,6 +498,19 @@ function Public:add_parameter(name, optional, as_type)
return self return self
end end
--- Adds an alias to the command.
---@param name string
---@return MetaCommand
function Public:add_alias(name)
if self.aliases[name] then
error('Alias: ' .. name .. ' already exists for command: ' .. self.name, 2)
end
self.aliases[name] = name
return self
end
--- Sets the command as default if marking paramaters as optional. --- Sets the command as default if marking paramaters as optional.
---@param defaults any ---@param defaults any
---@return MetaCommand ---@return MetaCommand
@ -553,6 +566,7 @@ end
Public.new('get', 'Hover over an object to get its name.') Public.new('get', 'Hover over an object to get its name.')
:require_admin() :require_admin()
:add_alias('entity')
:callback( :callback(
function (player) function (player)
local entity = player.selected local entity = player.selected

View File

@ -301,15 +301,15 @@ local function clear_corpses(cmd)
end end
end end
if param == nil then if param == nil then
player.print('[ERROR] Must specify radius!', Color.fail) player.print('[ERROR] Must specify radius!', { color = Color.fail })
return return
end end
if param < 0 then if param < 0 then
player.print('[ERROR] Value is too low.', Color.fail) player.print('[ERROR] Value is too low.', { color = Color.fail })
return return
end end
if param > 500 then if param > 500 then
player.print('[ERROR] Value is too big.', Color.fail) player.print('[ERROR] Value is too big.', { color = Color.fail })
return return
end end
local pos = player.position local pos = player.position
@ -330,9 +330,9 @@ local function clear_corpses(cmd)
corpse = 'corpses' corpse = 'corpses'
end end
if i == 0 then if i == 0 then
player.print('[color=blue][Cleaner][/color] No corpses to clear!', Color.warning) player.print('[color=blue][Cleaner][/color] No corpses to clear!', { color = Color.warning })
else else
player.print('[color=blue][Cleaner][/color] Cleared ' .. i .. ' ' .. corpse .. '!', Color.success) player.print('[color=blue][Cleaner][/color] Cleared ' .. i .. ' ' .. corpse .. '!', { color = Color.success })
end end
end end
@ -391,7 +391,7 @@ function Public.insert_all_items(player)
if _k and _v.type ~= 'mining-tool' then if _k and _v.type ~= 'mining-tool' then
player.character_inventory_slots_bonus = Modifiers.get_single_modifier(player, 'character_inventory_slots_bonus', 'creative') player.character_inventory_slots_bonus = Modifiers.get_single_modifier(player, 'character_inventory_slots_bonus', 'creative')
player.insert { name = _k, count = _v.stack_size, quality = quality } player.insert { name = _k, count = _v.stack_size, quality = quality }
player.print('[CREATIVE] Inserted all base items.', Color.success) player.print('[CREATIVE] Inserted all base items.', { color = Color.success })
end end
end end
end end

View File

@ -154,7 +154,7 @@ Commands.new('where', 'Locates a player')
create_mini_camera_gui(player, target) create_mini_camera_gui(player, target)
else else
remove_player_data(player) remove_player_data(player)
player.print('[Where] Please type a name of a player who is connected.', Color.warning) player.print('[Where] Please type a name of a player who is connected.', { color = Color.warning })
end end
end end
) )

View File

@ -60,7 +60,7 @@ Commands.new('save-color', "Save your personal color preset so it's always the s
local chat = player.chat_color local chat = player.chat_color
set_data(color_data_set, player.name, { color = { color }, chat = { chat } }) set_data(color_data_set, player.name, { color = { color }, chat = { chat } })
player.print('Your personal color has been saved to the datastore.', Color.success) player.print('Your personal color has been saved to the datastore.', { color = Color.success })
end end
) )
@ -69,7 +69,7 @@ Commands.new('remove-color', 'Removes your saved color from the datastore.')
:callback( :callback(
function (player) function (player)
set_data(color_data_set, player.name, nil) set_data(color_data_set, player.name, nil)
player.print('Your personal color has been removed from the datastore.', Color.success) player.print('Your personal color has been removed from the datastore.', { color = Color.success })
end end
) )

View File

@ -1,6 +1,6 @@
-- created by Gerkiz for ComfyFactorio -- created by Gerkiz for ComfyFactorio
local Token = require 'utils.token' local Task = require 'utils.task_token'
local Color = require 'utils.color_presets' local Color = require 'utils.color_presets'
local Server = require 'utils.server' local Server = require 'utils.server'
local Event = require 'utils.event' local Event = require 'utils.event'
@ -36,20 +36,79 @@ Global.register(
local Public = {} local Public = {}
local function apply_stash(player) local function check_if_item_exists(item)
local stash = this.logistics[player.name] if not prototypes.item[item] then
if stash then return false
for i, slot in pairs(stash) do end
if slot and slot.name then return true
player.set_personal_logistic_slot(i, { name = slot.name, min = slot.min, max = slot.max }) end
local function apply_logistic_network(player, saved_data)
if not saved_data then
return
end
if player.get_requester_point() then
if saved_data[1] and saved_data[1].name then
local old_section = player.get_requester_point().get_section(1)
if old_section then
old_section.group = 'Migrated from old format'
old_section.active = true
for i, slot in pairs(saved_data) do
if slot and slot.name and check_if_item_exists(slot.name) then
local item_stack = { min = slot.min, max = slot.max, value = { comparator = "=", name = slot.name, quality = "normal", type = slot.type or nil } }
old_section.set_slot(i, item_stack)
end
end
end end
return true
else
for index, section in pairs(saved_data) do
local new_section = player.get_requester_point().get_section(index) or player.get_requester_point().add_section()
if section and new_section then
local slots = section.slots
new_section.group = section.group
new_section.active = section.active
if slots and type(slots) == 'table' then
for i, slot in pairs(slots) do
if slot and slot.name and check_if_item_exists(slot.name) then
local item_stack = { min = slot.min, max = slot.max, value = { comparator = "=", name = slot.name, quality = "normal", type = slot.type or nil } }
new_section.set_slot(i, item_stack)
end
end
end
end
end
return true
end end
this.logistics[player.name] = nil else
if this.logistics[player.name] and this.logistics[player.name] == 1 then
return false
end
this.logistics[player.name] = saved_data
end end
end end
local function apply_stash(player)
local saved_data = this.logistics[player.name]
apply_logistic_network(player, saved_data)
this.logistics[player.name] = nil
end
local post_apply_token =
Task.register(
function ()
Core.iter_connected_players(
function (player)
apply_stash(player)
end
)
end
)
local fetch_quickbar = local fetch_quickbar =
Token.register( Task.register(
function (data) function (data)
local key = data.key local key = data.key
local value = data.value local value = data.value
@ -68,28 +127,16 @@ local fetch_quickbar =
) )
local fetch_logistics = local fetch_logistics =
Token.register( Task.register(
function (data) function (data)
local key = data.key local key = data.key
local value = data.value local saved_data = data.value
local player = game.players[key] local player = game.get_player(key)
if not player or not player.valid then if not player or not player.valid then
return return
end end
local tech = player.force.technologies['logistic-robotics'].researched if saved_data then
if value then apply_logistic_network(player, saved_data)
for i, slot in pairs(value) do
if slot and slot.name then
if tech then
player.set_personal_logistic_slot(i, { name = slot.name, min = slot.min, max = slot.max })
else
if not this.logistics[player.name] then
this.logistics[player.name] = {}
end
this.logistics[player.name][i] = { name = slot.name, min = slot.min, max = slot.max }
end
end
end
end end
end end
) )
@ -138,7 +185,7 @@ function Public.save_quickbar(player)
end end
if next(slots) then if next(slots) then
set_data(dataset, player.name, slots) set_data(dataset, player.name, slots)
player.print('Your quickbar has been saved.', Color.success) player.print('Your quickbar has been saved.', { color = Color.success })
end end
end end
@ -147,22 +194,45 @@ end
function Public.save_logistics(player) function Public.save_logistics(player)
local dataset = logistics_dataset local dataset = logistics_dataset
if not player.get_requester_point() then
return false
end
local game_has_mods = is_game_modded() local game_has_mods = is_game_modded()
if game_has_mods then if game_has_mods then
dataset = logistics_dataset_modded dataset = logistics_dataset_modded
end end
local slots = {} local sections = {}
for i = 1, 400 do
local slot = player.get_personal_logistic_slot(i) for sec = 1, 4 do
if slot and slot.name then local section = player.get_requester_point().get_section(sec)
slots[i] = { name = slot.name, min = slot.min, max = slot.max } if section then
if not sections[section.index] then
sections[section.index] = {}
end
local slots = {}
for i = 1, 100 do
local slot = section.get_slot(i)
if slot and next(slot) then
slots[i] = { name = slot.value.name, min = slot.min, max = slot.max, quality = slot.value.quality, type = slot.value.type, comparator = slot.value.comparator }
end
end
if next(slots) then
sections[section.index].group = section.group
sections[section.index].active = section.active
sections[section.index].slots = slots
end
end end
end end
if next(slots) then
set_data(dataset, player.name, slots) if next(sections) then
player.print('Your personal logistics has been saved.', Color.success) set_data(dataset, player.name, sections)
player.print('Your personal logistics has been saved.', { color = Color.success })
return true
else
return false
end end
end end
@ -177,7 +247,7 @@ function Public.remove_quickbar(player)
end end
set_data(dataset, player.name, nil) set_data(dataset, player.name, nil)
player.print('Your quickbar has been removed.', Color.success) player.print('Your quickbar has been removed.', { color = Color.success })
end end
--- Removes the logistics key from the webpanel. --- Removes the logistics key from the webpanel.
@ -191,7 +261,7 @@ function Public.remove_logistics(player)
end end
set_data(dataset, player.name, nil) set_data(dataset, player.name, nil)
player.print('Your personal logistics has been removed.', Color.success) player.print('Your personal logistics has been removed.', { color = Color.success })
end end
local fetch_quickbar_on_join = Public.fetch_quickbar local fetch_quickbar_on_join = Public.fetch_quickbar
@ -214,12 +284,12 @@ Commands.new('save-logistics', 'Save your personal logistics preset so it´s alw
:require_backend() :require_backend()
:callback( :callback(
function (player) function (player)
local success, _ = pcall(save_logistics, player) local success = save_logistics(player)
player.print('Notice: only the first 400 slots are saved.', Color.warning)
if not success then if not success then
player.print('An error occured while trying to save your logistics slots.', Color.warning) player.print('An error occured while trying to save your logistics slots.', { color = { color = Color.warning } })
return false return false
end end
player.print('Notice: only the first 400 slots are saved.', { color = { color = Color.warning } })
player.print('Logistics saved.') player.print('Logistics saved.')
end end
) )
@ -266,11 +336,7 @@ Event.add(
function (event) function (event)
local research = event.research local research = event.research
if research.name == 'logistic-robotics' then if research.name == 'logistic-robotics' then
Core.iter_connected_players( Task.set_timeout_in_ticks(10, post_apply_token)
function (player)
apply_stash(player)
end
)
end end
end end
) )

View File

@ -16,9 +16,9 @@ local set_timeout_in_ticks = Task.set_timeout_in_ticks
local this = { local this = {
settings = { settings = {
enabled = false, enabled = false,
reset_after = 7, -- 7 days reset_after = 7, -- 7 days
required_level_to_progress = 99, -- higher than 99 to be able to save required_level_to_progress = 99, -- higher than 99 to be able to save
limit = 39600, -- level 100 limit = 39600, -- level 100
dataset = 'rpg_v2_dataset', dataset = 'rpg_v2_dataset',
reset_key = 'reset_by_this_date' reset_key = 'reset_by_this_date'
}, },
@ -33,7 +33,7 @@ local round = math.round
Global.register( Global.register(
this, this,
function(tbl) function (tbl)
this = tbl this = tbl
end end
) )
@ -48,7 +48,7 @@ local function eligible(player)
if player_level <= this.settings.required_level_to_progress then if player_level <= this.settings.required_level_to_progress then
return false return false
else else
player.print('[RPG] Prestige system resets after 7 days.', Color.warning) player.print('[RPG] Prestige system resets after 7 days.', { color = Color.warning })
return true return true
end end
end end
@ -67,102 +67,102 @@ end
local clear_all_data_token = local clear_all_data_token =
Token.register( Token.register(
function(data) function (data)
local entries = data.entries local entries = data.entries
if not entries then if not entries then
return return
end end
for key, _ in pairs(entries) do for key, _ in pairs(entries) do
if key ~= this.settings.reset_key then if key ~= this.settings.reset_key then
this.data[key] = nil this.data[key] = nil
set_data(this.settings.dataset, key, nil) set_data(this.settings.dataset, key, nil)
end
end end
end end
end )
)
local try_download_amount_of_resets_token = local try_download_amount_of_resets_token =
Token.register( Token.register(
function(data) function (data)
local old_value = data.value local old_value = data.value
if old_value then if old_value then
old_value = tonumber(old_value) old_value = tonumber(old_value)
local new_value = Server.get_current_date() local new_value = Server.get_current_date()
local time_to_reset = (new_value - old_value) local time_to_reset = (new_value - old_value)
if not time_to_reset then if not time_to_reset then
return return
end end
if time_to_reset < this.settings.reset_after then if time_to_reset < this.settings.reset_after then
this.data[this.settings.reset_key] = new_value this.data[this.settings.reset_key] = new_value
else
this.data[this.settings.reset_key] = 0
set_data(this.settings.dataset, this.settings.reset_key, tonumber(new_value))
try_get_all_data(this.settings.dataset, clear_all_data_token)
end
else else
this.data[this.settings.reset_key] = 0 local new_value = Server.get_current_date()
set_data(this.settings.dataset, this.settings.reset_key, tonumber(new_value))
try_get_all_data(this.settings.dataset, clear_all_data_token)
end
else
local new_value = Server.get_current_date()
if new_value then if new_value then
set_data(this.settings.dataset, this.settings.reset_key, tonumber(new_value)) set_data(this.settings.dataset, this.settings.reset_key, tonumber(new_value))
else else
set_data(this.settings.dataset, this.settings.reset_key, 0) set_data(this.settings.dataset, this.settings.reset_key, 0)
end
end end
end end
end )
)
local try_download_data_token = local try_download_data_token =
Token.register( Token.register(
function(data) function (data)
local key = data.key local key = data.key
local value = data.value local value = data.value
local player = game.get_player(key) local player = game.get_player(key)
if not player or not player.valid then if not player or not player.valid then
return return
end end
if value then if value then
if value < this.settings.limit then if value < this.settings.limit then
this.data[player.name] = value this.data[player.name] = value
RPG.set_value_to_player(player.index, 'xp', value) RPG.set_value_to_player(player.index, 'xp', value)
else else
set_data(this.settings.dataset, key, nil) set_data(this.settings.dataset, key, nil)
end
end end
end end
end )
)
local try_upload_data_token = local try_upload_data_token =
Token.register( Token.register(
function(data) function (data)
local key = data.key local key = data.key
local value = data.value local value = data.value
local player = game.get_player(key) local player = game.get_player(key)
if value then if value then
if not eligible(player) then if not eligible(player) then
return return
end end
local old_xp = value local old_xp = value
local new_xp = old_xp + get_progression(player) local new_xp = old_xp + get_progression(player)
if new_xp <= 0 then if new_xp <= 0 then
return return
end end
new_xp = round(new_xp, 0) new_xp = round(new_xp, 0)
set_data(this.settings.dataset, key, new_xp) set_data(this.settings.dataset, key, new_xp)
this.data[key] = new_xp this.data[key] = new_xp
else else
if eligible(player) then if eligible(player) then
set_data(this.settings.dataset, key, get_progression(player)) set_data(this.settings.dataset, key, get_progression(player))
end
end end
end end
end )
)
--- Tries to update amount of resets, if the threshold is reached nil the bonuses. --- Tries to update amount of resets, if the threshold is reached nil the bonuses.
function Public.try_dl_resets() function Public.try_dl_resets()
@ -258,7 +258,7 @@ end
Event.add( Event.add(
defines.events.on_player_joined_game, defines.events.on_player_joined_game,
function(event) function (event)
if not this.settings.enabled then if not this.settings.enabled then
return return
end end
@ -274,7 +274,7 @@ Event.add(
Event.add( Event.add(
defines.events.on_player_left_game, defines.events.on_player_left_game,
function(event) function (event)
if not this.settings.enabled then if not this.settings.enabled then
return return
end end
@ -290,14 +290,14 @@ Event.add(
local nth_tick_token = local nth_tick_token =
Token.register( Token.register(
function(data) function (data)
local index = data.index local index = data.index
local player = game.get_player(index) local player = game.get_player(index)
if player and player.valid then if player and player.valid then
Public.try_ul_data(player.name) Public.try_ul_data(player.name)
end
end end
end )
)
--- Saves all eligible players to the web-panel --- Saves all eligible players to the web-panel
function Public.save_all_players() function Public.save_all_players()
@ -312,7 +312,7 @@ function Public.save_all_players()
if eligible(player) then if eligible(player) then
local count = 0 local count = 0
count = count + 10 count = count + 10
set_timeout_in_ticks(count, nth_tick_token, {index = player.index}) set_timeout_in_ticks(count, nth_tick_token, { index = player.index })
end end
end end
end end
@ -329,7 +329,7 @@ function Public.restore_xp_on_reset()
local player = game.get_player(key) local player = game.get_player(key)
if player and player.valid then if player and player.valid then
RPG.set_value_to_player(player.index, 'xp', value) RPG.set_value_to_player(player.index, 'xp', value)
player.print('[RPG] Prestige system has been applied.', Color.success) player.print('[RPG] Prestige system has been applied.', { color = Color.success })
end end
end end
end end
@ -348,7 +348,7 @@ end
Event.add( Event.add(
Server.events.on_server_started, Server.events.on_server_started,
function() function ()
Public.try_dl_resets() Public.try_dl_resets()
end end
) )

View File

@ -122,7 +122,7 @@ local function validate_action(player, action)
if not admin_button_validation[action][player.name] then if not admin_button_validation[action][player.name] then
admin_button_validation[action][player.name] = true admin_button_validation[action][player.name] = true
Task.set_timeout_in_ticks(200, clear_validation_token, { player_name = player.name, action = action }) Task.set_timeout_in_ticks(200, clear_validation_token, { player_name = player.name, action = action })
player.print('Please run this again if you are certain that you want to run this action[' .. action .. '].', Color.warning) player.print('Please run this again if you are certain that you want to run this action[' .. action .. '].', { color = Color.warning })
return true return true
end end
return false return false
@ -131,7 +131,7 @@ end
local function admin_only_message(str) local function admin_only_message(str)
for _, player in pairs(game.connected_players) do for _, player in pairs(game.connected_players) do
if player.admin == true then if player.admin == true then
player.print('Admins-only-message: ' .. str, { r = 0.88, g = 0.88, b = 0.88 }) player.print('Admins-only-message: ' .. str, { color = { r = 0.88, g = 0.88, b = 0.88 } })
end end
end end
end end
@ -142,7 +142,7 @@ local function jail(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'jail') clear_validation_action(source_player.name, 'jail')
return return
end end
@ -166,7 +166,7 @@ local function clear_biters(player)
end end
end end
player.print('Cleared: ' .. count .. ' biters.', Color.warning) player.print('Cleared: ' .. count .. ' biters.', { color = Color.warning })
clear_validation_action(player.name, 'clear_biters') clear_validation_action(player.name, 'clear_biters')
end end
@ -177,7 +177,7 @@ local function mute(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'mute') clear_validation_action(source_player.name, 'mute')
return return
end end
@ -194,7 +194,7 @@ local function free(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'free') clear_validation_action(source_player.name, 'free')
return return
end end
@ -214,12 +214,12 @@ local function bring_player(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'bring_player') clear_validation_action(source_player.name, 'bring_player')
return return
end end
if player.driving == true then if player.driving == true then
source_player.print('Target player is in a vehicle, teleport not available.', { r = 0.88, g = 0.88, b = 0.88 }) source_player.print('Target player is in a vehicle, teleport not available.', { color = { r = 0.88, g = 0.88, b = 0.88 } })
clear_validation_action(source_player.name, 'bring_player') clear_validation_action(source_player.name, 'bring_player')
return return
end end
@ -241,7 +241,7 @@ local function go_to_player(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'go_to_player') clear_validation_action(source_player.name, 'go_to_player')
return return
end end
@ -255,7 +255,7 @@ end
local function spank(player, source_player) local function spank(player, source_player)
if player.name == source_player.name then if player.name == source_player.name then
return player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) return player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
end end
if player.character then if player.character then
if player.character.health > 1 then if player.character.health > 1 then
@ -273,7 +273,7 @@ local damage_messages = {
} }
local function damage(player, source_player) local function damage(player, source_player)
if player.name == source_player.name then if player.name == source_player.name then
return player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) return player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
end end
if player.character then if player.character then
if player.character.health > 1 then if player.character.health > 1 then
@ -297,7 +297,7 @@ local function kill(player, source_player)
return return
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'kill') clear_validation_action(source_player.name, 'kill')
return return
end end
@ -319,7 +319,7 @@ local function enemy(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'enemy') clear_validation_action(source_player.name, 'enemy')
return return
end end
@ -338,7 +338,7 @@ local function ally(player, source_player)
end end
if player.name == source_player.name then if player.name == source_player.name then
player.print("You can't select yourself!", { r = 1, g = 0.5, b = 0.1 }) player.print("You can't select yourself!", { color = { r = 1, g = 0.5, b = 0.1 } })
clear_validation_action(source_player.name, 'ally') clear_validation_action(source_player.name, 'ally')
return return
end end
@ -439,10 +439,10 @@ local function clear_items_on_ground(player)
end end
end end
if i == 0 then if i == 0 then
return player.print('No items to clear!', Color.warning) return player.print('No items to clear!', { color = Color.warning })
end end
player.print('Cleared: ' .. i .. ' items.', Color.success) player.print('Cleared: ' .. i .. ' items.', { color = Color.success })
clear_validation_action(player.name, 'clear_items_on_ground') clear_validation_action(player.name, 'clear_items_on_ground')
end end
@ -1115,7 +1115,7 @@ local function on_gui_click(event)
return return
end end
if target_player_name == 'Select Player' then if target_player_name == 'Select Player' then
player.print('[AdminGui] No target player selected.', { r = 0.88, g = 0.88, b = 0.88 }) player.print('[AdminGui] No target player selected.', { color = { r = 0.88, g = 0.88, b = 0.88 } })
return return
end end
local target_player = game.players[target_player_name] local target_player = game.players[target_player_name]
@ -1306,7 +1306,7 @@ Gui.on_click(
if current_page == 1 then if current_page == 1 then
current_page = 1 current_page = 1
player_data.current_page = current_page player_data.current_page = current_page
player.print('[Admin] There are no more pages beyond this point.', Color.warning) player.print('[Admin] There are no more pages beyond this point.', { color = Color.warning })
return return
end end
@ -1359,7 +1359,7 @@ Gui.on_click(
if current_page == last_page then if current_page == last_page then
current_page = last_page current_page = last_page
player_data.current_page = current_page player_data.current_page = current_page
player.print('[Admin] There are no more pages beyond this point.', Color.warning) player.print('[Admin] There are no more pages beyond this point.', { color = Color.warning })
return return
end end

View File

@ -51,10 +51,10 @@ local function build_group_gui(data)
local t = frame.add({ type = 'table', column_count = 5 }) local t = frame.add({ type = 'table', column_count = 5 })
local headings = { local headings = {
{ { 'gui.title' }, group_name_width }, { { 'gui.title' }, group_name_width },
{ { 'gui.description' }, description_width }, { { 'gui.description' }, description_width },
{ { 'gui.members' }, members_width * member_columns }, { { 'gui.members' }, members_width * member_columns },
{ '', actions_width } { '', actions_width }
} }
for _, h in pairs(headings) do for _, h in pairs(headings) do
local l = t.add({ type = 'label', caption = h[1] }) local l = t.add({ type = 'label', caption = h[1] })
@ -283,23 +283,23 @@ local function on_gui_click(event)
if new_group_name ~= '' and new_group_name ~= 'Name' and new_group_description ~= 'Description' then if new_group_name ~= '' and new_group_name ~= 'Name' and new_group_description ~= 'Description' then
if this.alphanumeric then if this.alphanumeric then
if alphanumeric(new_group_name) then if alphanumeric(new_group_name) then
player.print('Group name is not valid.', { r = 0.90, g = 0.0, b = 0.0 }) player.print('Group name is not valid.', { color = { r = 0.90, g = 0.0, b = 0.0 } })
return return
end end
if alphanumeric(new_group_description) then if alphanumeric(new_group_description) then
player.print('Group description is not valid.', { r = 0.90, g = 0.0, b = 0.0 }) player.print('Group description is not valid.', { color = { r = 0.90, g = 0.0, b = 0.0 } })
return return
end end
end end
if string.len(new_group_name) > 64 then if string.len(new_group_name) > 64 then
player.print('Group name is too long. 64 characters maximum.', { r = 0.90, g = 0.0, b = 0.0 }) player.print('Group name is too long. 64 characters maximum.', { color = { r = 0.90, g = 0.0, b = 0.0 } })
return return
end end
if string.len(new_group_description) > 128 then if string.len(new_group_description) > 128 then
player.print('Description is too long. 128 characters maximum.', { r = 0.90, g = 0.0, b = 0.0 }) player.print('Description is too long. 128 characters maximum.', { color = { r = 0.90, g = 0.0, b = 0.0 } })
return return
end end
@ -360,7 +360,7 @@ local function on_gui_click(event)
if element.type == 'button' and caption == 'gui.delete' then if element.type == 'button' and caption == 'gui.delete' then
if this.tag_groups[element.parent.name] and this.tag_groups[element.parent.name].static then if this.tag_groups[element.parent.name] and this.tag_groups[element.parent.name].static then
player.print('Static groups cannot be deleted.', Color.warning) player.print('Static groups cannot be deleted.', { color = Color.warning })
return return
end end
for _, players in pairs(game.players) do for _, players in pairs(game.players) do

View File

@ -65,6 +65,8 @@ function Public.init_player_table(player, reset)
this.score_table[player.force.name].players = {} this.score_table[player.force.name].players = {}
end end
if not player.name then return end
if not this.score_table[player.force.name].players[player.name] then if not this.score_table[player.force.name].players[player.name] then
this.score_table[player.force.name].players[player.name] = { this.score_table[player.force.name].players[player.name] = {
built_entities = 0, built_entities = 0,
@ -500,6 +502,10 @@ Gui.on_click(
end end
) )
Event.on_init(function ()
Public.reset_tbl()
end)
Event.add(defines.events.on_player_mined_entity, on_player_mined_entity) Event.add(defines.events.on_player_mined_entity, on_player_mined_entity)
Event.add(defines.events.on_player_crafted_item, on_player_crafted_item) Event.add(defines.events.on_player_crafted_item, on_player_crafted_item)
Event.add(defines.events.on_player_died, on_player_died) Event.add(defines.events.on_player_died, on_player_died)