1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-08 00:39:30 +02:00
ComfyFactorio/maps/cave_choppy/player_elevator.lua
2021-03-24 18:22:45 +01:00

171 lines
4.8 KiB
Lua

--luacheck: ignore
local Event = require 'utils.event'
local Global = require 'utils.global'
local function validate_player(player)
if not player then
return false
end
if not player.valid then
return false
end
if not player.character then
return false
end
if not player.connected then
return false
end
if not game.players[player.name] then
return false
end
return true
end
local cooldowns = {}
local chests = {}
local inventories = {}
Global.register(
{
chests = chests,
inventories = inventories
},
function(global)
chests = global.chests
inventories = global.inventories
end
)
Global.register(
{
cooldowns = cooldowns
},
function(global)
cooldowns = global.cooldowns
end
)
local function check_player_ports()
for _, player in pairs(game.connected_players) do
if not validate_player(player) then
goto continue
end
if not cooldowns[player.name] then
cooldowns[player.name] = game.tick
end
--if cooldowns[player.name] - game.tick > 0 then goto continue end
if player.surface.find_entity('player-port', player.position) then
if cooldowns[player.name] > game.tick then
player.play_sound {path = 'utility/armor_insert', volume_modifier = 1}
if math.random(1, 3) == 1 then
player.surface.create_entity(
{
name = 'flying-text',
position = player.position,
text = math.ceil((cooldowns[tostring(player.name)] - game.tick) / 60),
color = {r = math.random(130, 170), g = math.random(130, 170), b = 130}
}
)
end
goto continue
end
local surface_name = player.surface.name == 'cave_miner' and 'choppy' or 'cave_miner'
local pos = surface_name == 'cave_miner' and global.surface_cave_elevator.position or {1, -4}
local safe_pos = game.surfaces[surface_name].find_non_colliding_position('character', pos, 20, 1)
if safe_pos then
player.teleport(safe_pos, surface_name)
else
player.teleport({0, -3}, surface_name)
end
cooldowns[player.name] = game.tick + 900
end
--
--[[
if cooldowns[player.name] > game.tick then
local text = rendering.draw_text{
text = "Cooldown:" .. math.ceil((cooldowns[player.name] - game.tick)/60) .. " seconds",
surface = "choppy",
target = global.surface_choppy_elevator,
target_offset = {0, 5},
color = { r=0.98, g=0.66, b=0.22},
alignment = "center"
}
else
rendering.destroy(text)
end
if math.random(1, 2) == 1 then
rendering.destroy(text)
]] ::continue::
end
end
local function built_entity(event)
local entity = event.created_entity
if not entity or not entity.valid then
return
end
if entity.name ~= 'player-port' then
return
end
entity.minable = false
entity.destructible = false
entity.operable = false
end
local function tick()
if not chests['cave_miner'] then
chests['cave_miner'] = global.surface_cave_chest
end
if not chests['choppy'] then
chests['choppy'] = global.surface_choppy_chest
end
local cave = chests['cave_miner']
local tree = chests['choppy']
if not cave or not tree then
return
end
if not cave.valid or not tree.valid then
return
end
local civ = tree.get_inventory(defines.inventory.chest)
local oiv = cave.get_inventory(defines.inventory.chest)
local ci = civ.get_contents()
local oi = oiv.get_contents()
for item, count in pairs(ci) do
local count2 = oi[item] or 0
local diff = count - count2
if diff > 1 then
local count2 = oiv.insert {name = item, count = math.floor(diff / 2)}
if count2 > 0 then
civ.remove {name = item, count = count2}
end
elseif diff < -1 then
local count2 = civ.insert {name = item, count = math.floor(-diff / 2)}
if count2 > 0 then
oiv.remove {name = item, count = count2}
end
end
end
for item, count in pairs(oi) do
if count > 1 and not ci[item] then
local count2 = civ.insert {name = item, count = math.floor(count / 2)}
if count2 > 0 then
oiv.remove {name = item, count = count2}
end
end
end
end
Event.add(defines.events.on_tick, tick)
Event.on_nth_tick(60, check_player_ports)
Event.add(defines.events.on_built_entity, built_entity)