1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-12 10:04:40 +02:00
RedMew/nuke_control.lua
2018-04-06 20:58:50 +01:00

125 lines
5.4 KiB
Lua

local Event = require "utils.event"
function allowed_to_nuke(player)
if type(player) == "table" then
return player.admin or is_mod(player.name) or is_regular(player.name) or ((player.online_time / 216000) > global.scenario.config.nuke_min_time_hours)
elseif type(player) == "number" then
return allowed_to_nuke(game.players[player])
end
end
local function ammo_changed(event)
local player = game.players[event.player_index]
if allowed_to_nuke(player) then return end
local nukes = player.remove_item({name="atomic-bomb", count=1000})
if nukes > 0 then
game.print(player.name .. " tried to use a nuke, but instead dropped it on his foot.")
player.character.health = 0
end
end
local function on_player_deconstructed_area(event)
local player = game.players[event.player_index]
if allowed_to_nuke(player) then return end
local nukes = player.remove_item({name="deconstruction-planner", count=1000})
--Make them think they arent noticed
print_except(player.name .. " tried to deconstruct something, but instead deconstructed himself.", player)
player.print("Only regulars can mark things for deconstruction, if you want to deconstruct something you may ask an admin to promote you.")
player.character.health = 0
local entities = player.surface.find_entities_filtered{area = event.area, force = player.force}
if #entities > 1000 then
print_admins("Warning! " .. player.name .. " just tried to deconstruct " .. tostring(#entities) .. " entities!")
end
for _,entity in pairs(entities) do
if entity.valid and entity.to_be_deconstructed(game.players[event.player_index].force) then
entity.cancel_deconstruction(game.players[event.player_index].force)
end
end
end
local function log_on_player_mined_entity(str, event)
game.write_file("on_player_mined_entity_debug", game.tick .. " (" .. game.players[event.player_index].name .. ") " .. str .. "\n", true, 0)
end
global.on_player_mined_item_enabled = true
global.on_player_mined_item_init = true
--Never knew the debug code made it into the codebase lol
local function on_player_mined_item(event)
log_on_player_mined_entity("nuke_control.on_player_mined_item: entry", event)
if global.on_player_mined_item_enabled then
log_on_player_mined_entity("nuke_control.on_player_mined_item: enabled", event)
if global.on_player_mined_item_init then
log_on_player_mined_entity("nuke_control.on_player_mined_item: init", event)
game.forces.enemy.research_all_technologies() --avoids losing logstics slot configuration on force toggle
global.on_player_mined_item_init = false
end
local entity = event.entity
if entity.valid and entity.force.name ~= "enemy" and entity.force.name ~= "neutral" and entity.name ~= "entity-ghost" and entity.type ~= "logistic-robot" and entity.type ~= "construction-robot" then
log_on_player_mined_entity("nuke_control.on_player_mined_item: in body", event)
local entity_name = entity.name
if entity_name == "pipe-to-ground" then entity_name = "pipe" end
log_on_player_mined_entity("nuke_control.on_player_mined_item: before ghost placement", event)
local ghost = event.entity.surface.create_entity{name = "entity-ghost", position = event.entity.position, inner_name = entity_name, expires = false, force = "enemy", direction = event.entity.direction}
log_on_player_mined_entity("nuke_control.on_player_mined_item: ghost placed", event)
ghost.last_user = event.player_index
log_on_player_mined_entity("nuke_control.on_player_mined_item: last user set", event)
end
end
log_on_player_mined_entity("nuke_control.on_player_mined_item: exit", event)
end
local function item_not_sanctioned(item)
local name = item.name
return (
name:find("capsule") or
name == "cliff-explosives" or
name == "raw-fish" or
name == "discharge-defense-remote"
)
end
local function entity_allowed_to_bomb(e)
local name = entity.name
return (
name:find("turret") or
name:find("rail") or
name.find("ghost") or
name == "player" or
name == "stone-wall" or
entity.type == "electric-pole"
)
end
global.players_warned = {}
local function on_capsule_used(event)
if item_not_sanctioned(event.item) then return nil end
local player = game.players[event.player_index]
if (not allowed_to_nuke(player)) then
local area = {{event.position.x-5, event.position.y-5}, {event.position.x+5, event.position.y+5}}
local count = 0
local entities = player.surface.find_entities_filtered{force=player.force, area=area}
for _,e in pairs(entities) do
if not entity_allowed_to_bomb(e) then count = count + 1 end
end
if count > 8 then
if global.players_warned[event.player_index] then
game.ban_player(player, string.format("Damaged %i entities with %s. This action was performed automatically. If you want to contest this ban please visit redmew.com/discord.", count, event.item.name))
else
global.players_warned[event.player_index] = true
game.kick_player(player, string.format("Damaged %i entities with %s -Antigrief", count, event.item.name))
end
end
end
end
Event.add(defines.events.on_player_ammo_inventory_changed, ammo_changed)
Event.add(defines.events.on_player_deconstructed_area, on_player_deconstructed_area)
--Event.add(defines.events.on_player_mined_entity, on_player_mined_item)
Event.add(defines.events.on_player_used_capsule, on_capsule_used)