Station movement handle snaps back in place

This commit is contained in:
JonShard
2026-07-30 17:37:08 +02:00
parent 0826f29265
commit a606a2f93f
2 changed files with 43 additions and 23 deletions
+13 -10
View File
@@ -206,36 +206,34 @@ _data = {
[node name="Hob" type="Node3D" unique_id=172418174 groups=["station"]]
[node name="Movement" type="Node3D" parent="." unique_id=1818087979]
[node name="MoveHandle" type="RigidBody3D" parent="." unique_id=1675596942 groups=["platalbe_item"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.08, 0)
script = ExtResource("7_akjp4")
[node name="MoveHandle" type="RigidBody3D" parent="Movement" unique_id=1675596942 groups=["platalbe_item"]]
collision_layer = 4
collision_mask = 196615
axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_z = true
mass = 0.004
gravity_scale = 0.0
gravity_scale = 0.5
linear_damp = 100.0
script = ExtResource("7_d4kl5")
release_mode = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="Movement/MoveHandle" unique_id=1023455695]
[node name="CollisionShape3D" type="CollisionShape3D" parent="MoveHandle" unique_id=1023455695]
shape = SubResource("BoxShape3D_m1xbq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Movement/MoveHandle" unique_id=1223689787]
[node name="MeshInstance3D" type="MeshInstance3D" parent="MoveHandle" unique_id=1223689787]
mesh = SubResource("BoxMesh_vlqg6")
[node name="GrabPointHandLeft" parent="Movement/MoveHandle" unique_id=1571481674 instance=ExtResource("8_w3ous")]
[node name="GrabPointHandLeft" parent="MoveHandle" unique_id=1571481674 instance=ExtResource("8_w3ous")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.067650706, 0.04601878, -0.08606844)
hand_pose = SubResource("Resource_lc22d")
[node name="GrabPointHandRight" parent="Movement/MoveHandle" unique_id=514404634 instance=ExtResource("11_sexl6")]
[node name="GrabPointHandRight" parent="MoveHandle" unique_id=514404634 instance=ExtResource("11_sexl6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.06531982, 0.042291984, -0.08604182)
hand_pose = SubResource("Resource_qyiot")
[node name="NetPickable" type="MultiplayerSynchronizer" parent="Movement/MoveHandle" unique_id=1858332513]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="MoveHandle" unique_id=1858332513]
replication_config = SubResource("SceneReplicationConfig_np_cube")
script = ExtResource("15_trny8")
@@ -358,3 +356,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5053487, 0)
light_color = Color(1, 0.13725491, 0, 1)
light_energy = 0.0
omni_range = 0.5
[node name="Movement" type="Node" parent="Hob" unique_id=1004484356 node_paths=PackedStringArray("move_handle", "station")]
script = ExtResource("7_akjp4")
move_handle = NodePath("../../MoveHandle")
station = NodePath("..")
+30 -13
View File
@@ -1,27 +1,44 @@
extends Node3D
extends Node
@export var snap_grid_size: float = 0.6
@onready var move_handle: XRToolsPickable = $MoveHandle
@onready var move_handle_rigid: RigidBody3D = $MoveHandle
@onready var station: StaticBody3D = $"../Hob"
@export var move_handle: XRToolsPickable
@export var station: StaticBody3D
var move_handle_rigid: RigidBody3D
var original_collision_layer
var original_y_pos: float
# TODO: Reject placing station in occupied spot.
# TODO: Make ghost version of station that is displayed instead of model.
# TODO: public toggle to disable handle in build mode.
# TODO: If game exits build mode, drop the handle before disabling it.
func _ready() -> void:
if not station:
push_error("StationMovement is missing referece to station")
move_handle_rigid = move_handle as RigidBody3D
original_collision_layer = station.collision_layer
original_y_pos = move_handle.transform.origin.y
move_handle.picked_up.connect(_handle_pickup)
move_handle.dropped.connect(_handle_drop)
func _handle_pickup(_by):
print("StationMovement handle pickup")
station.collision_layer = 0
func _handle_drop(_by):
print("StationMovement handle drop")
station.collision_layer = original_collision_layer
move_handle.global_position = station.global_position + Vector3(0, original_y_pos, 0)
move_handle.rotation = station.rotation
func _process(_delta: float) -> void:
if move_handle.is_picked_up():
station.collision_layer = 0
else:
station.collision_layer = original_collision_layer
# move_handle.transform.origin = Vector3.ZERO
move_handle_rigid.linear_velocity = Vector3.ZERO
move_handle_rigid.angular_velocity = Vector3.ZERO
station.global_position.x = snappedf(move_handle.global_position.x, snap_grid_size)
station.global_position.z = snappedf(move_handle.global_position.z, snap_grid_size)
station.global_rotation_degrees.y = snappedf(move_handle.global_rotation_degrees.y, 90)