mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2025-12-27 03:25:23 +09:00
104 lines
3.1 KiB
Lua
104 lines
3.1 KiB
Lua
--[[-- Commands - Artillery
|
|
Adds a command that helps shoot artillery
|
|
]]
|
|
|
|
local AABB = require("modules/exp_util/aabb")
|
|
local Commands = require("modules/exp_commands")
|
|
|
|
local Selection = require("modules/exp_util/selection")
|
|
local SelectArea = Selection.connect("ExpCommand_Artillery")
|
|
|
|
local floor = math.floor
|
|
local abs = math.abs
|
|
|
|
--- @class ExpCommand_Artillery.commands
|
|
local commands = {}
|
|
|
|
--- @param player LuaPlayer
|
|
--- @param area BoundingBox
|
|
--- @return boolean
|
|
local function location_break(player, area)
|
|
local surface = player.surface -- Allow remote view
|
|
local is_charted = player.force.is_chunk_charted
|
|
if is_charted(surface, { x = floor(area.left_top.x / 32), y = floor(area.left_top.y / 32) }) then
|
|
return true
|
|
elseif is_charted(surface, { x = floor(area.left_top.x / 32), y = floor(area.right_bottom.y / 32) }) then
|
|
return true
|
|
elseif is_charted(surface, { x = floor(area.right_bottom.x / 32), y = floor(area.left_top.y / 32) }) then
|
|
return true
|
|
elseif is_charted(surface, { x = floor(area.right_bottom.x / 32), y = floor(area.right_bottom.y / 32) }) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
--- Toggle player selection mode for artillery
|
|
--- @class ExpCommand_Artillery.commands.artillery: ExpCommand
|
|
--- @overload fun(player: LuaPlayer)
|
|
commands.artillery = Commands.new("artillery", { "exp-commands_artillery.description" })
|
|
:register(function(player)
|
|
if SelectArea:stop(player) then
|
|
return Commands.status.success{ "exp-commands_artillery.exit" }
|
|
end
|
|
SelectArea:start(player)
|
|
return Commands.status.success{ "exp-commands_artillery.enter" }
|
|
end) --[[ @as any ]]
|
|
|
|
--- when an area is selected to add protection to the area
|
|
SelectArea:on_selection(function(event)
|
|
local area = AABB.expand(event.area)
|
|
local player = game.players[event.player_index]
|
|
local surface = event.surface
|
|
|
|
if not (player.cheat_mode or location_break(player, event.area)) then
|
|
player.print{ "exp-commands_artillery.invalid_area" }
|
|
return
|
|
end
|
|
|
|
local entities = surface.find_entities_filtered{
|
|
area = area,
|
|
type = { "unit-spawner", "turret" },
|
|
force = "enemy"
|
|
}
|
|
|
|
local count = 0
|
|
local hits = {} --- @type MapPosition[]
|
|
for _, entity in ipairs(entities) do
|
|
local skip = false
|
|
|
|
for _, pos in ipairs(hits) do
|
|
local x = abs(entity.position.x - pos.x)
|
|
local y = abs(entity.position.y - pos.y)
|
|
if x * x + y * y < 36 then
|
|
skip = true
|
|
break
|
|
end
|
|
end
|
|
|
|
if not skip then
|
|
surface.create_entity{
|
|
name = "artillery-flare",
|
|
position = entity.position,
|
|
force = player.force,
|
|
life_time = 240,
|
|
movement = { 0, 0 },
|
|
height = 0,
|
|
vertical_speed = 0,
|
|
frame_speed = 0
|
|
}
|
|
|
|
count = count + 1
|
|
hits[count] = entity.position
|
|
|
|
if count > 400 then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
return {
|
|
commands = commands,
|
|
}
|