1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-08 00:39:30 +02:00
ComfyFactorio/modules/crawl_into_pipes.lua

94 lines
2.6 KiB
Lua
Raw Normal View History

2020-08-18 09:28:12 +02:00
--Your character may enter pipes.
local Global = require 'utils.global'
local Event = require 'utils.event'
local math_floor = math.floor
local pipe_crawl = {}
Global.register(
pipe_crawl,
function(tbl)
pipe_crawl = tbl
end
)
local function get_current_pipe(player)
local position = {math_floor(player.position.x) + 0.5, math_floor(player.position.y) + 0.5}
local pipe = player.surface.find_entities_filtered({type = {"pipe", "pipe-to-ground"}, position = position, limit = 1})[1]
return pipe
end
local function is_pipe_end_piece(pipe)
local neighbours = pipe.neighbours[1]
if #neighbours == 1 then return true end
end
local function enter_pipe(player, pipe)
if not is_pipe_end_piece(pipe) then return end
player.walking_state = {walking = false}
pipe_crawl[player.name].character = player.character.clone({position = {0,0}, surface = "crawl_into_pipes", force = player.force})
player.character.destroy()
player.set_controller({type = defines.controllers.god})
end
local function exit_pipe(player)
if player.character then return end
local saved_character = pipe_crawl[player.name].character
player.character = saved_character.clone({position = player.position, surface = player.surface, force = player.force})
saved_character.destroy()
end
--[[
local function align_position_to_pipe(player, pipe)
local position = player.position
local tile_position = {x = math_floor(position.x), y = math_floor(position.y)}
local inside_position = {x = position.x - tile_position.x, y = position.y - tile_position.y}
end
]]
local function on_player_changed_position(event)
local player = game.players[event.player_index]
local pipe = get_current_pipe(player)
if not pipe then
exit_pipe(player)
return
end
--[[
if not player.character then
align_position_to_pipe(player, pipe)
return
end
]]
if not player.character.valid then return end
if player.character.driving then return end
enter_pipe(player, pipe)
end
local function on_player_joined_game(event)
local player = game.players[event.player_index]
if not pipe_crawl[player.name] then pipe_crawl[player.name] = {} end
end
local function on_init()
pipe_crawl.players = {}
game.create_surface(
"crawl_into_pipes",
{
height = 3,
width = 3,
["default_enable_all_autoplace_controls"] = false,
["autoplace_settings"] = {
["entity"] = {treat_missing_as_default = false},
["tile"] = {treat_missing_as_default = false},
["decorative"] = {treat_missing_as_default = false},
},
}
)
end
Event.on_init(on_init)
Event.add(defines.events.on_player_changed_position, on_player_changed_position)
Event.add(defines.events.on_player_joined_game, on_player_joined_game)