1
0
mirror of https://github.com/Refactorio/RedMew.git synced 2024-12-14 10:13:13 +02:00
RedMew/features/nuke_control.lua

184 lines
6.4 KiB
Lua
Raw Normal View History

local Event = require 'utils.event'
local UserGroups = require 'features.user_groups'
2018-11-26 03:07:03 +02:00
local Utils = require 'utils.core'
local Game = require 'utils.game'
local Server = require 'features.server'
2017-07-08 22:24:24 +02:00
2018-11-06 13:55:52 +02:00
local function allowed_to_nuke(player)
2018-11-28 13:15:44 +02:00
return player.admin or UserGroups.is_regular(player.name) or
((player.online_time / 216000) > global.config.nuke_control.nuke_min_time_hours)
2017-07-08 22:24:24 +02:00
end
local function ammo_changed(event)
local player = Game.get_player_by_index(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.')
local character = player.character
if character and character.valid then
for _, p in ipairs(game.connected_players) do
if p ~= player then
p.add_custom_alert(character, {type = 'item', name = 'atomic-bomb'}, player.name, true)
end
end
2018-06-08 00:50:31 +02:00
end
player.character.health = 0
2018-06-08 00:50:31 +02:00
end
2017-07-08 22:24:24 +02:00
end
local function on_player_deconstructed_area(event)
local player = Game.get_player_by_index(event.player_index)
if allowed_to_nuke(player) then
return
end
player.remove_item({name = 'deconstruction-planner', count = 1000})
--Make them think they arent noticed
Utils.print_except(player.name .. ' tried to deconstruct something, but instead deconstructed themself.', player)
2018-11-28 13:15:44 +02:00
player.print(
'Only regulars can mark things for deconstruction, if you want to deconstruct something you may ask an admin to promote you.'
)
2018-06-08 00:50:31 +02:00
local character = player.character
if character and character.valid then
for _, p in ipairs(game.connected_players) do
if p ~= player then
p.add_custom_alert(character, {type = 'item', name = 'deconstruction-planner'}, player.name, true)
end
2018-06-08 00:50:31 +02:00
end
end
character.health = 0
2018-06-25 00:31:08 +02:00
local area = event.area
local left_top, right_bottom = area.left_top, area.right_bottom
if left_top.x == right_bottom.x and left_top.y == right_bottom.y then
return
2018-06-25 00:31:08 +02:00
end
2018-08-14 00:30:49 +02:00
local entities = player.surface.find_entities_filtered {area = area, force = player.force}
if #entities > 1000 then
2018-11-28 13:15:44 +02:00
Utils.print_admins(
'Warning! ' .. player.name .. ' just tried to deconstruct ' .. tostring(#entities) .. ' entities!',
false
)
end
for _, entity in pairs(entities) do
if entity.valid and entity.to_be_deconstructed(Game.get_player_by_index(event.player_index).force) then
entity.cancel_deconstruction(Game.get_player_by_index(event.player_index).force)
end
end
end
local function item_not_sanctioned(item)
local name = item.name
2018-11-28 13:15:44 +02:00
return (name:find('capsule') or name == 'cliff-explosives' or name == 'raw-fish' or
name == 'discharge-defense-remote')
end
2018-08-14 00:30:49 +02:00
global.entities_allowed_to_bomb = {
['stone-wall'] = true,
['transport-belt'] = true,
['fast-transport-belt'] = true,
['express-transport-belt'] = true,
['construction-robot'] = true,
['player'] = true,
['gun-turret'] = true,
['laser-turret'] = true,
['flamethrower-turret'] = true,
['rail'] = true,
['rail-chain-signal'] = true,
['rail-signal'] = true,
['tile-ghost'] = true,
['entity-ghost'] = true,
['gate'] = true,
['electric-pole'] = true,
['small-electric-pole'] = true,
['medium-electric-pole'] = true,
['big-electric-pole'] = true,
['logistic-robot'] = true,
['defender'] = true,
['destroyer'] = true,
['distractor'] = true
2018-08-14 00:30:49 +02:00
}
2018-05-16 11:58:55 +02:00
local function entity_allowed_to_bomb(entity)
return global.entities_allowed_to_bomb[entity.name]
2018-02-08 09:55:26 +02:00
end
2018-11-28 13:15:44 +02:00
2017-12-26 00:00:24 +02:00
global.players_warned = {}
2018-11-28 13:15:44 +02:00
2017-12-26 00:00:24 +02:00
local function on_capsule_used(event)
local item = event.item
local player = Game.get_player_by_index(event.player_index)
2018-11-28 13:15:44 +02:00
if not player or not player.valid then
return
end
if item.name == 'artillery-targeting-remote' then
2018-11-28 13:15:44 +02:00
player.surface.create_entity {
name = 'flying-text',
text = player.name,
color = player.color,
position = event.position
}
end
local nuke_control = global.config.nuke_control
if not nuke_control.enable_autokick and not nuke_control.enable_autoban then
2018-11-28 13:15:44 +02:00
return
end
if item_not_sanctioned(item) then
return
end
2018-11-28 13:15:44 +02:00
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
2018-11-28 13:15:44 +02:00
if nuke_control.enable_autoban then
Server.ban_sync(
2018-11-28 19:59:32 +02:00
player.name,
2018-11-28 13:15:44 +02:00
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,
item.name
),
'<script>'
2018-11-28 13:15:44 +02:00
)
end
else
global.players_warned[event.player_index] = true
2018-11-28 13:15:44 +02:00
if nuke_control.enable_autokick then
game.kick_player(player, string.format('Damaged %i entities with %s -Antigrief', count, item.name))
end
end
end
2017-12-26 00:00:24 +02:00
end
end
2018-10-04 10:53:35 +02:00
local function on_player_joined(event)
local player = game.players[event.player_index]
if string.match(player.name, '^[Ili1|]+$') then
2018-11-28 19:59:32 +02:00
Server.ban_sync(player.name, '', '<script>') --No reason given, to not give them any hints to change their name
end
2018-10-04 10:53:35 +02:00
end
2018-04-06 21:58:50 +02:00
Event.add(defines.events.on_player_ammo_inventory_changed, ammo_changed)
2018-10-04 10:53:35 +02:00
Event.add(defines.events.on_player_joined_game, on_player_joined)
2018-04-06 21:58:50 +02:00
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)