From e5bb7ee1afa13a05139394da123036732791cbe6 Mon Sep 17 00:00:00 2001 From: MewMew Date: Tue, 18 Aug 2020 09:28:12 +0200 Subject: [PATCH] module --- modules/crawl_into_pipes.lua | 94 ++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 modules/crawl_into_pipes.lua diff --git a/modules/crawl_into_pipes.lua b/modules/crawl_into_pipes.lua new file mode 100644 index 00000000..ee4ac41f --- /dev/null +++ b/modules/crawl_into_pipes.lua @@ -0,0 +1,94 @@ +--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) \ No newline at end of file