173 lines
3.9 KiB
Lua

local custom_alert = {type = "item", name = "mirv-targeting-remote"}
local alert_message = {"launch-detected"}
local alert_sound = {path = "entity-build/mirv-target"}
local mirv_item = "mirv-rocket"
local mirv_smoke = "mirv-smoke"
local mirv_smoke_2 = "mirv-smoke-2"
local mirv_target = "mirv-target"
local nuke = "atomic-rocket"
local mirv_entity = "mirv-entity"
local launcher = "mirv-launcher"
local insert_param = {name = "mirv-ammo", count = 5}
local mirv_effect_id = "mirv-launch"
local mirv_projectile = "mirv-projectile"
local mirv_pollution_trigger = "mirv-pollute"
local make_mirv_launcher = function(silo)
local launcher = silo.surface.create_entity
{
name = launcher,
position = silo.position,
force = silo.force
}
launcher.insert(insert_param)
launcher.destructible = false
end
local on_rocket_launched = function(event)
local rocket = event.rocket
if not (rocket and rocket.valid) then return end
local silo = event.rocket_silo
if not (silo and silo.valid) then return end
local item_count = rocket.get_item_count(mirv_item)
if item_count == 0 then return end
make_mirv_launcher(silo)
end
local call_nuke = function(surface, position, source)
--position = {x = 16 + (32 * math.floor(position.x / 32)), y = 16 + (32 * math.floor(position.y / 32))}
surface.request_to_generate_chunks(position, 4)
--surface.force_generate_chunk_requests()
local source_position = source.position
local create_entity = surface.create_entity
local target = create_entity
{
name = mirv_target,
position = position,
force = "neutral"
}
local offset = ((position.x - source_position.x) / 2)
offset = math.min(offset, 1000)
offset = math.max(offset, -1000)
local projectile = create_entity
{
name = mirv_projectile,
position = {position.x - offset, target.position.y - 1250},
force = source.force,
target = target,
speed = math.random(500, 650) / 200
}
for k, player in pairs (game.connected_players) do
if player.surface == surface then
player.add_custom_alert(target, custom_alert, alert_message, true)
end
end
surface.play_sound(alert_sound)
surface.create_trivial_smoke{name = mirv_smoke, position = position}
surface.create_trivial_smoke{name = mirv_smoke_2, position = position}
end
local mirv_script_trigger = function(event)
local source = event.source_entity
if not (source and source.valid) then
return
end
local position = event.target_position
if not position then return end
local surface = source.surface
local flares = surface.find_entities_filtered{name = "mirv-flare", position = position}
for k, flare in pairs (flares) do
flare.destroy()
--game.print("Killed flare "..k)
end
call_nuke(surface, position, source)
local item_count = source.get_item_count("mirv-ammo")
if item_count == 1 then
source.destructible = false
source.destroy()
end
end
local offsets =
{
{8, 8},
{-8, -8},
{-8, 8},
{8, -8}
}
local mirv_pollute_trigger = function(event)
local position = event.target_position
if not position then return end
local surface = game.get_surface(event.surface_index)
if not surface then return end
for k, offset in pairs (offsets) do
surface.pollute({position.x + offset[1], position.y + offset[2]}, 666/#offsets)
end
game.pollution_statistics.on_flow(launcher, 666)
end
local on_script_trigger_effect = function(event)
if event.effect_id == mirv_effect_id then
mirv_script_trigger(event)
return
end
if event.effect_id == mirv_pollution_trigger then
mirv_pollute_trigger(event)
return
end
end
remote.add_interface("mirv",
{
call_nuke = call_nuke
})
local lib = {}
lib.events =
{
[defines.events.on_rocket_launched] = on_rocket_launched,
[defines.events.on_script_trigger_effect] = on_script_trigger_effect,
}
lib.on_init = function()
end
lib.on_configuration_changed = function()
end
local handler = require("event_handler")
handler.add_lib(lib)