diff options
author | Paul Oliver <contact@pauloliver.dev> | 2025-04-14 17:24:56 +0200 |
---|---|---|
committer | Paul Oliver <contact@pauloliver.dev> | 2025-04-15 01:44:25 +0200 |
commit | 1c97c7b61f51255baa2a42c81a8cd8cb6ef9ea1b (patch) | |
tree | 8cd0eb09240e3e1f6ffa930845df4b4fdeaf52a5 | |
parent | 27ab3b77a329892258bd44af2f5cc9e438b378a5 (diff) |
Prevents the player from exploring unvisible areas
-rw-r--r-- | von-newmann-2/control.lua | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/von-newmann-2/control.lua b/von-newmann-2/control.lua index 27e1190..0283aa5 100644 --- a/von-newmann-2/control.lua +++ b/von-newmann-2/control.lua @@ -295,14 +295,77 @@ local function on_player_created(event) create_roboport(center, surface, player)
end
+local function on_player_changed_position(event)
+ -- Inspired by Brave New OARC.
+ -- This prevents exploration of non-visible areas of the map.
+ -- Player needs to install radars in order to explore.
+
+ local player = game.players[event.player_index]
+ local chunk_size = 32
+
+ if prev_pos[event.player_index] == nil then
+ prev_pos[event.player_index] = player.position
+ end
+
+ --print("x:", player.position.x, "y:", player.position.y, "prev_x:", prev_pos[event.player_index].x, "prev_y:", prev_pos[event.player_index].y)
+
+ local pred_dim = function(pos, prev_pos)
+ local delta = pos - prev_pos
+
+ if delta > 0 then
+ return pos + chunk_size * 2
+ elseif delta < 0 then
+ return pos - chunk_size * 2
+ end
+
+ return pos
+ end
+
+ local pred_x = pred_dim(player.position.x, prev_pos[event.player_index].x)
+ local pred_y = pred_dim(player.position.y, prev_pos[event.player_index].y)
+
+ --print("pred_x:", pred_x, "pred_y:", pred_y)
+
+ local get_player_surface = function()
+ if player.character then
+ return player.character.surface
+ else
+ return player.surface
+ end
+ end
+
+ local to_chunk_coord = function(coord)
+ return math.floor(coord / chunk_size)
+ end
+
+ if not player.force.is_chunk_visible(get_player_surface(), {to_chunk_coord(pred_x), to_chunk_coord(pred_y)}) then
+ -- teleport player to (possibly modified) prev_pos
+ player.teleport(prev_pos[event.player_index])
+ player.print("Fog of War limit! Drop a radar to extend your reach.", {sound=defines.print_sound.never})
+ end
+
+ -- Teleport back to 0,0 if current position is not visible.
+ -- This prevents the player from getting stuck in case a radar is disabled or destroyed.
+ if not player.force.is_chunk_visible(get_player_surface(), {to_chunk_coord(player.position.x), to_chunk_coord(player.position.y)}) then
+ player.teleport({0, 0})
+ player.print("Inside Fog of War! Was radar disabled or destroyed?") -- do play sound here
+ end
+
+ -- save new player position
+ prev_pos[event.player_index] = player.position
+end
+
script.on_init(function ()
if not remote.interfaces.freeplay then
modEnabled = false
return
end
+ prev_pos = {}
+
remote.call("freeplay", "set_disable_crashsite", true)
script.on_event(defines.events.on_player_created, on_player_created)
+ script.on_event(defines.events.on_player_changed_position, on_player_changed_position)
script.on_configuration_changed(updateInventory)
end)
|