Files
tekton/scripts/static_tekton_stand.gd
T

100 lines
2.7 KiB
GDScript

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