diff options
author | nokoe <nokoe@mailbox.org> | 2025-04-07 16:29:11 +0200 |
---|---|---|
committer | nokoe <nokoe@mailbox.org> | 2025-04-07 16:29:11 +0200 |
commit | a51e4f60fcc03649529349227bbe2b28395eebc7 (patch) | |
tree | a3da5ce2b00837df98257d8f093b85ac99bf3c2b | |
parent | 48a7a20e0f1595cd6e46c8c5136863ed56d5ef2b (diff) | |
download | hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.bz2 hurrycurry-a51e4f60fcc03649529349227bbe2b28395eebc7.tar.zst |
fix #240; fix #241
-rw-r--r-- | client/map/map.gd | 4 | ||||
-rw-r--r-- | client/map/tiles/floor_mesher.gd | 22 | ||||
-rw-r--r-- | server/editor/src/main.rs | 30 |
3 files changed, 24 insertions, 32 deletions
diff --git a/client/map/map.gd b/client/map/map.gd index 10bb1bd1..2b8dd651 100644 --- a/client/map/map.gd +++ b/client/map/map.gd @@ -21,7 +21,7 @@ extends Node3D var tile_by_pos: Dictionary = {} var autobake = false var currently_baked = false -var floor_mesher = FloorMesher.new() +var floor_mesher := FloorMesher.new() var floor_node := MeshInstance3D.new() func get_tile_name(pos: Vector2i): @@ -34,6 +34,7 @@ func get_tile_instance(pos: Vector2i) -> Tile: else: return null func set_tile(pos: Vector2i, name_: String, neighbors: Array = [null,null,null,null]) -> Tile: + clear_tile(pos) var tile = TileFactory.produce(name_, pos, neighbors, floor_mesher) add_child(tile) tile.position = Vector3(pos.x, 0, pos.y) @@ -47,6 +48,7 @@ func clear_tile(pos: Vector2i): tile_by_pos.erase(str(pos)) tile.name += "_queued_free" tile.queue_free() + floor_mesher.remove_tile(pos) @onready var voxelgi: VoxelGI = $VoxelGI diff --git a/client/map/tiles/floor_mesher.gd b/client/map/tiles/floor_mesher.gd index 182425a5..d3a66c89 100644 --- a/client/map/tiles/floor_mesher.gd +++ b/client/map/tiles/floor_mesher.gd @@ -31,21 +31,25 @@ var tiles: Dictionary func add_tile(pos: Vector2i): tiles[str(pos)] = pos +func remove_tile(pos: Vector2i): + tiles.erase(str(pos)) + func flush() -> ArrayMesh: + var tiles_queue = tiles.duplicate() var st := SurfaceTool.new() st.begin(Mesh.PRIMITIVE_TRIANGLES) - while not tiles.is_empty(): - var key: String = tiles.keys()[0] - var tile_position: Vector2i = tiles[key] + while not tiles_queue.is_empty(): + var key: String = tiles_queue.keys()[0] + var tile_position: Vector2i = tiles_queue[key] var shift := Vector2i.ZERO # move the origin of the rectangle to the upper left corner while true: - #if tiles.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)): + #if tiles_queue.has(str(tile_position + shift + Vector2i.UP + Vector2i.LEFT)): # shift += Vector2i.UP + Vector2i.LEFT - if tiles.has(str(tile_position + shift + Vector2i.UP)): + if tiles_queue.has(str(tile_position + shift + Vector2i.UP)): shift += Vector2i.UP - elif tiles.has(str(tile_position + shift + Vector2i.LEFT)): + elif tiles_queue.has(str(tile_position + shift + Vector2i.LEFT)): shift += Vector2i.LEFT else: break @@ -54,14 +58,14 @@ func flush() -> ArrayMesh: var rectangle := Vector2i.ONE # go down as long as possible - while tiles.has(str(rectangle_origin + Vector2i(0, rectangle.y))): + while tiles_queue.has(str(rectangle_origin + Vector2i(0, rectangle.y))): rectangle.y += 1 # try to go right as long as possible by checking if whole columns are long enough while true: var column_possible := true for i in range(0, rectangle.y): - column_possible = tiles.has(str(rectangle_origin + Vector2i(rectangle.x, i))) + column_possible = tiles_queue.has(str(rectangle_origin + Vector2i(rectangle.x, i))) if not column_possible: break if column_possible: rectangle.x += 1 @@ -102,5 +106,5 @@ func flush() -> ArrayMesh: # remove the rectangle from the "queue" for x in range(rectangle_origin.x, rectangle_origin.x + rectangle.x): for y in range(rectangle_origin.y, rectangle_origin.y + rectangle.y): - tiles.erase(str(Vector2i(x, y))) + tiles_queue.erase(str(Vector2i(x, y))) return st.commit() diff --git a/server/editor/src/main.rs b/server/editor/src/main.rs index 8577aec1..2c05dfbc 100644 --- a/server/editor/src/main.rs +++ b/server/editor/src/main.rs @@ -92,7 +92,7 @@ const TILES: &[(&str, char, u8)] = &[ ("coconut-crate", 'u', 0), ("strawberry-crate", 'v', 0), ("rice-crate", 'w', 0), - ("wall-window", 'x', 0), + ("wall-window", 'x', 2), ("freezer", 'y', 0), ("trash", 'z', 0), ("sink", 'A', 0), @@ -103,6 +103,13 @@ const TILES: &[(&str, char, u8)] = &[ ("door", 'F', 1), ("path", 'G', 1), ("book", 'H', 1), + ("house-wall", 'I', 2), + ("house-side", 'J', 2), + ("house-balcony", 'K', 2), + ("house-door", 'L', 2), + ("house-oriel", 'M', 2), + ("house-roof", 'N', 2), + ("house-roof-chimney", 'O', 2), ]; #[allow(unused_assignments)] @@ -237,27 +244,6 @@ impl State { ], }) } - // send every existing tile once move because client does not remember - // TODO remove when client is fixed - for (tile, _) in &self.tiles { - self.out.push(PacketC::UpdateMap { - tile: *tile, - kind: None, - neighbors: [None; 4], - }) - } - for (tile, kind) in &self.tiles { - self.out.push(PacketC::UpdateMap { - tile: *tile, - kind: Some(*kind), - neighbors: [ - self.tiles.get(&(tile + IVec2::NEG_Y)).copied(), - self.tiles.get(&(tile + IVec2::NEG_X)).copied(), - self.tiles.get(&(tile + IVec2::Y)).copied(), - self.tiles.get(&(tile + IVec2::X)).copied(), - ], - }) - } self.out.push(PacketC::FlushMap); } } |