1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00

Merge pull request #6 from ComfyFactory/planet_prison_fix_v5

Planet prison fix v5
This commit is contained in:
Gerkiz 2021-03-22 22:35:17 +01:00 committed by GitHub
commit 5f78cf907b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 225 additions and 118 deletions

View File

@ -14,6 +14,7 @@ local Timers = require 'maps.planet_prison.mod.timers'
local ClaimsFunctions = require 'maps.planet_prison.mod.claims'
local MapConfig = require 'maps.planet_prison.config'
local Token = require 'utils.token'
require 'modules.thirst'
local this = {}
local floor = math.floor
@ -74,8 +75,8 @@ this.maps = {
},
{
name = 'swampy-rivers',
height = 1500,
width = 1500,
height = 2500,
width = 2500,
water = 1,
terrain_segmentation = 6,
property_expression_names = {
@ -116,6 +117,15 @@ this.maps = {
}
}
local function assign_perks(player)
this.perks[player.name] = {
flashlight_enable = true,
minimap = false,
chat_global = true
}
return this.perks[player.name]
end
local assign_camouflage = function(ent, common)
local shade = common.rand_range(20, 200)
ent.color = {
@ -315,7 +325,8 @@ local swampy_rivers_layers = {
name = 'hostile',
objects = {
'character',
'gun-turret'
'gun-turret',
'small-biter'
},
elevation = 0.92,
resolution = 0.99,
@ -358,7 +369,11 @@ local function find_force(name)
return nil
end
local function init_player_ship_bp(entity, player)
local init_player_ship_bp =
Token.register(
function(data)
local player = data.player
local entity = data.entity
entity.force = player.force
if entity.name == 'crash-site-chest-1' then
for _, stack in pairs(MapConfig.player_ship_loot) do
@ -366,6 +381,7 @@ local function init_player_ship_bp(entity, player)
end
end
end
)
this.events = {
merchant = {
@ -377,7 +393,11 @@ this.events = {
offer = MapConfig.merchant_offer
}
}
local function init_merchant_bp(entity, _)
local init_merchant_bp =
Token.register(
function(data)
local entity = data.entity
entity.force = 'merchant'
entity.rotatable = false
entity.minable = false
@ -389,6 +409,7 @@ local function init_merchant_bp(entity, _)
end
end
end
)
local function create_orbit_group()
local orbit = game.permissions.create_group('orbit')
@ -424,7 +445,7 @@ local function init_game()
create_orbit_group()
game.map_settings.pollution.enabled = false
game.map_settings.enemy_evolution.enabled = false
game.difficulty_settings.technology_price_multiplier = 0.1
game.difficulty_settings.technology_price_multiplier = 0.3
game.difficulty_settings.research_queue_setting = 'always'
LayersFunctions.set_collision_mask({'water-tile'})
@ -593,6 +614,9 @@ end
local function draw_common_gui(player)
local perks = this.perks[player.name]
if not perks then
perks = assign_perks(player)
end
local chat_type = 'Global chat'
if not perks.chat_global then
chat_type = 'NAP chat'
@ -635,10 +659,13 @@ end
local function print_merchant_position(player)
local position = this.events.merchant.position
local perks = this.perks[player.name]
if not perks.minimap then
player.print(string.format('>> You were able to spot him %s from your location', CommonFunctions.get_readable_direction(player.position, position)))
else
if not perks then
perks = assign_perks(player)
end
if perks and perks.minimap then
player.print(string.format('>> You received a broadcast with [gps=%d,%d] coordinates', position.x, position.y))
else
player.print(string.format('>> You were able to spot him %s from your location', CommonFunctions.get_readable_direction(player.position, position)))
end
end
@ -696,6 +723,9 @@ local function on_gui_click(e)
local elem = e.element
local p = game.players[e.player_index]
local perks = this.perks[p.name]
if not perks then
perks = assign_perks(p)
end
if not elem.valid then
return
@ -756,7 +786,12 @@ local function init_player(p)
this.perks[p.name] = nil
p.teleport(position, 'arena')
--p.name = get_random_name() --player name is read only
local pf = game.forces[p.force.name]
if not pf then
p.force = game.create_force(p.name)
else
p.force = pf
end
p.force.set_friend('neutral', true)
this.perks[p.name] = {
flashlight_enable = true,
@ -764,6 +799,16 @@ local function init_player(p)
chat_global = true
}
for i = 1, 7 do
p.force.technologies['inserter-capacity-bonus-' .. i].enabled = false
p.force.technologies['inserter-capacity-bonus-' .. i].researched = false
end
if not p.character or not p.character.valid then
p.set_controller({type = defines.controllers.god})
p.create_character()
end
local merch = find_force('merchant')
if merch then
p.force.set_friend(merch, true)
@ -1189,8 +1234,16 @@ local function on_player_died(e)
local p = game.players[index]
ClaimsFunctions.on_player_died(p)
ClaimsFunctions.clear_player_base(p)
if game.forces[p.name] then
game.merge_forces(p.name, 'neutral')
end
if p.connected then
return
end
game.remove_offline_players({p})
end
local function on_player_respawned(e)
local p = game.players[e.player_index]
@ -1455,6 +1508,9 @@ local function on_market_item_purchased(e)
local m = e.market
local o = m.get_market_items()[e.offer_index].offer
local perks = this.perks[p.name]
if not perks then
perks = assign_perks(p)
end
if o.effect_description == 'Construct a GPS receiver' then
perks.minimap = true
@ -1513,7 +1569,10 @@ local function on_console_chat(e)
for _, peer in pairs(game.players) do
if peer.name ~= p.name then
local perks = this.perks[peer.name]
if perks.minimap then
if not perks then
perks = assign_perks(peer)
end
if perks and perks.minimap then
peer.print(msg)
else
peer.print(filter_out_gps(msg))
@ -1526,7 +1585,10 @@ local function on_console_chat(e)
local peer = f.players[1]
if peer.name ~= p.name then
local perks = this.perks[peer.name]
if perks.minimap then
if not perks then
perks = assign_perks(peer)
end
if perks and perks.minimap then
peer.print(msg)
else
peer.print(filter_out_gps(msg))

View File

@ -1 +1 @@
return '{"blueprint":{"icons":[{"signal":{"type":"item","name":"crash-site-spaceship-wreck-medium-1"},"index":1},{"signal":{"type":"item","name":"crash-site-spaceship-wreck-big-1"},"index":2}],"entities":[{"entity_number":1,"name":"crash-site-spaceship-wreck-big-2","position":{"x":3,"y":-3.5}},{"entity_number":2,"name":"crash-site-spaceship-wreck-medium-3","position":{"x":-2,"y":-1}},{"entity_number":3,"name":"crash-site-chest-1","position":{"x":4,"y":-1}},{"entity_number":4,"name":"crash-site-chest-2","position":{"x":-3,"y":3}},{"entity_number":5,"name":"assembling-machine-1","position":{"x":-2,"y":-5},"revoke_minable":"true"}, {"entity_number":6,"name":"small-electric-pole","position":{"x":-4,"y":-6}}, {"entity_number":7,"name":"burner-generator","position":{"x":-6,"y":-6},"fill":{"name":"coal","count":"50"},"revoke_minable":"true"}],"item":"blueprint","version":73019621376}}'
return '{"blueprint":{"icons":[{"signal":{"type":"item","name":"crash-site-spaceship-wreck-medium-1"},"index":1},{"signal":{"type":"item","name":"crash-site-spaceship-wreck-big-1"},"index":2}],"entities":[{"entity_number":1,"name":"crash-site-spaceship-wreck-big-2","position":{"x":3,"y":-3.5}},{"entity_number":2,"name":"crash-site-spaceship-wreck-medium-3","position":{"x":-2,"y":-1}},{"entity_number":3,"name":"crash-site-chest-1","position":{"x":4,"y":-1}},{"entity_number":4,"name":"crash-site-chest-2","position":{"x":-3,"y":3}},{"entity_number":5,"name":"assembling-machine-1","position":{"x":-2,"y":-5},"revoke_minable":"true"}, {"entity_number":6,"name":"small-electric-pole","position":{"x":-4,"y":-6}}, {"entity_number":7,"name":"burner-generator","position":{"x":-6,"y":-6},"fill":{"name":"coal","count":"50"},"revoke_minable":"true", "operable":"false"}],"item":"blueprint","version":73019621376}}'

View File

@ -270,7 +270,7 @@ local function _build_tiles(surf, point, tiles)
return _tiles
end
local function _build_entities(surf, point, entities, hook, args)
local function _build_entities(surf, point, entities, hook, player)
local _entities = {}
local get_axis = CommonFunctions.get_axis
@ -296,10 +296,15 @@ local function _build_entities(surf, point, entities, hook, args)
e.minable = false
end
if ent.operable then
e.operable = false
end
if hook then
local token = Token.get(hook)
if token then
token(e, args)
local data = {player = player, entity = e}
token(data)
end
end

View File

@ -84,7 +84,7 @@ local function claim_on_build_entity(ent)
end
if not in_range then
claim_new_claim(ent, deps)
claim_new_claim(ent)
end
end
@ -172,6 +172,23 @@ Public.on_player_died = function(player)
this._claims_info[player.name] = nil
end
Public.clear_player_base = function(player)
if not player or not player.valid then
return
end
local position = player.position
local x, y = position.x, position.y
local entities = player.surface.find_entities_filtered {force = player.force, area = {{x - 50, y - 50}, {x + 50, y + 50}}}
for i = 1, #entities do
local e = entities[i]
if e and e.valid then
e.destroy()
end
end
end
--[[
get_claims - Get all claims data points for given force.
@param f_name - Force name.

View File

@ -1,27 +1,23 @@
--Players will have to carry water barrels or stand next to a water tile, to keep themselves hydrated!
local Player_modifiers = require "player_modifiers"
local math_random = math.random
local tooltip = "How thirsty your character is.\nStand next to water,\nor keep water-barrels in your inventory to take a sip."
local water_tiles = {
["water"] = true,
["deepwater"] = true,
}
local Event = require 'utils.event'
local Player_modifiers = require 'player_modifiers'
local random = math.random
local tooltip = 'How thirsty your character is.\nStand next to water,\nor keep water-barrels in your inventory to take a sip.'
local function update_player_modifiers(player)
if global.hydration[player.index] <= 0 then
global.hydration[player.index] = 100
player.character.die()
game.print(player.name .. " forgot to take a sip.")
game.print(player.name .. ' forgot to take a sip.')
return
end
local m = ((global.hydration[player.index] - 100) * 0.01) + 0.2
local modifiers = Player_modifiers.get_table()
modifiers[player.index].character_mining_speed_modifier["thirst"] = m
modifiers[player.index].character_running_speed_modifier["thirst"] = m
modifiers[player.index].character_crafting_speed_modifier["thirst"] = m
modifiers[player.index].character_mining_speed_modifier['thirst'] = m
modifiers[player.index].character_running_speed_modifier['thirst'] = m
modifiers[player.index].character_crafting_speed_modifier['thirst'] = m
Player_modifiers.update_player_modifiers(player)
end
@ -31,22 +27,22 @@ local function update_hydration_meter(player)
if not hydration_meter then
global.hydration[player.index] = 100
hydration_meter = player.gui.top.add({type = "frame", name = "hydration_meter"})
hydration_meter = player.gui.top.add({type = 'frame', name = 'hydration_meter'})
hydration_meter.style.padding = 3
hydration_meter.tooltip = tooltip
local label = hydration_meter.add({type = "label", caption = "Hydration:"})
label.style.font = "heading-2"
local label = hydration_meter.add({type = 'label', caption = 'Hydration:'})
label.style.font = 'heading-2'
label.style.font_color = {125, 125, 255}
label.tooltip = tooltip
local label = hydration_meter.add({type = "label", caption = 100})
label.style.font = "heading-2"
label.style.font_color = {175, 175, 175}
label.tooltip = tooltip
local label = hydration_meter.add({type = "label", caption = "%"})
label.style.font = "heading-2"
label.style.font_color = {175, 175, 175}
label.tooltip = tooltip
local label2 = hydration_meter.add({type = 'label', caption = 100})
label2.style.font = 'heading-2'
label2.style.font_color = {175, 175, 175}
label2.tooltip = tooltip
local label3 = hydration_meter.add({type = 'label', caption = '%'})
label3.style.font = 'heading-2'
label3.style.font_color = {175, 175, 175}
label3.tooltip = tooltip
return
end
@ -54,42 +50,70 @@ local function update_hydration_meter(player)
end
local function sip(player)
if not global.hydration[player.index] then return end
if math_random(1, 4) == 1 then global.hydration[player.index] = global.hydration[player.index] - 1 end
if global.hydration[player.index] == 100 then return end
if player.surface.count_tiles_filtered({name = {"water", "deepwater"}, area = {{player.position.x - 1, player.position.y - 1}, {player.position.x + 1, player.position.y + 1}}}) > 0 then
global.hydration[player.index] = global.hydration[player.index] + 20
if global.hydration[player.index] > 100 then global.hydration[player.index] = 100 end
if not global.hydration[player.index] then
return
end
if random(1, 4) == 1 then
global.hydration[player.index] = global.hydration[player.index] - 1
end
if global.hydration[player.index] == 100 then
return
end
if global.hydration[player.index] > 90 then return end
if
player.surface.count_tiles_filtered(
{name = {'water', 'deepwater'}, area = {{player.position.x - 1, player.position.y - 1}, {player.position.x + 1, player.position.y + 1}}}
) > 0
then
global.hydration[player.index] = global.hydration[player.index] + 20
if global.hydration[player.index] > 100 then
global.hydration[player.index] = 100
end
return
end
if global.hydration[player.index] > 90 then
return
end
local inventory = player.get_main_inventory()
local removed_count = inventory.remove({name = "water-barrel", count = 1})
if removed_count == 0 then return end
local removed_count = inventory.remove({name = 'water-barrel', count = 1})
if removed_count == 0 then
return
end
global.hydration[player.index] = global.hydration[player.index] + 10
player.play_sound{path="utility/armor_insert", volume_modifier=0.9}
player.play_sound {path = 'utility/armor_insert', volume_modifier = 0.9}
local inserted_count = inventory.insert({name = "empty-barrel", count = 1})
if inserted_count > 0 then return end
local inserted_count = inventory.insert({name = 'empty-barrel', count = 1})
if inserted_count > 0 then
return
end
player.surface.spill_item_stack(player.position, {name = "empty-barrel", count = 1}, true)
player.surface.spill_item_stack(player.position, {name = 'empty-barrel', count = 1}, true)
end
local function on_player_changed_position(event)
if math_random(1, 320) ~= 1 then return end
if random(1, 320) ~= 1 then
return
end
local player = game.players[event.player_index]
if not player.character then return end
if not player.character.valid then return end
if player.vehicle then return end
if not player.character then
return
end
if not player.character.valid then
return
end
if player.vehicle then
return
end
global.hydration[player.index] = global.hydration[player.index] - 1
end
local function on_player_died(event)
if not global.hydration[event.player_index] then return end
if not global.hydration[event.player_index] then
return
end
global.hydration[event.player_index] = 100
end
@ -109,7 +133,6 @@ local function on_init()
global.hydration = {}
end
local Event = require 'utils.event'
Event.add(defines.events.on_player_changed_position, on_player_changed_position)
Event.add(defines.events.on_player_died, on_player_died)
Event.on_nth_tick(120, tick)