mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-03-17 20:58:13 +02:00
custom health, build restrictions
This commit is contained in:
parent
fc1061801d
commit
59b9967e9c
@ -1,6 +1,53 @@
|
||||
local Public = {}
|
||||
|
||||
local connection_radius = 5
|
||||
local connection_radius = 4
|
||||
|
||||
local entity_type_whitelist = {
|
||||
["accumulator"] = true,
|
||||
["ammo-turret"] = true,
|
||||
["arithmetic-combinator"] = true,
|
||||
["artillery-turret"] = true,
|
||||
["assembling-machine"] = true,
|
||||
["boiler"] = true,
|
||||
["constant-combinator"] = true,
|
||||
["container"] = true,
|
||||
["curved-rail"] = true,
|
||||
["decider-combinator"] = true,
|
||||
["electric-turret"] = true,
|
||||
["fluid-turret"] = true,
|
||||
["furnace"] = true,
|
||||
["gate"] = true,
|
||||
["generator"] = true,
|
||||
["heat-pipe"] = true,
|
||||
["infinity-container"] = true,
|
||||
["heat-interface"] = true,
|
||||
["infinity-pipe"] = true,
|
||||
["inserter"] = true,
|
||||
["lamp"] = true,
|
||||
["loader"] = true,
|
||||
["logistic-container"] = true,
|
||||
["market"] = true,
|
||||
["mining-drill"] = true,
|
||||
["offshore-pump"] = true,
|
||||
["pipe"] = true,
|
||||
["pipe-to-ground"] = true,
|
||||
["programmable-speaker"] = true,
|
||||
["pump"] = true,
|
||||
["radar"] = true,
|
||||
["rail-chain-signal"] = true,
|
||||
["rail-signal"] = true,
|
||||
["reactor"] = true,
|
||||
["roboport"] = true,
|
||||
["rocket-silo"] = true,
|
||||
["solar-panel"] = true,
|
||||
["splitter"] = true,
|
||||
["storage-tank"] = true,
|
||||
["straight-rail"] = true,
|
||||
["train-stop"] = true,
|
||||
["transport-belt"] = true,
|
||||
["underground-belt"] = true,
|
||||
["wall"] = true,
|
||||
}
|
||||
|
||||
local function is_entity_isolated(surface, entity)
|
||||
local position_x = entity.position.x
|
||||
@ -9,7 +56,7 @@ local function is_entity_isolated(surface, entity)
|
||||
local count = 0
|
||||
|
||||
for _, e in pairs(surface.find_entities_filtered({area = area, force = entity.force.name})) do
|
||||
if game.entity_prototypes[e.name] and game.recipe_prototypes[e.name] or e.name == "market" then
|
||||
if entity_type_whitelist[e.type] then
|
||||
count = count + 1
|
||||
if count > 1 then return end
|
||||
end
|
||||
@ -36,6 +83,7 @@ end
|
||||
function Public.prevent_isolation(event)
|
||||
local entity = event.created_entity
|
||||
if not entity.valid then return end
|
||||
if entity.type == "entity-ghost" then return end
|
||||
local surface = event.created_entity.surface
|
||||
|
||||
if is_entity_isolated(surface, entity) then
|
||||
|
@ -35,6 +35,20 @@ local function on_entity_died(event)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_entity_damaged(event)
|
||||
local entity = event.entity
|
||||
if entity.name == "market" then
|
||||
Town_center.set_market_health(entity, event.final_damage_amount)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_player_repaired_entity(event)
|
||||
local entity = event.entity
|
||||
if entity.name == "market" then
|
||||
Town_center.set_market_health(entity, -3)
|
||||
end
|
||||
end
|
||||
|
||||
local function on_init()
|
||||
global.towny = {}
|
||||
global.towny.town_centers = {}
|
||||
@ -48,4 +62,7 @@ Event.add(defines.events.on_player_joined_game, on_player_joined_game)
|
||||
Event.add(defines.events.on_player_respawned, on_player_respawned)
|
||||
Event.add(defines.events.on_robot_built_entity, on_robot_built_entity)
|
||||
Event.add(defines.events.on_built_entity, on_built_entity)
|
||||
Event.add(defines.events.on_entity_died, on_entity_died)
|
||||
Event.add(defines.events.on_entity_died, on_entity_died)
|
||||
Event.add(defines.events.on_entity_damaged, on_entity_damaged)
|
||||
Event.add(defines.events.on_player_repaired_entity, on_player_repaired_entity)
|
||||
|
||||
|
@ -9,9 +9,11 @@ end
|
||||
|
||||
function Public.kill_force(force_name)
|
||||
local force = game.forces[force_name]
|
||||
local market = global.towny.town_centers[force_name]
|
||||
local market = global.towny.town_centers[force_name].market
|
||||
local surface = market.surface
|
||||
|
||||
surface.create_entity({name = "big-artillery-explosion", position = market.position})
|
||||
|
||||
for _, player in pairs(force.players) do
|
||||
if player.character then player.character.die() end
|
||||
player.force = game.forces.player
|
||||
|
@ -69,7 +69,7 @@ local starter_supplies = {
|
||||
}
|
||||
|
||||
local function draw_town_spawn(player_name)
|
||||
local market = global.towny.town_centers[player_name]
|
||||
local market = global.towny.town_centers[player_name].market
|
||||
local position = market.position
|
||||
local surface = market.surface
|
||||
|
||||
@ -113,15 +113,17 @@ local function draw_town_spawn(player_name)
|
||||
|
||||
for i = 1, 4, 1 do
|
||||
for _, vector in pairs(resource_vectors[i]) do
|
||||
local p = {position.x + vector[1], position.y + vector[2]}
|
||||
surface.create_entity({name = ores[i], position = p, amount = 1500})
|
||||
local p = {position.x + vector[1], position.y + vector[2]}
|
||||
if not surface.get_tile(p).collides_with("resource-layer") then
|
||||
surface.create_entity({name = ores[i], position = p, amount = 1500})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for _, item_stack in pairs(starter_supplies) do
|
||||
local m1 = -8 + math_random(0, 16)
|
||||
local m2 = -8 + math_random(0, 16)
|
||||
local p = {position.x + m1, position.x + m2}
|
||||
local p = {position.x + m1, position.y + m2}
|
||||
p = surface.find_non_colliding_position("wooden-chest", p, 32, 1)
|
||||
if p then
|
||||
local e = surface.create_entity({name = "wooden-chest", position = p, force = player_name})
|
||||
@ -182,6 +184,15 @@ local function is_valid_location(surface, entity)
|
||||
return true
|
||||
end
|
||||
|
||||
function Public.set_market_health(entity, final_damage_amount)
|
||||
local town_center = global.towny.town_centers[entity.force.name]
|
||||
town_center.health = town_center.health - final_damage_amount
|
||||
local m = town_center.health / town_center.max_health
|
||||
entity.health = 150 * m
|
||||
rendering.set_text(town_center.health_text, "Health: " .. town_center.health)
|
||||
|
||||
end
|
||||
|
||||
function Public.found(event)
|
||||
local entity = event.created_entity
|
||||
if entity.name ~= "stone-furnace" then return end
|
||||
@ -201,7 +212,36 @@ function Public.found(event)
|
||||
|
||||
Team.add_new_force(player_name)
|
||||
|
||||
global.towny.town_centers[player_name] = surface.create_entity({name = "market", position = entity.position, force = player_name})
|
||||
global.towny.town_centers[player_name] = {}
|
||||
local town_center = global.towny.town_centers[player_name]
|
||||
town_center.market = surface.create_entity({name = "market", position = entity.position, force = player_name})
|
||||
town_center.max_health = 5000
|
||||
town_center.health = town_center.max_health
|
||||
|
||||
town_center.health_text = rendering.draw_text{
|
||||
text = "HP: " .. town_center.health .. " / " .. town_center.max_health,
|
||||
surface = surface,
|
||||
target = town_center.market,
|
||||
target_offset = {0, -2.5},
|
||||
color = {200, 200, 200},
|
||||
scale = 1.00,
|
||||
font = "default-game",
|
||||
alignment = "center",
|
||||
scale_with_zoom = false
|
||||
}
|
||||
|
||||
town_center.town_caption = rendering.draw_text{
|
||||
text = player.name .. "'s town",
|
||||
surface = surface,
|
||||
target = town_center.market,
|
||||
target_offset = {0, -3.25},
|
||||
color = player.chat_color,
|
||||
scale = 1.30,
|
||||
font = "default-game",
|
||||
alignment = "center",
|
||||
scale_with_zoom = false
|
||||
}
|
||||
|
||||
global.towny.size_of_town_centers = global.towny.size_of_town_centers + 1
|
||||
|
||||
entity.destroy()
|
||||
|
Loading…
x
Reference in New Issue
Block a user