I'm trying to revive the Ruin maker mod https://mods.factorio.com/mod/ruin-maker
I fixed all the errors that the game showed. But the mod doesn't work!!!!
The description says that after selecting the "ruin-maker" tool, you need to select the necessary objects with a frame using Shift + left mouse button. After that, a window with settings should appear...
But the window does not appear after selecting the frame - what did I do wrong?!!!!!!!!
Edited files:
Data.lua:
Code: Select all
data:extend
{
{
type = "selection-tool",
name = "ruin-maker",
icon = "__ruin-maker__/graphics/ruin-maker.png",
icon_size = 64,
stack_size = 1,
select = {
border_color = { r = 1, g = 1, b = 1 },
cursor_box_type = "entity", -- Green
mode = {"blueprint"},
entity_type_filters = {},
},
alt_select = {
border_color = { r = 1},
cursor_box_type = "train-visualization", -- Red
mode = {"any-tile", "any-entity"},
entity_type_filters = {},
},
always_include_tiles = true,
flags = {"spawnable"}
},
{
type = "shortcut",
name = "give-ruin-maker",
order = "b[blueprints]-d[give-ruin-maker]",
action = "spawn-item",
item_to_spawn = "give-ruin-maker",
-- localised_name = {"shortcut.give-ruin-maker"},
associated_control_input = "give-ruin-maker",
icon = "__ruin-maker__/graphics/ruin-maker-shortcut.png",
icon_size = 32,
small_icon = "__ruin-maker__/graphics/ruin-maker-shortcut.png",
small_icon_size = 32
}
}
Code: Select all
local util = require("utilities")
local output_selection = require("output")
local function discard_selection(player_index)
for _, render in pairs(storage.selection[player_index].renders) do
rendering.destroy(render)
end
storage.selection[player_index] = nil
end
local function confirm_selection(player_index, name)
local data = storage.selection[player_index]
output_selection(data.entities, data.tiles, data.tile_filter, data.center, name ~= "" and name or "unknown", data["ruin-maker-damage"], data["ruin-maker-items"], data["ruin-maker-fluids"], player_index)
discard_selection(player_index)
end
script.on_event(defines.events.on_gui_click, function(event)
if event.element.name == "ruin-maker-confirm" then
confirm_selection(event.player_index, storage.selection[event.player_index].name.text)
game.get_player(event.player_index).gui.screen["ruin-maker-main"].destroy()
elseif event.element.name == "ruin-maker-cancel" then
discard_selection(event.player_index)
game.get_player(event.player_index).gui.screen["ruin-maker-main"].destroy()
end
end)
script.on_event(defines.events.on_gui_checked_state_changed, function(event)
if event.element.parent and event.element.parent.name == "ruin-maker-tile-filter" then
storage.selection[event.player_index].tile_filter[event.element.name] = event.element.state
elseif event.element.parent and event.element.parent.name == "ruin-maker-config" then
storage.selection[event.player_index][event.element.name] = event.element.state
end
end)
script.on_event(defines.events.on_gui_confirmed, function(event)
if not storage.selection[event.player_index] then return end
if event.element == storage.selection[event.player_index].name then
confirm_selection(event.player_index, event.element.text)
game.get_player(event.player_index).gui.screen["ruin-maker-main"].destroy()
end
end)
local function config_gui(player, tile_names, area)
local gui = player.gui.screen.add{type = "frame", caption = {"gui.ruin-maker-config"}, direction = "vertical", name = "ruin-maker-main"}
gui.force_auto_center()
gui = gui.add{type = "frame", style = "inside_shallow_frame_with_padding"}
gui = gui.add{type = "table", name = "ruin-maker-config", style = "bordered_table", column_count = 1}
do
local w = area.right_bottom.x - area.left_top.x
local h = area.right_bottom.y - area.left_top.y
local name = "too big"
if w <= 8 and h <= 8 then
name = "small"
elseif w <= 16 and h <= 16 then
name = "medium"
elseif w <= 32 and h <= 32 then
name = "large"
end
local flow = gui.add{type="flow", direction = "vertical"}
flow.add{type = "label", caption = {"gui.ruin-maker-size", name, w, h}}
end
do
local flow = gui.add{type="flow", direction = "vertical"}
flow.add{type = "label", caption = {"gui.ruin-maker-name"}}
storage.selection[player.index].name = flow.add{type = "textfield"}
storage.selection[player.index].name.focus()
end
if next(tile_names) ~= nil then
local frame = gui.add{type="flow", name = "ruin-maker-tile-filter", direction = "vertical"}
frame.add{type = "label", caption = {"gui.ruin-maker-tile-filter"}}
for tile_name in pairs(tile_names) do
frame.add{type = "checkbox", name = tile_name, caption = tile_name, state = true}
end
end
gui.add{type = "checkbox", name = "ruin-maker-damage", caption = {"gui.ruin-maker-damage"}, state = true}
gui.add{type = "checkbox", name = "ruin-maker-items", caption = {"gui.ruin-maker-items"}, state = true}
gui.add{type = "checkbox", name = "ruin-maker-fluids", caption = {"gui.ruin-maker-fluids"}, state = true}
gui.add{type = "button", name = "ruin-maker-cancel", caption = {"gui.ruin-maker-cancel"}}
gui.add{type = "button", name = "ruin-maker-confirm", caption = {"gui.ruin-maker-confirm"}}
end
local function configure_selection(entities, tiles, area, center, player_index, renders)
local tile_names = {}
for _, tile in pairs(tiles) do
tile_names[tile.name] = true
end
storage.selection[player_index] = {
entities = entities,
tiles = tiles,
tile_filter = tile_names,
center = center,
renders = renders,
["ruin-maker-damage"] = true,
["ruin-maker-items"] = true,
["ruin-maker-fluids"] = true
}
config_gui(game.get_player(player_index), tile_names, area)
end
local function render_selection(area, center, surface)
local renders = {}
renders[#renders+1] = rendering.draw_line(
{
from = {center.x + 0.5, center.y},
to = {center.x - 0.5, center.y},
width = 4,
color = {1, 1, 1},
surface = surface
})
renders[#renders+1] = rendering.draw_line(
{
from = {center.x, center.y + 0.5},
to = {center.x, center.y - 0.5},
width = 4,
color = {1, 1, 1},
surface = surface
})
renders[#renders+1] = rendering.draw_rectangle(
{
left_top = area.left_top,
right_bottom = area.right_bottom,
filled = false,
width = 4,
color = {1, 1, 1},
surface = surface
})
return renders
end
script.on_event({defines.events.on_player_selected_area, defines.events.on_player_alt_selected_area}, function(event)
if event.item ~= "ruin-maker" then return end
if storage.selection[event.player_index] ~= nil then
game.get_player(event.player_index).print({"error.ruin-maker-already-in-progress"})
return
end
local area = util.expand_area_to_tile_border(event.area)
local center = util.get_center_of_area(area)
local renders = render_selection(area, center, event.surface)
configure_selection(event.entities, event.tiles, area, center, event.player_index, renders)
end)
script.on_init(function()
storage.selection = {}
end)