173 lines
3.9 KiB
Lua
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)
|