local function split_string_to_map(str, separator) local parts = {} for part in string.gmatch(str, "([^" .. separator .. "]+)") do -- Trim leading/trailing whitespace: part = part:gsub("^%s*(.-)%s*$", "%1") parts[part] = true end return parts end local no_alarm_entities = {} local no_ghost_possible_entities = { ["car"] = true, ["tank"] = true, ["construction-robot"] = true, ["logistic-robot"] = true, ["player"] = true } local function build_no_alarm_table(setting_value) no_alarm_entities = split_string_to_map(setting_value, ",") end script.on_init(function() build_no_alarm_table(settings.global["no-alarm-entities"].value) end) script.on_load(function() build_no_alarm_table(settings.global["no-alarm-entities"].value) end) script.on_event(defines.events.on_runtime_mod_setting_changed, function(event) if event.setting == "no-alarm-entities" then build_no_alarm_table(settings.global["no-alarm-entities"].value) end end) script.on_event(defines.events.on_entity_damaged, function(event) local entity = event.entity -- Check if the damaged entity is in our list of no-alarm entities if entity and entity.valid and no_alarm_entities[entity.name] then -- Check if the damage would destroy the entity if event.final_health <= 0 then local surface = entity.surface local position = entity.position local force = entity.force local direction = entity.direction local name = entity.name -- Remove the original entity entity.destroy() -- Check if the force has researched ghost placement if force.technologies["construction-robotics"] and force.technologies["construction-robotics"].researched then -- Don't create a ghost for entities that cannot have a ghost if no_ghost_possible_entities[name] then return end -- Create a ghost of the entity surface.create_entity { name = "entity-ghost", inner_name = name, position = position, force = force, direction = direction } end end end end)