extends StaticBody3D @onready var mesh_instance: MeshInstance3D = $MeshInstance3D # Sync the chosen shape so all clients see the same one @export var shape_index: int = -1: set(value): shape_index = value if is_inside_tree(): _update_mesh_from_index() func _ready(): add_to_group("StaticTektonStands") print("Static Stand Ready: ", name) # Clear 3x3 local GridMap void for late joiners call_deferred("_clear_local_gridmap_area") if multiplayer.is_server(): # Only randomize if not already set (Main.gd sets it now) if shape_index == -1: shape_index = randi() % 4 _update_mesh_from_index() else: # Client side: if shape_index != -1: _update_mesh_from_index() else: # If we spawned but data hasn't arrived (unlikely with spawn=true but possible), # we wait. The setter will trigger update when data arrives. # But just in case, we can try to request it or use a default pass func _clear_local_gridmap_area(): var main = get_tree().get_root().get_node_or_null("Main") if not main: return var gridmap = main.get_node_or_null("EnhancedGridMap") if not gridmap or not "cell_size" in gridmap: return var grid_x = int(round((global_position.x - gridmap.cell_size.x / 2.0) / gridmap.cell_size.x)) var grid_z = int(round((global_position.z - gridmap.cell_size.z / 2.0) / gridmap.cell_size.z)) var floor_count = 3 if "floors" in gridmap: floor_count = gridmap.floors for dx in range(-1, 2): for dy in range(-1, 2): for f in range(floor_count): gridmap.set_cell_item(Vector3i(grid_x + dx, f, grid_z + dy), -1) # Force pathfinding update if methods exist if gridmap.has_method("update_grid_data"): gridmap.update_grid_data() if gridmap.has_method("update_astar_costs"): gridmap.update_astar_costs() func _update_mesh_from_index(): if not mesh_instance: return var shapes = [ _create_cylinder(), _create_box() ] var idx = shape_index % shapes.size() var selected_mesh = shapes[idx] # Apply Material var mat = StandardMaterial3D.new() mat.albedo_color = Color(0.2, 0.2, 0.25) mat.metallic = 0.5 mat.roughness = 0.5 selected_mesh.material = mat mesh_instance.mesh = selected_mesh # Deprecated: _randomize_shape (Logic moved to server init and sync) # func _randomize_shape(): ... func _create_cylinder() -> CylinderMesh: var mesh = CylinderMesh.new() mesh.top_radius = 1.4 mesh.bottom_radius = 1.4 mesh.height = 0.6 return mesh func _create_box() -> BoxMesh: var mesh = BoxMesh.new() mesh.size = Vector3(3.2, 0.6, 3.2) return mesh func _create_sphere() -> SphereMesh: # A flattened sphere acting like a dome stand var mesh = SphereMesh.new() mesh.radius = 1.4 mesh.height = 1.0 # Flattened mesh.is_hemisphere = true return mesh