z_mirror/EditorExtensions

git clone https://git.raiguard.me/z_mirror/EditorExtensions

Caleb HeuerGet working on 2.12c4827c

trunk
5.5 KiB188 linesraw
1local flib_array = require("__flib__.array")
2local util = require("scripts.util")
3
4local character_modifiers = {
5  character_build_distance_bonus = 1000000,
6  character_mining_speed_modifier = 2,
7  character_reach_distance_bonus = 1000000,
8  character_resource_reach_distance_bonus = 1000000,
9}
10
11local equipment_to_add = {
12  { name = "ee-infinity-fission-reactor-equipment", position = { 0, 0 } },
13  { name = "ee-super-personal-roboport-equipment", position = { 1, 0 } },
14  { name = "ee-super-exoskeleton-equipment", position = { 2, 0 } },
15  { name = "ee-super-exoskeleton-equipment", position = { 3, 0 } },
16  { name = "ee-super-energy-shield-equipment", position = { 4, 0 } },
17  { name = "ee-super-night-vision-equipment", position = { 5, 0 } },
18  { name = "ee-super-battery-equipment", position = { 6, 0 } },
19  { name = "belt-immunity-equipment", position = { 7, 0 } },
20}
21
22local items_to_add = {
23  { name = "ee-infinity-accumulator", count = 50 },
24  { name = "ee-infinity-chest", count = 50 },
25  { name = "ee-super-construction-robot", count = 100 },
26  { name = "ee-super-inserter", count = 50 },
27  { name = "ee-infinity-loader", count = 50 },
28  { name = "ee-infinity-pipe", count = 50 },
29  { name = "ee-super-substation", count = 50 },
30}
31
32local items_to_remove = {
33  { name = "express-loader", count = 50 },
34  { name = "bulk-inserter", count = 50 },
35  { name = "substation", count = 50 },
36  { name = "construction-robot", count = 100 },
37  { name = "electric-energy-interface", count = 1 },
38  { name = "infinity-chest", count = 20 },
39  { name = "infinity-pipe", count = 10 },
40  { name = "linked-chest", count = 10 },
41}
42
43--- @param inventory LuaInventory?
44local function set_armor(inventory)
45  if not inventory or not inventory.valid then
46    return
47  end
48  inventory[1].set_stack({ name = script.active_mods["space-age"] and "mech-armor" or "power-armor-mk2" })
49  local grid = inventory[1].grid
50  if not grid then
51    return
52  end
53  for i = 1, #equipment_to_add do
54    grid.put(equipment_to_add[i])
55  end
56end
57
58--- @param player LuaPlayer
59local function set_character_cheats(player)
60  if player.character_reach_distance_bonus >= 1000000 then
61    return
62  end
63  local character = player.character
64  if not character or not character.valid then
65    return
66  end
67  for modifier, amount in pairs(character_modifiers) do
68    character[modifier] = character[modifier] + amount
69  end
70end
71
72--- @param player LuaPlayer
73local function set_loadout(player)
74  -- Remove default items
75  local main_inventory = player.get_main_inventory()
76  if not main_inventory then
77    return
78  end
79  local items_to_remove = items_to_remove
80  for i = 1, #items_to_remove do
81    main_inventory.remove(items_to_remove[i])
82  end
83  -- Add custom items
84  local items_to_add = items_to_add
85  for i = 1, #items_to_add do
86    main_inventory.insert(items_to_add[i])
87  end
88  if player.controller_type == defines.controllers.character then
89    set_armor(player.get_inventory(defines.inventory.character_armor))
90    set_character_cheats(player)
91  elseif player.controller_type == defines.controllers.editor then
92    set_armor(player.get_inventory(defines.inventory.editor_armor))
93  end
94end
95
96--- @param force LuaForce
97local function disable_recipes(force)
98  for _, recipe in pairs(force.recipes) do
99    if flib_array.contains(recipe.categories, "ee-testing-tool") then
100      recipe.enabled = false
101    end
102  end
103end
104
105--- @param force LuaForce
106local function enable_recipes(force)
107  for _, recipe in pairs(force.recipes) do
108    if flib_array.contains(recipe.categories, "ee-testing-tool") then
109      recipe.enabled = true
110    end
111  end
112  for _, player in pairs(force.players) do
113    player.clear_recipe_notifications()
114  end
115end
116
117--- @param e EventData.on_console_command
118local function on_console_command(e)
119  if e.command ~= "cheat" or not game.console_command_used then
120    return
121  end
122  local player = game.get_player(e.player_index)
123  if not player or not player.valid then
124    return
125  end
126  if e.parameters == "all" then
127    set_loadout(player)
128  end
129  enable_recipes(player.force --[[@as LuaForce]])
130  if game.is_multiplayer() then
131    player.force.print({ "message.ee-tools-enabled", player.name })
132  end
133end
134
135--- @param e EventData.on_player_created
136local function on_player_created(e)
137  local player = game.get_player(e.player_index)
138  if not player then
139    return
140  end
141  if util.in_debug_world() or util.in_testing_scenario() then
142    set_loadout(player)
143    enable_recipes(player.force --[[@as LuaForce]])
144  end
145end
146
147--- @param e EventData.on_player_toggled_map_editor
148local function on_player_toggled_map_editor(e)
149  local player = game.get_player(e.player_index)
150  if not player or not player.cheat_mode or player.controller_type ~= defines.controllers.character then
151    return
152  end
153  set_character_cheats(player)
154end
155
156local cheat_mode = {}
157
158function cheat_mode.on_configuration_changed()
159  for _, force in pairs(game.forces) do
160    for _, player in pairs(force.players) do
161      if player.cheat_mode then
162        enable_recipes(force)
163        break
164      end
165    end
166  end
167end
168
169cheat_mode.events = {
170  [defines.events.on_console_command] = on_console_command,
171  [defines.events.on_player_created] = on_player_created,
172  [defines.events.on_player_toggled_map_editor] = on_player_toggled_map_editor,
173}
174
175cheat_mode.add_remote_interface = function()
176  remote.add_interface("ee_cheat_mode", {
177    --- @param force LuaForce
178    disable_testing_recipes = function(force)
179      disable_recipes(force)
180    end,
181    --- @param force LuaForce
182    enable_testing_recipes = function(force)
183      enable_recipes(force)
184    end,
185  })
186end
187
188return cheat_mode