mirror of
https://github.com/ComfyFactory/ComfyFactorio.git
synced 2025-01-08 00:39:30 +02:00
171 lines
4.8 KiB
Lua
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)
|