1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-20 03:29:47 +02:00

Prevent building in shielded area

This commit is contained in:
blubFisch 2022-10-16 12:11:47 +01:00
parent f945ab772b
commit e86dd28e3e
4 changed files with 29 additions and 17 deletions

View File

@ -4,6 +4,7 @@ local math_floor = math.floor
local table_insert = table.insert
local table_size = table.size
local ScenarioTable = require 'maps.scrap_towny_ffa.table'
local PvPShield = require 'maps.scrap_towny_ffa.pvp_shield'
local town_zoning_entity_types = { "wall", "gate", "electric-pole", "ammo-turret", "electric-turret", "fluid-turret"}
@ -223,26 +224,19 @@ local function process_built_entities(event)
local name = entity.name
local surface = entity.surface
local position = entity.position
local force
local force_name
if player_index ~= nil then
local player = game.players[player_index]
if player ~= nil then
local force = player.force
if force ~= nil then
force_name = force.name
end
end
force = player.force
force_name = force.name
else
local robot = event.robot
if robot ~= nil then
local force = robot.force
if force ~= nil then
force_name = force.name
end
end
force = robot.force
force_name = force.name
end
if Public.near_another_town(force_name, position, surface, 32) == true then
if PvPShield.in_other_zones(surface, position, force) or Public.near_another_town(force_name, position, surface, 32) == true then
if neutral_whitelist[name] then
entity.force = game.forces['neutral']
else
@ -335,6 +329,9 @@ local function on_player_built_tile(event)
if prevent_landfill_in_restricted_zone(event) then
return
end
if process_built_entities(event) then
return
end
if prevent_tiles_near_towns(event) then
return
end

View File

@ -37,6 +37,9 @@ Survive as long as you can. Raid other towns. Defend your town.
Tip: use filter inserters with to get coins/iron/.. out of the market
- Fishes procreate near towns. The more fishes, the quicker they multiply. Automated fish farm, anyone?
- Use /rename-town (chat command) to rename your town
- PvP shields prevent players from entering and building inside, but they can still shoot inside!
- Your town has a AFK PvP shield that you can use to safely take a quick break
without other players killing your town. Deploy it from the market.
# Town members and alliances
- Once a town is formed, members may invite other players and teams using a coin. To invite another player, drop a coin

View File

@ -33,7 +33,7 @@ local function remove_drawn_borders(shield)
end
end
local function scale_size_and_box(shield)
local function scale_size_by_lifetime(shield)
local time_scale = math.min(1, (game.tick - shield.lifetime_start) / shield.time_to_full_size_ticks)
local scaled_size = time_scale * shield.max_size
@ -63,7 +63,7 @@ function Public.add_shield(surface, force, center, max_size, lifetime_ticks, tim
string.format("%.0f", (Public.remaining_lifetime(shield)) / 60 / 60) .. ' minutes')
end
scale_size_and_box(shield)
scale_size_by_lifetime(shield)
this.pvp_shields[force.name] = shield
end
@ -89,7 +89,7 @@ local function update_shield_lifetime()
if Public.remaining_lifetime(shield) > 0 then
if shield.size < shield.max_size then
remove_drawn_borders(shield)
scale_size_and_box(shield)
scale_size_by_lifetime(shield)
draw_borders(shield)
-- Push everyone out as we grow (even if they're just standing)
@ -107,6 +107,18 @@ local function vector_norm(vector)
return math_sqrt(vector.x ^ 2 + vector.y ^ 2)
end
function Public.in_other_zones(surface, position, force)
local this = ScenarioTable.get_table()
for _, shield in pairs(this.pvp_shields) do
if not (shield.force == force or surface ~= shield.surface) then
if CommonFunctions.point_in_bounding_box(position, shield.box) then
return true
end
end
end
return false
end
function Public.push_enemies_out(player)
local this = ScenarioTable.get_table()
for _, shield in pairs(this.pvp_shields) do

View File

@ -419,7 +419,7 @@ local function add_pvp_shield_scaled(position, force, surface)
force.print("Based on the highest tech on map, your town deploys a PvP shield of "
.. string.format("%.0f", size) .. " tiles"
.. " for " .. string.format("%.0f", lifetime_ticks/60/60) .. " minutes."
.. " Enemy players will not be able to enter the shielded area.")
.. " Enemy players will not be able to enter and build in the shielded area.")
end
local function found_town(event)