65 Commits

Author SHA1 Message Date
algodoogle 2efeb2dd24 Merge branch 'master' of https://git.offcoursegames.com/JonShard/VRyHungry1 2026-08-11 15:22:57 +01:00
algodoogle 88dcfbafdf table fix 2026-08-11 15:22:42 +01:00
JonShard b4a32b7a5e Metadata files 2026-08-11 16:20:59 +02:00
algodoogle 4f8c96d089 Merge branch 'master' of https://git.offcoursegames.com/JonShard/VRyHungry1 2026-08-11 15:04:09 +01:00
algodoogle a0a1c504c1 mp snap fix 2026-08-11 15:04:05 +01:00
JonShard 9ea7a045f4 Sync SnapZone picked_up_ranged 2026-08-11 15:12:09 +02:00
JonShard 58adbf83e2 Modify kitchen scene 2026-08-11 14:46:04 +02:00
JonShard 6a591b9e3a Add bought station is ghost when spawns 2026-08-11 13:24:51 +02:00
JonShard 70d41fc21b WIP apply visibility 2026-08-11 11:51:14 +02:00
JonShard 4bfb72d749 Improve logging 2026-08-11 11:02:20 +02:00
JonShard 3ae1e089aa Clean up SweetLogger prints by making file and functions arguments automatic 2026-08-11 10:19:26 +02:00
JonShard bd43b0bd1e Add a const in SweetLogger to toggle debug prints 2026-08-10 14:36:27 +02:00
JonShard 7648ecbac9 Add Sweetlogger 2026-08-10 13:47:01 +02:00
JonShard bf31f85b02 Fix StationMovement in Multiplayer, still works singleplayer 2026-08-10 13:02:19 +02:00
JonShard dbaad35e50 Fix gamemanager state syncing 2026-08-10 10:23:38 +02:00
JonShard 513ad23e09 Warning hunt 2026-08-09 14:04:49 +02:00
JonShard 9cdf72dc47 Add MultiplayerSyncronizers to stations 2026-08-09 13:15:30 +02:00
JonShard cf4b4ac32e Change GameManager to use RPCs to sync state 2026-08-09 10:10:04 +02:00
JonShard f156379ff3 Notes 2026-08-09 08:17:47 +02:00
JonShard d82f856b1a Experiment RPC 2026-08-06 20:27:43 +02:00
algodoogle ddf37cc0ae bug fix 2026-08-06 19:05:57 +01:00
JonShard aa4ffd6346 Fix Scene folder rename refs 2026-08-06 19:46:53 +02:00
JonShard 85960df6b2 Update Sync on Hob 2026-08-06 19:35:56 +02:00
JonShard eae9e56da7 Merge branch 'master' of https://git.offcoursegames.com/JonShard/VRyHungry1 2026-08-06 19:09:45 +02:00
JonShard 1196036973 Fix multiplayer scene outdated 2026-08-06 19:09:43 +02:00
algodoogle d4a724dddf random gen 2026-08-06 18:07:03 +01:00
JonShard d5c162a51a Fix all tables consumed the same customer. 2026-08-06 18:49:57 +02:00
JonShard 1cf3afd440 Add DayController and QueueController to handle spawning of customer through out a day 2026-08-06 14:51:49 +02:00
JonShard 97e09b9c12 Add MultiplayerSyncronizer to Station movement ghost 2026-08-05 11:52:06 +02:00
JonShard 528f66627b Add shop closes on buying something 2026-08-05 09:54:46 +02:00
JonShard 3646992e35 Add food dispensers to shop. 2026-08-05 09:46:19 +02:00
JonShard c7840d3cc7 Add Shop spawn station 2026-08-04 14:55:00 +02:00
JonShard dde627d05b Add Shop toggles poke 2026-08-04 13:29:11 +02:00
JonShard 661210eac8 Add Shop menu on each hand 2026-08-04 12:38:21 +02:00
JonShard 2e8c12cb8a Add Table go into IDLE in build mode 2026-08-04 12:37:33 +02:00
JonShard 58f7da7481 Add Shop UI 2026-08-03 13:19:30 +02:00
JonShard c3671c4489 Add StationMovement to counter, sink, table 2026-08-02 14:04:50 +02:00
JonShard b24a3f99ee Add BuildModeController that deletes loose items on enter BuildMode 2026-08-02 13:43:30 +02:00
JonShard 71c338da3c Move StationMovement into a subscene 2026-08-02 13:42:00 +02:00
JonShard ad9753c65d Fix a movement handle could get picked up by a station 2026-08-02 13:41:30 +02:00
JonShard 1117d90da6 Station Move handles disabled when not in build mode 2026-08-02 12:41:49 +02:00
JonShard 10bb7cd5bf Add Station move handle has ghost 2026-08-02 12:21:14 +02:00
JonShard 2e670129a5 WIP ghost 2026-08-02 11:09:58 +02:00
JonShard b169b5d05e Add min speed to chopping 2026-08-02 10:51:06 +02:00
JonShard a5c7df29cc Add Chopping Gesture 2026-08-02 09:19:08 +02:00
JonShard 3f67b03a4e Add Chips chain of pickable items 2026-08-01 21:48:28 +02:00
JonShard 247a7e316d Change way of gettng Managers to use class name 2026-08-01 21:46:52 +02:00
JonShard ee169a62b6 Organize files into some new folders 2026-07-31 16:51:01 +02:00
JonShard 6f01e20700 Removed old files 2026-07-31 14:16:03 +02:00
JonShard 4242325c8a Add tables pick random meals and 2026-07-31 14:15:47 +02:00
JonShard 48c9845624 Add Table handles Sides 2026-07-31 14:03:53 +02:00
JonShard 3d616bf4a5 Fix table doesn't detect player that were present before order state 2026-07-31 10:07:29 +02:00
JonShard 89e72c161b Add static resturant 2026-07-30 20:41:19 +02:00
JonShard a606a2f93f Station movement handle snaps back in place 2026-07-30 17:37:08 +02:00
JonShard 0826f29265 Fix error 2026-07-30 16:40:46 +02:00
JonShard 8a93ae4816 Update hob 2026-07-30 16:39:56 +02:00
JonShard 257c838255 Station movement disabled collision 2026-07-30 16:29:28 +02:00
JonShard 58e7792b62 Add spawning kitchen on hosting game 2026-07-30 16:03:34 +02:00
JonShard 8733d59084 Add Hob move handle 2026-07-30 12:49:43 +02:00
JonShard e4403e4a50 Change pickables swap hands on second grab 2026-07-30 11:33:06 +02:00
JonShard 19207e7f72 Add Table handles meals served before order taken 2026-07-30 11:29:28 +02:00
JonShard e9a7786cab Add Table lock-in delivered meal 2026-07-30 11:18:07 +02:00
JonShard 9cdf0fc787 Add Exponential table progress bar 2026-07-30 11:09:43 +02:00
JonShard d71f3824cf Add Table, taking orders require player present 2026-07-30 10:22:37 +02:00
JonShard dfc081de3b Import project 2026-07-30 09:37:16 +02:00
214 changed files with 10451 additions and 4007 deletions
+25 -21
View File
@@ -29,31 +29,31 @@ func _ready() -> void:
func _on_body_entered(body: Node3D) -> void: func _on_body_entered(body: Node3D) -> void:
if not NetworkManager.owns_world(): if not NetworkManager.owns_world():
return return
print("Container enabled: ", enabled) SweetLogger.debug("enabled: {0}", [enabled])
if not enabled: if not enabled:
print("Container disabled in _on_body_entered body") SweetLogger.debug("disabled in _on_body_entered body")
return return
if not body.is_in_group(target_group): if not body.is_in_group(target_group):
return return
print("Container _on_body_entered body: ", body) SweetLogger.debug("body: {0}", [body])
# If one of us is in a station # If one of us is in a station
var picked_by = xr_pickable.get_picked_up_by() var picked_by = xr_pickable.get_picked_up_by()
var body_pickable = body as XRToolsPickable var body_pickable = body as XRToolsPickable
var body_picked_by = body_pickable.get_picked_up_by() if body_pickable else null var body_picked_by = body_pickable.get_picked_up_by() if body_pickable else null
if (picked_by and picked_by.is_in_group("station")) or (body_picked_by and body_picked_by.is_in_group("station")): if (picked_by and picked_by.is_in_group("station_zone")) or (body_picked_by and body_picked_by.is_in_group("station_zone")):
# If enough space, add item # If enough space, add item
var food_item = body.get_node("FoodItem") var food_item = body.get_node("FoodItem")
print("Container in station found %s of type %s: %s" % [target_group, FoodItem.Type.keys()[food_item.type], body.name]) SweetLogger.debug("in station found {0} of type {1}: {2}", [target_group, FoodItem.Type.keys()[food_item.type], body.name], "container.gd", "_on_body_entered")
var meal_count := contained_items.filter(func(f): return f.type == FoodItem.Type.MEAL).size() var meal_count := contained_items.filter(func(f): return f.type == FoodItem.Type.MEAL).size()
var side_count := contained_items.filter(func(f): return f.type == FoodItem.Type.SIDE).size() var side_count := contained_items.filter(func(f): return f.type == FoodItem.Type.SIDE).size()
if food_item.type == FoodItem.Type.MEAL and meal_count < meal_positions.size(): if food_item.type == FoodItem.Type.MEAL and meal_count < meal_positions.size():
print("Container adding meal") SweetLogger.debug("adding meal")
_add_item(body) _add_item(body)
if food_item.type == FoodItem.Type.SIDE and side_count < side_positions.size(): if food_item.type == FoodItem.Type.SIDE and side_count < side_positions.size():
print("Container adding side") SweetLogger.debug("adding side")
_add_item(body) _add_item(body)
@@ -91,6 +91,10 @@ func _add_item(item: Node3D) -> void:
plate_controller.contained_ids = updated plate_controller.contained_ids = updated
NetworkManager.despawn_item(item) NetworkManager.despawn_item(item)
# In case the container is on a table that needs to register this addition,
# ask all table in scene to absorb any new items.
SweetLogger.debug("group call absorb_items()")
get_tree().call_group("table", "absorb_items")
func erase_item(item: FoodItem) -> void: func erase_item(item: FoodItem) -> void:
@@ -154,22 +158,19 @@ func refresh_visuals(ids: Array[String]) -> void:
visual.rotation = positions[idx].rotation visual.rotation = positions[idx].rotation
# Strip interactivity from a display-only copy. It is instantiated straight from # Strip interactivity/networking from a display-only copy: it's not spawned
# its scene rather than spawned through NetWorld, so it is not part of the # through NetworkManager, so it must never try to sync (its NetPickable child,
# replicated world at all — it exists only to be looked at, and must not be # if any, would have no corresponding replicated identity on other peers) or
# grabbable or collidable. # be grabbable/collidable.
#
# It gets no synchronizers either: NetReplication.attach only ever runs for
# direct children of the content root, and this is parented under a plate.
func _make_cosmetic(visual: Node3D) -> void: func _make_cosmetic(visual: Node3D) -> void:
var despawn_timer := visual.get_node_or_null("DespawningItem") var net_pickable := visual.get_node_or_null("NetPickable")
if despawn_timer: if net_pickable:
# Detached and freed outright rather than queue_free()d: this runs before # Detach and free it outright rather than queue_free(): this runs before
# `visual` is added to the tree, and a merely-queued node still enters the # `visual` is added to the tree, and a merely-queued node still enters the
# tree with its parent and runs a frame of _process before the queued # tree with its parent and runs _ready() (which starts syncing and logging)
# deletion lands at the end of the frame. # before the queued deletion lands at the end of the frame.
visual.remove_child(despawn_timer) visual.remove_child(net_pickable)
despawn_timer.free() net_pickable.free()
if visual is RigidBody3D: if visual is RigidBody3D:
visual.freeze = true visual.freeze = true
# STATIC, not KINEMATIC: a kinematic body is still driven by the physics # STATIC, not KINEMATIC: a kinematic body is still driven by the physics
@@ -196,6 +197,9 @@ func _make_cosmetic(visual: Node3D) -> void:
func _remove_from_physics(visual: Node3D) -> void: func _remove_from_physics(visual: Node3D) -> void:
if visual is RigidBody3D: if visual is RigidBody3D:
PhysicsServer3D.body_set_space((visual as RigidBody3D).get_rid(), RID()) PhysicsServer3D.body_set_space((visual as RigidBody3D).get_rid(), RID())
var despawning_item = visual.get_node_or_null("DespawningItem")
if despawning_item:
NetworkManager.despawn_item(despawning_item)
#plate (Pickalbe) #plate (Pickalbe)
+22
View File
@@ -8,6 +8,7 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_dhtvl"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_dhtvl"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_vlcpl"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_vlcpl"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_el51w"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_el51w"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_kek77"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_kek77"]
height = 0.0635376 height = 0.0635376
@@ -26,11 +27,29 @@ metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(0.36656043, 0.16690676, 0.12531222, 1) albedo_color = Color(0.36656043, 0.16690676, 0.12531222, 1)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_plate"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
properties/3/path = NodePath("PlateController:contained_ids")
properties/3/spawn = true
properties/3/replication_mode = 1
properties/4/path = NodePath("PlateController:is_dirty")
properties/4/spawn = true
properties/4/replication_mode = 1
[node name="Plate" type="RigidBody3D" unique_id=190487773] [node name="Plate" type="RigidBody3D" unique_id=190487773]
collision_layer = 4 collision_layer = 4
collision_mask = 196615 collision_mask = 196615
freeze_mode = 1 freeze_mode = 1
script = ExtResource("1_nq5sa") script = ExtResource("1_nq5sa")
second_hand_grab = 1
[node name="PlateController" type="Node" parent="." unique_id=1503264193] [node name="PlateController" type="Node" parent="." unique_id=1503264193]
script = ExtResource("1_vjsmi") script = ExtResource("1_vjsmi")
@@ -135,3 +154,6 @@ polygon = PackedVector2Array(-0.053057775, 0.2586278, 0.09469998, 0.40791017, 0.
depth = 0.02 depth = 0.02
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." unique_id=1770751620]
replication_config = SubResource("SceneReplicationConfig_np_plate")
script = ExtResource("20_netpk")
+7 -5
View File
@@ -13,6 +13,8 @@ extends Node
## the cosmetic result via the setter below. ## the cosmetic result via the setter below.
@export var contained_ids: Array[String] = []: set = _set_contained_ids @export var contained_ids: Array[String] = []: set = _set_contained_ids
func get_food_items() -> Array[FoodItem]:
return container.contained_items
func _ready() -> void: func _ready() -> void:
if not dirty_node: if not dirty_node:
@@ -30,11 +32,11 @@ func _process(_delta: float) -> void:
func _set_contained_ids(value: Array[String]) -> void: func _set_contained_ids(value: Array[String]) -> void:
# Only rebuild when the contents actually changed. refresh_visuals() frees and # Only rebuild when the contents actually changed. This property is
# re-instantiates a scene per item, so a redundant call is thousands of # replicated in ALWAYS mode, so the synchronizer assigns it every network
# throwaway nodes over a session. NetReplication uses ON_CHANGE for state, so # tick on every peer that doesn't own the plate — and refresh_visuals()
# the synchronizer should not be assigning this unless it really changed — but # frees and re-instantiates a scene per item each time. That was thousands
# a local write can still repeat a value, and this stays cheap either way. # of throwaway nodes per run (and a log line from each one's NetPickable).
if contained_ids == value: if contained_ids == value:
return return
contained_ids = value contained_ids = value
-45
View File
@@ -1,45 +0,0 @@
class_name GameManager
extends Node
static var money: int
static var meals_in_play: Array[String]
static var sides_in_play: Array[String]
enum GameState {
RUNNING,
GAME_OVER
}
static var game_state: GameState = GameState.RUNNING
static func _restart():
print("restart Game")
game_state = GameState.RUNNING
static func get_random_meal() -> String:
if meals_in_play.size() == 0:
push_error("GameManager: get_random_meal() called but meals_in_play is empty")
return ""
var rand_index = randi() % meals_in_play.size()
print("GameManager: get_random_meal() returning ", meals_in_play[rand_index])
return meals_in_play[rand_index]
static func get_random_side() -> String:
if sides_in_play.size() == 0:
push_error("GameManager: get_random_side() called but sides_in_play is empty")
return ""
var rand_index = randi() % sides_in_play.size()
print("GameManager: get_random_side() returning ", sides_in_play[rand_index])
return sides_in_play[rand_index]
static func game_over():
print("Game Over")
game_state = GameState.GAME_OVER
Signals.game_over.emit()
+20 -3
View File
@@ -6,9 +6,10 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_wb51u"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_wb51u"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="5_wqyr2"] [ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="5_wqyr2"]
[ext_resource type="Animation" uid="uid://bediglpx0rj7i" path="res://addons/godot-xr-tools/hands/animations/left/Grip 5.res" id="6_ftab3"] [ext_resource type="Animation" uid="uid://bediglpx0rj7i" path="res://addons/godot-xr-tools/hands/animations/left/Grip 5.res" id="6_ftab3"]
[ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://Prefabs/combinable_item.tscn" id="7_wb51u"] [ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://prefabs/combinable_item.tscn" id="7_wb51u"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="8_t9y3x"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="8_t9y3x"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="10_46e7r"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_46e7r"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_vlqg6"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_vlqg6"]
height = 0.10708985 height = 0.10708985
@@ -27,7 +28,19 @@ metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hoqox"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hoqox"]
albedo_color = Color(0.6784191, 0.54546416, 0.016760282, 1) albedo_color = Color(0.6784191, 0.54546416, 0.016760282, 1)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_buns"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="BurgerBuns" unique_id=1088240294 instance=ExtResource("1_g1t48")] [node name="BurgerBuns" unique_id=1088240294 instance=ExtResource("1_g1t48")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05776599, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05776599, 0)
@@ -74,4 +87,8 @@ type = 2
[node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("7_wb51u")] [node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("7_wb51u")]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="6" unique_id=2086885420]
replication_config = SubResource("SceneReplicationConfig_np_buns")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_46e7r")] [node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_46e7r")]
+20 -3
View File
@@ -6,9 +6,10 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_mgacb"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_mgacb"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_vw7i6"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_vw7i6"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_cp3eg"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_cp3eg"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="7_mde49"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="7_mde49"]
[ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://Prefabs/combinable_item.tscn" id="8_wmrff"] [ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://prefabs/combinable_item.tscn" id="8_wmrff"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="10_6ypk4"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_6ypk4"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_gkni8"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_gkni8"]
height = 0.1 height = 0.1
@@ -33,7 +34,19 @@ script = ExtResource("4_mgacb")
closed_pose = ExtResource("6_cp3eg") closed_pose = ExtResource("6_cp3eg")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8" metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_charcoal"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="PickableObject" unique_id=1675596942 instance=ExtResource("1_r73y2")] [node name="PickableObject" unique_id=1675596942 instance=ExtResource("1_r73y2")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
shape = SubResource("CylinderShape3D_gkni8") shape = SubResource("CylinderShape3D_gkni8")
@@ -55,4 +68,8 @@ type = 2
[node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("8_wmrff")] [node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("8_wmrff")]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="6" unique_id=1070495412]
replication_config = SubResource("SceneReplicationConfig_np_charcoal")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_6ypk4")] [node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_6ypk4")]
+20 -3
View File
@@ -6,9 +6,10 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_hc3f7"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_hc3f7"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_a0a5b"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_a0a5b"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_bdp75"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_bdp75"]
[ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://Prefabs/combinable_item.tscn" id="7_bdp75"] [ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://prefabs/combinable_item.tscn" id="7_bdp75"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="10_uygc5"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_uygc5"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="11_vjw41"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="11_vjw41"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="BoxShape3D" id="BoxShape3D_m1xbq"] [sub_resource type="BoxShape3D" id="BoxShape3D_m1xbq"]
size = Vector3(0.1, 0.1, 0.1) size = Vector3(0.1, 0.1, 0.1)
@@ -30,7 +31,19 @@ script = ExtResource("4_hc3f7")
closed_pose = ExtResource("6_bdp75") closed_pose = ExtResource("6_bdp75")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8" metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_cube"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="PickableObject" unique_id=1675596942 groups=["platalbe_item"] instance=ExtResource("1_dbtw8")] [node name="PickableObject" unique_id=1675596942 groups=["platalbe_item"] instance=ExtResource("1_dbtw8")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
shape = SubResource("BoxShape3D_m1xbq") shape = SubResource("BoxShape3D_m1xbq")
@@ -52,4 +65,8 @@ type = 1
[node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("7_bdp75")] [node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("7_bdp75")]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="6" unique_id=1858332513]
replication_config = SubResource("SceneReplicationConfig_np_cube")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_uygc5")] [node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_uygc5")]
+20 -3
View File
@@ -1,14 +1,15 @@
[gd_scene format=3 uid="uid://dpot5qie20vf6"] [gd_scene format=3 uid="uid://dpot5qie20vf6"]
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_fco8w"] [ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_fco8w"]
[ext_resource type="Texture2D" uid="uid://cexxfyw03hr81" path="res://Textures/1.png" id="2_r8jvx"] [ext_resource type="Texture2D" uid="uid://cexxfyw03hr81" path="res://textures/1.png" id="2_r8jvx"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="3_qixic"] [ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="3_qixic"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="4_bw8vh"] [ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="4_bw8vh"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_w8sii"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_w8sii"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_mvnl5"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_mvnl5"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_wqxjj"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_wqxjj"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="10_l4hsd"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_l4hsd"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="10_yxtxs"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="10_yxtxs"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"]
height = 0.0338974 height = 0.0338974
@@ -27,7 +28,19 @@ script = ExtResource("5_w8sii")
closed_pose = ExtResource("7_wqxjj") closed_pose = ExtResource("7_wqxjj")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8" metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_burger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="raw_burger" unique_id=1675596942 instance=ExtResource("1_fco8w")] [node name="raw_burger" unique_id=1675596942 instance=ExtResource("1_fco8w")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00077831745, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.00077831745, 0)
@@ -51,4 +64,8 @@ hand_pose = SubResource("Resource_qyiot")
id = "raw_burger" id = "raw_burger"
type = 2 type = 2
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="5" unique_id=1382968688]
replication_config = SubResource("SceneReplicationConfig_np_burger")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="6" unique_id=303090111 instance=ExtResource("10_l4hsd")] [node name="DespawningItem" parent="." index="6" unique_id=303090111 instance=ExtResource("10_l4hsd")]
+254
View File
@@ -0,0 +1,254 @@
[gd_scene format=3 uid="uid://duwrbvwcqcuk3"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="1_g660j"]
[ext_resource type="Script" uid="uid://bfrlpbsqg5lqr" path="res://addons/godot-xr-tools/objects/pickable.gd" id="1_skw8o"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="2_skw8o"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="3_j0320"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="4_krlan"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="5_ygjl7"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="6_66ydo"]
[ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://prefabs/combinable_item.tscn" id="7_qlknf"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="8_do54s"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="9_obvwg"]
[sub_resource type="BoxShape3D" id="BoxShape3D_m1xbq"]
size = Vector3(0.1, 0.1, 0.1)
[sub_resource type="Resource" id="Resource_lc22d"]
script = ExtResource("3_j0320")
closed_pose = ExtResource("2_skw8o")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="Resource" id="Resource_qyiot"]
script = ExtResource("3_j0320")
closed_pose = ExtResource("5_ygjl7")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(1, 0.26, 0.26, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.66, 0.58300006, 0.19800001, 1)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_cube"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="Chips" type="RigidBody3D" unique_id=1028364693 groups=["platalbe_item"]]
collision_layer = 4
collision_mask = 196615
freeze_mode = 1
script = ExtResource("1_skw8o")
second_hand_grab = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1621665718]
shape = SubResource("BoxShape3D_m1xbq")
[node name="GrabPointHandLeft" parent="." unique_id=389569681 instance=ExtResource("1_g660j")]
transform = Transform3D(0.99971306, 0.023955148, 0, -0.023955148, 0.99971306, 0, 0, 0, 1, -0.042430807, 0.04601878, -0.066400535)
hand_pose = SubResource("Resource_lc22d")
[node name="GrabPointHandRight" parent="." unique_id=332233083 instance=ExtResource("4_krlan")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.039321173, 0.042291984, -0.06561862)
hand_pose = SubResource("Resource_qyiot")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=965503334]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=816650852]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 0.7, 0, -0.008749997, 0)
radius = 0.055
height = 0.10250001
sides = 32
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" unique_id=387203621]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00010003522, 0.004754007, -0.0005688625)
operation = 2
radius = 0.05
height = 0.0934961
sides = 32
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D" unique_id=93328108]
transform = Transform3D(0.7620723, -0.15403531, 0.62890285, 0.14065021, 0.98747945, 0.07142768, -0.632031, 0.034022264, 0.77419585, 0, 0.023602298, 0)
size = Vector3(0.01, 0.1472046, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=916963062]
transform = Transform3D(0.8856182, 0, -0.46441403, 0, 1, 0, 0.46441403, 0, 0.8856182, -0.025303185, 0.017004399, -0.011429907)
size = Vector3(0.01, 0.1340088, 0.012324219)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D" unique_id=2028227382]
transform = Transform3D(0.9982952, 0.058366816, 0, -0.058366816, 0.9982952, 0, 0, 0, 1, 0.01182463, 0.014508067, -0.020026028)
size = Vector3(0.005488281, 0.12901612, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D4" type="CSGBox3D" parent="CSGCombiner3D" unique_id=281966004]
transform = Transform3D(0.7529522, 0.17319141, -0.63487613, -0.17018878, 0.98317415, 0.06636462, 0.6356876, 0.058079403, 0.7697584, 0.030878175, 0.017004376, 0.0073254704)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1396476812]
transform = Transform3D(0.9059609, 0.09732082, -0.4120236, 0.057229556, 0.93613446, 0.3469537, 0.41947538, -0.33790648, 0.8425318, 0.022142533, 0.013039222, 0.0003975192)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D6" type="CSGBox3D" parent="CSGCombiner3D" unique_id=799991689]
transform = Transform3D(0.84679973, -0.153204, -0.5093709, 0.13128299, 0.9881946, -0.07896996, 0.5154561, 0, 0.856916, -0.035753187, 0.02232056, 0.006355174)
size = Vector3(0.010739746, 0.14464112, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D7" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1801209773]
transform = Transform3D(0.97630554, 0.034820024, 0.21357699, 0, 0.98696935, -0.16090819, -0.21639681, 0.15709558, 0.96358365, 0.013860466, 0.019146731, 0.016792327)
size = Vector3(0.01, 0.13829346, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D8" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1457970557]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.014735691, 0.014813228, 0.009678945)
size = Vector3(0.01, 0.12962647, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D9" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1215031746]
transform = Transform3D(0.98743933, -0.15799865, 0, 0.15799865, 0.98743933, 0, 0, 0, 1, -0.00090237334, 0.017004391, -0.023620732)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D10" type="CSGBox3D" parent="CSGCombiner3D" unique_id=532075410]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.021327257, 0.013287356, 0.022823062)
size = Vector3(0.010739746, 0.12657471, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D11" type="CSGBox3D" parent="CSGCombiner3D" unique_id=2073146495]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.03040018, 0.009017946, 0.020780522)
size = Vector3(0.01, 0.11803589, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D12" type="CSGBox3D" parent="CSGCombiner3D" unique_id=75858017]
transform = Transform3D(0.97359693, 0, 0.22827391, 0.051342297, 0.9743782, -0.21897686, -0.22242515, 0.22491528, 0.9486517, -0.0036671162, 0.017004391, 0.02201752)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D13" type="CSGBox3D" parent="CSGCombiner3D" unique_id=632405164]
transform = Transform3D(0.77419585, 0, 0.6329461, 0, 0.52134585, 0, -0.6329461, 0, 0.77419585, 0, -0.007927237, 0)
size = Vector3(0.01, 0.1472046, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D14" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1656744815]
transform = Transform3D(-0.8283986, -0.2356963, 0.46195662, -0.27667236, 0.7057101, 0.1542864, -0.48704025, 0, -0.8733795, 0.021192847, -0.004947574, 0.01600693)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D15" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1543269420]
transform = Transform3D(-0.91507524, 0.2995426, 0.023545321, 0.40246198, 0.68106806, -0.010355539, -0.025721962, -5.579416e-10, -0.99966913, -0.01809039, 0.0024462799, 0.0042534657)
size = Vector3(0.005488281, 0.15618286, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D16" type="CSGBox3D" parent="CSGCombiner3D" unique_id=254315930]
transform = Transform3D(-0.92201805, 0, 0.38714674, 0, 0.7440292, 0, -0.38714674, 0, -0.92201805, -0.03251951, -0.0049475897, 0.0013081154)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D17" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1486469355]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0, 0.7440292, 0, -0.025721963, 0, -0.99966913, -0.023322525, -0.0049475795, -0.00594615)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D18" type="CSGBox3D" parent="CSGCombiner3D" unique_id=630552823]
transform = Transform3D(-0.83532625, 0.10253985, 0.5321998, 0.116231225, 0.7369294, -0.07405278, -0.5373271, 0, -0.84337395, 0.032662854, -0.0009921952, -0.0025184364)
size = Vector3(0.010739746, 0.14464112, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D19" type="CSGBox3D" parent="CSGCombiner3D" unique_id=239318459]
transform = Transform3D(-0.9815485, 0, -0.19121267, 0, 0.74402916, 0, 0.19121267, 0, -0.9815485, -0.016665924, -0.0033536162, -0.014228297)
size = Vector3(0.01, 0.13829346, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D20" type="CSGBox3D" parent="CSGCombiner3D" unique_id=928371372]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0, 0.7440292, 0, -0.025721963, 0, -0.99966913, 0.011737803, -0.00657787, -0.006381719)
size = Vector3(0.01, 0.12962647, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D21" type="CSGBox3D" parent="CSGCombiner3D" unique_id=226684342]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0, 0.7440292, 0, -0.025721963, 0, -0.99966913, 0.0084346505, -0.0049475795, 0.026858818)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D22" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1692336606]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0, 0.7440292, 0, -0.025721963, 0, -0.99966913, 0.01866528, -0.0077131614, -0.019351937)
size = Vector3(0.010739746, 0.12657471, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D23" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1460106852]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0, 0.7440292, 0, -0.025721963, 0, -0.99966913, -0.03309758, -0.010889728, -0.018640606)
size = Vector3(0.01, 0.11803589, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D24" type="CSGBox3D" parent="CSGCombiner3D" unique_id=814233916]
transform = Transform3D(-0.9791465, 0, -0.20315555, 0, 0.74402934, 0, 0.20315555, 0, -0.9791465, 0.0009902613, -0.0049475795, -0.019000916)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D25" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1206566850]
transform = Transform3D(0.9997566, 0, -0.022063702, 0, 0.7440293, 0, 0.022063702, 0, 0.9997566, 0.034941338, -0.0049475897, -0.015364999)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D26" type="CSGBox3D" parent="CSGCombiner3D" unique_id=782469494]
transform = Transform3D(0.9394602, 0, 0.34265807, 0, 0.7440292, 0, -0.34265807, 0, 0.9394602, 0.029045265, -0.0049475795, -0.0052434783)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D27" type="CSGBox3D" parent="CSGCombiner3D" unique_id=615899037]
transform = Transform3D(0.9816637, 0, -0.19062132, 0, 0.74402916, 0, 0.19062132, 0, 0.9816637, -0.024296898, -0.0009921952, 0.012097965)
size = Vector3(0.010739746, 0.14464112, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D28" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1440223352]
transform = Transform3D(0.84304994, 0, 0.537835, 0, 0.74402916, 0, -0.537835, 0, 0.84304994, 0.025889535, -0.0033536162, 0.0049027367)
size = Vector3(0.01, 0.13829346, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D29" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1162134484]
transform = Transform3D(0.9394602, 0, 0.34265807, 0, 0.7440292, 0, -0.34265807, 0, 0.9394602, -0.0034128763, -0.00657787, 0.0080187)
size = Vector3(0.01, 0.12962647, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D30" type="CSGBox3D" parent="CSGCombiner3D" unique_id=939036040]
transform = Transform3D(0.9394602, 0, 0.34265807, 0, 0.7440292, 0, -0.34265807, 0, 0.9394602, -0.0018274263, -0.0049475795, -0.028005121)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D31" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1952616270]
transform = Transform3D(0.9394602, 0, 0.34265807, 0, 0.7440292, 0, -0.34265807, 0, 0.9394602, -0.0051014535, -0.0077131614, 0.022625728)
size = Vector3(0.010739746, 0.12657471, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D32" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1868626634]
transform = Transform3D(0.9394602, 0, 0.34265807, 0, 0.7440292, 0, -0.34265807, 0, 0.9394602, 0.042794522, -0.010889728, 0.0029820204)
size = Vector3(0.01, 0.11803589, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D33" type="CSGBox3D" parent="CSGCombiner3D" unique_id=529418367]
transform = Transform3D(0.8364357, 0, 0.54806507, 0, 0.74402934, 0, -0.54806507, 0, 0.8364357, 0.011213522, -0.0049475795, 0.015817564)
size = Vector3(0.01, 0.1340088, 0.01)
material = SubResource("StandardMaterial3D_24d3s")
[node name="FoodItem" parent="." unique_id=63948206 instance=ExtResource("6_66ydo")]
id = "chips"
type = 1
sell_value = 2
[node name="CombinableItem" parent="." unique_id=996936271 instance=ExtResource("7_qlknf")]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." unique_id=1263255707]
replication_config = SubResource("SceneReplicationConfig_np_cube")
script = ExtResource("8_do54s")
[node name="DespawningItem" parent="." unique_id=303090111 instance=ExtResource("9_obvwg")]
+136
View File
@@ -0,0 +1,136 @@
[gd_scene format=3 uid="uid://bpvp20hiagxxb"]
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_of0s8"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="2_cllfo"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="3_qjifl"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_1hoyy"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_83pbl"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_bwaw5"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="7_7a0yr"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="8_wbxrg"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="9_jlkrg"]
[sub_resource type="BoxShape3D" id="BoxShape3D_of0s8"]
size = Vector3(0.10456543, 0.1, 0.035327148)
[sub_resource type="Resource" id="Resource_lc22d"]
script = ExtResource("4_1hoyy")
closed_pose = ExtResource("3_qjifl")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="Resource" id="Resource_qyiot"]
script = ExtResource("4_1hoyy")
closed_pose = ExtResource("6_bwaw5")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_burger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_of0s8"]
albedo_color = Color(0.7546, 0.77, 0.30799997, 1)
[node name="ChoppedPotato" unique_id=1675596942 instance=ExtResource("1_of0s8")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0.0022827126, 0.010339355, -0.0028051804)
shape = SubResource("BoxShape3D_of0s8")
[node name="GrabPointHandLeft" parent="." index="1" unique_id=1571481674 instance=ExtResource("2_cllfo")]
transform = Transform3D(0.4877618, 0.85191125, -0.19062005, -0.8708042, 0.49020204, -0.0374375, 0.06154889, 0.1842533, 0.98094976, 0.028727118, 0.03771837, -0.06794037)
hand_pose = SubResource("Resource_lc22d")
[node name="GrabPointHandRight" parent="." index="2" unique_id=514404634 instance=ExtResource("5_83pbl")]
transform = Transform3D(0.35819444, -0.933647, 0, 0.92118585, 0.35341373, -0.16283518, 0.1520306, 0.05832667, 0.98665327, -0.02374028, 0.05081141, -0.06576714)
hand_pose = SubResource("Resource_qyiot")
[node name="FoodItem" parent="." index="3" unique_id=63948206 instance=ExtResource("7_7a0yr")]
id = "chopped_potato"
type = 2
sell_value = 0
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="4" unique_id=1382968688]
replication_config = SubResource("SceneReplicationConfig_np_burger")
script = ExtResource("8_wbxrg")
[node name="DespawningItem" parent="." index="5" unique_id=303090111 instance=ExtResource("9_jlkrg")]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." index="6" unique_id=1632388374]
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D" index="0" unique_id=333574743]
transform = Transform3D(0.9982952, 0.058366816, 0, 2.5512945e-09, -4.363687e-08, -1, -0.058366816, 0.9982952, -4.371139e-08, 0.017540446, 0.012680878, -0.007841777)
size = Vector3(0.012, 0.0737854, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D10" type="CSGBox3D" parent="CSGCombiner3D" index="1" unique_id=1055117011]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, -0.043418147, 0.013074134, 0.00018549338)
size = Vector3(0.012, 0.048638918, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D11" type="CSGBox3D" parent="CSGCombiner3D" index="2" unique_id=12997588]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0.0347388, 0, -0.0042848364)
size = Vector3(0.012, 0.11803589, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D16" type="CSGBox3D" parent="CSGCombiner3D" index="3" unique_id=520084094]
transform = Transform3D(-0.9220182, 0, 0.38714683, 0.38714683, -3.2522554e-08, 0.9220182, 1.6922723e-08, 0.7440293, 4.030269e-08, -0.03251951, 0, -0.0066871783)
size = Vector3(0.012, 0.1340088, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D18" type="CSGBox3D" parent="CSGCombiner3D" index="4" unique_id=1713154750]
transform = Transform3D(-0.83532625, 0.10253985, 0.5321998, 0.5373272, -3.183022e-08, 0.8433741, 0.11623128, 0.7369294, -0.07405276, 0.012299374, 0, -0.0027317838)
size = Vector3(0.012, 0.14464112, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D19" type="CSGBox3D" parent="CSGCombiner3D" index="5" unique_id=1856457460]
transform = Transform3D(-0.9815485, 0, -0.19121267, -0.19121267, -3.2522546e-08, 0.9815485, -8.358171e-09, 0.74402916, 4.2904848e-08, 0.0047408585, 0.015360672, -0.0050932043)
size = Vector3(0.012, 0.13829346, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D21" type="CSGBox3D" parent="CSGCombiner3D" index="6" unique_id=1085994272]
transform = Transform3D(-0.99966913, 0, 0.025721963, 0.025721963, -3.252255e-08, 0.99966913, 1.1243427e-09, 0.7440292, 4.3696925e-08, 0.0084346505, -1.2525464e-10, -0.0038216766)
size = Vector3(0.012, 0.14171143, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D24" type="CSGBox3D" parent="CSGCombiner3D" index="7" unique_id=799603447]
transform = Transform3D(-0.95734614, -0.16150172, -0.19071358, -0.19483496, -0.0018292161, 0.980833, -0.21337205, 0.7262875, -0.039937917, -0.015636567, 0.016941056, -0.0038651554)
size = Vector3(0.012, 0.1340088, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D26" type="CSGBox3D" parent="CSGCombiner3D" index="8" unique_id=129671681]
transform = Transform3D(0.9394602, 0, 0.34265804, 0.34265804, -3.252255e-08, -0.9394602, 1.497806e-08, 0.7440292, -4.106511e-08, 0.033136886, 0.017579898, -0.0066871676)
size = Vector3(0.012, 0.1340088, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D27" type="CSGBox3D" parent="CSGCombiner3D" index="9" unique_id=17129382]
transform = Transform3D(0.9816637, 0, -0.19062133, -0.19062132, -3.2522546e-08, -0.98166364, -8.332322e-09, 0.74402916, -4.2909882e-08, -0.019075055, -4.3606386e-05, -0.0027317842)
size = Vector3(0.012, 0.14464112, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D28" type="CSGBox3D" parent="CSGCombiner3D" index="10" unique_id=1557637409]
transform = Transform3D(0.84304994, 0, 0.537835, 0.537835, -3.2522546e-08, -0.84304994, 2.3509514e-08, 0.74402916, -3.6850885e-08, 0.047794472, 0.016187795, -0.0034102863)
size = Vector3(0.012, 0.11199341, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D30" type="CSGBox3D" parent="CSGCombiner3D" index="11" unique_id=1187654453]
transform = Transform3D(0.9394602, 0, 0.34265804, 0.34265804, -3.252255e-08, -0.9394602, 1.497806e-08, 0.7440292, -4.106511e-08, -0.005314119, 0, 0.009267362)
size = Vector3(0.012, 0.1340088, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D32" type="CSGBox3D" parent="CSGCombiner3D" index="12" unique_id=733217969]
transform = Transform3D(0.9394602, 0, 0.34265804, 0.34265804, -3.252255e-08, -0.9394602, 1.497806e-08, 0.7440292, -4.106511e-08, 0.050648127, 9.4238846e-11, -0.0005330723)
size = Vector3(0.012, 0.1122406, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
[node name="CSGBox3D29" type="CSGBox3D" parent="CSGCombiner3D" index="13" unique_id=1376406225]
transform = Transform3D(0.9816637, 0, -0.19062133, -0.19062132, -3.2522546e-08, -0.98166364, -8.332322e-09, 0.74402916, -4.2909882e-08, -0.04667829, -4.360572e-05, -0.0065923333)
size = Vector3(0.012, 0.10369263, 0.012)
material = SubResource("StandardMaterial3D_of0s8")
+20 -3
View File
@@ -6,9 +6,10 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_ychvb"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_ychvb"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_etdv2"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_etdv2"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_rl64h"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_rl64h"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="10_6p8pj"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_6p8pj"]
[ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://Prefabs/combinable_item.tscn" id="10_ut7mg"] [ext_resource type="PackedScene" uid="uid://3lr2dhy62rhk" path="res://prefabs/combinable_item.tscn" id="10_ut7mg"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="10_zz42p"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="10_zz42p"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"]
height = 0.04777527 height = 0.04777527
@@ -27,7 +28,19 @@ script = ExtResource("5_ychvb")
closed_pose = ExtResource("7_rl64h") closed_pose = ExtResource("7_rl64h")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8" metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_cookedburger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="CookedBurger" unique_id=1675596942 instance=ExtResource("1_ut7mg")] [node name="CookedBurger" unique_id=1675596942 instance=ExtResource("1_ut7mg")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0072289705, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0072289705, 0)
@@ -53,4 +66,8 @@ type = 2
[node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("10_ut7mg")] [node name="CombinableItem" parent="." index="5" unique_id=996936271 instance=ExtResource("10_ut7mg")]
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="6" unique_id=925955029]
replication_config = SubResource("SceneReplicationConfig_np_cookedburger")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_6p8pj")] [node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("10_6p8pj")]
+19 -2
View File
@@ -6,8 +6,9 @@
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_cljtj"] [ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_cljtj"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_dunns"] [ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_dunns"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_fh0f6"] [ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_fh0f6"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://Prefabs/food_item.tscn" id="7_yy3y8"] [ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="7_yy3y8"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://Prefabs/despawning_item.tscn" id="9_ej8jm"] [ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="9_ej8jm"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="20_netpk"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"]
height = 0.10392761 height = 0.10392761
@@ -29,8 +30,20 @@ albedo_color = Color(0.6784191, 0.54546416, 0.016760282, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6l01i"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_6l01i"]
albedo_color = Color(0.29, 0.101500005, 0, 1) albedo_color = Color(0.29, 0.101500005, 0, 1)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_hamburger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[node name="Hamburger" unique_id=1675596942 groups=["platalbe_item"] instance=ExtResource("1_3gf3l")] [node name="Hamburger" unique_id=1675596942 groups=["platalbe_item"] instance=ExtResource("1_3gf3l")]
gravity_scale = 0.04 gravity_scale = 0.04
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"] [node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.02, 0.02, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.02, 0.02, 0)
@@ -83,4 +96,8 @@ id = "hamburger"
type = 0 type = 0
sell_value = 4 sell_value = 4
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="6" unique_id=56164120]
replication_config = SubResource("SceneReplicationConfig_np_hamburger")
script = ExtResource("20_netpk")
[node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("9_ej8jm")] [node name="DespawningItem" parent="." index="7" unique_id=303090111 instance=ExtResource("9_ej8jm")]
+158
View File
@@ -0,0 +1,158 @@
[gd_scene format=3 uid="uid://dgk88esxip5xi"]
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_apu43"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="2_ti0k8"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="3_xyohi"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="4_4iajw"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="5_kni1i"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="6_b3is5"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="8_2ao4o"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"]
height = 0.29805934
radius = 0.025390625
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(0.01, 0.062841795, 0.18769531)
[sub_resource type="Resource" id="Resource_lc22d"]
script = ExtResource("4_4iajw")
closed_pose = ExtResource("3_xyohi")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="Resource" id="Resource_qyiot"]
script = ExtResource("4_4iajw")
closed_pose = ExtResource("6_b3is5")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_burger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[sub_resource type="Gradient" id="Gradient_s6exe"]
interpolation_mode = 2
offsets = PackedFloat32Array(0.0088495575, 0.76106197)
colors = PackedColorArray(0.6, 0.6, 0.6, 1, 1, 1, 1, 1)
[sub_resource type="FastNoiseLite" id="FastNoiseLite_22jur"]
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_3lf03"]
noise = SubResource("FastNoiseLite_22jur")
color_ramp = SubResource("Gradient_s6exe")
normalize = false
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.54, 0.39384004, 0.22680002, 1)
albedo_texture = SubResource("NoiseTexture2D_3lf03")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(0.6, 0.6, 0.6, 1)
metallic = 1.0
metallic_specular = 1.0
[node name="Knife" unique_id=1675596942 groups=["chopping_tool"] instance=ExtResource("1_apu43")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 2.8164342e-09, -0.0644325)
shape = SubResource("CylinderShape3D_fco8w")
[node name="Area3D" type="Area3D" parent="." index="1" unique_id=1995926098 groups=["chopping_tool"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.05011083)
collision_layer = 513
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D" index="0" unique_id=1593629505]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.018579103, -0.1395939)
shape = SubResource("BoxShape3D_vlqg6")
[node name="GrabPointHandLeft" parent="." index="2" unique_id=1571481674 instance=ExtResource("2_ti0k8")]
transform = Transform3D(1, 0, 0, 0, 0.80581045, 0.5921736, 0, -0.5921736, 0.80581045, -0.0055686757, -0.027660534, -0.06972287)
hand_pose = SubResource("Resource_lc22d")
[node name="GrabPointHandRight" parent="." index="3" unique_id=514404634 instance=ExtResource("5_kni1i")]
transform = Transform3D(1, 0, 0, 0, 0.7906625, 0.6122523, 0, -0.6122523, 0.7906625, -0.00973678, -0.036154382, -0.07772979)
hand_pose = SubResource("Resource_qyiot")
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="4" unique_id=1382968688]
replication_config = SubResource("SceneReplicationConfig_np_burger")
script = ExtResource("8_2ao4o")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." index="5" unique_id=1632388374]
transform = Transform3D(0.45, 0, 0, 0, 0.45, 0, 0, 0, 0.45, 0, 0, 0)
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" index="0" unique_id=73312047]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, 1.9443882e-09, 0.044482417)
radius = 0.05
height = 0.28896484
sides = 16
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D/CSGCylinder3D" index="0" unique_id=1092536616]
transform = Transform3D(1, 0, 0, 0, -4.3711392e-08, -1, 0, 1, -4.3711392e-08, -0.06291181, -0.003074348, 0.003173826)
operation = 2
size = Vector3(0.06698901, 0.08496094, 0.3070221)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D/CSGCylinder3D" index="1" unique_id=611507380]
transform = Transform3D(1, 0, 0, 0, -4.3711392e-08, -1, 0, 1, -4.3711392e-08, 0.057669085, -0.00014465302, 0.003173826)
operation = 2
size = Vector3(0.051974364, 0.08496094, 0.30897522)
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" index="2" unique_id=1981876218]
transform = Transform3D(-4.3711392e-08, 1, 0, 4.3711392e-08, 1.9106857e-15, -1, -1, -4.3711392e-08, -4.3711392e-08, 0.0014698628, 0.062123798, 0.00029686643)
radius = 0.016
height = 0.06318359
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" index="3" unique_id=1905314362]
transform = Transform3D(-4.3711392e-08, 1, 0, 4.3711392e-08, 1.9106857e-15, -1, -1, -4.3711392e-08, -4.3711392e-08, 0.0014698628, -0.049634382, 0.00029686154)
radius = 0.016
height = 0.06318359
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" index="4" unique_id=905243368]
transform = Transform3D(-6.070399e-08, 1, 0, 1.3887457, 4.3711392e-08, 8.7422784e-08, 1.21408e-07, 3.8213714e-15, -1, 0.0017506231, -0.10254226, -0.07109782)
operation = 2
radius = 0.032226563
height = 0.07854004
sides = 32
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" index="5" unique_id=1873534320]
transform = Transform3D(-1.0240791e-07, 1, 0, 2.34282, 4.3711392e-08, 8.7422784e-08, 2.0481582e-07, 3.8213714e-15, -1, 0.0017506231, 0.089636564, -0.07143875)
operation = 2
radius = 0.032226563
height = 0.07854004
sides = 32
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCylinder3D" index="6" unique_id=471254428]
transform = Transform3D(-1.0240791e-07, 1, 0, 2.34282, 4.3711392e-08, 8.7422784e-08, 2.0481582e-07, 3.8213714e-15, -1, 0.0017506231, -0.079547666, -0.07143876)
operation = 2
radius = 0.032226563
height = 0.07854004
sides = 32
material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3DBlade" type="CSGBox3D" parent="CSGCombiner3D" index="1" unique_id=94519802]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.005445559, -0.18191797)
size = Vector3(0.007, 0.08954346, 0.6364492)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGTorus3D" type="CSGTorus3D" parent="CSGCombiner3D/CSGBox3DBlade" index="0" unique_id=555698965]
transform = Transform3D(-4.3711392e-08, 1, 0, -1, -4.3711392e-08, 0, 0, 0, 0.90598416, 0, 0.25891897, -0.12508947)
operation = 2
outer_radius = 0.3
sides = 64
[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D/CSGBox3DBlade/CSGTorus3D" index="0" unique_id=720590378]
transform = Transform3D(-4.3710607e-08, -0.9973613, 0.0724587, 0.99998987, -4.3595673e-08, 3.1672265e-09, 0, 0.034851935, 0.47972566, 0.25730363, -0.003919763, 0.23939973)
operation = 2
size = Vector3(0.40247935, 0.2781372, 0.97288764)
+79
View File
@@ -0,0 +1,79 @@
[gd_scene format=3 uid="uid://drwuhqb3pjtiy"]
[ext_resource type="PackedScene" uid="uid://c8l60rnugru40" path="res://addons/godot-xr-tools/objects/pickable.tscn" id="1_wihyv"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="3_a8yvn"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="4_d124x"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_7epdb"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_14hae"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_hkms5"]
[ext_resource type="PackedScene" uid="uid://bfj80jh13t6e5" path="res://prefabs/food_item.tscn" id="8_35g7i"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="9_x0uku"]
[ext_resource type="PackedScene" uid="uid://b5ukku8i0hilb" path="res://prefabs/despawning_item.tscn" id="10_fj22u"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_fco8w"]
height = 0.16196387
radius = 0.07080078
[sub_resource type="Resource" id="Resource_lc22d"]
script = ExtResource("5_7epdb")
closed_pose = ExtResource("4_d124x")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="Resource" id="Resource_qyiot"]
script = ExtResource("5_7epdb")
closed_pose = ExtResource("7_hkms5")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_burger"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("NetPickable:net_held_by")
properties/2/spawn = true
properties/2/replication_mode = 1
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_d4wpw"]
albedo_color = Color(0.48, 0.34336, 0.1872, 1)
[node name="Potato" unique_id=1675596942 instance=ExtResource("1_wihyv")]
second_hand_grab = 1
[node name="CollisionShape3D" parent="." index="0"]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 1.2261836e-10, -0.0028051808)
shape = SubResource("CylinderShape3D_fco8w")
[node name="GrabPointHandLeft" parent="." index="1" unique_id=1571481674 instance=ExtResource("3_a8yvn")]
transform = Transform3D(1, 0, 0, 0, -0.5343598, -0.84525716, 0, 0.84525716, -0.5343598, -0.03287975, 0.03671424, 0.10207943)
hand_pose = SubResource("Resource_lc22d")
[node name="GrabPointHandRight" parent="." index="2" unique_id=514404634 instance=ExtResource("6_14hae")]
transform = Transform3D(1, 0, 0, 0, -0.7457213, -0.66625804, 0, 0.66625804, -0.7457213, 0.03408891, 0.014529038, 0.10517749)
hand_pose = SubResource("Resource_qyiot")
[node name="FoodItem" parent="." index="3" unique_id=63948206 instance=ExtResource("8_35g7i")]
id = "potato"
type = 2
sell_value = 0
[node name="NetPickable" type="MultiplayerSynchronizer" parent="." index="4" unique_id=1382968688]
replication_config = SubResource("SceneReplicationConfig_np_burger")
script = ExtResource("9_x0uku")
[node name="DespawningItem" parent="." index="5" unique_id=303090111 instance=ExtResource("10_fj22u")]
[node name="CSGCombiner3DPotato" type="CSGCombiner3D" parent="." index="6" unique_id=1632388374]
[node name="CSGSphere3D" type="CSGSphere3D" parent="CSGCombiner3DPotato" index="0" unique_id=125051486]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.03307341)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="CSGCombiner3DPotato" index="1" unique_id=837168454]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.03243477)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
+157
View File
@@ -0,0 +1,157 @@
extends Node3D
## World script for the multiplayer scene. Consumes the host/join request set
## by the main menu, spawns the world's stations/items on whichever machine
## owns the world (server, or the local player when offline), spawns/despawns
## a player avatar per connected peer, and returns to the menu if the session
## ends.
##
## The world's actual content (stations, items) is NOT baked into this scene —
## it's spawned at runtime from Net/world_layout.gd via NetworkManager, so a
## joining client receives it from the server (MultiplayerSpawner replays
## existing spawns to late joiners) instead of relying on its own local copy
## matching.
const PLAYER_SCENE := preload("res://Player/net_player.tscn")
## Whether to spawn the full WorldLayout on the machine that owns the world.
## The real game scene wants this; focused debug scenes (test/) bake their own
## handful of stations and items instead and turn it off, so the thing under
## test isn't sharing the world with a second copy of the whole kitchen.
@export var populate_from_layout: bool = true
var xr_interface: XRInterface
var _populated := false
@export var items_spawner: MultiplayerSpawner
@export var players_spawner: MultiplayerSpawner
func _ready() -> void:
xr_interface = XRServer.find_interface("OpenXR")
if xr_interface and xr_interface.is_initialized():
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
get_viewport().use_xr = true
NetworkManager.register_world(self, players_spawner, items_spawner)
NetworkManager.player_joined.connect(_on_player_joined)
NetworkManager.player_left.connect(_on_player_left)
NetworkManager.session_started.connect(_on_session_started)
NetworkManager.session_ended.connect(_on_session_ended)
NetworkManager.connection_failed.connect(_on_connection_failed)
# world_ready() is what actually calls host()/join() (or the cmdline
# equivalent). Populating before this point is wrong for EVERY case, not
# just offline: is_online() is still false until host()/join() runs, so
# owns_world() would read true for a joining client too, and it would
# build its own local copy instead of receiving the server's via the
# spawner. host() emits session_started synchronously, which populates
# via _on_session_started below; the explicit call after world_ready()
# only matters for the case where neither host() nor join() ran (no
# pending session, no cmdline args) — running this scene directly offline.
NetworkManager.world_ready()
_populate_world_if_owner()
get_tree().create_timer(3.0).timeout.connect(_log_world_state)
# Temporary-ish sanity check: confirms WorldContent actually ended up
# populated on this peer (whether by spawning it or by receiving it via
# replication), so a silent replication failure shows up in the net log
# instead of just an empty-looking world.
func _log_world_state() -> void:
NetworkManager.log_line("World state: WorldContent=%d children, Players=%d children" % [$WorldContent.get_child_count(), $Players.get_child_count()])
func _exit_tree() -> void:
NetworkManager.unregister_world()
func _on_session_started(_is_server: bool) -> void:
NetworkManager.gate_existing_stations()
_populate_world_if_owner()
## Spawns the world's stations/items exactly once, on the machine that owns
## world logic (server or offline). Safe to call multiple times/entry points.
func _populate_world_if_owner() -> void:
if _populated or not populate_from_layout:
return
# WorldLayout reads the live scene tree to find what to replicate, so it
# needs to be an instance sitting in that tree — its methods can't be called
# on the class itself.
var layout := WorldLayout.new()
add_child(layout)
var authored := layout.get_station_nodes()
authored.append_array(layout.get_item_nodes())
# The stations and items authored into the scene file are a *template*, not
# the live world. Only the server turns them into real objects, spawned
# through NetworkManager so they replicate. Every peer therefore drops its
# own authored copies: the client would otherwise show its local originals
# on top of the server's replicated ones, and the two sets would drift apart
# because only the server's are synced.
if not NetworkManager.owns_world():
NetworkManager.log_line("Clearing %d authored nodes; the server's copies replace them" % authored.size())
_remove_authored(authored)
layout.queue_free()
return
_init_recipes()
_populated = true
var stations := layout.get_stations()
var items := layout.get_items()
layout.queue_free()
_remove_authored(authored)
NetworkManager.log_line("Populating world: %d stations, %d items" % [stations.size(), items.size()])
for d in stations:
NetworkManager.spawn_item(d["scene"], d["xform"], d["name"], d["props"])
for d in items:
NetworkManager.spawn_item(d["scene"], d["xform"], d["name"], d["props"])
NetworkManager.log_line("World populated")
func _init_recipes():
GameManager.set_meals_in_play(["hamburger"])
GameManager.set_sides_in_play(["cube"])
# Free the authored template nodes. Done immediately rather than with
# queue_free() so the names are released before the replicated copies are
# spawned under the same ones.
func _remove_authored(nodes: Array[Node]) -> void:
for node in nodes:
if is_instance_valid(node):
node.get_parent().remove_child(node)
node.free()
## Only the server (or the single offline machine) materialises player
## avatars; MultiplayerSpawner replicates the result to everyone else,
## including late joiners.
func _on_player_joined(peer_id: int) -> void:
if not NetworkManager.owns_world() or $Players.has_node(str(peer_id)):
return
var p := PLAYER_SCENE.instantiate()
p.name = str(peer_id)
$Players.add_child(p, true)
NetworkManager.log_line("Spawned avatar for peer %d" % peer_id)
func _on_player_left(peer_id: int) -> void:
if not NetworkManager.owns_world():
return
var p := $Players.get_node_or_null(str(peer_id))
if p:
p.queue_free()
NetworkManager.log_line("Despawned avatar for peer %d" % peer_id)
func _on_session_ended() -> void:
NetworkManager.log_line("Session ended, returning to main menu")
get_tree().change_scene_to_file("res://scenes/mainMenu.tscn")
func _on_connection_failed() -> void:
NetworkManager.log_line("Connection failed, returning to main menu")
get_tree().change_scene_to_file("res://scenes/mainMenu.tscn")
-136
View File
@@ -1,136 +0,0 @@
extends Node
## The whole interaction layer: two RPCs, for every object in the game.
##
## Registered as the "NetGrab" autoload so its RPCs resolve to the same node path
## on every peer.
##
## A hand picks something up locally the instant the player grabs it — no round
## trip, no waiting — and tells the server. The server answers by moving the
## object's NetXform to that peer, which is what actually makes the prediction
## work: a MultiplayerSynchronizer never applies inbound state on the peer that
## owns it, so from that moment the holder's own hand drives the object and the
## server's copy follows instead of fighting it. Releasing hands NetXform back,
## and the server decides where the object really ends up.
##
## Note what is NOT here. There is no per-object networking component, no
## replicated "who is holding this" field to keep in step with the authority, and
## no grant/reject/force-release negotiation. Authority is the single source of
## truth for who simulates an object, and NetWorld.apply_physics_role reads it.
## Starts watching a pickable. Called by NetWorld for every replicated object, so
## no scene has to include a networking node to take part.
func watch(item: XRToolsPickable) -> void:
if item.picked_up.is_connected(_on_picked_up):
return
item.picked_up.connect(_on_picked_up)
item.dropped.connect(_on_dropped)
func _on_picked_up(item: Node3D) -> void:
if not NetworkManager.is_online():
return
# A station snap zone grabbing something is the server placing it, not a
# player taking it, so it must not move authority anywhere.
if not (item.get_picked_up_by() is XRToolsFunctionPickup):
return
NetworkManager.log_line("%s grabbed by hand, claiming it" % item.name)
if NetworkManager.is_server():
_claim(item.get_path(), 1)
else:
# rpc_id() to ourselves is rejected by Godot, which is why the server
# branch calls straight through instead.
_request_grab.rpc_id(1, item.get_path())
func _on_dropped(item: Node3D) -> void:
if not NetworkManager.is_online():
return
# Only the peer that was actually driving the object reports a release. A drop
# caused by losing authority (see NetWorld.apply_physics_role) must not be
# echoed back as if the player had let go.
var xform := item.get_node_or_null(NetReplication.XFORM_NAME)
if not xform or not xform.is_multiplayer_authority():
return
# Our own final transform travels with the release. We were driving the object
# right up to this moment and our position updates ride the synchronizer's
# separate, unordered channel, which this reliable message routinely
# overtakes — so the server's copy can still be back where the object was
# before we carried it away. Deciding the snap from that stale position
# teleports the object straight back into the station it was just taken from.
if NetworkManager.is_server():
_settle(item.get_path(), item.global_transform, item.linear_velocity, item.angular_velocity)
else:
_request_release.rpc_id(
1, item.get_path(), item.global_transform,
item.linear_velocity, item.angular_velocity
)
# --- server side -----------------------------------------------------------
@rpc("any_peer", "reliable")
func _request_grab(item_path: NodePath) -> void:
if not NetworkManager.is_server():
return
_claim(item_path, multiplayer.get_remote_sender_id())
@rpc("any_peer", "reliable")
func _request_release(item_path: NodePath, xform: Transform3D, lin: Vector3, ang: Vector3) -> void:
if not NetworkManager.is_server():
return
_settle(item_path, xform, lin, ang)
func _claim(item_path: NodePath, peer: int) -> void:
var item := get_node_or_null(item_path)
if not item:
return
NetworkManager.log_line("grant %s to peer %d" % [item.name, peer])
# Order matters: hand the object over first, so the station's zone has already
# stopped owning it by the time it is told to let go.
_set_xform_authority.rpc(item_path, peer)
NetStations.release_from_zones(self, item)
func _settle(item_path: NodePath, xform: Transform3D, lin: Vector3, ang: Vector3) -> void:
var item := get_node_or_null(item_path)
if not item:
return
NetworkManager.log_line("release %s" % item.name)
if item is Node3D:
item.global_transform = xform
_set_xform_authority.rpc(item_path, 1)
if item is RigidBody3D:
item.linear_velocity = lin
item.angular_velocity = ang
NetStations.try_snap.call_deferred(self, item)
## set_multiplayer_authority is a local call, so every peer has to run it for
## them to agree on who is driving the object.
@rpc("authority", "call_local", "reliable")
func _set_xform_authority(item_path: NodePath, peer: int) -> void:
var item := get_node_or_null(item_path)
if not item:
return
var xform := item.get_node_or_null(NetReplication.XFORM_NAME)
if not xform:
return
xform.set_multiplayer_authority(peer)
NetworkManager.apply_physics_role(item)
## Hands everything a departing peer was holding back to the server. Without
## this, anything still in their hand when they dropped out would be frozen
## forever on every remaining peer, waiting on an authority that has gone.
func reclaim_from(peer: int) -> void:
if not NetworkManager.is_server():
return
for item in NetworkManager.replicated_objects():
var xform := item.get_node_or_null(NetReplication.XFORM_NAME)
if xform and xform.get_multiplayer_authority() == peer:
NetworkManager.log_line("reclaiming %s from departed peer %d" % [item.name, peer])
_settle(item.get_path(), item.global_transform, Vector3.ZERO, Vector3.ZERO)
-1
View File
@@ -1 +0,0 @@
uid://bv82nioivbmnx
+190
View File
@@ -0,0 +1,190 @@
extends MultiplayerSynchronizer
## Networked sync component for a pickable item. Added as a child literally
## named "NetPickable" (network_manager.gd's authority RPCs already expect
## this) of every net-synced pickable, replicating its transform and held
## state. Only the current multiplayer authority (the server while loose, or
## whichever peer is holding it) actually simulates physics for the item;
## every other peer freezes their local copy and just follows the synced
## transform.
## 0 = loose/server-simulated; otherwise the peer id currently holding it.
## Replicated at spawn and on change so a late joiner sees the current holder.
var net_held_by: int = 0: set = _set_net_held_by
var _pickable: XRToolsPickable
# This item's own baked freeze_mode (e.g. plate.tscn bakes KINEMATIC, not the
# RigidBody3D default of STATIC) — captured once so it can be restored when
# this peer regains ownership, instead of getting stuck on whatever
# apply_held_state() last forced it to while non-authority.
var _original_freeze_mode: RigidBody3D.FreezeMode
# Same idea for the pickable's authored `enabled` flag, which the non-authority
# branch of apply_held_state() clears while someone else is holding the item.
var _original_enabled: bool
# Whether the "our own hand still holds this" guard has already been logged for
# the current grab. apply_held_state() runs every network tick, so without this
# the guard message repeats for as long as you hold the item.
var _grab_race_logged := false
func _ready() -> void:
_pickable = get_parent() as XRToolsPickable
if not _pickable:
push_error("NetPickable must be a child of an XRToolsPickable")
return
_original_freeze_mode = _pickable.freeze_mode
_original_enabled = _pickable.enabled
_pickable.picked_up.connect(_on_picked_up)
_pickable.dropped.connect(_on_dropped)
# Deferred: the pickable root captures its own original_collision_mask/
# original_collision_layer via @onready, which runs AFTER this child's
# _ready() but BEFORE the root's _ready() body. Calling apply_held_state
# synchronously here would freeze/mask the item before that capture runs,
# permanently corrupting the "restore on drop" values.
apply_held_state.call_deferred()
func _set_net_held_by(value: int) -> void:
var old := net_held_by
net_held_by = value
if old != value and NetworkManager.is_online():
SweetLogger.debug("{0} net_held_by: {1} -> {2} (local state: {3}, authority={4})", [_pickable.name, old, value, _holder_desc(), get_multiplayer_authority()])
apply_held_state()
## Puts the item in the right physics state for whether this peer currently
## owns it. Called locally after net_held_by changes, and directly by
## NetworkManager._set_item_authority right after an authority handoff.
##
## IMPORTANT: this runs on every network tick, not just on a real change.
## net_held_by is replicated in ALWAYS mode, so the synchronizer assigns it every
## tick on non-authority peers — unchanged value included — and that assignment
## lands in _set_net_held_by(), which calls this. So every branch here has to be
## idempotent and silent when there is nothing to do: otherwise each item logs a
## line and rewrites four physics properties every tick on every peer that
## doesn't own it.
func apply_held_state() -> void:
if not _pickable:
return
if not NetworkManager.is_online() or (is_inside_tree() and is_multiplayer_authority()) :
_grab_race_logged = false
# We own this item's simulation (offline, loose+server, or currently
# holding it). If it's not actively in our own hand right now, make
# sure it isn't still left frozen/collision-less from a previous
# non-authority period (e.g. right after regaining authority when a
# client released it) — while actually held, XRToolsPickable's own
# pick_up()/let_go() already manage these fields, so leave those be.
if not _pickable.is_picked_up():
var changed := _pickable.freeze_mode != _original_freeze_mode \
or _pickable.collision_mask != _pickable.original_collision_mask
if changed:
if NetworkManager.is_online():
SweetLogger.debug("{0}: reclaiming ownership, restoring freeze_mode {1}->{2} collision_mask {3}->{4}", [_pickable.name, _pickable.freeze_mode, _original_freeze_mode, _pickable.collision_mask, _pickable.original_collision_mask])
_pickable.freeze_mode = _original_freeze_mode
_pickable.collision_mask = _pickable.original_collision_mask
# Unlike freeze/collision (which XRToolsPickable manages itself while
# held), `enabled` is only ever written by the non-authority branch
# below, so it must be restored here or it stays false forever: once a
# client grabbed this item, every other peer set enabled=false, and
# regaining authority left it that way. On the server that silently
# broke everything downstream — hands couldn't pick the item up again,
# and a station snap zone would "snap" it (emitting has_picked_up, so
# e.g. a plate still got marked dirty) while pick_up() bailed out on
# the disabled item, leaving the zone holding an item with no grab
# driver that then fell out of the station.
if _pickable.enabled != _original_enabled:
if NetworkManager.is_online():
SweetLogger.debug("{0}: reclaiming ownership, restoring enabled {1}->{2}", [_pickable.name, _pickable.enabled, _original_enabled])
_pickable.enabled = _original_enabled
return
# A net_held_by/position sync update can race ahead of the
# authority-handoff RPC that's about to confirm a grab we just made
# optimistically (they travel on different channels with no ordering
# guarantee). Don't let a stale sync value yank an item out of our own
# hand mid-grab — only an explicit force_release_item rejection, or
# actually losing authority for real, should end a grab we initiated.
if _pickable.is_picked_up() and _pickable.get_picked_up_by() is XRToolsFunctionPickup:
# Log once per grab, not once per tick.
if NetworkManager.is_online() and not _grab_race_logged:
_grab_race_logged = true
SweetLogger.debug("{0}: ignoring non-authority sync (net_held_by={1}) — still actively held by our own hand (grab-race guard)", [_pickable.name, net_held_by])
return
_grab_race_logged = false
# Someone else owns it: stop simulating locally, just follow the sync.
if _pickable.is_picked_up():
if NetworkManager.is_online():
SweetLogger.debug("{0}: was held by {1} on this peer, but authority now says peer {2} owns it — force-dropping", [_pickable.name, _holder_desc(), net_held_by])
_pickable.drop()
# Bail out when we're already in the follow-the-sync state. Without this the
# writes below (and the line logged with them) repeated every tick for every
# item on every non-authority peer — 90% of the log, plus four redundant
# physics-property writes per item per tick. The comparison also means we
# still re-apply if something else perturbs the state (e.g. let_go()
# restoring the collision mask after a force-drop).
var want_enabled := (net_held_by == 0)
if _pickable.freeze \
and _pickable.freeze_mode == RigidBody3D.FREEZE_MODE_KINEMATIC \
and _pickable.collision_mask == 0 \
and _pickable.enabled == want_enabled:
return
# if NetworkManager.is_online(): # This was spamming that Knife was frozen every frame.
# print("%s: freezing (non-authority, owner=peer %d)" % [_pickable.name, net_held_by])
_pickable.freeze = true
_pickable.freeze_mode = RigidBody3D.FREEZE_MODE_KINEMATIC
_pickable.collision_mask = 0
_pickable.enabled = want_enabled
## Local hand grab (not a station snap zone, which is server-only): request
## authority immediately so the throw/drop can be reconciled, but let the grab
## happen instantly here rather than waiting on the round trip.
func _on_picked_up(_p) -> void:
var by := _pickable.get_picked_up_by()
if not (by is XRToolsFunctionPickup):
# e.g. a station snap zone grabbed it (server-side auto-snap, or the
# addon's own "grab out of a snap zone" shortcut mid-cascade) — not a
# player-initiated hand grab, so no authority request from here.
if NetworkManager.is_online():
SweetLogger.debug("{0} picked up by {1} (not a hand) — no authority request", [_pickable.name, _holder_desc()])
return
if NetworkManager.is_online():
SweetLogger.debug("{0} grabbed by hand (authority was peer {1}), requesting authority", [_pickable.name, net_held_by])
NetworkManager.request_item_authority_from(_pickable.get_path())
func _on_dropped(_p) -> void:
# Only forward if we're actually still the authority — a drop caused by
# apply_held_state() losing authority (see above) must not re-report.
if not is_multiplayer_authority():
if NetworkManager.is_online():
SweetLogger.debug("{0} dropped locally, but we aren't its authority (peer {1} is) — not reporting", [_pickable.name, net_held_by])
return
if NetworkManager.is_online():
SweetLogger.debug("{0} dropped, reporting release to server (lin={1} ang={2})", [_pickable.name, _pickable.linear_velocity, _pickable.angular_velocity])
# Send our own final transform too: we were the authority until now, and the
# server's copy may not have received our last position sync yet.
NetworkManager.release_item_authority_from(
_pickable.get_path(), _pickable.linear_velocity, _pickable.angular_velocity,
_pickable.global_transform
)
## Human-readable description of what's currently holding this item on THIS
## peer, for diagnosing desyncs between a hand's own "what am I holding"
## bookkeeping and the item's actual grab state (see the snap-zone-grab race
## in NetworkManager._try_snap_into_station for a real example).
func _holder_desc() -> String:
if not _pickable or not _pickable.is_picked_up():
return "loose"
var by := _pickable.get_picked_up_by()
if not by:
return "held(no grabber?)"
if by is XRToolsFunctionPickup:
return "hand(%s)" % by.get_path()
if by is XRToolsSnapZone:
var station := by.get_parent()
return "zone(%s)" % (str(station.name) if station else str(by.get_path()))
return "other(%s: %s)" % [by.get_class(), by.get_path()]
+1
View File
@@ -0,0 +1 @@
uid://bwd0pe2udb5xo
-188
View File
@@ -1,188 +0,0 @@
extends Node
class_name NetReplication
## Builds MultiplayerSynchronizers for any node by convention, so no scene needs
## a hand-authored replication config.
##
## Every replicated node gets TWO synchronizers, both generated here:
##
## NetSync script state (is_dirty, contained_ids, time_cooked, ...).
## Always owned by the server. Gameplay outcomes are the server's to
## decide, so this never changes hands.
## NetXform position + quaternion. Owned by the server while the object is
## loose, and handed to a peer for as long as that peer holds it.
##
## Splitting them is what makes client-side grab prediction work. A
## MultiplayerSynchronizer never applies inbound state on the peer that owns it,
## so giving the holder NetXform means their own hand drives the object with no
## round trip and no fight with the server's copy — while is_dirty and friends
## keep flowing one way, server to client, exactly as before.
##
## The obvious alternative, per-peer visibility (set_visibility_for), does NOT
## work: MultiplayerSpawner also uses synchronizer visibility to decide whether
## a node should exist on a peer, so hiding an object from its holder despawns
## it in their hand. Verified in test/spike/.
##
## The convention for what gets replicated:
## * a Node3D replicates `position` and `quaternion` (never `scale` — nothing
## in this game animates scale as gameplay state)
## * every script variable, on the node and on any scripted descendant, whose
## name does not start with "_" and whose declared type is serialisable
##
## Underscore-prefixed vars are the opt-out, and they already mark exactly the
## state that must not be replicated: @onready node references, cached lookups,
## per-frame bookkeeping.
## SceneReplicationConfig's replication modes. The enum is not exposed under a
## friendly name in GDScript, so they are spelled out here.
const MODE_ALWAYS := 1
const MODE_ON_CHANGE := 2
const SYNC_NAME := "NetSync"
const XFORM_NAME := "NetXform"
## Types that survive a network round trip. Object/Callable/Signal/RID cannot be
## serialised, and are exactly what @onready and cached references hold.
const SYNCABLE_TYPES := [
TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_STRING_NAME,
TYPE_VECTOR2, TYPE_VECTOR3, TYPE_QUATERNION, TYPE_TRANSFORM3D,
TYPE_COLOR, TYPE_PACKED_STRING_ARRAY, TYPE_ARRAY,
]
## Adds both synchronizers to `node`, unless they are already there. Idempotent.
##
## Must run on EVERY peer, not just the authority: the client's copy is built by
## MultiplayerSpawner straight from the .tscn, so it only has synchronizers if
## something puts them there. NetWorld calls this from the content root's
## child_entered_tree on both sides — early enough that they enter the tree
## inside the spawner's own add_child(), which is what lets them pick up the
## spawn payload (verified in test/spike/: a late joiner receives position and
## script state from a synchronizer that exists only at runtime).
static func attach(node: Node) -> void:
if node is Node3D and not node.has_node(XFORM_NAME):
_add_sync(node, XFORM_NAME, _transform_config())
if not node.has_node(SYNC_NAME):
_add_sync(node, SYNC_NAME, state_config(node))
static func _add_sync(node: Node, sync_name: String, config: SceneReplicationConfig) -> void:
var sync := MultiplayerSynchronizer.new()
sync.name = sync_name
sync.replication_config = config
# Sync every network tick. ON_CHANGE properties are only sent when they
# actually change regardless of this interval.
sync.replication_interval = 0.0
# Inherit the node's authority rather than defaulting to the server. Items are
# server-owned and this changes nothing for them, but a player avatar sets its
# authority to the peer it belongs to in _enter_tree — which has already run by
# the time we get here — and its synchronizer has to agree, or the owning peer
# would be receiving its own head and hands back from the server.
sync.set_multiplayer_authority(node.get_multiplayer_authority())
node.add_child(sync)
## Transform-only config. ALWAYS rather than ON_CHANGE: a carried or simulated
## object changes every tick anyway, so ON_CHANGE would only add a comparison
## per property per tick. spawn = true so a replicated object arrives already in
## the right place instead of sitting at the origin for a frame.
static func _transform_config() -> SceneReplicationConfig:
var config := SceneReplicationConfig.new()
_add(config, ".:position", true, MODE_ALWAYS)
_add(config, ".:quaternion", true, MODE_ALWAYS)
return config
## Script-state config for `node` and its scripted descendants. Public so the
## tests can inspect what the convention picked up without spinning up a session.
##
## ON_CHANGE, not ALWAYS: the value is then only sent — and, crucially, only
## ASSIGNED on the receiving peer — when it actually changes. Under ALWAYS every
## replicated setter becomes a per-tick hot path, which is how this project
## previously ended up rebuilding every plate's visuals 60 times a second.
static func state_config(node: Node) -> SceneReplicationConfig:
var config := SceneReplicationConfig.new()
for path in _script_var_paths(node, node):
_add(config, path, true, MODE_ON_CHANGE)
return config
static func _add(config: SceneReplicationConfig, path: String, spawn: bool, mode: int) -> void:
var np := NodePath(path)
config.add_property(np)
config.property_set_spawn(np, spawn)
config.property_set_replication_mode(np, mode)
## Whether a script comes from a third-party addon rather than this game.
##
## Addon components are local plumbing, and replicating their configuration is
## not merely wasteful — it is actively wrong. godot-xr-tools' snap zones and
## pickables both expose a public `enabled`, which is precisely the flag each
## peer has to set for ITSELF: a client disables its stations' snap zones because
## placement is the server's decision, and disables a pickable another player is
## holding. Replicating those meant the server helpfully sent `enabled = true`
## straight back over every client's gate, so stations on clients went on
## grabbing objects out of the local player's hands.
##
## Their values are authored in the scene file and therefore already identical on
## every peer, so nothing is lost by leaving them alone.
static func _is_addon(script: Script) -> bool:
return script.resource_path.begins_with("res://addons/")
## Whether a typed array holds something that can cross the wire.
##
## An array of nodes cannot, and this game has several: ItemContainer's
## meal_positions/side_positions are Array[Node3D], and contained_items is
## Array[FoodItem]. Replicating one would try to serialise live node references.
##
## GDScript reports the element type three different ways, so all three are
## handled here (verified against the real scripts):
## Array[String] hint 23, hint_string "4:" -> element type 4
## Array[Node3D] hint 23, hint_string "24/34:Node3D" -> element type 24
## Array[FoodItem] hint 31, hint_string "FoodItem" -> a class name
## An untyped Array reports an empty hint_string and is excluded too: it can hold
## anything, including nodes, so there is no safe answer.
static func _is_syncable_array(prop: Dictionary) -> bool:
var hint_string := str(prop["hint_string"])
if hint_string.is_empty():
return false
var head := hint_string.split(":")[0].split("/")[0]
if not head.is_valid_int():
# A bare class name, e.g. "FoodItem".
return false
return SYNCABLE_TYPES.has(head.to_int()) and head.to_int() != TYPE_ARRAY
## Every "<relative path>:<var>" on `node` and its scripted descendants.
## Descends through children but stops at anything carrying its own synchronizer
## — that subtree replicates itself and must not be replicated twice.
static func _script_var_paths(root: Node, node: Node) -> Array[String]:
var paths: Array[String] = []
var prefix: String = "." if node == root else str(root.get_path_to(node))
var script: Script = node.get_script() as Script
# Note the descent below still happens for an addon-scripted node — only its
# own properties are skipped. plate.tscn's root is godot-xr-tools' pickable.gd
# and its PlateController child is where the game state actually lives.
if script and _is_addon(script):
script = null
if script:
for prop in script.get_script_property_list():
var prop_name := str(prop["name"])
if prop_name.begins_with("_"):
continue
if not (prop["usage"] & PROPERTY_USAGE_SCRIPT_VARIABLE):
continue
if not SYNCABLE_TYPES.has(prop["type"]):
continue
if prop["type"] == TYPE_ARRAY and not _is_syncable_array(prop):
continue
paths.append("%s:%s" % [prefix, prop_name])
for child in node.get_children():
if child is MultiplayerSynchronizer or child is MultiplayerSpawner:
continue
if child.has_node(SYNC_NAME) or child.has_node(XFORM_NAME):
continue
paths.append_array(_script_var_paths(root, child))
return paths
-1
View File
@@ -1 +0,0 @@
uid://bmuqb0yywjfyw
-64
View File
@@ -1,64 +0,0 @@
extends Node
class_name NetStations
## Server-side placement rules for stations. Generic over the "station" group —
## there is nothing per-station here, and nothing any individual station scene
## has to opt into.
##
## Placement is a server decision for the same reason cooking is: every peer runs
## its own copy of a snap zone, so letting each decide independently means the
## same object gets grabbed in two places at once.
## Every snap zone belonging to a station. Some stations (Table) have more than
## one, so this is not a one-per-station lookup.
static func zones(context: Node) -> Array:
var found := []
for station in context.get_tree().get_nodes_in_group("station"):
for child in station.get_children():
if child is XRToolsSnapZone:
found.append(child)
return found
## Frees an object from whatever station is currently holding it, because
## someone has just taken it by hand.
static func release_from_zones(context: Node, item: Node) -> void:
for zone in zones(context):
if zone.picked_up_object == item:
zone.drop_object()
# Make the zone forget it as well. These zones are snap_mode=RANGE, so
# every frame they re-grab anything still listed in their grab area — and
# Jolt does NOT emit body_exited when let_go() switches the object's
# collision layer back out of the zone's mask, so the entry never clears
# on its own. The station then snatches the object straight back off the
# player who just took it and teleports it home. Bringing it near again
# re-adds it properly, and releasing next to a station is handled
# explicitly by try_snap below.
if zone._object_in_grab_area.has(item):
zone._object_in_grab_area.erase(item)
## Snaps a just-released object into the nearest empty station zone in range.
##
## Call this DEFERRED. XRToolsFunctionPickup's own "grab an object out of a snap
## zone" path calls zone.drop_object() before it calls pick_up() on the hand's
## behalf, and drop_object() synchronously fires the `dropped` signal that lands
## here. Running inline would immediately re-snap the object into the very zone
## it is still physically inside, stealing it before the hand's own pick_up()
## later in the same call stack ever runs — leaving the hand pointing at an
## object whose grab driver belongs to the zone, which crashes on the next
## controller press. The is_picked_up() check below is the second guard, for the
## case where something grabs it for real before this runs.
static func try_snap(context: Node, item: Node) -> void:
if not (item is Node3D) or not is_instance_valid(item):
return
if item.has_method("is_picked_up") and item.is_picked_up():
return
for zone in zones(context):
if is_instance_valid(zone.picked_up_object):
continue
if zone.global_position.distance_to(item.global_position) <= zone.grab_distance:
NetworkManager.log_line("snapped %s into %s" % [item.name, zone.get_parent().name])
zone.pick_up_object(item)
return
-1
View File
@@ -1 +0,0 @@
uid://cgp15pxa7ui1r
-251
View File
@@ -1,251 +0,0 @@
extends Node
class_name NetWorld
## Owns the replicated contents of the world: what exists, where it lives, and
## which peer is allowed to simulate it.
##
## Everything here runs on Godot's stock MultiplayerSpawner in its DEFAULT mode.
## There is no spawn_function and no payload dictionary: the server instantiates
## a scene, sets it up, and adds it under the spawn path — the spawner replicates
## the creation (and later the deletion) to every peer, including late joiners,
## and the synchronizers NetReplication attaches carry the state.
##
## The two hooks that make this generic, rather than something each object opts
## into:
##
## * content_root.child_entered_tree -> NetReplication.attach, on EVERY peer.
## The client's copy is built by the spawner straight from the .tscn, so this
## is what gives it synchronizers at all. It also runs early enough for them
## to pick up the spawn payload.
## * the same hook, on clients only -> _gate. One rule decides what a client is
## not allowed to simulate, for any object, whatever it happens to be.
## Directories scanned for spawnable scenes. Anything in them can be spawned
## over the network without being registered by hand anywhere.
const SPAWNABLE_DIRS := [
"res://Items/",
"res://Containers/",
"res://Stations/",
"res://Prefabs/",
]
var _spawner: MultiplayerSpawner
var _content_root: Node
## Wires this up to the world scene's spawner and content root. Must run on every
## peer BEFORE it connects, so the spawnable list is identical by the time any
## spawn packet can arrive.
func setup(spawner: MultiplayerSpawner, content_root: Node) -> void:
_spawner = spawner
_content_root = content_root
_register_spawnables()
_content_root.child_entered_tree.connect(_on_content_child_entered)
## Registers every scene under SPAWNABLE_DIRS, sorted.
##
## The sort is not cosmetic. Auto-spawn puts an INDEX into this list on the wire,
## not a path, so a peer whose list is ordered differently instantiates the wrong
## scene entirely. Directory listing order is not guaranteed to match across
## machines, so it is pinned here.
func _register_spawnables() -> void:
var scenes: Array[String] = []
for dir in SPAWNABLE_DIRS:
for file in ResourceLoader.list_directory(dir):
if file.ends_with(".tscn"):
scenes.append(dir + file)
scenes.sort()
for scene in scenes:
_spawner.add_spawnable_scene(scene)
NetworkManager.log_line("Registered %d spawnable scenes" % scenes.size())
func _on_content_child_entered(node: Node) -> void:
# Our own synchronizers re-enter here as children of the node, not of the
# content root, so this only ever sees spawned roots — but the guard is cheap
# and makes the intent explicit.
if node is MultiplayerSynchronizer:
return
NetReplication.attach(node)
# Grab handling is wired up centrally, so no scene has to carry a networking
# component to be pickable over the network.
if node is XRToolsPickable:
NetGrab.watch(node)
if not NetworkManager.owns_world():
_gate(node)
# Deferred, in this order, because both depend on the node being fully
# constructed: XRToolsPickable captures original_collision_mask in an @onready,
# which has not run yet at child_entered_tree time. Reading it now would
# record 0 as the object's authored collision mask and it would never collide
# with anything again.
_remember_authored.call_deferred(node)
apply_physics_role.call_deferred(node)
# --- spawning --------------------------------------------------------------
## Creates a networked object. Server-only when online (the spawner replicates
## it from there); works directly when offline.
##
## `props` are applied BEFORE the node enters the tree, so they ride the spawn
## packet as the synchronizer's spawn properties and every peer builds the object
## already configured. Note that this means their setters run before the node is
## in the tree, where @onready references are still null — any setter reachable
## this way has to be null-guarded.
func spawn(scene_path: String, xform: Transform3D, node_name: String = "", props: Dictionary = {}) -> Node:
if not NetworkManager.owns_world():
return null
var scene: PackedScene = load(scene_path)
if not scene:
push_error("NetWorld.spawn: could not load scene %s" % scene_path)
return null
var inst := scene.instantiate()
if node_name != "":
inst.name = node_name
for key in props:
inst.set(key, props[key])
if inst is Node3D:
inst.transform = xform
_content_root.add_child(inst)
# global_transform can only be honoured once the node has a parent to be
# global relative to. Content roots are normally at the origin, but a debug
# scene is free to move one.
if inst is Node3D:
inst.global_transform = xform
NetworkManager.log_line("spawn: %s as %s" % [scene_path.get_file(), inst.name])
return inst
## Destroys a networked object everywhere. The spawner broadcasts the despawn
## when a tracked node leaves the tree on the authority, so freeing it here is
## the whole implementation — there is no despawn RPC any more.
##
## Callers reach this holding all sorts of nodes (a component such as
## DespawningItem, or a visual deep inside a plate), so it walks up to the object
## the spawner actually knows about. Getting that wrong used to leave a ghost
## copy on every client, which then blocked the station it was sitting in.
func despawn(node: Node) -> void:
if not NetworkManager.owns_world() or not is_instance_valid(node):
return
var root := _spawned_root(node)
if not root:
# Not part of the replicated world at all (a cosmetic copy parented under
# a plate, say). Freeing it locally is all that was ever meant.
node.queue_free()
return
NetworkManager.log_line("despawn: %s" % root.name)
root.queue_free()
# The ancestor that is a direct child of the content root — i.e. the node the
# spawner tracks — or null if this node is not part of the replicated world.
func _spawned_root(node: Node) -> Node:
var current := node
while current:
if current.get_parent() == _content_root:
return current
current = current.get_parent()
return null
## Every replicated object currently in the world.
func objects() -> Array[Node]:
var found: Array[Node] = []
if _content_root:
for child in _content_root.get_children():
found.append(child)
return found
# --- what a client is not allowed to simulate ------------------------------
## The one gating rule, applied to every replicated object on peers that do not
## own world logic.
##
## Stations decide things (what has cooked, what is clean, what snaps where) and
## those decisions are the server's, so a client neither runs their logic nor
## lets their snap zones grab anything. Without this each peer independently
## grabs and simulates the same shared object, and the copies drift apart.
##
## Note what is NOT here: display code. A client still has to show a lit hob and
## a dirty plate, so anything visual must be driven from a replicated value's
## setter rather than from _process — which is where it belongs anyway, since
## that is the only version that also works for a late joiner.
func _gate(node: Node) -> void:
if node.is_in_group("station"):
node.set_process(false)
var zones := _snap_zones_of(node)
for zone in zones:
zone.enabled = false
zone.set_process(false)
NetworkManager.log_line("gated %s (%d snap zones)" % [node.name, zones.size()])
func _snap_zones_of(node: Node) -> Array:
var zones := []
for child in node.get_children():
if child is XRToolsSnapZone:
zones.append(child)
return zones
## Puts a body into the right physics state for whether this peer is currently
## driving it, which is exactly "do we own its NetXform".
##
## The authority IS the state here. The old implementation carried a replicated
## `net_held_by` peer id alongside the authority and reconciled the two by hand,
## which is what made held items get stuck frozen, or disabled forever, when the
## two disagreed. There is only one source of truth now.
##
## Called when an object is created and again whenever its NetXform changes
## hands, which is the complete set of moments the answer can change.
func apply_physics_role(node: Node) -> void:
if not (node is RigidBody3D):
return
var xform := node.get_node_or_null(NetReplication.XFORM_NAME)
if not xform:
return
var body: RigidBody3D = node
if xform.is_multiplayer_authority():
# We simulate it: restore whatever the scene authored. XRToolsPickable
# manages freeze and collision itself while an object is actually in a
# hand, so a held object is left alone.
if body is XRToolsPickable and body.is_picked_up():
return
body.freeze = false
body.freeze_mode = body.get_meta("net_freeze_mode", body.freeze_mode)
if body is XRToolsPickable:
body.collision_mask = body.original_collision_mask
# `enabled` has to be restored explicitly. Nothing else ever writes it
# back: the non-authority branch below clears it, so once any peer had
# held this object every other peer left it disabled forever. On the
# server that quietly broke everything downstream — hands could no
# longer pick the object up, while a snap zone still reported having
# grabbed it.
body.enabled = body.get_meta("net_enabled", body.enabled)
return
# Someone else drives it: stop simulating and just follow the sync. Kinematic
# rather than static so the incoming transform can still move it.
if body is XRToolsPickable and body.is_picked_up():
body.drop()
body.freeze = true
body.freeze_mode = RigidBody3D.FREEZE_MODE_KINEMATIC
body.collision_mask = 0
if body is XRToolsPickable:
# Still grabbable if the SERVER owns it, because that just means the object
# is lying around loose — being able to pick those up is the entire point.
# Only an object held by another player is off limits, and that is exactly
# when NetXform belongs to a peer other than 1.
body.enabled = xform.get_multiplayer_authority() == 1
# Records the state the scene authored, before gating has a chance to overwrite
# it, so reclaiming an object restores what it was built with rather than
# whatever the frozen-follower state last forced on it.
func _remember_authored(node: Node) -> void:
if not (node is RigidBody3D) or node.has_meta("net_freeze_mode"):
return
node.set_meta("net_freeze_mode", node.freeze_mode)
if node is XRToolsPickable:
node.set_meta("net_enabled", node.enabled)
-1
View File
@@ -1 +0,0 @@
uid://bgo0xq4uupuhi
+398 -80
View File
@@ -1,34 +1,36 @@
extends Node extends Node
## Session manager for VRyHungry (listen-server model: the host is peer 1 and ## Client-server session manager for VRyHungry (listen-server model).
## also plays).
## ##
## Registered as the "NetworkManager" autoload. This owns the transport and the ## Registered as the "NetworkManager" autoload. Owns transport (ENet), tracks
## session lifecycle, and nothing else — what exists in the world and who is ## the session, and is the single place that reassigns multiplayer authority
## allowed to simulate it belongs to NetWorld, and interaction belongs to ## (only the server does so). The world scene (main.gd) registers its spawners
## NetGrab. The spawn_item/despawn_item pair below are deliberately thin ## here via [method register_world]; higher layers (players, items, stations)
## forwards, so game code keeps one obvious place to call. ## build on top of this in later phases.
const DEFAULT_PORT := 24565 const DEFAULT_PORT := 24565
const MAX_CLIENTS := 7 const MAX_CLIENTS := 7
## Emitted on every peer (including the server for its own local player) when a ## Emitted on every peer (including the server for its own local player) when a
## player peer joins. On the server this fires for each remote peer; the server ## player peer joins. On the server this fires for each remote peer; the server
## uses it to spawn that peer's avatar. ## uses it to spawn that peer's player.
signal player_joined(peer_id: int) signal player_joined(peer_id: int)
signal player_left(peer_id: int) signal player_left(peer_id: int)
signal session_started(is_server: bool) signal session_started(is_server: bool)
signal session_ended() signal session_ended()
signal connection_failed() signal connection_failed()
# World hooks, registered by main.gd once the scene tree exists.
var _world: Node = null var _world: Node = null
var _net_world: NetWorld = null var _players_spawner: MultiplayerSpawner = null
var _items_spawner: MultiplayerSpawner = null
var _content_root: Node = null
var _log_file: FileAccess var _log_file: FileAccess
## Reason the session ended, shown by the menu on its next _ready() (see ## Reason the session ended, shown by the menu on the next _ready() (see
## take_status). Avoids depending on a live signal connection to a panel that ## take_status). Avoids depending on a live signal connection to a panel that
## does not exist yet at the moment the session actually ends. ## doesn't exist yet at the moment the session actually ends.
var last_status := "" var last_status := ""
@@ -41,9 +43,9 @@ func _ready() -> void:
multiplayer.server_disconnected.connect(_on_server_disconnected) multiplayer.server_disconnected.connect(_on_server_disconnected)
# --- session --------------------------------------------------------------- # --- Public API ------------------------------------------------------------
## Start hosting. The host is peer 1 and also plays. ## Start hosting. The host is peer 1 and also plays (listen server).
func host(port: int = DEFAULT_PORT) -> Error: func host(port: int = DEFAULT_PORT) -> Error:
var peer := ENetMultiplayerPeer.new() var peer := ENetMultiplayerPeer.new()
var err := peer.create_server(port, MAX_CLIENTS) var err := peer.create_server(port, MAX_CLIENTS)
@@ -53,7 +55,8 @@ func host(port: int = DEFAULT_PORT) -> Error:
multiplayer.multiplayer_peer = peer multiplayer.multiplayer_peer = peer
log_line("HOST started on port %d (peer id %d)" % [port, multiplayer.get_unique_id()]) log_line("HOST started on port %d (peer id %d)" % [port, multiplayer.get_unique_id()])
session_started.emit(true) session_started.emit(true)
player_joined.emit(multiplayer.get_unique_id()) # The host's own local player joins immediately.
_on_player_present(multiplayer.get_unique_id())
return OK return OK
@@ -76,9 +79,9 @@ func leave() -> void:
session_ended.emit() session_ended.emit()
# Restore Godot's default OfflineMultiplayerPeer rather than leaving the peer # Restore Godot's default OfflineMultiplayerPeer (rather than leaving the peer
# null: is_multiplayer_authority() and get_unique_id() both throw on a null peer, # null), so is_multiplayer_authority()/get_unique_id() keep working while we are
# and plenty of code keeps calling them while we are back in menu state. # back in single-player / menu state.
func _go_offline() -> void: func _go_offline() -> void:
if multiplayer.multiplayer_peer: if multiplayer.multiplayer_peer:
multiplayer.multiplayer_peer.close() multiplayer.multiplayer_peer.close()
@@ -86,6 +89,319 @@ func _go_offline() -> void:
unregister_world() unregister_world()
# --- Item spawning ---------------------------------------------------------
## Spawn a networked item. Server-only when online (replicates to all peers via
## the ItemsSpawner, including late joiners); works directly when offline.
## node_name gives the spawned node a deterministic, identical name on every
## peer (needed for NodePath-based RPCs to resolve it); props are applied to
## the instance before it enters the tree, so exported vars land correctly.
## Returns the new node on the machine that owns spawning, else null.
func spawn_item(scene_path: String, xform: Transform3D, node_name: String = "", props: Dictionary = {}) -> Node:
if is_online() and not is_server():
return null
var data := {"scene": scene_path, "xform": xform, "name": node_name, "props": props}
var via := "spawner" if (is_online() and _items_spawner) else "offline"
log_line("spawn_item: %s (name=%s, via=%s)" % [scene_path.get_file(), node_name, via])
if is_online() and _items_spawner:
return _items_spawner.spawn(data)
# Offline: instantiate directly under the registered content root, or (for
# scenes that never call register_world, e.g. the offline menu/dev scenes)
# the current scene, so this keeps working without every offline scene
# needing to opt in.
var inst := _spawn_item_from_data(data)
if inst:
var parent: Node = _content_root if _content_root else get_tree().current_scene
if parent:
parent.add_child(inst)
return inst
## Despawn a server-spawned item. MultiplayerSpawner broadcasts a despawn to
## every peer when a tracked node exits the tree on the authority, so this is
## the single seam for destroying spawned items (works offline too).
func despawn_item(node: Node) -> void:
if not owns_world() or not is_instance_valid(node):
return
log_line("despawn_item: %s" % node.name)
# Items that came from the ItemsSpawner are despawned on every peer
# automatically when they leave the tree here. Items baked into a scene file
# are unknown to the spawner, so their removal has to be broadcast
# explicitly — otherwise every client keeps a ghost copy of an item the
# server has consumed, which then blocks the station it was sitting in and
# gets grabbed instead of the real item that replaced it.
if is_online() and not _is_spawner_tracked(node):
_despawn_static_item.rpc(node.get_path())
node.queue_free()
# Items the ItemsSpawner replicates live under its spawn path; anything else was
# baked into the scene file and the spawner knows nothing about it.
func _is_spawner_tracked(node: Node) -> bool:
return _content_root != null and _content_root.is_ancestor_of(node)
@rpc("authority", "call_remote", "reliable")
func _despawn_static_item(path: NodePath) -> void:
var node := get_node_or_null(path)
if node:
log_line("despawn_static_item: freeing %s (the server consumed it)" % node.name)
node.queue_free()
# MultiplayerSpawner custom spawn function: runs on every peer to build the node
# from the replicated payload.
func _spawn_item_from_data(data: Variant) -> Node:
var scene: PackedScene = load(data["scene"])
if not scene:
push_error("spawn_item: could not load scene %s" % str(data.get("scene")))
return null
var inst := scene.instantiate()
if inst is Node3D:
inst.transform = data["xform"]
if data.get("name", "") != "":
inst.name = data["name"]
for key in data.get("props", {}):
inst.set(key, data["props"][key])
if not owns_world():
_gate_station(inst)
# ...and again once the node is in the tree. Gating before _ready() is what
# keeps a station from ever ticking on a client, but a station's own
# _ready() runs afterwards and can undo it (table.gd re-arms its state
# machine with set_process(true)). The deferred pass runs after every
# _ready() in this frame and re-asserts the gate.
_gate_station.call_deferred(inst)
return inst
# Stations run their own logic and auto-grab (XRToolsSnapZone with
# snap_mode=RANGE) identically on every peer by default, which would let each
# peer independently grab/simulate the same shared object. Disable both on
# every peer except the one that owns world logic; the server-authoritative
# item-authority RPCs are what let clients still grab a server-held item by
# hand. Runs before the node enters the tree, so its own _ready() sees the
# final (disabled) state.
#
# Group contract (see also _station_snap_zones): "station" marks the body that
# runs the station's script, "station_zone" marks its snap zones. Station scenes
# wrap that body in a Node3D (for StationMovement), and spawn_item hands us that
# wrapper, so accept either and recurse — a type check on the node we're handed
# silently gated nothing for stations whose root isn't the body itself.
func _gate_station(node: Node) -> void:
if not node.is_in_group("station"):
for child in node.find_children("*", "", true, false):
if child.is_in_group("station"):
_gate_station(child)
return
# Only report a gate that actually changed something: this runs a second time
# (deferred) for every spawned station, and on a re-gate that found nothing to
# do there is nothing worth logging.
var changed := node.is_processing()
for zone in node.find_children("*", "XRToolsSnapZone", true, false):
changed = changed or zone.enabled or zone.is_processing()
zone.enabled = false
zone.set_process(false)
node.set_process(false)
if changed:
log_line("gated station (non-owner peer): %s" % node.name)
## Gate every station already sitting in the scene tree, for peers that don't
## own world logic. Stations that arrive through spawn_item() are gated as they
## are built (see _spawn_item_from_data), but ones baked into a scene file never
## pass through there — leaving a client running its own snap zones, which then
## grab items straight out of the local hand and fight the server's
## authoritative placement. Idempotent, so it's safe on every session start.
func gate_existing_stations() -> void:
if owns_world():
return
for station in get_tree().get_nodes_in_group("station"):
_gate_station(station)
# --- Item grab-authority transfer -----------------------------------------
## Called by NetPickable when this peer grabs an item by hand. Godot rejects
## rpc_id() targeting your own peer id ("RPC on yourself is not allowed"), so
## when we ARE the server this runs the logic directly instead of round-
## tripping an RPC to ourselves — otherwise every host-side grab/drop was
## silently failing to run its server-side half (no denial checks, and
## crucially no auto-snap-into-station on release).
func request_item_authority_from(item_path: NodePath) -> void:
if is_server():
_grant_or_reject_item_authority(item_path, multiplayer.get_unique_id())
else:
_request_item_authority_rpc.rpc_id(1, item_path)
@rpc("any_peer", "reliable")
func _request_item_authority_rpc(item_path: NodePath) -> void:
if not is_server():
return
_grant_or_reject_item_authority(item_path, multiplayer.get_remote_sender_id())
## Runs on the server (called directly if the requester IS the server, or via
## the RPC above otherwise). If the item was snapped into a station, the
## station releases it so the grabber cleanly takes ownership.
func _grant_or_reject_item_authority(item_path: NodePath, sender: int) -> void:
var item := get_node_or_null(item_path)
if item:
var np := item.get_node_or_null("NetPickable")
if np and np.net_held_by != 0 and np.net_held_by != sender:
# Already legitimately held by a different live peer: reject the
# requester's optimistic client-side grab instead of stealing it.
log_line("request_item_authority: DENIED %s to peer %d (already held by %d)" % [item.name, sender, np.net_held_by])
_force_release_item_to(sender, item_path)
return
log_line("request_item_authority: granting %s to peer %d" % [str(item.name) if item else str(item_path), sender])
# Assign authority + held state first (disables the item on the server so its
# snap zone won't re-grab it), then release it from any station.
_set_item_authority.rpc(item_path, sender)
if item:
_release_from_snap_zones(item)
## Called by NetPickable when this peer releases an item, forwarding its throw
## velocity so the server can resume simulating it. Same self-RPC issue as
## above: runs directly if we're the server.
func release_item_authority_from(item_path: NodePath, lin: Vector3, ang: Vector3, xform: Transform3D) -> void:
if is_server():
_do_release_item_authority(item_path, lin, ang, xform, multiplayer.get_unique_id())
else:
_release_item_authority_rpc.rpc_id(1, item_path, lin, ang, xform)
@rpc("any_peer", "reliable")
func _release_item_authority_rpc(item_path: NodePath, lin: Vector3, ang: Vector3, xform: Transform3D) -> void:
if not is_server():
return
_do_release_item_authority(item_path, lin, ang, xform, multiplayer.get_remote_sender_id())
## Runs on the server. If released next to a station, the server snaps it in
## (server-authoritative placement).
func _do_release_item_authority(item_path: NodePath, lin: Vector3, ang: Vector3, xform: Transform3D, sender: int) -> void:
log_line("release_item_authority: %s released by peer %d" % [str(item_path), sender])
_set_item_authority.rpc(item_path, 1)
var item := get_node_or_null(item_path)
if item is RigidBody3D:
# Adopt the releasing peer's own final transform rather than trusting our
# copy's. That peer was the item's authority right up to this moment, and
# its position updates travel on the synchronizer's separate, unordered
# channel — this reliable RPC routinely overtakes them, leaving our copy
# still sitting where the item was BEFORE the peer carried it away. The
# snap decision below then reads that stale position and teleports the
# item straight back into the station it was just picked up from.
item.global_transform = xform
item.freeze = false
item.linear_velocity = lin
item.angular_velocity = ang
_try_snap_into_station.call_deferred(item)
# All station snap zones in the world (every XRToolsSnapZone under a node in the
# "station" group — some stations, e.g. Table, have more than one). Derived from
# the station body rather than from the "station_zone" group directly, so zones
# that are deliberately not server-placeable (the player's Hatch) stay out.
func _station_snap_zones() -> Array:
var zones := []
for station in get_tree().get_nodes_in_group("station"):
for zone in station.find_children("*", "XRToolsSnapZone", true, false):
if not zones.has(zone):
zones.append(zone)
return zones
# If the item is snapped into any station, drop it from that station.
func _release_from_snap_zones(item: Node) -> void:
for zone in _station_snap_zones():
if zone.picked_up_object == item:
log_line("releasing %s from %s's snap zone (authority just granted elsewhere)" % [item.name, zone.get_parent().name])
zone.drop_object()
# Make the zone forget the item as well. These zones are snap_mode=RANGE,
# so every frame they re-grab anything still listed in their grab area
# that can be picked up — and Jolt does not emit body_exited when let_go()
# switches the item's collision layer back out of the zone's mask, so the
# entry goes stale and never clears. The station then snatches the item
# straight back off the player who just took it, teleporting it home.
# Bringing it near again re-adds it properly (a held item is on the layer
# the zone watches), and releasing next to a station is handled
# explicitly by _try_snap_into_station.
if zone._object_in_grab_area.has(item):
zone._object_in_grab_area.erase(item)
# Snap the item into the nearest empty station snap zone within grab range.
#
# Called deferred from _do_release_item_authority: XRToolsFunctionPickup's own
# "grab an item out of a snap zone" path calls zone.drop_object() BEFORE it
# calls pick_up() on the hand's behalf. drop_object()'s let_go() synchronously
# fires the pickable's `dropped` signal, which (via NetPickable) lands here —
# if this ran synchronously it would immediately re-snap the item into the
# very same zone it's still physically inside, stealing it away before the
# hand's own pick_up() call (later in the same call stack) ever runs. That
# leaves XRToolsFunctionPickup.picked_up_object pointing at an item whose
# _grab_driver actually belongs to the zone — a stale reference that crashes
# (null _grab_driver) the next time a controller button is pressed. Deferring
# lets the hand's pick_up() go first; the is_picked_up() check below is a
# second guard in case the item gets grabbed for real before this runs.
func _try_snap_into_station(item: Node) -> void:
if not (item is Node3D):
return
if item.has_method("is_picked_up") and item.is_picked_up():
var by: Node = null
if item.has_method("get_picked_up_by"):
by = item.get_picked_up_by()
log_line("skipped snapping %s: already held by %s (grab-race guard)" % [item.name, str(by.get_path()) if by else "?"])
return
for zone in _station_snap_zones():
if is_instance_valid(zone.picked_up_object):
continue
if zone.global_position.distance_to(item.global_position) <= zone.grab_distance:
log_line("snapped %s into %s" % [item.name, zone.get_parent().name])
zone.pick_up_object(item)
return
log_line("no station in range to snap %s into (or none empty)" % item.name)
# Server broadcasts an authority assignment so every peer agrees on who owns the
# item (set_multiplayer_authority is a local call and must run everywhere).
@rpc("authority", "call_local", "reliable")
func _set_item_authority(item_path: NodePath, peer: int) -> void:
var item := get_node_or_null(item_path)
if not item:
return
log_line("_set_item_authority: %s -> peer %d" % [item.name, peer])
item.set_multiplayer_authority(peer) # recursive: item + synchronizer + NetPickable
var np := item.get_node_or_null("NetPickable")
if np:
np.net_held_by = 0 if peer == 1 else peer
np.apply_held_state()
## Rejects peer's optimistic grab (the item was already legitimately held by
## someone else). Same self-RPC concern: if the rejected peer is the server
## itself, apply it directly rather than rpc_id-ing ourselves.
func _force_release_item_to(peer: int, item_path: NodePath) -> void:
if peer == 1:
_do_force_release(item_path)
else:
force_release_item.rpc_id(peer, item_path)
@rpc("authority", "reliable")
func force_release_item(item_path: NodePath) -> void:
_do_force_release(item_path)
func _do_force_release(item_path: NodePath) -> void:
log_line("force_release_item: dropping %s (server rejected our grab)" % str(item_path))
var item := get_node_or_null(item_path)
if item and item.has_method("drop"):
item.drop()
func is_server() -> bool: func is_server() -> bool:
return is_online() and multiplayer.is_server() return is_online() and multiplayer.is_server()
@@ -98,69 +414,71 @@ func is_online() -> bool:
## True on the machine that owns authoritative world logic: the server when ## True on the machine that owns authoritative world logic: the server when
## online, or the single player when offline. Station logic and spawning only run ## online, or the single player when offline. Station logic and spawning should
## where this is true, so state has one source of truth. ## only run where this is true, so state has one source of truth.
func owns_world() -> bool: func owns_world() -> bool:
return not is_online() or is_server() return not is_online() or is_server()
# --- world ----------------------------------------------------------------- # --- Station work-progress seam -------------------------------------------
## Called by the world scene once its tree exists. Must run before ## Reusable entry point for a client to contribute work to a station (e.g. a
## world_ready()/host()/join() on every peer, so the spawnable scene list is ## future chopping/gesture station). The client detects the gesture locally and
## registered before any spawn packet can arrive. ## calls this; the server validates and accumulates. Timer-driven stations like
func register_world(world: Node, net_world: NetWorld) -> void: ## the Hob don't need it, but it is the drop-in seam for input-driven ones.
@rpc("any_peer", "reliable")
func submit_work(station_path: NodePath, amount: float) -> void:
if not is_server():
return
var station := get_node_or_null(station_path)
if station and station.has_method("add_work"):
log_line("submit_work: peer %d contributed %.2f to %s" % [multiplayer.get_remote_sender_id(), amount, station.name])
station.add_work(multiplayer.get_remote_sender_id(), amount)
## Called by the world scene once it's ready, passing its spawners. Must run
## before world_ready()/host()/join() on every peer so the custom spawn
## function is installed before any spawn packet can arrive.
func register_world(world: Node, players_spawner: MultiplayerSpawner, items_spawner: MultiplayerSpawner) -> void:
_world = world _world = world
_net_world = net_world _players_spawner = players_spawner
log_line("World registered") _items_spawner = items_spawner
_content_root = items_spawner.get_node(items_spawner.spawn_path) if items_spawner else world
if _items_spawner:
_items_spawner.spawn_function = _spawn_item_from_data
log_line("World registered (players_spawner=%s items_spawner=%s)" % [str(players_spawner != null), str(items_spawner != null)])
## Called when the world scene goes away (disconnect, leaving the session) so the ## Called when the world scene goes away (disconnect, leaving the session) so
## autoload does not hold freed references across a scene reload. ## the autoload doesn't hold stale/freed references across a scene reload.
func unregister_world() -> void: func unregister_world() -> void:
_world = null _world = null
_net_world = null _content_root = null
_players_spawner = null
_items_spawner = null
## Creates a networked object. See NetWorld.spawn. ## Returns the reason the last session ended (if any) and clears it. The menu
func spawn_item(scene_path: String, xform: Transform3D, node_name: String = "", props: Dictionary = {}) -> Node: ## pulls this on its own _ready() rather than depending on a live signal
if not _net_world: ## connection to a panel that doesn't exist yet when the session ends.
push_error("spawn_item called with no world registered: %s" % scene_path) func take_status() -> String:
return null var s := last_status
return _net_world.spawn(scene_path, xform, node_name, props) last_status = ""
return s
## Destroys a networked object everywhere. See NetWorld.despawn. ## Called by main.gd after it has registered the world and connected its
func despawn_item(node: Node) -> void: ## player_joined/left listeners. Kicks off any menu- or command-line-driven
if _net_world: ## session so that session signals never fire before the world is listening.
_net_world.despawn(node)
## Puts an object into the right physics state for whether this peer drives it.
func apply_physics_role(node: Node) -> void:
if _net_world:
_net_world.apply_physics_role(node)
## Every replicated object currently in the world.
func replicated_objects() -> Array[Node]:
if not _net_world:
return []
return _net_world.objects()
## Called by the world scene after it has registered itself and connected its
## listeners. Kicks off any menu- or command-line-driven session, so session
## signals never fire before the world is listening for them.
func world_ready() -> void: func world_ready() -> void:
consume_pending_session() consume_pending_session()
# --- menu-driven session request ------------------------------------------- # --- Menu-driven session request -------------------------------------------
# Set by the main menu's Host/Join buttons before switching to the multiplayer # Set by the main menu's Host/Join buttons before switching to the multiplayer
# scene; consumed once that scene is ready to listen for session signals (avoids # scene; consumed once that scene's world is ready to listen for session
# a race between change_scene_to_file and the connection callbacks). # signals (avoids a race between change_scene_to_file and connection callbacks).
var pending_action := "" var pending_action := ""
var pending_ip := "" var pending_ip := ""
@@ -182,29 +500,18 @@ func consume_pending_session() -> void:
_handle_cmdline() _handle_cmdline()
## Returns the reason the last session ended (if any) and clears it. The menu # --- Session signal handlers ----------------------------------------------
## pulls this on its own _ready() rather than depending on a live signal
## connection to a panel that does not exist yet when the session ends.
func take_status() -> String:
var s := last_status
last_status = ""
return s
# --- session signal handlers ----------------------------------------------
func _on_peer_connected(peer_id: int) -> void: func _on_peer_connected(peer_id: int) -> void:
log_line("peer_connected: %d" % peer_id) log_line("peer_connected: %d" % peer_id)
# Only the server reacts by materialising that peer's player.
if is_server(): if is_server():
player_joined.emit(peer_id) _on_player_present(peer_id)
func _on_peer_disconnected(peer_id: int) -> void: func _on_peer_disconnected(peer_id: int) -> void:
log_line("peer_disconnected: %d" % peer_id) log_line("peer_disconnected: %d" % peer_id)
if is_server(): if is_server():
# Anything still in their hand would otherwise stay frozen on every _on_player_absent(peer_id)
# remaining peer, waiting on an authority that has gone.
NetGrab.reclaim_from(peer_id)
player_left.emit(peer_id)
func _on_connected_to_server() -> void: func _on_connected_to_server() -> void:
log_line("connected_to_server (my id=%d)" % multiplayer.get_unique_id()) log_line("connected_to_server (my id=%d)" % multiplayer.get_unique_id())
@@ -223,10 +530,22 @@ func _on_server_disconnected() -> void:
session_ended.emit() session_ended.emit()
# --- command-line driven test bootstrap ----------------------------------- # Player materialise/dematerialise. Phase 2 wires these to the PlayersSpawner;
# for now they announce presence so the transport layer is independently testable.
func _on_player_present(peer_id: int) -> void:
log_line("player_present: %d" % peer_id)
player_joined.emit(peer_id)
func _on_player_absent(peer_id: int) -> void:
log_line("player_absent: %d" % peer_id)
player_left.emit(peer_id)
# --- Command-line driven test bootstrap -----------------------------------
func _handle_cmdline() -> void: func _handle_cmdline() -> void:
var args := OS.get_cmdline_user_args() SweetLogger.info("Networkmanager _handle_cmdline()")
var args := OS.get_cmdline_args()
if args.has("--server"): if args.has("--server"):
log_line("cmdline: --server") log_line("cmdline: --server")
host() host()
@@ -239,7 +558,7 @@ func _handle_cmdline() -> void:
join(addr) join(addr)
# --- logging --------------------------------------------------------------- # --- Logging ---------------------------------------------------------------
func _open_log() -> void: func _open_log() -> void:
var dir := OS.get_environment("TEMP") var dir := OS.get_environment("TEMP")
@@ -251,14 +570,13 @@ func _open_log() -> void:
_log_file = FileAccess.open(path, FileAccess.WRITE) _log_file = FileAccess.open(path, FileAccess.WRITE)
log_line("=== NetworkManager log (pid %d) ===" % OS.get_process_id()) log_line("=== NetworkManager log (pid %d) ===" % OS.get_process_id())
func log_line(s: String) -> void: func log_line(s: String) -> void:
var id := 0 var id := 0
var p := multiplayer.multiplayer_peer var p := multiplayer.multiplayer_peer
if p != null and p.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED: if p != null and p.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
id = multiplayer.get_unique_id() id = multiplayer.get_unique_id()
var line := "[NET %d] %s" % [id, s] var line := "[NET %d] %s" % [id, s]
print(line) SweetLogger.info(line, [], "network_manager.gd", "log_line")
if _log_file: if _log_file:
_log_file.store_line(line) _log_file.store_line(line)
_log_file.flush() _log_file.flush()
+131 -55
View File
@@ -1,79 +1,155 @@
extends Node extends Node
class_name WorldLayout class_name WorldLayout
## Reads the kitchen a scene file authored and describes it as data, so the ## Data-driven description of what's in the multiplayer world. The server (or
## server can respawn it as replicated objects. ## the single machine, when offline) spawns every entry through
## NetworkManager.spawn_item() instead of baking these into the scene file, so
## a joining client receives them from the server rather than assuming its own
## copy of the scene matches. Swapping the contents of these two functions is
## the only change needed for a future varying/procedural layout.
## ##
## The authored nodes are a template, not the live world. Baking them into the ## Positions below are transcribed verbatim from the previous baked layout in
## scene would mean each peer ran its own unsynced copy; spawning them means the ## Scenes/multiPlayer.tscn so the starting world is unchanged.
## client receives the server's, through the same path as a mid-session join.
## Directories whose scenes count as world content, and the base type to look for
## in each. Anything instanced from these is picked up automatically — adding a
## new station or item needs no change here.
const SOURCES := [
{"dir": "res://Stations/", "type": "StaticBody3D"},
{"dir": "res://Items/", "type": "XRToolsPickable"},
{"dir": "res://Containers/", "type": "XRToolsPickable"},
]
## Every authored node in the current scene, stations first. func get_node_data(node):
## # {"scene": "res://Stations/Hob.tscn", "name": "Hob",
## Order matters: stations have to exist before items, so an item spawning on top # "xform": Transform3D(Basis(), Vector3(0.29336345, 0.8981018, -1.484)), "props": {}},
## of one lands in a snap zone that is already there. var data = {}
func get_authored_nodes() -> Array[Node]: data["scene"] = node.scene_file_path
var found: Array[Node] = [] data["name"] = node.name
for source in SOURCES: # global, not local: the copies are respawned under WorldContent, so an
for node in _instances_of(source["dir"], source["type"]): # authored node that was nested inside another (JonScene parents Counter5
if not found.has(node): # under Counter3) would otherwise land in the wrong place.
found.append(node) data["xform"] = node.global_transform
data["props"] = {}
var scrip = node.get_script()
if scrip:
for i in scrip.get_script_property_list():
# Only authored configuration — i.e. @export vars, which are the ones
# the editor exposes. Plain script variables are live runtime state:
# copying those and replaying them into a fresh instance re-runs their
# setters before the node is in the tree, so any setter touching an
# @onready reference blows up (Table's _state calls into its progress
# bar, which is still null at that point).
if not (i.usage & PROPERTY_USAGE_EDITOR):
continue
if str(i["name"]).begins_with("_"):
continue
data["props"][i["name"]] = node.get(i["name"])
return data
## The authored station nodes sitting in the current scene: anything instanced
## from res://Stations/. Exposed as nodes (not just data) because every peer has
## to remove these originals — the server replaces them with replicated copies,
## and a client that kept its own would end up showing two of everything.
func get_station_nodes() -> Array[Node]:
return _authored_nodes("res://Stations/", "StaticBody3D")
## Likewise for authored items. Containers/ counts as items too — plates and
## trays are things the player carries, and a client that never received one
## would have an incomplete world.
func get_item_nodes() -> Array[Node]:
var found := _authored_nodes("res://Items/", "XRToolsPickable")
found.append_array(_authored_nodes("res://Containers/", "XRToolsPickable"))
return found return found
func _instances_of(dir: String, type: String) -> Array[Node]: func _authored_nodes(dir: String, type: String) -> Array[Node]:
var scenes := [] var scenes := []
for file in ResourceLoader.list_directory(dir): for file in ResourceLoader.list_directory(dir):
scenes.append(dir + file) scenes.append(dir + file)
var found: Array[Node] = [] var found: Array[Node] = []
for node in get_tree().root.find_children("*", type, true, false): for node in get_tree().root.find_children("*", type, true, false):
if node.scene_file_path in scenes: if node.scene_file_path in scenes and not found.has(node):
found.append(node) found.append(node)
return found return found
## Turns authored nodes into spawn descriptions. func get_stations() -> Array[Dictionary]:
func describe(nodes: Array[Node]) -> Array[Dictionary]:
var data: Array[Dictionary] = [] var data: Array[Dictionary] = []
for node in nodes: for node in get_station_nodes():
data.append(_describe_one(node)) data.append(get_node_data(node))
return data return data
func _describe_one(node: Node) -> Dictionary: func get_items() -> Array[Dictionary]:
return { var data: Array[Dictionary] = []
"scene": node.scene_file_path, for node in get_item_nodes():
"name": node.name, data.append(get_node_data(node))
# Global, not local: the copies are respawned under one content root, so return data
# an authored node nested inside another (JonScene parents Counter5 under
# Counter3) would otherwise land in the wrong place.
"xform": node.global_transform,
"props": _authored_props(node),
}
# Only authored configuration — @export vars, the ones the editor exposes. Plain
# script variables are live runtime state, and replaying those into a fresh
# instance re-runs their setters before the node is in the tree, where any setter static func get_stations_old() -> Array[Dictionary]:
# touching an @onready reference blows up. return [
func _authored_props(node: Node) -> Dictionary: {"scene": "res://Stations/Hob.tscn", "name": "Hob",
var props := {} "xform": Transform3D(Basis(), Vector3(0.29336345, 0.8981018, -1.484)), "props": {}},
var script: Script = node.get_script() as Script {"scene": "res://Stations/BurgerBunsDispenser.tscn", "name": "BurgerBunsDispenser",
if not script: "xform": Transform3D(Basis(), Vector3(-1.832131, 0.40028095, -1.4813508)), "props": {}},
return props {"scene": "res://Stations/sink.tscn", "name": "Sink",
for prop in script.get_script_property_list(): "xform": Transform3D(Basis(), Vector3(1.3140475, 0.9061539, -1.4941733)), "props": {}},
var prop_name := str(prop["name"]) {"scene": "res://Stations/dirt_station.tscn", "name": "DirtStation",
if not (prop["usage"] & PROPERTY_USAGE_EDITOR) or prop_name.begins_with("_"): "xform": Transform3D(Basis(), Vector3(2.0864775, 0.8981018, -1.244947)), "props": {}},
continue {"scene": "res://Stations/Counter.tscn", "name": "Counter",
props[prop_name] = node.get(prop_name) "xform": Transform3D(Basis(), Vector3(-0.7124918, 0.90304357, -1.4886917)), "props": {}},
return props {"scene": "res://Stations/Counter.tscn", "name": "Counter2",
"xform": Transform3D(Vector3(-4.371139e-08, 0.0, 1.0), Vector3(0.0, 1.0, 0.0), Vector3(-1.0, 0.0, -4.371139e-08), Vector3(-1.7648025, 0.90304357, -0.4458799)), "props": {}},
{"scene": "res://Stations/Counter.tscn", "name": "Counter3",
"xform": Transform3D(Vector3(-4.371139e-08, 0.0, 1.0), Vector3(0.0, 1.0, 0.0), Vector3(-1.0, 0.0, -4.371139e-08), Vector3(-1.7648025, 0.90304357, 0.55367994)), "props": {}},
{"scene": "res://Stations/Counter.tscn", "name": "Counter4",
"xform": Transform3D(Vector3(-4.371139e-08, 0.0, 1.0), Vector3(0.0, 1.0, 0.0), Vector3(-1.0, 0.0, -4.371139e-08), Vector3(-1.7648025, 0.90304357, 1.5539298)), "props": {}},
{"scene": "res://Stations/table.tscn", "name": "Table",
"xform": Transform3D(Basis(), Vector3(1.633146, 0.9030438, 1.1343781)),
"props": {
"initial_thinking_time": 8.0,
"initial_primary_time": 40.0,
"initial_friend_time": 3.0,
"initial_eating_time": 3.0,
}},
]
static func get_items_old() -> Array[Dictionary]:
var items: Array[Dictionary] = []
items.append(_item("res://Items/BurgerBuns.tscn", "BurgerBuns", Vector3(-1.8162017, 1.6081157, -1.4714175)))
items.append(_item("res://Items/BurgerBuns.tscn", "BurgerBuns2", Vector3(-1.3596323, 1.4110342, -0.22482127)))
items.append(_item("res://Containers/plate.tscn", "Plate", Vector3(-1.5717233, 1.5454081, 1.5373346)))
items.append(_item("res://Containers/plate.tscn", "Plate2", Vector3(-1.5730225, 1.499024, 0.59790254)))
items.append(_item("res://Containers/plate.tscn", "Plate3", Vector3(-1.5818124, 1.499024, -0.4634577)))
items.append(_item("res://Items/burger.tscn", "burger", Vector3(0.6888188, 1.4195822, -1.7110313)))
items.append(_item("res://Items/burger.tscn", "burger2", Vector3(0.6931299, 1.5300478, -1.71225)))
items.append(_item("res://Items/burger.tscn", "burger3", Vector3(0.69027674, 1.4969791, -1.7210286)))
items.append(_item("res://Items/burger.tscn", "burger4", Vector3(0.69134104, 1.4543622, -1.7210286)))
items.append(_item("res://Items/hamburger.tscn", "Hamburger", Vector3(-1.9352558, 1.623975, 1.2447833)))
items.append(_item("res://Items/hamburger.tscn", "Hamburger2", Vector3(-1.9857153, 1.5329368, 0.9472374)))
items.append(_item("res://Items/hamburger.tscn", "Hamburger3", Vector3(-1.7201865, 1.5329367, 0.14773655)))
items.append(_item("res://Items/cooked_burger.tscn", "CookedBurger", Vector3(-0.30671906, 1.4131018, -1.0928738)))
items.append(_item("res://Items/cooked_burger.tscn", "CookedBurger2", Vector3(-0.30671906, 1.4496142, -1.0928738)))
items.append(_item("res://Items/cooked_burger.tscn", "CookedBurger3", Vector3(-1.3344773, 1.4398065, -0.7096845)))
items.append(_item("res://Items/cooked_burger.tscn", "CookedBurger4", Vector3(-0.30671906, 1.525444, -1.0928738)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject", Vector3(0.6225724, 1.4792972, -1.0473135)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject2", Vector3(0.6359743, 1.4639391, -1.1673055)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject3", Vector3(0.5142721, 1.4792972, -1.0473135)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject4", Vector3(0.5276739, 1.4639391, -1.1673055)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject5", Vector3(0.73287535, 1.4792972, -1.0473135)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject6", Vector3(0.7462772, 1.4639391, -1.1673055)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject7", Vector3(-1.3556751, 1.4792972, 0.28881657)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject8", Vector3(-1.3422732, 1.4639391, 0.16882455)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject9", Vector3(-1.4639754, 1.4792972, 0.28881657)))
items.append(_item("res://Items/PickupCube.tscn", "PickableObject10", Vector3(-1.4505737, 1.4639391, 0.16882455)))
return items
static func _item(scene: String, item_name: String, pos: Vector3) -> Dictionary:
return {"scene": scene, "name": item_name, "xform": Transform3D(Basis(), pos), "props": {}}
+32 -67
View File
@@ -1,106 +1,71 @@
extends Node3D extends Node3D
## Networked representation of one connected player. ## Networked representation of one connected player. The owning peer's local
## ## XR rig (found via the "local_xr_origin" group) drives Head/LeftHand/
## The owning peer's local XR rig drives the three transforms below every frame; ## RightHand each frame; the MultiplayerSynchronizer replicates those
## the generated NetSync replicates them, and every other peer applies them to ## transforms so every other peer sees a matching avatar.
## the avatar's head and hands. They are ordinary script variables rather than an
## authored replication config, so the avatar goes through exactly the same
## convention as every other replicated object.
@onready var _head: Node3D = $Head @onready var _head: Node3D = $Head
@onready var _left_hand: Node3D = $LeftHand @onready var _left_hand: Node3D = $LeftHand
@onready var _right_hand: Node3D = $RightHand @onready var _right_hand: Node3D = $RightHand
## Replicated pose. Underscore-free by design — that is what marks a variable as
## replicated (see NetReplication). Written by the owning peer, applied by
## everyone else through the setters.
var head_xform: Transform3D = Transform3D.IDENTITY: set = _set_head_xform
var left_xform: Transform3D = Transform3D.IDENTITY: set = _set_left_xform
var right_xform: Transform3D = Transform3D.IDENTITY: set = _set_right_xform
var _local_camera: Node3D var _local_camera: Node3D
var _local_left_hand: Node3D var _local_left_hand: Node3D
var _local_right_hand: Node3D var _local_right_hand: Node3D
func _enter_tree() -> void: func _enter_tree() -> void:
# The avatar's name is the peer id it belongs to. Authority has to be claimed # MultiplayerSynchronizer resolves authority when this node enters the
# here rather than in _ready(): NetReplication reads it when it attaches the # tree, so authority must be set here rather than in _ready(), or the
# synchronizers, which happens as this node enters the tree. # first synced frames go the wrong direction.
set_multiplayer_authority(str(name).to_int()) set_multiplayer_authority(str(name).to_int())
func _ready() -> void: func _ready() -> void:
# LeftHand/RightHand are the full godot-xr-tools glove scenes, whose root # LeftHand/RightHand are the full godot-xr-tools glove scenes, whose root
# carries hand.gd. That script sets top_level = true and every physics frame # node carries hand.gd (XRToolsHand). That script sets top_level = true
# repositions itself to track a live XRController3D parent. Here the parent is # and every physics frame does global_transform = get_parent().
# just this avatar, not a controller, so leaving it running fights both the # global_transform * offset — i.e. it actively repositions itself to
# local copy below and the replicated values on other peers — and mostly wins, # track a live XRController3D parent. Here the parent is just this
# since it runs every physics tick regardless of our _process. That was the # NetPlayer node, not a controller, so left running it fights (and mostly
# "hands stuck near the origin, only occasionally correct" symptom. Nothing # wins, since it runs every physics tick regardless of our own _process)
# else in that script matters here; _controller is always null without a real # against both the local authority's transform copy below and the
# controller ancestor, so the grip animation already no-ops. # replicated values on other peers — the exact "hands stuck near origin,
# only occasionally correct" symptom. Disable it everywhere; nothing else
# in that script matters here since _controller is always null without a
# real controller ancestor (grip/trigger animation already no-ops).
_left_hand.set_physics_process(false) _left_hand.set_physics_process(false)
_right_hand.set_physics_process(false) _right_hand.set_physics_process(false)
if not is_multiplayer_authority(): if is_multiplayer_authority():
set_process(false)
# State that arrived in the spawn packet was applied before these @onready
# references existed, so render it now.
_apply_pose()
return
var origin := get_tree().get_first_node_in_group("local_xr_origin") var origin := get_tree().get_first_node_in_group("local_xr_origin")
if origin: if origin:
_local_camera = origin.get_node_or_null("XRCamera3D") _local_camera = origin.get_node_or_null("XRCamera3D")
_local_left_hand = origin.get_node_or_null("XRControllerLeftHand") _local_left_hand = origin.get_node_or_null("XRControllerLeftHand")
_local_right_hand = origin.get_node_or_null("XRControllerRightHand") _local_right_hand = origin.get_node_or_null("XRControllerRightHand")
# Every peer's rig is baked at the same spot, so spread joiners along X # Every peer's rig is baked at the same spot in the scene; spread
# rather than starting them stacked on top of each other. ENet peer ids # joiners out along X so they don't start stacked on top of each
# are large effectively-random 32-bit numbers, so this has to be bounded # other. Peer ids from ENet are large effectively-random 32-bit
# AND kept well inside the floor's footprint — an earlier version used up # numbers, so this must be bounded, AND kept well within the
# to 12 units and could drop a joining player off the edge. # floor's actual footprint (15x15, so ~7.5 units from center) —
# a previous version used up to 12 units and could place a
# joining player off the edge of the floor.
var peer_id := str(name).to_int() var peer_id := str(name).to_int()
if peer_id != 1: if peer_id != 1:
var slot := absi(peer_id) % 4 var slot := absi(peer_id) % 4
origin.position += Vector3((slot - 1.5) * 1.2, 0, 0) origin.position += Vector3((slot - 1.5) * 1.2, 0, 0)
# Don't render your own floating head and hands from the inside. # Don't render your own floating head/hands from the inside.
_head.visible = false _head.visible = false
_left_hand.visible = false _left_hand.visible = false
_right_hand.visible = false _right_hand.visible = false
else:
set_process(false)
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
if _local_camera: if _local_camera:
head_xform = _local_camera.global_transform _head.global_transform = _local_camera.global_transform
if _local_left_hand: if _local_left_hand:
left_xform = _local_left_hand.global_transform _left_hand.global_transform = _local_left_hand.global_transform
if _local_right_hand: if _local_right_hand:
right_xform = _local_right_hand.global_transform _right_hand.global_transform = _local_right_hand.global_transform
# The setters are null-guarded because a spawn-replicated property fires its
# setter BEFORE the node is in the tree, when @onready references are still null.
func _set_head_xform(value: Transform3D) -> void:
head_xform = value
if _head:
_head.global_transform = value
func _set_left_xform(value: Transform3D) -> void:
left_xform = value
if _left_hand:
_left_hand.global_transform = value
func _set_right_xform(value: Transform3D) -> void:
right_xform = value
if _right_hand:
_right_hand.global_transform = value
func _apply_pose() -> void:
_head.global_transform = head_xform
_left_hand.global_transform = left_xform
_right_hand.global_transform = right_xform
+30 -6
View File
@@ -1,6 +1,6 @@
[gd_scene load_steps=4 format=3] [gd_scene format=3 uid="uid://c58ns7csdahjy"]
[ext_resource type="Script" path="res://Player/net_player.gd" id="1_np001"] [ext_resource type="Script" uid="uid://bncuxh7j7ix5q" path="res://Player/net_player.gd" id="1_np001"]
[ext_resource type="PackedScene" uid="uid://bq86r4yll8po" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/left_fullglove_low.tscn" id="2_np002"] [ext_resource type="PackedScene" uid="uid://bq86r4yll8po" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/left_fullglove_low.tscn" id="2_np002"]
[ext_resource type="PackedScene" uid="uid://xqimcf20s2jp" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/right_fullglove_low.tscn" id="3_np003"] [ext_resource type="PackedScene" uid="uid://xqimcf20s2jp" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/right_fullglove_low.tscn" id="3_np003"]
@@ -8,12 +8,36 @@
radius = 0.09 radius = 0.09
height = 0.22 height = 0.22
[node name="NetPlayer" type="Node3D"] [sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np005"]
properties/0/path = NodePath("Head:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("Head:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("LeftHand:position")
properties/2/spawn = false
properties/2/replication_mode = 1
properties/3/path = NodePath("LeftHand:quaternion")
properties/3/spawn = false
properties/3/replication_mode = 1
properties/4/path = NodePath("RightHand:position")
properties/4/spawn = false
properties/4/replication_mode = 1
properties/5/path = NodePath("RightHand:quaternion")
properties/5/spawn = false
properties/5/replication_mode = 1
[node name="NetPlayer" type="Node3D" unique_id=70287099]
script = ExtResource("1_np001") script = ExtResource("1_np001")
[node name="Head" type="MeshInstance3D" parent="."] [node name="Head" type="MeshInstance3D" parent="." unique_id=56588259]
mesh = SubResource("CapsuleMesh_np004") mesh = SubResource("CapsuleMesh_np004")
[node name="LeftHand" parent="." instance=ExtResource("2_np002")] [node name="LeftHand" parent="." unique_id=1703673184 instance=ExtResource("2_np002")]
[node name="RightHand" parent="." instance=ExtResource("3_np003")] [node name="RightHand" parent="." unique_id=325341465 instance=ExtResource("3_np003")]
[node name="Sync" type="MultiplayerSynchronizer" parent="." unique_id=529459963]
replication_interval = 0.033
replication_config = SubResource("SceneReplicationConfig_np005")
+14
View File
@@ -0,0 +1,14 @@
extends Node
func _ready() -> void:
$"..".visible = false
# Listen for the game over signal from GameManager
Signals.game_state_changed.connect(_on_game_state_changed)
func _on_game_state_changed(new_state: GameManager.GameState) -> void:
if new_state == GameManager.GameState.GAME_OVER:
$"..".visible = true
else:
$"..".visible = false
+214
View File
@@ -0,0 +1,214 @@
[gd_scene format=3 uid="uid://j5s5wus7tuhb"]
[ext_resource type="PackedScene" uid="uid://bq86r4yll8po" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/left_fullglove_low.tscn" id="1_jr1t4"]
[ext_resource type="PackedScene" uid="uid://xqimcf20s2jp" path="res://addons/godot-xr-tools/hands/scenes/lowpoly/right_fullglove_low.tscn" id="2_gshht"]
[ext_resource type="PackedScene" uid="uid://bl2nuu3qhlb5k" path="res://addons/godot-xr-tools/functions/movement_direct.tscn" id="2_q1xvu"]
[ext_resource type="PackedScene" uid="uid://b4ysuy43poobf" path="res://addons/godot-xr-tools/functions/function_pickup.tscn" id="3_rd8py"]
[ext_resource type="PackedScene" uid="uid://diyu06cw06syv" path="res://addons/godot-xr-tools/player/player_body.tscn" id="4_6xr3x"]
[ext_resource type="PackedScene" uid="uid://b6bk2pj8vbj28" path="res://addons/godot-xr-tools/functions/movement_turn.tscn" id="4_rd8py"]
[ext_resource type="PackedScene" uid="uid://cmxe1av5nsxyq" path="res://UI/shop_menu_3d.tscn" id="5_7rrtu"]
[ext_resource type="PackedScene" uid="uid://cqhw276realc" path="res://addons/godot-xr-tools/functions/function_pointer.tscn" id="6_ptr"]
[ext_resource type="PackedScene" uid="uid://bjcxf427un2wp" path="res://addons/godot-xr-tools/player/poke/poke.tscn" id="7_1fmci"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1fmci"]
animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_itrmp"]
animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_nrfrd"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Little_Distal_L", "Armature/Skeleton3D:Little_Intermediate_L", "Armature/Skeleton3D:Little_Metacarpal_L", "Armature/Skeleton3D:Little_Proximal_L", "Armature/Skeleton3D:Middle_Distal_L", "Armature/Skeleton3D:Middle_Intermediate_L", "Armature/Skeleton3D:Middle_Metacarpal_L", "Armature/Skeleton3D:Middle_Proximal_L", "Armature/Skeleton3D:Ring_Distal_L", "Armature/Skeleton3D:Ring_Intermediate_L", "Armature/Skeleton3D:Ring_Metacarpal_L", "Armature/Skeleton3D:Ring_Proximal_L", "Armature/Skeleton3D:Thumb_Distal_L", "Armature/Skeleton3D:Thumb_Metacarpal_L", "Armature/Skeleton3D:Thumb_Proximal_L", "Armature/Skeleton:Little_Distal_L", "Armature/Skeleton:Little_Intermediate_L", "Armature/Skeleton:Little_Proximal_L", "Armature/Skeleton:Middle_Distal_L", "Armature/Skeleton:Middle_Intermediate_L", "Armature/Skeleton:Middle_Proximal_L", "Armature/Skeleton:Ring_Distal_L", "Armature/Skeleton:Ring_Intermediate_L", "Armature/Skeleton:Ring_Proximal_L", "Armature/Skeleton:Thumb_Distal_L", "Armature/Skeleton:Thumb_Proximal_L"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_73fu8"]
animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_ouruy"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Index_Distal_L", "Armature/Skeleton3D:Index_Intermediate_L", "Armature/Skeleton3D:Index_Metacarpal_L", "Armature/Skeleton3D:Index_Proximal_L", "Armature/Skeleton:Index_Distal_L", "Armature/Skeleton:Index_Intermediate_L", "Armature/Skeleton:Index_Proximal_L"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_i0gvw"]
graph_offset = Vector2(-536, 11)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_1fmci")
nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_itrmp")
nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_nrfrd")
nodes/Grip/position = Vector2(0, 20)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_73fu8")
nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_ouruy")
nodes/Trigger/position = Vector2(-360, 20)
node_connections = [&"output", 0, &"Grip", &"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_1fmci"]
transparency = 1
albedo_color = Color(1, 1, 1, 0.5882353)
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_5mmou"]
animation = &"Grip"
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_yfij0"]
animation = &"Grip"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_2ebvs"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Little_Distal_R", "Armature/Skeleton3D:Little_Intermediate_R", "Armature/Skeleton3D:Little_Metacarpal_R", "Armature/Skeleton3D:Little_Proximal_R", "Armature/Skeleton3D:Middle_Distal_R", "Armature/Skeleton3D:Middle_Intermediate_R", "Armature/Skeleton3D:Middle_Metacarpal_R", "Armature/Skeleton3D:Middle_Proximal_R", "Armature/Skeleton3D:Ring_Distal_R", "Armature/Skeleton3D:Ring_Intermediate_R", "Armature/Skeleton3D:Ring_Metacarpal_R", "Armature/Skeleton3D:Ring_Proximal_R", "Armature/Skeleton3D:Thumb_Distal_R", "Armature/Skeleton3D:Thumb_Metacarpal_R", "Armature/Skeleton3D:Thumb_Proximal_R", "Armature/Skeleton:Little_Distal_R", "Armature/Skeleton:Little_Intermediate_R", "Armature/Skeleton:Little_Proximal_R", "Armature/Skeleton:Middle_Distal_R", "Armature/Skeleton:Middle_Intermediate_R", "Armature/Skeleton:Middle_Proximal_R", "Armature/Skeleton:Ring_Distal_R", "Armature/Skeleton:Ring_Intermediate_R", "Armature/Skeleton:Ring_Proximal_R", "Armature/Skeleton:Thumb_Distal_R", "Armature/Skeleton:Thumb_Proximal_R"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_l8v2a"]
animation = &"Grip 5"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_qpjda"]
filter_enabled = true
filters = ["Armature/Skeleton3D:Index_Distal_R", "Armature/Skeleton3D:Index_Intermediate_R", "Armature/Skeleton3D:Index_Metacarpal_R", "Armature/Skeleton3D:Index_Proximal_R", "Armature/Skeleton:Index_Distal_R", "Armature/Skeleton:Index_Intermediate_R", "Armature/Skeleton:Index_Proximal_R"]
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_37hbl"]
graph_offset = Vector2(-552.664, 107.301)
nodes/ClosedHand1/node = SubResource("AnimationNodeAnimation_5mmou")
nodes/ClosedHand1/position = Vector2(-600, 300)
nodes/ClosedHand2/node = SubResource("AnimationNodeAnimation_yfij0")
nodes/ClosedHand2/position = Vector2(-360, 300)
nodes/Grip/node = SubResource("AnimationNodeBlend2_2ebvs")
nodes/Grip/position = Vector2(0, 40)
nodes/OpenHand/node = SubResource("AnimationNodeAnimation_l8v2a")
nodes/OpenHand/position = Vector2(-600, 100)
nodes/Trigger/node = SubResource("AnimationNodeBlend2_qpjda")
nodes/Trigger/position = Vector2(-360, 40)
node_connections = [&"output", 0, &"Grip", &"Grip", 0, &"Trigger", &"Grip", 1, &"ClosedHand2", &"Trigger", 0, &"OpenHand", &"Trigger", 1, &"ClosedHand1"]
[node name="XROrigin3D" type="XROrigin3D" unique_id=2055526621]
[node name="XRCamera3D" type="XRCamera3D" parent="." unique_id=983614103]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.49626195, 0)
[node name="XRControllerLeftHand" type="XRController3D" parent="." unique_id=1171100950]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 0, 0)
tracker = &"left_hand"
[node name="LeftHand" parent="XRControllerLeftHand" unique_id=1805508372 instance=ExtResource("1_jr1t4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.009340696, -0.0074635968, 0.024033919)
[node name="Hand_low_L" parent="XRControllerLeftHand/LeftHand" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.01, 0, 0.05)
[node name="Skeleton3D" parent="XRControllerLeftHand/LeftHand/Hand_low_L/Armature" index="0" unique_id=242151480]
bones/1/rotation = Quaternion(0.323537, -2.5658142e-05, -0.027220426, 0.9458239)
bones/2/rotation = Quaternion(-0.09044407, -0.04151748, -0.16629349, 0.98104167)
bones/3/rotation = Quaternion(-0.04661986, 0.02097099, 0.010327632, 0.9986392)
bones/5/rotation = Quaternion(-0.0012845465, -0.011608094, -0.016825877, 0.99979025)
bones/6/rotation = Quaternion(0.10292491, -0.009932083, -0.007944166, 0.9946078)
bones/7/rotation = Quaternion(-0.012859, -0.023610815, -0.32325828, 0.9459289)
bones/8/rotation = Quaternion(0.012057539, -0.009291937, -0.24747224, 0.96877545)
bones/10/rotation = Quaternion(-0.035753887, -0.0004000325, 0.0063676415, 0.9993403)
bones/11/rotation = Quaternion(-0.0026496367, -0.0011447113, -0.12599176, 0.9920271)
bones/12/rotation = Quaternion(0.039422527, 0.0019339261, -0.22807404, 0.97284347)
bones/13/rotation = Quaternion(-0.012339468, -0.008812943, -0.28066906, 0.9596848)
bones/15/rotation = Quaternion(-0.070265576, 0.010190836, -0.024330735, 0.9971795)
bones/16/rotation = Quaternion(-0.032063447, -0.002236244, -0.06863657, 0.99712384)
bones/17/rotation = Quaternion(0.025345208, 0.008124622, -0.2490055, 0.9681363)
bones/18/rotation = Quaternion(0.0025223217, 0.007880732, -0.2432038, 0.9699399)
bones/20/rotation = Quaternion(-0.09173688, 0.020302717, -0.010182976, 0.9955242)
bones/21/rotation = Quaternion(-0.06251818, -0.00022572002, -0.115392834, 0.99135065)
bones/22/rotation = Quaternion(0.058578636, 0.021648303, -0.26990518, 0.9608596)
bones/23/rotation = Quaternion(0.006871769, -0.0035727466, -0.21195254, 0.97724926)
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XRControllerLeftHand/LeftHand/Hand_low_L/Armature/Skeleton3D" index="1" unique_id=774348011]
transform = Transform3D(0.5408296, 0.8408128, -0.023173608, -0.08262672, 0.08052427, 0.99332196, 0.83706397, -0.5353032, 0.11302349, 0.039901964, 0.040282845, -0.15009598)
bone_name = "Index_Tip_L"
bone_idx = 9
[node name="Poke" parent="XRControllerLeftHand/LeftHand/Hand_low_L/Armature/Skeleton3D/BoneAttachment3D" unique_id=259928841 instance=ExtResource("7_1fmci")]
[node name="AnimationTree" parent="XRControllerLeftHand/LeftHand" index="1"]
tree_root = SubResource("AnimationNodeBlendTree_i0gvw")
[node name="MovementDirect" parent="XRControllerLeftHand" unique_id=1865515938 instance=ExtResource("2_q1xvu")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.009340696, -0.0074635968, 0.024033919)
strafe = true
[node name="FunctionPickup" parent="XRControllerLeftHand" unique_id=2133415351 instance=ExtResource("3_rd8py")]
grab_collision_mask = 327748
[node name="FunctionPointer" parent="XRControllerLeftHand" unique_id=315304316 instance=ExtResource("6_ptr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.02, 0.05, -0.1)
show_laser = 2
laser_length = 1
laser_material = SubResource("StandardMaterial3D_1fmci")
laser_hit_material = SubResource("StandardMaterial3D_1fmci")
show_target = true
target_radius = 0.009
target_material = SubResource("StandardMaterial3D_1fmci")
[node name="ShopMenu3D" parent="XRControllerLeftHand" unique_id=331240263 instance=ExtResource("5_7rrtu")]
transform = Transform3D(0.17921828, 0.016751308, -0.00045015282, -0.0125175975, 0.13704088, 0.116030626, 0.011140855, -0.11549542, 0.13761066, 0.27515364, 0.031010807, -0.013297826)
[node name="XRControllerRightHand" type="XRController3D" parent="." unique_id=202756852]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0)
tracker = &"right_hand"
[node name="RightHand" parent="XRControllerRightHand" unique_id=1112462503 instance=ExtResource("2_gshht")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0074635968, 0.024033919)
[node name="Hand_low_R" parent="XRControllerRightHand/RightHand" index="0"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.01, 0, 0.05)
[node name="Skeleton3D" parent="XRControllerRightHand/RightHand/Hand_low_R/Armature" index="0" unique_id=976194013]
bones/1/rotation = Quaternion(0.323537, 2.5658142e-05, 0.027220426, 0.9458239)
bones/2/rotation = Quaternion(-0.09044407, 0.04151748, 0.16629349, 0.98104167)
bones/3/rotation = Quaternion(-0.04661986, -0.020970985, -0.010327632, 0.9986392)
bones/5/rotation = Quaternion(-0.0012845465, 0.011608096, 0.01682588, 0.99979025)
bones/6/rotation = Quaternion(0.10292492, 0.009932085, 0.007944188, 0.9946078)
bones/7/rotation = Quaternion(-0.012859004, 0.023610815, 0.32325834, 0.94592875)
bones/8/rotation = Quaternion(0.012057537, 0.0092919255, 0.24747224, 0.96877545)
bones/10/rotation = Quaternion(-0.035753887, 0.00040003238, -0.0063676336, 0.9993403)
bones/11/rotation = Quaternion(-0.0026496367, 0.0011447114, 0.1259918, 0.9920271)
bones/12/rotation = Quaternion(0.03942253, -0.0019339275, 0.2280741, 0.97284347)
bones/13/rotation = Quaternion(-0.012339467, 0.008812944, 0.28066906, 0.9596848)
bones/15/rotation = Quaternion(-0.07026557, -0.010190836, 0.024330745, 0.99717957)
bones/16/rotation = Quaternion(-0.032063447, 0.002236245, 0.06863657, 0.99712384)
bones/17/rotation = Quaternion(0.025345206, -0.00812462, 0.24900547, 0.9681363)
bones/18/rotation = Quaternion(0.0025223275, -0.007880732, 0.24320383, 0.9699399)
bones/20/rotation = Quaternion(-0.09173688, -0.020302719, 0.010182976, 0.9955242)
bones/21/rotation = Quaternion(-0.06251817, 0.00022572096, 0.115392834, 0.99135065)
bones/22/rotation = Quaternion(0.058578644, -0.021648303, 0.26990518, 0.9608596)
bones/23/rotation = Quaternion(0.0068717655, 0.0035727452, 0.21195254, 0.97724926)
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="XRControllerRightHand/RightHand/Hand_low_R/Armature/Skeleton3D" index="1" unique_id=497290142]
transform = Transform3D(0.5408295, -0.8408129, 0.023173586, 0.08262676, 0.08052423, 0.99332196, -0.83706397, -0.53530306, 0.11302352, -0.03990197, 0.040282845, -0.15009597)
bone_name = "Index_Tip_R"
bone_idx = 9
[node name="Poke" parent="XRControllerRightHand/RightHand/Hand_low_R/Armature/Skeleton3D/BoneAttachment3D" unique_id=303927399 instance=ExtResource("7_1fmci")]
[node name="AnimationTree" parent="XRControllerRightHand/RightHand" index="1"]
tree_root = SubResource("AnimationNodeBlendTree_37hbl")
[node name="MovementTurn" parent="XRControllerRightHand" unique_id=154529119 instance=ExtResource("4_rd8py")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0074635968, 0.024033919)
turn_mode = 2
smooth_turn_speed = 3.5
[node name="FunctionPickup" parent="XRControllerRightHand" unique_id=1876210450 instance=ExtResource("3_rd8py")]
grab_collision_mask = 327748
[node name="FunctionPointer" parent="XRControllerRightHand" unique_id=2017919314 instance=ExtResource("6_ptr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.02, 0.05, -0.1)
show_laser = 2
laser_length = 1
laser_material = SubResource("StandardMaterial3D_1fmci")
laser_hit_material = SubResource("StandardMaterial3D_1fmci")
show_target = true
target_radius = 0.009
target_material = SubResource("StandardMaterial3D_1fmci")
[node name="ShopMenu3D" parent="XRControllerRightHand" unique_id=246744456 instance=ExtResource("5_7rrtu")]
transform = Transform3D(0.17912053, -0.017761359, -0.0006130421, 0.014117808, 0.138435, 0.11417722, -0.010794867, -0.11366743, 0.13915166, -0.11845571, 0.038174443, -0.038154215)
[node name="PlayerBody" parent="." unique_id=1444632058 instance=ExtResource("4_6xr3x")]
collision_mask = 1017
player_calibrate_height = false
[editable path="XRControllerLeftHand/LeftHand"]
[editable path="XRControllerLeftHand/LeftHand/Hand_low_L"]
[editable path="XRControllerRightHand/RightHand"]
[editable path="XRControllerRightHand/RightHand/Hand_low_R"]
+37
View File
@@ -0,0 +1,37 @@
extends Node
class_name BuildModeController
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
Signals.game_state_changed.connect(_on_game_state_changed)
func _on_game_state_changed(new_state: GameManager.GameState) -> void:
SweetLogger.info("game_state_changed to {0}", [GameManager.GameState.keys()[new_state]], "build_mode_controller.gd", "_on_game_state_changed")
if new_state == GameManager.GameState.BUILDING:
despawn_unheld_pickables()
# Despawn all food_items unless it's in a "persistent_inventory" snap_zone
func despawn_unheld_pickables():
var root = get_tree().get_root()
var pickables: Array[Node] = []
_collect_pickables(root, pickables)
for pickable in pickables:
if not Helper.find_food_item(pickable):
continue
var held_by: Node = pickable.get_picked_up_by()
if not held_by:
NetworkManager.despawn_item(pickable)
continue
if not held_by.is_in_group("persistent_inventory"):
SweetLogger.debug("despawn_unheld_pickables held_by: {0}, pickable: {1}", [held_by, pickable])
NetworkManager.despawn_item(pickable)
func _collect_pickables(node: Node, out_array: Array) -> void:
if node is XRToolsPickable:
out_array.append(node)
for child in node.get_children():
if child is Node:
_collect_pickables(child, out_array)
+1
View File
@@ -0,0 +1 @@
uid://bsdpd18i1i17s
+6
View File
@@ -0,0 +1,6 @@
[gd_scene format=3 uid="uid://bnwb7imcotkod"]
[ext_resource type="Script" uid="uid://bsdpd18i1i17s" path="res://prefabs/build_mode_controller.gd" id="1_7i0c4"]
[node name="BuildModeController" type="Node" unique_id=552013109]
script = ExtResource("1_7i0c4")
+9 -21
View File
@@ -1,8 +1,6 @@
class_name CombinableItem class_name CombinableItem
extends Node extends Node
const RECIPE_MANAGER = preload("res://RecipeManager.gd")
@onready var combine_area_3d: Area3D = $Area3d @onready var combine_area_3d: Area3D = $Area3d
@onready var _pickable: XRToolsPickable = get_parent() as XRToolsPickable @onready var _pickable: XRToolsPickable = get_parent() as XRToolsPickable
@@ -12,7 +10,7 @@ var _food_item: FoodItem
func _ready() -> void: func _ready() -> void:
print("CombinableItem _ready(): ", _pickable.name) SweetLogger.debug("_ready(): {0}", [_pickable.name])
_food_item = get_parent().get_node_or_null("FoodItem") as FoodItem _food_item = get_parent().get_node_or_null("FoodItem") as FoodItem
if not _food_item: if not _food_item:
push_error("CombinableItem is missing FoodItem reference. must be a sibling of a FoodItem on ", get_parent().name, ".") push_error("CombinableItem is missing FoodItem reference. must be a sibling of a FoodItem on ", get_parent().name, ".")
@@ -42,8 +40,8 @@ func _ready() -> void:
# Enable the trigger only while snapped into a snap zone (not hand-held). # Enable the trigger only while snapped into a snap zone (not hand-held).
func _on_item_picked_up(_item: Node3D) -> void: func _on_item_picked_up(_item: Node3D) -> void:
var by := _pickable.get_picked_up_by() var by := _pickable.get_picked_up_by()
var snapped: bool = by != null and by.has_method("is_xr_class") and by.is_xr_class("XRToolsSnapZone") var is_snapped: bool = by != null and by.has_method("is_xr_class") and by.is_xr_class("XRToolsSnapZone")
set_deferred("monitoring", snapped) set_deferred("monitoring", is_snapped)
func _on_item_dropped(_item: Node3D) -> void: func _on_item_dropped(_item: Node3D) -> void:
set_deferred("monitoring", false) set_deferred("monitoring", false)
@@ -54,24 +52,24 @@ func _on_body_entered(body: Node3D) -> void:
if not NetworkManager.owns_world(): if not NetworkManager.owns_world():
return return
if _combining or body == _pickable: if _combining or body == _pickable:
print("CombinableItem _on_body_entered: other is our own pickable") SweetLogger.debug("other is our own pickable")
return return
var other := _find_food_item(body) var other := Helper.find_food_item(body)
if not other: if not other:
print("CombinableItem _on_body_entered: other is not a foodItem") SweetLogger.debug("other is not a foodItem")
return return
var result: PackedScene = RECIPE_MANAGER.get_combination_result(_food_item.id, other.id) var result: PackedScene = RecipeManager.get_combination_result(_food_item.id, other.id)
if not result: if not result:
print("CombinableItem _on_body_entered: There is no recipe for %s + %s" % [_food_item.id, other.id]) SweetLogger.debug("There is no recipe for {0} + {1}", [_food_item.id, other.id])
return return
_combine(body, result) _combine(body, result)
# Instantiate the result of combination and free the two ingredient items # Instantiate the result of combination and free the two ingredient items
func _combine(other_body: Node3D, result: PackedScene) -> void: func _combine(other_body: Node3D, result: PackedScene) -> void:
print("CombinableItem _combine: combining %s + %s into %s" % [_food_item.id, _find_food_item(other_body).id, result.resource_path]) SweetLogger.debug("combining {0} + {1} into {2}", [_food_item.id, Helper.find_food_item(other_body).id, result.resource_path])
# Get Snapzone # Get Snapzone
var snap_zone := _pickable.get_picked_up_by() var snap_zone := _pickable.get_picked_up_by()
@@ -91,13 +89,3 @@ func _combine(other_body: Node3D, result: PackedScene) -> void:
# Snap the result into the now-empty zone. # Snap the result into the now-empty zone.
snap_zone.pick_up_object(result_instance) snap_zone.pick_up_object(result_instance)
# Find a FoodItem among the direct children of [param node].
func _find_food_item(node: Node) -> FoodItem:
if not node:
return null
for child in node.get_children():
if child is FoodItem:
return child
return null
+1 -1
View File
@@ -1,6 +1,6 @@
[gd_scene format=3 uid="uid://3lr2dhy62rhk"] [gd_scene format=3 uid="uid://3lr2dhy62rhk"]
[ext_resource type="Script" uid="uid://dounic663dn5q" path="res://Prefabs/combinable_item.gd" id="1_q21ti"] [ext_resource type="Script" uid="uid://dounic663dn5q" path="res://prefabs/combinable_item.gd" id="1_q21ti"]
[sub_resource type="SphereShape3D" id="SphereShape3D_o1b3t"] [sub_resource type="SphereShape3D" id="SphereShape3D_o1b3t"]
radius = 0.2 radius = 0.2
+2 -2
View File
@@ -1,7 +1,7 @@
[gd_scene format=3 uid="uid://7earnjgdmwgx"] [gd_scene format=3 uid="uid://7earnjgdmwgx"]
[ext_resource type="Script" uid="uid://bs7cxydoxk1cx" path="res://Prefabs/cookable_item.gd" id="1_6hwx6"] [ext_resource type="Script" uid="uid://bs7cxydoxk1cx" path="res://prefabs/cookable_item.gd" id="1_6hwx6"]
[ext_resource type="PackedScene" uid="uid://cucc3gaqu2nab" path="res://Items/Charcoal.tscn" id="2_rpt7j"] [ext_resource type="PackedScene" uid="uid://cucc3gaqu2nab" path="res://items/Charcoal.tscn" id="2_rpt7j"]
[node name="CookableItem" type="Node" unique_id=280820828] [node name="CookableItem" type="Node" unique_id=280820828]
script = ExtResource("1_6hwx6") script = ExtResource("1_6hwx6")
+6
View File
@@ -0,0 +1,6 @@
[gd_scene format=3 uid="uid://dm70ynyuw1a5u"]
[ext_resource type="Script" uid="uid://bbr5arulbeuvq" path="res://scenes/day_controller.gd" id="1_lna8j"]
[node name="DayController" type="Node" unique_id=1418639156]
script = ExtResource("1_lna8j")
+1 -1
View File
@@ -41,7 +41,7 @@ func _process(delta: float) -> void:
# Count down to zero and despawn # Count down to zero and despawn
_time_left -= delta _time_left -= delta
if _time_left <= 0: if _time_left <= 0:
print("DespawningItem despawning!" , get_parent()) SweetLogger.debug("despawning {0}", [get_parent()])
NetworkManager.despawn_item(get_parent()) NetworkManager.despawn_item(get_parent())
# Stop counting: despawn_item() only queues the free, so without this we # Stop counting: despawn_item() only queues the free, so without this we
# keep re-reporting the same item every frame until it actually goes. # keep re-reporting the same item every frame until it actually goes.
+1 -1
View File
@@ -1,6 +1,6 @@
[gd_scene format=3 uid="uid://b5ukku8i0hilb"] [gd_scene format=3 uid="uid://b5ukku8i0hilb"]
[ext_resource type="Script" uid="uid://deyna316ka4xs" path="res://Prefabs/despawning_item.gd" id="1_ayqk8"] [ext_resource type="Script" uid="uid://deyna316ka4xs" path="res://prefabs/despawning_item.gd" id="1_ayqk8"]
[node name="DespawningItem" type="Node" unique_id=303090111] [node name="DespawningItem" type="Node" unique_id=303090111]
script = ExtResource("1_ayqk8") script = ExtResource("1_ayqk8")
+1
View File
@@ -7,3 +7,4 @@ enum Type { MEAL, SIDE, INGREDIENT, NONE }
@export var id: String @export var id: String
@export var type: Type = Type.NONE @export var type: Type = Type.NONE
@export var sell_value = 1 @export var sell_value = 1
var is_absorbed = false # Used by tables to keep track of whether the item has been registered as delivered already
+1 -1
View File
@@ -1,6 +1,6 @@
[gd_scene format=3 uid="uid://bfj80jh13t6e5"] [gd_scene format=3 uid="uid://bfj80jh13t6e5"]
[ext_resource type="Script" uid="uid://5tpoohkopryv" path="res://Prefabs/food_item.gd" id="1_0na5k"] [ext_resource type="Script" uid="uid://5tpoohkopryv" path="res://prefabs/food_item.gd" id="1_0na5k"]
[node name="FoodItem" type="Node" unique_id=63948206] [node name="FoodItem" type="Node" unique_id=63948206]
script = ExtResource("1_0na5k") script = ExtResource("1_0na5k")
+18
View File
@@ -0,0 +1,18 @@
extends Node3D
@export var kitchen_scene: PackedScene
@export var hob_scene: PackedScene
func _ready() -> void:
if not kitchen_scene:
push_error("StationSpawner missing kitchen_scene")
SweetLogger.debug("initializing")
if NetworkManager.owns_world():
SweetLogger.debug("initializing on server")
# Later we will do procedural generation here.
# For now we just load a scene.
NetworkManager.call_deferred("spawn_item", kitchen_scene.resource_path, transform)
+1
View File
@@ -0,0 +1 @@
uid://fyd2rjramhbb
+9
View File
@@ -0,0 +1,9 @@
[gd_scene format=3 uid="uid://t83yi6hxti2x"]
[ext_resource type="Script" uid="uid://fyd2rjramhbb" path="res://prefabs/kitchen_instantiator.gd" id="1_jitfr"]
[ext_resource type="PackedScene" uid="uid://damrxtlt7uswf" path="res://content/station_layouts/small_line.tscn" id="2_3awg0"]
[node name="KitchenInstantiator" type="Node3D" unique_id=291701321]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0, 0, 0)
script = ExtResource("1_jitfr")
kitchen_scene = ExtResource("2_3awg0")
+17 -17
View File
@@ -1,7 +1,7 @@
[gd_scene format=3 uid="uid://22shbqdvnwgo"] [gd_scene format=3 uid="uid://22shbqdvnwgo"]
[ext_resource type="Script" uid="uid://b4ldkd3ngs0vp" path="res://main.gd" id="1_m3h4l"] [ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Net/multiplayer_world.gd" id="1_nlnup"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://XROrigin.tscn" id="2_8pfaf"] [ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://Prefabs/XROrigin.tscn" id="2_8pfaf"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_gatbn"] [ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_gatbn"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="4_3lufs"] [ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="4_3lufs"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="5_kh26v"] [ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="5_kh26v"]
@@ -13,10 +13,10 @@
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://Stations/raw_burger_dispenser.tscn" id="15_m3h4l"] [ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://Stations/raw_burger_dispenser.tscn" id="15_m3h4l"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://Stations/Counter.tscn" id="15_tpcje"] [ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://Stations/Counter.tscn" id="15_tpcje"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://Stations/table.tscn" id="16_g2k6a"] [ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://Stations/table.tscn" id="16_g2k6a"]
[ext_resource type="Script" uid="uid://k8ywnvlhcic4" path="res://Scenes/testworldLoad.gd" id="16_m3h4l"] [ext_resource type="Script" uid="uid://k8ywnvlhcic4" path="res://test/testworldLoad.gd" id="16_m3h4l"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="17_gatbn"] [ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="17_gatbn"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="18_3lufs"] [ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="18_3lufs"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://Scenes/GameOvercontroler.gd" id="19_3lufs"] [ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://Prefabs/GameOvercontroler.gd" id="19_3lufs"]
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"] [sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(16, 0.1, 16) size = Vector3(16, 0.1, 16)
@@ -38,7 +38,8 @@ sdfgi_enabled = true
size = Vector3(16, 10, 0.1) size = Vector3(16, 10, 0.1)
[node name="Main" type="Node3D" unique_id=1312265607] [node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_m3h4l") script = ExtResource("1_nlnup")
populate_from_layout = false
[node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("2_8pfaf")] [node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("2_8pfaf")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0)
@@ -47,8 +48,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.6, 0)
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0) transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="Table" parent="." unique_id=1863572470 instance=ExtResource("16_g2k6a")] [node name="Table" parent="." unique_id=1863572470 instance=ExtResource("16_g2k6a")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 2.739665, 0.47583598, -1.1895752) transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 2.739665, -0.023897558, -1.1895752)
primary_duration = 35.0
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514] [node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
@@ -64,10 +64,10 @@ mesh = SubResource("BoxMesh_24d3s")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -1.2)
[node name="Hob2" parent="." unique_id=496572049 instance=ExtResource("4_3lufs")] [node name="Hob2" parent="." unique_id=496572049 instance=ExtResource("4_3lufs")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 0.00026646256, -1.2)
[node name="Hob3" parent="." unique_id=421567982 instance=ExtResource("4_3lufs")] [node name="Hob3" parent="." unique_id=421567982 instance=ExtResource("4_3lufs")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0.00026646256, -1.2)
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250] [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1") environment = SubResource("Environment_bvwq1")
@@ -76,31 +76,31 @@ environment = SubResource("Environment_bvwq1")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0.015, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0.015, -1.2)
[node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("12_ah4xa")] [node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("12_ah4xa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5997182, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5997182, 0.00026646256, -1.2)
[node name="Sink2" parent="." unique_id=1692612192 instance=ExtResource("12_ah4xa")] [node name="Sink2" parent="." unique_id=1692612192 instance=ExtResource("12_ah4xa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1997182, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1997182, 0.00026646256, -1.2)
[node name="DirtStation" parent="." unique_id=160842153 instance=ExtResource("13_46xi2")] [node name="DirtStation" parent="." unique_id=160842153 instance=ExtResource("13_46xi2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0.5, -1.2) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0.5, -1.2)
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_tpcje")] [node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_tpcje")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.5, -0.6) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.00026646256, -0.6)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_tpcje")] [node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_tpcje")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.5, 0) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.00026646256, 0)
[node name="Counter4" parent="." unique_id=906748771 instance=ExtResource("15_tpcje")] [node name="Counter4" parent="." unique_id=906748771 instance=ExtResource("15_tpcje")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.5, 0.6) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.8, 0.00026646256, 0.6)
[node name="Counter5" parent="." unique_id=1487893288 instance=ExtResource("15_tpcje")] [node name="Counter5" parent="." unique_id=1487893288 instance=ExtResource("15_tpcje")]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, -0.6, 0.5, 1.2) transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, -0.6, 0.00026646256, 1.2)
[node name="Counter6" parent="." unique_id=1154936647 instance=ExtResource("15_tpcje")] [node name="Counter6" parent="." unique_id=1154936647 instance=ExtResource("15_tpcje")]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0.5, 1.2) transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0.00026646256, 1.2)
[node name="Counter7" parent="." unique_id=990260272 instance=ExtResource("15_tpcje")] [node name="Counter7" parent="." unique_id=990260272 instance=ExtResource("15_tpcje")]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.6, 0.5, 1.2) transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0.6, 0.00026646256, 1.2)
[node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=315740174] [node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=315740174]
-11
View File
@@ -1,11 +0,0 @@
extends Node
func _ready() -> void:
$"..".visible = false
# Listen for the game over signal from GameManager
Signals.game_over.connect(_on_game_over)
func _on_game_over() -> void:
$"..".visible = true
+382 -56
View File
@@ -1,21 +1,27 @@
[gd_scene format=3 uid="uid://do6mrslyqe5qe"] [gd_scene format=3 uid="uid://do6mrslyqe5qe"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Scenes/multiplayer_world.gd" id="1_57ppd"] [ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Net/multiplayer_world.gd" id="1_57ppd"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://XROrigin.tscn" id="2_o1b3t"] [ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_o1b3t"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_irf4n"] [ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_irf4n"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="4_ctden"] [ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"] [ext_resource type="PackedScene" uid="uid://q37nqadkibbp" path="res://environment/door.tscn" id="10_l51r2"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://Stations/BurgerBunsDispenser.tscn" id="9_sq0s2"] [ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="11_c8vo7"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://Stations/raw_burger_dispenser.tscn" id="11_ctden"] [ext_resource type="PackedScene" uid="uid://da6yrsnxvsrif" path="res://environment/wall.tscn" id="11_slo47"]
[ext_resource type="PackedScene" uid="uid://bbg7dwsbxxh1t" path="res://Scenes/cube_side_dispense.tscn" id="12_57ppd"] [ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="12_1f3bw"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://Stations/plate_dispenser.tscn" id="13_irf4n"] [ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="12_dpf3b"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://Stations/sink.tscn" id="13_o1b3t"] [ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="13_1f3bw"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="13_yjosk"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="14_2ndvi"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"] [ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"]
[ext_resource type="PackedScene" uid="uid://cnjwtnhwh0i8q" path="res://Stations/dirt_station.tscn" id="14_irf4n"] [ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://Stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"] [ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://Stations/table.tscn" id="16_di04w"] [ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="15_qxyk8"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://Scenes/GameOvercontroler.gd" id="16_n8fyw"] [ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://prefabs/GameOvercontroler.gd" id="16_n8fyw"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="16_u5c1m"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="17_y7baw"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="18_wvcs1"]
[ext_resource type="PackedScene" uid="uid://duwrbvwcqcuk3" path="res://items/chips.tscn" id="22_2ndvi"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="23_qxyk8"]
[sub_resource type="Environment" id="Environment_bvwq1"] [sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2 background_mode = 2
@@ -39,6 +45,24 @@ size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"] [sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1) size = Vector3(20, 10, 0.1)
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlqg6"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.35, 0.12250001, 0.12250001, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector2(6, 10)
center_offset = Vector3(3, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yqrpd"]
albedo_color = Color(0.35, 0.35, 0.35, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_kk3mq"]
material = SubResource("StandardMaterial3D_yqrpd")
size = Vector2(6, 10)
center_offset = Vector3(-3, 0, 0)
[node name="Main" type="Node3D" unique_id=1312265607] [node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_57ppd") script = ExtResource("1_57ppd")
@@ -46,16 +70,20 @@ script = ExtResource("1_57ppd")
environment = SubResource("Environment_bvwq1") environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")] [node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9667189, 0) transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, -2.4543328, 1.247834, 4.698895)
[node name="WorldContent" type="Node3D" parent="." unique_id=262398468] [node name="WorldContent" type="Node3D" parent="." unique_id=262398468]
[node name="Players" type="Node3D" parent="." unique_id=1772076868] [node name="Players" type="Node3D" parent="." unique_id=1772076868]
[node name="Stations" type="Node3D" parent="." unique_id=730717613]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581] [node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581]
spawn_path = NodePath("../WorldContent") spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427] [node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players") spawn_path = NodePath("../Players")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
@@ -68,7 +96,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
shape = SubResource("BoxShape3D_vlqg6") shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056] [node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00018164515, 0.0006352663, -0.002532661) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.001, -0.003)
mesh = SubResource("BoxMesh_24d3s") mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174] [node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
@@ -89,45 +117,8 @@ shape = SubResource("BoxShape3D_24d3s")
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023) transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s") shape = SubResource("BoxShape3D_24d3s")
[node name="Table" parent="." unique_id=1863572470 instance=ExtResource("16_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 3.6294794, 0.54177135, 0.0973109)
primary_duration = 35.0
[node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("4_ctden")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.35077858, 0.50655985, -1.2833805)
[node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("13_o1b3t")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.24685252, 0.51461196, -1.2828919)
[node name="DirtStation" parent="." unique_id=160842153 instance=ExtResource("14_irf4n")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.7978771, 0.50655985, -1.2598276)
[node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.94890714, 0.5115015, -1.3041471)
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5477214, 0.5115016, -0.1103079)
[node name="Counter4" parent="." unique_id=1748373996 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5477214, 0.5115016, -0.70863545)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.5477214, 0.5115016, 0.49258912)
[node name="Counter5" parent="Counter3" unique_id=200341072 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 4.371139e-08, 0, 1, 0, -4.371139e-08, 0, -1, -0.12681937, 2.3841858e-07, 3.538899)
[node name="BurgerBunsDispenser" parent="." unique_id=1720683779 instance=ExtResource("9_sq0s2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5242664, 0.008738995, 1.1073059)
[node name="RawBurgerDispenser" parent="." unique_id=235630131 instance=ExtResource("11_ctden")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.8896122, 0.008738995, 1.0872328)
[node name="PlateDispenser" parent="." unique_id=710538846 instance=ExtResource("13_irf4n")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.26631236, 0.008738995, 1.087036)
[node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")] [node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -2.0281777, 2.8122003, 0) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("15_eoxxy") scene = ExtResource("15_eoxxy")
viewport_size = Vector2(900, 600) viewport_size = Vector2(900, 600)
transparent = 0 transparent = 0
@@ -137,5 +128,340 @@ scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176] [node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176]
script = ExtResource("16_n8fyw") script = ExtResource("16_n8fyw")
[node name="CubeSideDispenser2" parent="." unique_id=200950572 instance=ExtResource("12_57ppd")] [node name="Resturant" type="Node3D" parent="." unique_id=1083608050]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.35154933, 0, 1.1119425) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6212463e-05, -0.010500789, 0.0014204979)
[node name="StaticBody3D" type="StaticBody3D" parent="Resturant" unique_id=1814285538]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Resturant/StaticBody3D" unique_id=1661443874]
shape = SubResource("WorldBoundaryShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Resturant" unique_id=888732490]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_vlqg6")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Resturant" unique_id=836421800]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_kk3mq")
[node name="Door" parent="Resturant" unique_id=964400290 instance=ExtResource("10_l51r2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 0)
[node name="Walls" type="Node3D" parent="Resturant" unique_id=1804204696]
[node name="Wall" parent="Resturant/Walls" unique_id=434181749 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6000001, 0, 0)
[node name="Wall2" parent="Resturant/Walls" unique_id=1183111925 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 0)
[node name="Wall3" parent="Resturant/Walls" unique_id=1561473949 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 0)
[node name="Wall4" parent="Resturant/Walls" unique_id=1593528497 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 0)
[node name="Wall5" parent="Resturant/Walls" unique_id=2071060763 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 0)
[node name="Wall6" parent="Resturant/Walls" unique_id=1607012472 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 0)
[node name="Wall7" parent="Resturant/Walls" unique_id=990512055 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 0)
[node name="Wall8" parent="Resturant/Walls" unique_id=751907897 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.200001, 0, 0)
[node name="Wall9" parent="Resturant/Walls" unique_id=358743133 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000004, 0, 0)
[node name="Wall10" parent="Resturant/Walls" unique_id=1374842161 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 0)
[node name="Wall11" parent="Resturant/Walls" unique_id=1408132826 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 0)
[node name="Wall12" parent="Resturant/Walls" unique_id=1937209307 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, -6)
[node name="Wall13" parent="Resturant/Walls" unique_id=1714975985 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, -6)
[node name="Wall14" parent="Resturant/Walls" unique_id=1732121903 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, -6)
[node name="Wall15" parent="Resturant/Walls" unique_id=1311494308 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, -6)
[node name="Wall16" parent="Resturant/Walls" unique_id=364484178 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, -6)
[node name="Wall17" parent="Resturant/Walls" unique_id=485501605 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, -6)
[node name="Wall18" parent="Resturant/Walls" unique_id=378206350 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, -6)
[node name="Wall19" parent="Resturant/Walls" unique_id=294380188 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -6)
[node name="Wall20" parent="Resturant/Walls" unique_id=1122365254 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, -6)
[node name="Wall21" parent="Resturant/Walls" unique_id=111446334 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, -6)
[node name="Wall22" parent="Resturant/Walls" unique_id=999769595 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, -6)
[node name="Wall23" parent="Resturant/Walls" unique_id=1832835858 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, -6)
[node name="Wall24" parent="Resturant/Walls" unique_id=927052367 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, -6)
[node name="Wall25" parent="Resturant/Walls" unique_id=1163278593 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, -6)
[node name="Wall26" parent="Resturant/Walls" unique_id=1074868471 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -6)
[node name="Wall27" parent="Resturant/Walls" unique_id=510219954 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, -6)
[node name="Wall28" parent="Resturant/Walls" unique_id=1615161517 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, -6)
[node name="Wall29" parent="Resturant/Walls" unique_id=11605666 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 6)
[node name="Wall30" parent="Resturant/Walls" unique_id=2032513926 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 6)
[node name="Wall31" parent="Resturant/Walls" unique_id=1308803807 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 6)
[node name="Wall32" parent="Resturant/Walls" unique_id=493869823 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 6)
[node name="Wall33" parent="Resturant/Walls" unique_id=699535234 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 6)
[node name="Wall34" parent="Resturant/Walls" unique_id=238973326 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, 6)
[node name="Wall35" parent="Resturant/Walls" unique_id=836717647 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, 6)
[node name="Wall36" parent="Resturant/Walls" unique_id=446988148 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, 6)
[node name="Wall37" parent="Resturant/Walls" unique_id=49950412 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, 6)
[node name="Wall38" parent="Resturant/Walls" unique_id=607255208 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, 6)
[node name="Wall39" parent="Resturant/Walls" unique_id=1089866573 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, 6)
[node name="Wall40" parent="Resturant/Walls" unique_id=2078240231 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, 6)
[node name="Wall41" parent="Resturant/Walls" unique_id=592669722 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 6)
[node name="Wall42" parent="Resturant/Walls" unique_id=1393176200 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, 6)
[node name="Wall43" parent="Resturant/Walls" unique_id=1885346301 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 6)
[node name="Wall44" parent="Resturant/Walls" unique_id=2021916640 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 6)
[node name="Wall45" parent="Resturant/Walls" unique_id=1289086279 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 6)
[node name="Wall46" parent="Resturant/Walls" unique_id=396503450 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.2000003)
[node name="Wall47" parent="Resturant/Walls" unique_id=300373285 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 0.6000004)
[node name="Wall49" parent="Resturant/Walls" unique_id=1072273787 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.8000002)
[node name="Wall50" parent="Resturant/Walls" unique_id=896022741 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 2.4000006)
[node name="Wall51" parent="Resturant/Walls" unique_id=2089599721 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.7999992)
[node name="Wall52" parent="Resturant/Walls" unique_id=965479737 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -2.3999996)
[node name="Wall53" parent="Resturant/Walls" unique_id=43762332 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3)
[node name="Wall54" parent="Resturant/Walls" unique_id=921007094 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.1999998)
[node name="Wall55" parent="Resturant/Walls" unique_id=2144411980 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, -0.5999994)
[node name="Wall56" parent="Resturant/Walls" unique_id=370330637 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.2000003)
[node name="Wall57" parent="Resturant/Walls" unique_id=537562206 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.6000004)
[node name="Wall58" parent="Resturant/Walls" unique_id=1918288432 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.0000002)
[node name="Wall59" parent="Resturant/Walls" unique_id=944759951 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.8000007)
[node name="Wall60" parent="Resturant/Walls" unique_id=1128237563 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 5.4000006)
[node name="Wall61" parent="Resturant/Walls" unique_id=1755969864 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3.5999994)
[node name="Wall62" parent="Resturant/Walls" unique_id=949006312 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.2)
[node name="Wall63" parent="Resturant/Walls" unique_id=1826688195 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.799999)
[node name="Wall64" parent="Resturant/Walls" unique_id=116523059 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -5.3999996)
[node name="Wall65" parent="Resturant/Walls" unique_id=711153775 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.2000003)
[node name="Wall66" parent="Resturant/Walls" unique_id=741047 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 0.6000004)
[node name="Wall67" parent="Resturant/Walls" unique_id=664067327 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.8000002)
[node name="Wall68" parent="Resturant/Walls" unique_id=1294537251 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 2.4000006)
[node name="Wall69" parent="Resturant/Walls" unique_id=1152383 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.7999992)
[node name="Wall70" parent="Resturant/Walls" unique_id=1710172322 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -2.3999996)
[node name="Wall71" parent="Resturant/Walls" unique_id=597518110 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3)
[node name="Wall72" parent="Resturant/Walls" unique_id=1028573693 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.1999998)
[node name="Wall73" parent="Resturant/Walls" unique_id=1232042046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, -0.5999994)
[node name="Wall74" parent="Resturant/Walls" unique_id=1159091046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.2000003)
[node name="Wall75" parent="Resturant/Walls" unique_id=904470924 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.6000004)
[node name="Wall76" parent="Resturant/Walls" unique_id=1709758099 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.0000002)
[node name="Wall77" parent="Resturant/Walls" unique_id=1252446997 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.8000007)
[node name="Wall78" parent="Resturant/Walls" unique_id=1207579491 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 5.4000006)
[node name="Wall79" parent="Resturant/Walls" unique_id=1798073342 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3.5999994)
[node name="Wall80" parent="Resturant/Walls" unique_id=36005990 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.2)
[node name="Wall81" parent="Resturant/Walls" unique_id=79516947 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.799999)
[node name="Wall82" parent="Resturant/Walls" unique_id=1363235805 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -5.3999996)
[node name="Hatches" type="Node3D" parent="Resturant" unique_id=1561045769]
[node name="ServingCounter" parent="Resturant/Hatches" unique_id=1341321603 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter2" parent="Resturant/Hatches" unique_id=1325232371 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0, 0)
[node name="ServingCounter3" parent="Resturant/Hatches" unique_id=539914523 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter4" parent="Resturant/Hatches" unique_id=2078770951 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.4, 0, 0)
[node name="ServingCounter5" parent="Resturant/Hatches" unique_id=2019049083 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
[node name="Table2" parent="Resturant" unique_id=1457688277 instance=ExtResource("13_yjosk")]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0.5999999, -0.035479546, -3)
[node name="Hob" parent="Resturant" unique_id=172418174 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.2000003, 0.024520457, 1.7999992)
[node name="Hob2" parent="Resturant" unique_id=980569400 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.200001, 0.024520457, 1.1999999)
[node name="Counter" parent="Resturant" unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.024520457, 2.3999996)
[node name="Counter2" parent="Resturant" unique_id=5128912 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.024520457, 3)
[node name="Counter3" parent="Resturant" unique_id=1298458612 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.2000003, 0.024520457, 0.5999999)
[node name="Counter4" parent="Resturant" unique_id=1764980142 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.024520457, 2.3999996)
[node name="Counter5" parent="Resturant" unique_id=1015820252 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.024520457, 3)
[node name="PlateDispenser" parent="Resturant" unique_id=710538846 instance=ExtResource("15_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.6)
[node name="Sink" parent="Resturant" unique_id=2055277359 instance=ExtResource("16_u5c1m")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.6, -0.035479546, -0.6)
[node name="Counter6" parent="Resturant" unique_id=2141915043 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 4.7683716e-07, 0.024520457, -0.6000006)
[node name="RawBurgerDispenser" parent="Resturant" unique_id=235630131 instance=ExtResource("17_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2)
[node name="BurgerBunsDispenser" parent="Resturant" unique_id=1720683779 instance=ExtResource("18_wvcs1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.8000001)
[node name="Table3" parent="Resturant" unique_id=1863572470 instance=ExtResource("13_yjosk")]
transform = Transform3D(-1, 0, 2.6226832e-07, 0, 1, 0, -2.6226832e-07, 0, -1, 3, -0.035479546, -3)
[node name="Hamburger" parent="." unique_id=1675596942 instance=ExtResource("11_c8vo7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8000001, -0.6)
[node name="Plate" parent="." unique_id=190487773 instance=ExtResource("12_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3800001, -0.6)
[node name="PickableObject" parent="." unique_id=1084951838 instance=ExtResource("13_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Chips" parent="." unique_id=1028364693 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Knife" parent="." unique_id=1789694138 instance=ExtResource("23_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 3)
+501
View File
@@ -0,0 +1,501 @@
[gd_scene format=3 uid="uid://do6mrslyqe5qe"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://scenes/multiplayer_world.gd" id="1_57ppd"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_o1b3t"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_irf4n"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"]
[ext_resource type="PackedScene" uid="uid://q37nqadkibbp" path="res://scenes/door.tscn" id="10_l51r2"]
[ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="11_c8vo7"]
[ext_resource type="PackedScene" uid="uid://da6yrsnxvsrif" path="res://scenes/wall.tscn" id="11_slo47"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="12_1f3bw"]
[ext_resource type="PackedScene" uid="uid://bbg7dwsbxxh1t" path="res://scenes/cube_side_dispense.tscn" id="12_57ppd"]
[ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="12_dpf3b"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="13_1f3bw"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="13_yjosk"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="14_2ndvi"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="15_qxyk8"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://scenes/GameOvercontroler.gd" id="16_n8fyw"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="16_u5c1m"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="17_y7baw"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="18_wvcs1"]
[ext_resource type="PackedScene" uid="uid://duwrbvwcqcuk3" path="res://items/chips.tscn" id="22_2ndvi"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="23_qxyk8"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="24_u5c1m"]
[ext_resource type="PackedScene" uid="uid://bpvp20hiagxxb" path="res://items/chopped_potato.tscn" id="25_y7baw"]
[sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2
sky = ExtResource("7_n8fyw")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_sky_contribution = 0.9
reflected_light_source = 2
ssr_enabled = true
ssao_enabled = true
ssil_enabled = true
sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_24d3s"]
material = ExtResource("3_irf4n")
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1)
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlqg6"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.35, 0.12250001, 0.12250001, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector2(6, 10)
center_offset = Vector3(3, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yqrpd"]
albedo_color = Color(0.35, 0.35, 0.35, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_kk3mq"]
material = SubResource("StandardMaterial3D_yqrpd")
size = Vector2(6, 10)
center_offset = Vector3(-3, 0, 0)
[node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_57ppd")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -1.8943893, 0.9667189, -4.301105)
[node name="WorldContent" type="Node3D" parent="." unique_id=262398468]
[node name="Players" type="Node3D" parent="." unique_id=1772076868]
[node name="Stations" type="Node3D" parent="." unique_id=730717613]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor" unique_id=958841648]
shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.001, -0.003)
mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls" unique_id=33059670]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, 8.838269)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="InvisibleWalls" unique_id=2018792171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, -10.243342)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="InvisibleWalls" unique_id=757662929]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -9.807113, 4.688614, -0.018813243)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="InvisibleWalls" unique_id=1468386997]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s")
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.6896921)
[node name="Counter4" parent="." unique_id=1748373996 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.0913646)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 2.2925892)
[node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("15_eoxxy")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176]
script = ExtResource("16_n8fyw")
[node name="CubeSideDispenser2" parent="." unique_id=200950572 instance=ExtResource("12_57ppd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8484511, 0, 2.9119425)
[node name="Resturant" type="Node3D" parent="." unique_id=1083608050]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6212463e-05, -0.010500789, 0.0014204979)
[node name="StaticBody3D" type="StaticBody3D" parent="Resturant" unique_id=1814285538]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Resturant/StaticBody3D" unique_id=1661443874]
shape = SubResource("WorldBoundaryShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Resturant" unique_id=888732490]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_vlqg6")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Resturant" unique_id=836421800]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_kk3mq")
[node name="Door" parent="Resturant" unique_id=964400290 instance=ExtResource("10_l51r2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 0)
[node name="Walls" type="Node3D" parent="Resturant" unique_id=1804204696]
[node name="Wall" parent="Resturant/Walls" unique_id=434181749 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6000001, 0, 0)
[node name="Wall2" parent="Resturant/Walls" unique_id=1183111925 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 0)
[node name="Wall3" parent="Resturant/Walls" unique_id=1561473949 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 0)
[node name="Wall4" parent="Resturant/Walls" unique_id=1593528497 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 0)
[node name="Wall5" parent="Resturant/Walls" unique_id=2071060763 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 0)
[node name="Wall6" parent="Resturant/Walls" unique_id=1607012472 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 0)
[node name="Wall7" parent="Resturant/Walls" unique_id=990512055 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 0)
[node name="Wall8" parent="Resturant/Walls" unique_id=751907897 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.200001, 0, 0)
[node name="Wall9" parent="Resturant/Walls" unique_id=358743133 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000004, 0, 0)
[node name="Wall10" parent="Resturant/Walls" unique_id=1374842161 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 0)
[node name="Wall11" parent="Resturant/Walls" unique_id=1408132826 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 0)
[node name="Wall12" parent="Resturant/Walls" unique_id=1937209307 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, -6)
[node name="Wall13" parent="Resturant/Walls" unique_id=1714975985 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, -6)
[node name="Wall14" parent="Resturant/Walls" unique_id=1732121903 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, -6)
[node name="Wall15" parent="Resturant/Walls" unique_id=1311494308 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, -6)
[node name="Wall16" parent="Resturant/Walls" unique_id=364484178 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, -6)
[node name="Wall17" parent="Resturant/Walls" unique_id=485501605 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, -6)
[node name="Wall18" parent="Resturant/Walls" unique_id=378206350 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, -6)
[node name="Wall19" parent="Resturant/Walls" unique_id=294380188 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -6)
[node name="Wall20" parent="Resturant/Walls" unique_id=1122365254 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, -6)
[node name="Wall21" parent="Resturant/Walls" unique_id=111446334 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, -6)
[node name="Wall22" parent="Resturant/Walls" unique_id=999769595 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, -6)
[node name="Wall23" parent="Resturant/Walls" unique_id=1832835858 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, -6)
[node name="Wall24" parent="Resturant/Walls" unique_id=927052367 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, -6)
[node name="Wall25" parent="Resturant/Walls" unique_id=1163278593 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, -6)
[node name="Wall26" parent="Resturant/Walls" unique_id=1074868471 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -6)
[node name="Wall27" parent="Resturant/Walls" unique_id=510219954 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, -6)
[node name="Wall28" parent="Resturant/Walls" unique_id=1615161517 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, -6)
[node name="Wall29" parent="Resturant/Walls" unique_id=11605666 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 6)
[node name="Wall30" parent="Resturant/Walls" unique_id=2032513926 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 6)
[node name="Wall31" parent="Resturant/Walls" unique_id=1308803807 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 6)
[node name="Wall32" parent="Resturant/Walls" unique_id=493869823 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 6)
[node name="Wall33" parent="Resturant/Walls" unique_id=699535234 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 6)
[node name="Wall34" parent="Resturant/Walls" unique_id=238973326 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, 6)
[node name="Wall35" parent="Resturant/Walls" unique_id=836717647 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, 6)
[node name="Wall36" parent="Resturant/Walls" unique_id=446988148 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, 6)
[node name="Wall37" parent="Resturant/Walls" unique_id=49950412 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, 6)
[node name="Wall38" parent="Resturant/Walls" unique_id=607255208 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, 6)
[node name="Wall39" parent="Resturant/Walls" unique_id=1089866573 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, 6)
[node name="Wall40" parent="Resturant/Walls" unique_id=2078240231 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, 6)
[node name="Wall41" parent="Resturant/Walls" unique_id=592669722 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 6)
[node name="Wall42" parent="Resturant/Walls" unique_id=1393176200 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, 6)
[node name="Wall43" parent="Resturant/Walls" unique_id=1885346301 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 6)
[node name="Wall44" parent="Resturant/Walls" unique_id=2021916640 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 6)
[node name="Wall45" parent="Resturant/Walls" unique_id=1289086279 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 6)
[node name="Wall46" parent="Resturant/Walls" unique_id=396503450 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.2000003)
[node name="Wall47" parent="Resturant/Walls" unique_id=300373285 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 0.6000004)
[node name="Wall49" parent="Resturant/Walls" unique_id=1072273787 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.8000002)
[node name="Wall50" parent="Resturant/Walls" unique_id=896022741 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 2.4000006)
[node name="Wall51" parent="Resturant/Walls" unique_id=2089599721 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.7999992)
[node name="Wall52" parent="Resturant/Walls" unique_id=965479737 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -2.3999996)
[node name="Wall53" parent="Resturant/Walls" unique_id=43762332 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3)
[node name="Wall54" parent="Resturant/Walls" unique_id=921007094 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.1999998)
[node name="Wall55" parent="Resturant/Walls" unique_id=2144411980 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, -0.5999994)
[node name="Wall56" parent="Resturant/Walls" unique_id=370330637 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.2000003)
[node name="Wall57" parent="Resturant/Walls" unique_id=537562206 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.6000004)
[node name="Wall58" parent="Resturant/Walls" unique_id=1918288432 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.0000002)
[node name="Wall59" parent="Resturant/Walls" unique_id=944759951 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.8000007)
[node name="Wall60" parent="Resturant/Walls" unique_id=1128237563 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 5.4000006)
[node name="Wall61" parent="Resturant/Walls" unique_id=1755969864 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3.5999994)
[node name="Wall62" parent="Resturant/Walls" unique_id=949006312 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.2)
[node name="Wall63" parent="Resturant/Walls" unique_id=1826688195 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.799999)
[node name="Wall64" parent="Resturant/Walls" unique_id=116523059 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -5.3999996)
[node name="Wall65" parent="Resturant/Walls" unique_id=711153775 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.2000003)
[node name="Wall66" parent="Resturant/Walls" unique_id=741047 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 0.6000004)
[node name="Wall67" parent="Resturant/Walls" unique_id=664067327 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.8000002)
[node name="Wall68" parent="Resturant/Walls" unique_id=1294537251 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 2.4000006)
[node name="Wall69" parent="Resturant/Walls" unique_id=1152383 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.7999992)
[node name="Wall70" parent="Resturant/Walls" unique_id=1710172322 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -2.3999996)
[node name="Wall71" parent="Resturant/Walls" unique_id=597518110 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3)
[node name="Wall72" parent="Resturant/Walls" unique_id=1028573693 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.1999998)
[node name="Wall73" parent="Resturant/Walls" unique_id=1232042046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, -0.5999994)
[node name="Wall74" parent="Resturant/Walls" unique_id=1159091046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.2000003)
[node name="Wall75" parent="Resturant/Walls" unique_id=904470924 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.6000004)
[node name="Wall76" parent="Resturant/Walls" unique_id=1709758099 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.0000002)
[node name="Wall77" parent="Resturant/Walls" unique_id=1252446997 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.8000007)
[node name="Wall78" parent="Resturant/Walls" unique_id=1207579491 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 5.4000006)
[node name="Wall79" parent="Resturant/Walls" unique_id=1798073342 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3.5999994)
[node name="Wall80" parent="Resturant/Walls" unique_id=36005990 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.2)
[node name="Wall81" parent="Resturant/Walls" unique_id=79516947 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.799999)
[node name="Wall82" parent="Resturant/Walls" unique_id=1363235805 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -5.3999996)
[node name="Hatches" type="Node3D" parent="Resturant" unique_id=1561045769]
[node name="ServingCounter" parent="Resturant/Hatches" unique_id=1341321603 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter2" parent="Resturant/Hatches" unique_id=1325232371 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0, 0)
[node name="ServingCounter3" parent="Resturant/Hatches" unique_id=539914523 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter4" parent="Resturant/Hatches" unique_id=2078770951 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.4, 0, 0)
[node name="ServingCounter5" parent="Resturant/Hatches" unique_id=2019049083 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
[node name="Table2" parent="Resturant" unique_id=1457688277 instance=ExtResource("13_yjosk")]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0.5999999, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hob" parent="Resturant" unique_id=172418174 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.2000003, 0.54, 1.7999992)
[node name="Hob2" parent="Resturant" unique_id=980569400 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.200001, 0.54, 1.1999999)
[node name="Counter" parent="Resturant" unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 2.3999996)
[node name="Counter2" parent="Resturant" unique_id=5128912 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 3)
[node name="Counter3" parent="Resturant" unique_id=1298458612 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.2000003, 0.54, 0.5999999)
[node name="Counter4" parent="Resturant" unique_id=1764980142 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 2.3999996)
[node name="Counter5" parent="Resturant" unique_id=1015820252 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 3)
[node name="PlateDispenser" parent="Resturant" unique_id=710538846 instance=ExtResource("15_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.6)
[node name="Sink" parent="Resturant" unique_id=2055277359 instance=ExtResource("16_u5c1m")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.6, 0.48000002, -0.6)
[node name="Counter6" parent="Resturant" unique_id=2141915043 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 4.7683716e-07, 0.54, -0.6000006)
[node name="RawBurgerDispenser" parent="Resturant" unique_id=235630131 instance=ExtResource("17_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2)
[node name="BurgerBunsDispenser" parent="Resturant" unique_id=1720683779 instance=ExtResource("18_wvcs1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.8000001)
[node name="Table3" parent="Resturant" unique_id=1863572470 instance=ExtResource("13_yjosk")]
transform = Transform3D(-1, 0, 2.6226832e-07, 0, 1, 0, -2.6226832e-07, 0, -1, 3, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hamburger" parent="." unique_id=1675596942 instance=ExtResource("11_c8vo7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8000001, -0.6)
[node name="Plate" parent="." unique_id=190487773 instance=ExtResource("12_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3800001, -0.6)
[node name="PickableObject" parent="." unique_id=1084951838 instance=ExtResource("13_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Chips" parent="." unique_id=1028364693 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Knife" parent="." unique_id=1789694138 instance=ExtResource("23_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 3)
[node name="Potato" parent="." unique_id=275760487 instance=ExtResource("24_u5c1m")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600005, 1.2, 2.2800002)
[node name="ChoppedPotato" parent="." unique_id=1564262551 instance=ExtResource("25_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9, 1.2, 1.8000001)
[node name="Chips2" parent="." unique_id=2054749156 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600003, 1.2, 1.08)
+501
View File
@@ -0,0 +1,501 @@
[gd_scene format=3 uid="uid://do6mrslyqe5qe"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://scenes/multiplayer_world.gd" id="1_57ppd"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_o1b3t"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_irf4n"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"]
[ext_resource type="PackedScene" uid="uid://q37nqadkibbp" path="res://scenes/door.tscn" id="10_l51r2"]
[ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="11_c8vo7"]
[ext_resource type="PackedScene" uid="uid://da6yrsnxvsrif" path="res://scenes/wall.tscn" id="11_slo47"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="12_1f3bw"]
[ext_resource type="PackedScene" uid="uid://bbg7dwsbxxh1t" path="res://scenes/cube_side_dispense.tscn" id="12_57ppd"]
[ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="12_dpf3b"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="13_1f3bw"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="13_yjosk"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="14_2ndvi"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="15_qxyk8"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://scenes/GameOvercontroler.gd" id="16_n8fyw"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="16_u5c1m"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="17_y7baw"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="18_wvcs1"]
[ext_resource type="PackedScene" uid="uid://duwrbvwcqcuk3" path="res://items/chips.tscn" id="22_2ndvi"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="23_qxyk8"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="24_u5c1m"]
[ext_resource type="PackedScene" uid="uid://bpvp20hiagxxb" path="res://items/chopped_potato.tscn" id="25_y7baw"]
[sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2
sky = ExtResource("7_n8fyw")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_sky_contribution = 0.9
reflected_light_source = 2
ssr_enabled = true
ssao_enabled = true
ssil_enabled = true
sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_24d3s"]
material = ExtResource("3_irf4n")
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1)
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlqg6"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.35, 0.12250001, 0.12250001, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector2(6, 10)
center_offset = Vector3(3, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yqrpd"]
albedo_color = Color(0.35, 0.35, 0.35, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_kk3mq"]
material = SubResource("StandardMaterial3D_yqrpd")
size = Vector2(6, 10)
center_offset = Vector3(-3, 0, 0)
[node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_57ppd")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -1.8943893, 0.9667189, -4.301105)
[node name="WorldContent" type="Node3D" parent="." unique_id=262398468]
[node name="Players" type="Node3D" parent="." unique_id=1772076868]
[node name="Stations" type="Node3D" parent="." unique_id=730717613]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor" unique_id=958841648]
shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.001, -0.003)
mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls" unique_id=33059670]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, 8.838269)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="InvisibleWalls" unique_id=2018792171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, -10.243342)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="InvisibleWalls" unique_id=757662929]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -9.807113, 4.688614, -0.018813243)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="InvisibleWalls" unique_id=1468386997]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s")
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.6896921)
[node name="Counter4" parent="." unique_id=1748373996 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.0913646)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 2.2925892)
[node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("15_eoxxy")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176]
script = ExtResource("16_n8fyw")
[node name="CubeSideDispenser2" parent="." unique_id=200950572 instance=ExtResource("12_57ppd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8484511, 0, 2.9119425)
[node name="Resturant" type="Node3D" parent="." unique_id=1083608050]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6212463e-05, -0.010500789, 0.0014204979)
[node name="StaticBody3D" type="StaticBody3D" parent="Resturant" unique_id=1814285538]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Resturant/StaticBody3D" unique_id=1661443874]
shape = SubResource("WorldBoundaryShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Resturant" unique_id=888732490]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_vlqg6")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Resturant" unique_id=836421800]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_kk3mq")
[node name="Door" parent="Resturant" unique_id=964400290 instance=ExtResource("10_l51r2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 0)
[node name="Walls" type="Node3D" parent="Resturant" unique_id=1804204696]
[node name="Wall" parent="Resturant/Walls" unique_id=434181749 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6000001, 0, 0)
[node name="Wall2" parent="Resturant/Walls" unique_id=1183111925 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 0)
[node name="Wall3" parent="Resturant/Walls" unique_id=1561473949 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 0)
[node name="Wall4" parent="Resturant/Walls" unique_id=1593528497 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 0)
[node name="Wall5" parent="Resturant/Walls" unique_id=2071060763 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 0)
[node name="Wall6" parent="Resturant/Walls" unique_id=1607012472 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 0)
[node name="Wall7" parent="Resturant/Walls" unique_id=990512055 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 0)
[node name="Wall8" parent="Resturant/Walls" unique_id=751907897 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.200001, 0, 0)
[node name="Wall9" parent="Resturant/Walls" unique_id=358743133 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000004, 0, 0)
[node name="Wall10" parent="Resturant/Walls" unique_id=1374842161 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 0)
[node name="Wall11" parent="Resturant/Walls" unique_id=1408132826 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 0)
[node name="Wall12" parent="Resturant/Walls" unique_id=1937209307 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, -6)
[node name="Wall13" parent="Resturant/Walls" unique_id=1714975985 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, -6)
[node name="Wall14" parent="Resturant/Walls" unique_id=1732121903 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, -6)
[node name="Wall15" parent="Resturant/Walls" unique_id=1311494308 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, -6)
[node name="Wall16" parent="Resturant/Walls" unique_id=364484178 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, -6)
[node name="Wall17" parent="Resturant/Walls" unique_id=485501605 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, -6)
[node name="Wall18" parent="Resturant/Walls" unique_id=378206350 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, -6)
[node name="Wall19" parent="Resturant/Walls" unique_id=294380188 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -6)
[node name="Wall20" parent="Resturant/Walls" unique_id=1122365254 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, -6)
[node name="Wall21" parent="Resturant/Walls" unique_id=111446334 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, -6)
[node name="Wall22" parent="Resturant/Walls" unique_id=999769595 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, -6)
[node name="Wall23" parent="Resturant/Walls" unique_id=1832835858 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, -6)
[node name="Wall24" parent="Resturant/Walls" unique_id=927052367 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, -6)
[node name="Wall25" parent="Resturant/Walls" unique_id=1163278593 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, -6)
[node name="Wall26" parent="Resturant/Walls" unique_id=1074868471 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -6)
[node name="Wall27" parent="Resturant/Walls" unique_id=510219954 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, -6)
[node name="Wall28" parent="Resturant/Walls" unique_id=1615161517 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, -6)
[node name="Wall29" parent="Resturant/Walls" unique_id=11605666 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 6)
[node name="Wall30" parent="Resturant/Walls" unique_id=2032513926 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 6)
[node name="Wall31" parent="Resturant/Walls" unique_id=1308803807 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 6)
[node name="Wall32" parent="Resturant/Walls" unique_id=493869823 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 6)
[node name="Wall33" parent="Resturant/Walls" unique_id=699535234 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 6)
[node name="Wall34" parent="Resturant/Walls" unique_id=238973326 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, 6)
[node name="Wall35" parent="Resturant/Walls" unique_id=836717647 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, 6)
[node name="Wall36" parent="Resturant/Walls" unique_id=446988148 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, 6)
[node name="Wall37" parent="Resturant/Walls" unique_id=49950412 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, 6)
[node name="Wall38" parent="Resturant/Walls" unique_id=607255208 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, 6)
[node name="Wall39" parent="Resturant/Walls" unique_id=1089866573 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, 6)
[node name="Wall40" parent="Resturant/Walls" unique_id=2078240231 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, 6)
[node name="Wall41" parent="Resturant/Walls" unique_id=592669722 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 6)
[node name="Wall42" parent="Resturant/Walls" unique_id=1393176200 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, 6)
[node name="Wall43" parent="Resturant/Walls" unique_id=1885346301 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 6)
[node name="Wall44" parent="Resturant/Walls" unique_id=2021916640 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 6)
[node name="Wall45" parent="Resturant/Walls" unique_id=1289086279 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 6)
[node name="Wall46" parent="Resturant/Walls" unique_id=396503450 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.2000003)
[node name="Wall47" parent="Resturant/Walls" unique_id=300373285 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 0.6000004)
[node name="Wall49" parent="Resturant/Walls" unique_id=1072273787 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.8000002)
[node name="Wall50" parent="Resturant/Walls" unique_id=896022741 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 2.4000006)
[node name="Wall51" parent="Resturant/Walls" unique_id=2089599721 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.7999992)
[node name="Wall52" parent="Resturant/Walls" unique_id=965479737 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -2.3999996)
[node name="Wall53" parent="Resturant/Walls" unique_id=43762332 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3)
[node name="Wall54" parent="Resturant/Walls" unique_id=921007094 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.1999998)
[node name="Wall55" parent="Resturant/Walls" unique_id=2144411980 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, -0.5999994)
[node name="Wall56" parent="Resturant/Walls" unique_id=370330637 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.2000003)
[node name="Wall57" parent="Resturant/Walls" unique_id=537562206 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.6000004)
[node name="Wall58" parent="Resturant/Walls" unique_id=1918288432 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.0000002)
[node name="Wall59" parent="Resturant/Walls" unique_id=944759951 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.8000007)
[node name="Wall60" parent="Resturant/Walls" unique_id=1128237563 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 5.4000006)
[node name="Wall61" parent="Resturant/Walls" unique_id=1755969864 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3.5999994)
[node name="Wall62" parent="Resturant/Walls" unique_id=949006312 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.2)
[node name="Wall63" parent="Resturant/Walls" unique_id=1826688195 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.799999)
[node name="Wall64" parent="Resturant/Walls" unique_id=116523059 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -5.3999996)
[node name="Wall65" parent="Resturant/Walls" unique_id=711153775 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.2000003)
[node name="Wall66" parent="Resturant/Walls" unique_id=741047 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 0.6000004)
[node name="Wall67" parent="Resturant/Walls" unique_id=664067327 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.8000002)
[node name="Wall68" parent="Resturant/Walls" unique_id=1294537251 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 2.4000006)
[node name="Wall69" parent="Resturant/Walls" unique_id=1152383 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.7999992)
[node name="Wall70" parent="Resturant/Walls" unique_id=1710172322 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -2.3999996)
[node name="Wall71" parent="Resturant/Walls" unique_id=597518110 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3)
[node name="Wall72" parent="Resturant/Walls" unique_id=1028573693 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.1999998)
[node name="Wall73" parent="Resturant/Walls" unique_id=1232042046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, -0.5999994)
[node name="Wall74" parent="Resturant/Walls" unique_id=1159091046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.2000003)
[node name="Wall75" parent="Resturant/Walls" unique_id=904470924 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.6000004)
[node name="Wall76" parent="Resturant/Walls" unique_id=1709758099 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.0000002)
[node name="Wall77" parent="Resturant/Walls" unique_id=1252446997 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.8000007)
[node name="Wall78" parent="Resturant/Walls" unique_id=1207579491 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 5.4000006)
[node name="Wall79" parent="Resturant/Walls" unique_id=1798073342 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3.5999994)
[node name="Wall80" parent="Resturant/Walls" unique_id=36005990 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.2)
[node name="Wall81" parent="Resturant/Walls" unique_id=79516947 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.799999)
[node name="Wall82" parent="Resturant/Walls" unique_id=1363235805 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -5.3999996)
[node name="Hatches" type="Node3D" parent="Resturant" unique_id=1561045769]
[node name="ServingCounter" parent="Resturant/Hatches" unique_id=1341321603 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter2" parent="Resturant/Hatches" unique_id=1325232371 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0, 0)
[node name="ServingCounter3" parent="Resturant/Hatches" unique_id=539914523 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter4" parent="Resturant/Hatches" unique_id=2078770951 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.4, 0, 0)
[node name="ServingCounter5" parent="Resturant/Hatches" unique_id=2019049083 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
[node name="Table2" parent="Resturant" unique_id=1457688277 instance=ExtResource("13_yjosk")]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0.5999999, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hob" parent="Resturant" unique_id=172418174 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.2000003, 0.54, 1.7999992)
[node name="Hob2" parent="Resturant" unique_id=980569400 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.200001, 0.54, 1.1999999)
[node name="Counter" parent="Resturant" unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 2.3999996)
[node name="Counter2" parent="Resturant" unique_id=5128912 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 3)
[node name="Counter3" parent="Resturant" unique_id=1298458612 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.2000003, 0.54, 0.5999999)
[node name="Counter4" parent="Resturant" unique_id=1764980142 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 2.3999996)
[node name="Counter5" parent="Resturant" unique_id=1015820252 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 3)
[node name="PlateDispenser" parent="Resturant" unique_id=710538846 instance=ExtResource("15_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.6)
[node name="Sink" parent="Resturant" unique_id=2055277359 instance=ExtResource("16_u5c1m")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.6, 0.48000002, -0.6)
[node name="Counter6" parent="Resturant" unique_id=2141915043 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 4.7683716e-07, 0.54, -0.6000006)
[node name="RawBurgerDispenser" parent="Resturant" unique_id=235630131 instance=ExtResource("17_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2)
[node name="BurgerBunsDispenser" parent="Resturant" unique_id=1720683779 instance=ExtResource("18_wvcs1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.8000001)
[node name="Table3" parent="Resturant" unique_id=1863572470 instance=ExtResource("13_yjosk")]
transform = Transform3D(-1, 0, 2.6226832e-07, 0, 1, 0, -2.6226832e-07, 0, -1, 3, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hamburger" parent="." unique_id=1675596942 instance=ExtResource("11_c8vo7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8000001, -0.6)
[node name="Plate" parent="." unique_id=190487773 instance=ExtResource("12_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3800001, -0.6)
[node name="PickableObject" parent="." unique_id=1084951838 instance=ExtResource("13_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Chips" parent="." unique_id=1028364693 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Knife" parent="." unique_id=1789694138 instance=ExtResource("23_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 3)
[node name="Potato" parent="." unique_id=275760487 instance=ExtResource("24_u5c1m")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600005, 1.2, 2.2800002)
[node name="ChoppedPotato" parent="." unique_id=1564262551 instance=ExtResource("25_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9, 1.2, 1.8000001)
[node name="Chips2" parent="." unique_id=2054749156 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600003, 1.2, 1.08)
+501
View File
@@ -0,0 +1,501 @@
[gd_scene format=3 uid="uid://do6mrslyqe5qe"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://scenes/multiplayer_world.gd" id="1_57ppd"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_o1b3t"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_irf4n"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"]
[ext_resource type="PackedScene" uid="uid://q37nqadkibbp" path="res://scenes/door.tscn" id="10_l51r2"]
[ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="11_c8vo7"]
[ext_resource type="PackedScene" uid="uid://da6yrsnxvsrif" path="res://scenes/wall.tscn" id="11_slo47"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="12_1f3bw"]
[ext_resource type="PackedScene" uid="uid://bbg7dwsbxxh1t" path="res://scenes/cube_side_dispense.tscn" id="12_57ppd"]
[ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="12_dpf3b"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="13_1f3bw"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="13_yjosk"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="14_2ndvi"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="15_qxyk8"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://scenes/GameOvercontroler.gd" id="16_n8fyw"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="16_u5c1m"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="17_y7baw"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="18_wvcs1"]
[ext_resource type="PackedScene" uid="uid://duwrbvwcqcuk3" path="res://items/chips.tscn" id="22_2ndvi"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="23_qxyk8"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="24_u5c1m"]
[ext_resource type="PackedScene" uid="uid://bpvp20hiagxxb" path="res://items/chopped_potato.tscn" id="25_y7baw"]
[sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2
sky = ExtResource("7_n8fyw")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_sky_contribution = 0.9
reflected_light_source = 2
ssr_enabled = true
ssao_enabled = true
ssil_enabled = true
sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_24d3s"]
material = ExtResource("3_irf4n")
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1)
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlqg6"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.35, 0.12250001, 0.12250001, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector2(6, 10)
center_offset = Vector3(3, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yqrpd"]
albedo_color = Color(0.35, 0.35, 0.35, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_kk3mq"]
material = SubResource("StandardMaterial3D_yqrpd")
size = Vector2(6, 10)
center_offset = Vector3(-3, 0, 0)
[node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_57ppd")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -1.8943893, 0.9667189, -4.301105)
[node name="WorldContent" type="Node3D" parent="." unique_id=262398468]
[node name="Players" type="Node3D" parent="." unique_id=1772076868]
[node name="Stations" type="Node3D" parent="." unique_id=730717613]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor" unique_id=958841648]
shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.001, -0.003)
mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls" unique_id=33059670]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, 8.838269)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="InvisibleWalls" unique_id=2018792171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, -10.243342)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="InvisibleWalls" unique_id=757662929]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -9.807113, 4.688614, -0.018813243)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="InvisibleWalls" unique_id=1468386997]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s")
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.6896921)
[node name="Counter4" parent="." unique_id=1748373996 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.0913646)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 2.2925892)
[node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("15_eoxxy")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176]
script = ExtResource("16_n8fyw")
[node name="CubeSideDispenser2" parent="." unique_id=200950572 instance=ExtResource("12_57ppd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8484511, 0, 2.9119425)
[node name="Resturant" type="Node3D" parent="." unique_id=1083608050]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6212463e-05, -0.010500789, 0.0014204979)
[node name="StaticBody3D" type="StaticBody3D" parent="Resturant" unique_id=1814285538]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Resturant/StaticBody3D" unique_id=1661443874]
shape = SubResource("WorldBoundaryShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Resturant" unique_id=888732490]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_vlqg6")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Resturant" unique_id=836421800]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_kk3mq")
[node name="Door" parent="Resturant" unique_id=964400290 instance=ExtResource("10_l51r2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 0)
[node name="Walls" type="Node3D" parent="Resturant" unique_id=1804204696]
[node name="Wall" parent="Resturant/Walls" unique_id=434181749 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6000001, 0, 0)
[node name="Wall2" parent="Resturant/Walls" unique_id=1183111925 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 0)
[node name="Wall3" parent="Resturant/Walls" unique_id=1561473949 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 0)
[node name="Wall4" parent="Resturant/Walls" unique_id=1593528497 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 0)
[node name="Wall5" parent="Resturant/Walls" unique_id=2071060763 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 0)
[node name="Wall6" parent="Resturant/Walls" unique_id=1607012472 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 0)
[node name="Wall7" parent="Resturant/Walls" unique_id=990512055 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 0)
[node name="Wall8" parent="Resturant/Walls" unique_id=751907897 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.200001, 0, 0)
[node name="Wall9" parent="Resturant/Walls" unique_id=358743133 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000004, 0, 0)
[node name="Wall10" parent="Resturant/Walls" unique_id=1374842161 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 0)
[node name="Wall11" parent="Resturant/Walls" unique_id=1408132826 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 0)
[node name="Wall12" parent="Resturant/Walls" unique_id=1937209307 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, -6)
[node name="Wall13" parent="Resturant/Walls" unique_id=1714975985 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, -6)
[node name="Wall14" parent="Resturant/Walls" unique_id=1732121903 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, -6)
[node name="Wall15" parent="Resturant/Walls" unique_id=1311494308 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, -6)
[node name="Wall16" parent="Resturant/Walls" unique_id=364484178 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, -6)
[node name="Wall17" parent="Resturant/Walls" unique_id=485501605 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, -6)
[node name="Wall18" parent="Resturant/Walls" unique_id=378206350 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, -6)
[node name="Wall19" parent="Resturant/Walls" unique_id=294380188 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -6)
[node name="Wall20" parent="Resturant/Walls" unique_id=1122365254 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, -6)
[node name="Wall21" parent="Resturant/Walls" unique_id=111446334 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, -6)
[node name="Wall22" parent="Resturant/Walls" unique_id=999769595 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, -6)
[node name="Wall23" parent="Resturant/Walls" unique_id=1832835858 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, -6)
[node name="Wall24" parent="Resturant/Walls" unique_id=927052367 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, -6)
[node name="Wall25" parent="Resturant/Walls" unique_id=1163278593 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, -6)
[node name="Wall26" parent="Resturant/Walls" unique_id=1074868471 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -6)
[node name="Wall27" parent="Resturant/Walls" unique_id=510219954 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, -6)
[node name="Wall28" parent="Resturant/Walls" unique_id=1615161517 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, -6)
[node name="Wall29" parent="Resturant/Walls" unique_id=11605666 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 6)
[node name="Wall30" parent="Resturant/Walls" unique_id=2032513926 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 6)
[node name="Wall31" parent="Resturant/Walls" unique_id=1308803807 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 6)
[node name="Wall32" parent="Resturant/Walls" unique_id=493869823 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 6)
[node name="Wall33" parent="Resturant/Walls" unique_id=699535234 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 6)
[node name="Wall34" parent="Resturant/Walls" unique_id=238973326 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, 6)
[node name="Wall35" parent="Resturant/Walls" unique_id=836717647 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, 6)
[node name="Wall36" parent="Resturant/Walls" unique_id=446988148 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, 6)
[node name="Wall37" parent="Resturant/Walls" unique_id=49950412 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, 6)
[node name="Wall38" parent="Resturant/Walls" unique_id=607255208 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, 6)
[node name="Wall39" parent="Resturant/Walls" unique_id=1089866573 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, 6)
[node name="Wall40" parent="Resturant/Walls" unique_id=2078240231 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, 6)
[node name="Wall41" parent="Resturant/Walls" unique_id=592669722 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 6)
[node name="Wall42" parent="Resturant/Walls" unique_id=1393176200 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, 6)
[node name="Wall43" parent="Resturant/Walls" unique_id=1885346301 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 6)
[node name="Wall44" parent="Resturant/Walls" unique_id=2021916640 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 6)
[node name="Wall45" parent="Resturant/Walls" unique_id=1289086279 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 6)
[node name="Wall46" parent="Resturant/Walls" unique_id=396503450 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.2000003)
[node name="Wall47" parent="Resturant/Walls" unique_id=300373285 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 0.6000004)
[node name="Wall49" parent="Resturant/Walls" unique_id=1072273787 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.8000002)
[node name="Wall50" parent="Resturant/Walls" unique_id=896022741 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 2.4000006)
[node name="Wall51" parent="Resturant/Walls" unique_id=2089599721 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.7999992)
[node name="Wall52" parent="Resturant/Walls" unique_id=965479737 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -2.3999996)
[node name="Wall53" parent="Resturant/Walls" unique_id=43762332 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3)
[node name="Wall54" parent="Resturant/Walls" unique_id=921007094 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.1999998)
[node name="Wall55" parent="Resturant/Walls" unique_id=2144411980 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, -0.5999994)
[node name="Wall56" parent="Resturant/Walls" unique_id=370330637 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.2000003)
[node name="Wall57" parent="Resturant/Walls" unique_id=537562206 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.6000004)
[node name="Wall58" parent="Resturant/Walls" unique_id=1918288432 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.0000002)
[node name="Wall59" parent="Resturant/Walls" unique_id=944759951 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.8000007)
[node name="Wall60" parent="Resturant/Walls" unique_id=1128237563 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 5.4000006)
[node name="Wall61" parent="Resturant/Walls" unique_id=1755969864 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3.5999994)
[node name="Wall62" parent="Resturant/Walls" unique_id=949006312 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.2)
[node name="Wall63" parent="Resturant/Walls" unique_id=1826688195 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.799999)
[node name="Wall64" parent="Resturant/Walls" unique_id=116523059 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -5.3999996)
[node name="Wall65" parent="Resturant/Walls" unique_id=711153775 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.2000003)
[node name="Wall66" parent="Resturant/Walls" unique_id=741047 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 0.6000004)
[node name="Wall67" parent="Resturant/Walls" unique_id=664067327 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.8000002)
[node name="Wall68" parent="Resturant/Walls" unique_id=1294537251 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 2.4000006)
[node name="Wall69" parent="Resturant/Walls" unique_id=1152383 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.7999992)
[node name="Wall70" parent="Resturant/Walls" unique_id=1710172322 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -2.3999996)
[node name="Wall71" parent="Resturant/Walls" unique_id=597518110 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3)
[node name="Wall72" parent="Resturant/Walls" unique_id=1028573693 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.1999998)
[node name="Wall73" parent="Resturant/Walls" unique_id=1232042046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, -0.5999994)
[node name="Wall74" parent="Resturant/Walls" unique_id=1159091046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.2000003)
[node name="Wall75" parent="Resturant/Walls" unique_id=904470924 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.6000004)
[node name="Wall76" parent="Resturant/Walls" unique_id=1709758099 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.0000002)
[node name="Wall77" parent="Resturant/Walls" unique_id=1252446997 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.8000007)
[node name="Wall78" parent="Resturant/Walls" unique_id=1207579491 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 5.4000006)
[node name="Wall79" parent="Resturant/Walls" unique_id=1798073342 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3.5999994)
[node name="Wall80" parent="Resturant/Walls" unique_id=36005990 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.2)
[node name="Wall81" parent="Resturant/Walls" unique_id=79516947 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.799999)
[node name="Wall82" parent="Resturant/Walls" unique_id=1363235805 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -5.3999996)
[node name="Hatches" type="Node3D" parent="Resturant" unique_id=1561045769]
[node name="ServingCounter" parent="Resturant/Hatches" unique_id=1341321603 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter2" parent="Resturant/Hatches" unique_id=1325232371 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0, 0)
[node name="ServingCounter3" parent="Resturant/Hatches" unique_id=539914523 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter4" parent="Resturant/Hatches" unique_id=2078770951 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.4, 0, 0)
[node name="ServingCounter5" parent="Resturant/Hatches" unique_id=2019049083 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
[node name="Table2" parent="Resturant" unique_id=1457688277 instance=ExtResource("13_yjosk")]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0.5999999, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hob" parent="Resturant" unique_id=172418174 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.2000003, 0.54, 1.7999992)
[node name="Hob2" parent="Resturant" unique_id=980569400 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.200001, 0.54, 1.1999999)
[node name="Counter" parent="Resturant" unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 2.3999996)
[node name="Counter2" parent="Resturant" unique_id=5128912 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 3)
[node name="Counter3" parent="Resturant" unique_id=1298458612 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.2000003, 0.54, 0.5999999)
[node name="Counter4" parent="Resturant" unique_id=1764980142 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 2.3999996)
[node name="Counter5" parent="Resturant" unique_id=1015820252 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 3)
[node name="PlateDispenser" parent="Resturant" unique_id=710538846 instance=ExtResource("15_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.6)
[node name="Sink" parent="Resturant" unique_id=2055277359 instance=ExtResource("16_u5c1m")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.6, 0.48000002, -0.6)
[node name="Counter6" parent="Resturant" unique_id=2141915043 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 4.7683716e-07, 0.54, -0.6000006)
[node name="RawBurgerDispenser" parent="Resturant" unique_id=235630131 instance=ExtResource("17_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2)
[node name="BurgerBunsDispenser" parent="Resturant" unique_id=1720683779 instance=ExtResource("18_wvcs1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.8000001)
[node name="Table3" parent="Resturant" unique_id=1863572470 instance=ExtResource("13_yjosk")]
transform = Transform3D(-1, 0, 2.6226832e-07, 0, 1, 0, -2.6226832e-07, 0, -1, 3, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hamburger" parent="." unique_id=1675596942 instance=ExtResource("11_c8vo7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8000001, -0.6)
[node name="Plate" parent="." unique_id=190487773 instance=ExtResource("12_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3800001, -0.6)
[node name="PickableObject" parent="." unique_id=1084951838 instance=ExtResource("13_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Chips" parent="." unique_id=1028364693 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Knife" parent="." unique_id=1789694138 instance=ExtResource("23_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 3)
[node name="Potato" parent="." unique_id=275760487 instance=ExtResource("24_u5c1m")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600005, 1.2, 2.2800002)
[node name="ChoppedPotato" parent="." unique_id=1564262551 instance=ExtResource("25_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9, 1.2, 1.8000001)
[node name="Chips2" parent="." unique_id=2054749156 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600003, 1.2, 1.08)
+501
View File
@@ -0,0 +1,501 @@
[gd_scene format=3 uid="uid://do6mrslyqe5qe"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://scenes/multiplayer_world.gd" id="1_57ppd"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_o1b3t"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_irf4n"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="7_n8fyw"]
[ext_resource type="PackedScene" uid="uid://q37nqadkibbp" path="res://scenes/door.tscn" id="10_l51r2"]
[ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="11_c8vo7"]
[ext_resource type="PackedScene" uid="uid://da6yrsnxvsrif" path="res://scenes/wall.tscn" id="11_slo47"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="12_1f3bw"]
[ext_resource type="PackedScene" uid="uid://bbg7dwsbxxh1t" path="res://scenes/cube_side_dispense.tscn" id="12_57ppd"]
[ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="12_dpf3b"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="13_1f3bw"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="13_yjosk"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="14_2ndvi"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="14_di04w"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_di04w"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="15_eoxxy"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="15_qxyk8"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://scenes/GameOvercontroler.gd" id="16_n8fyw"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="16_u5c1m"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="17_y7baw"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="18_wvcs1"]
[ext_resource type="PackedScene" uid="uid://duwrbvwcqcuk3" path="res://items/chips.tscn" id="22_2ndvi"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="23_qxyk8"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="24_u5c1m"]
[ext_resource type="PackedScene" uid="uid://bpvp20hiagxxb" path="res://items/chopped_potato.tscn" id="25_y7baw"]
[sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2
sky = ExtResource("7_n8fyw")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_sky_contribution = 0.9
reflected_light_source = 2
ssr_enabled = true
ssao_enabled = true
ssil_enabled = true
sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_24d3s"]
material = ExtResource("3_irf4n")
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1)
[sub_resource type="WorldBoundaryShape3D" id="WorldBoundaryShape3D_vlqg6"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.35, 0.12250001, 0.12250001, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector2(6, 10)
center_offset = Vector3(3, 0, 0)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_yqrpd"]
albedo_color = Color(0.35, 0.35, 0.35, 1)
[sub_resource type="PlaneMesh" id="PlaneMesh_kk3mq"]
material = SubResource("StandardMaterial3D_yqrpd")
size = Vector2(6, 10)
center_offset = Vector3(-3, 0, 0)
[node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_57ppd")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_o1b3t")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -1.8943893, 0.9667189, -4.301105)
[node name="WorldContent" type="Node3D" parent="." unique_id=262398468]
[node name="Players" type="Node3D" parent="." unique_id=1772076868]
[node name="Stations" type="Node3D" parent="." unique_id=730717613]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=2051771581]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=619815427]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor" unique_id=958841648]
shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.001, -0.003)
mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls" unique_id=33059670]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, 8.838269)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="InvisibleWalls" unique_id=2018792171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, -10.243342)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="InvisibleWalls" unique_id=757662929]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -9.807113, 4.688614, -0.018813243)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="InvisibleWalls" unique_id=1468386997]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s")
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.6896921)
[node name="Counter4" parent="." unique_id=1748373996 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 1.0913646)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -3.9477215, 0.5115016, 2.2925892)
[node name="GameOverPanel" parent="." unique_id=1234658657 instance=ExtResource("14_di04w")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("15_eoxxy")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=803158176]
script = ExtResource("16_n8fyw")
[node name="CubeSideDispenser2" parent="." unique_id=200950572 instance=ExtResource("12_57ppd")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8484511, 0, 2.9119425)
[node name="Resturant" type="Node3D" parent="." unique_id=1083608050]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.6212463e-05, -0.010500789, 0.0014204979)
[node name="StaticBody3D" type="StaticBody3D" parent="Resturant" unique_id=1814285538]
[node name="CollisionShape3D" type="CollisionShape3D" parent="Resturant/StaticBody3D" unique_id=1661443874]
shape = SubResource("WorldBoundaryShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Resturant" unique_id=888732490]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_vlqg6")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Resturant" unique_id=836421800]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 0, 0.01, 0)
mesh = SubResource("PlaneMesh_kk3mq")
[node name="Door" parent="Resturant" unique_id=964400290 instance=ExtResource("10_l51r2")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 0)
[node name="Walls" type="Node3D" parent="Resturant" unique_id=1804204696]
[node name="Wall" parent="Resturant/Walls" unique_id=434181749 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6000001, 0, 0)
[node name="Wall2" parent="Resturant/Walls" unique_id=1183111925 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 0)
[node name="Wall3" parent="Resturant/Walls" unique_id=1561473949 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 0)
[node name="Wall4" parent="Resturant/Walls" unique_id=1593528497 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 0)
[node name="Wall5" parent="Resturant/Walls" unique_id=2071060763 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 0)
[node name="Wall6" parent="Resturant/Walls" unique_id=1607012472 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 0)
[node name="Wall7" parent="Resturant/Walls" unique_id=990512055 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 0)
[node name="Wall8" parent="Resturant/Walls" unique_id=751907897 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.200001, 0, 0)
[node name="Wall9" parent="Resturant/Walls" unique_id=358743133 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000004, 0, 0)
[node name="Wall10" parent="Resturant/Walls" unique_id=1374842161 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 0)
[node name="Wall11" parent="Resturant/Walls" unique_id=1408132826 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 0)
[node name="Wall12" parent="Resturant/Walls" unique_id=1937209307 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, -6)
[node name="Wall13" parent="Resturant/Walls" unique_id=1714975985 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, -6)
[node name="Wall14" parent="Resturant/Walls" unique_id=1732121903 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, -6)
[node name="Wall15" parent="Resturant/Walls" unique_id=1311494308 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, -6)
[node name="Wall16" parent="Resturant/Walls" unique_id=364484178 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, -6)
[node name="Wall17" parent="Resturant/Walls" unique_id=485501605 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, -6)
[node name="Wall18" parent="Resturant/Walls" unique_id=378206350 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, -6)
[node name="Wall19" parent="Resturant/Walls" unique_id=294380188 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -6)
[node name="Wall20" parent="Resturant/Walls" unique_id=1122365254 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, -6)
[node name="Wall21" parent="Resturant/Walls" unique_id=111446334 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, -6)
[node name="Wall22" parent="Resturant/Walls" unique_id=999769595 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, -6)
[node name="Wall23" parent="Resturant/Walls" unique_id=1832835858 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, -6)
[node name="Wall24" parent="Resturant/Walls" unique_id=927052367 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, -6)
[node name="Wall25" parent="Resturant/Walls" unique_id=1163278593 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, -6)
[node name="Wall26" parent="Resturant/Walls" unique_id=1074868471 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, -6)
[node name="Wall27" parent="Resturant/Walls" unique_id=510219954 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, -6)
[node name="Wall28" parent="Resturant/Walls" unique_id=1615161517 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, -6)
[node name="Wall29" parent="Resturant/Walls" unique_id=11605666 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.60000014, 0, 6)
[node name="Wall30" parent="Resturant/Walls" unique_id=2032513926 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.3841858e-07, 0, 6)
[node name="Wall31" parent="Resturant/Walls" unique_id=1308803807 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5999999, 0, 6)
[node name="Wall32" parent="Resturant/Walls" unique_id=493869823 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2000002, 0, 6)
[node name="Wall33" parent="Resturant/Walls" unique_id=699535234 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000002, 0, 6)
[node name="Wall34" parent="Resturant/Walls" unique_id=238973326 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.3999999, 0, 6)
[node name="Wall35" parent="Resturant/Walls" unique_id=836717647 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.9999998, 0, 6)
[node name="Wall36" parent="Resturant/Walls" unique_id=446988148 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, 6)
[node name="Wall37" parent="Resturant/Walls" unique_id=49950412 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.7999998, 0, 6)
[node name="Wall38" parent="Resturant/Walls" unique_id=607255208 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1999998, 0, 6)
[node name="Wall39" parent="Resturant/Walls" unique_id=1089866573 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.6000001, 0, 6)
[node name="Wall40" parent="Resturant/Walls" unique_id=2078240231 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0000002, 0, 6)
[node name="Wall41" parent="Resturant/Walls" unique_id=592669722 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0, 6)
[node name="Wall42" parent="Resturant/Walls" unique_id=1393176200 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.2000003, 0, 6)
[node name="Wall43" parent="Resturant/Walls" unique_id=1885346301 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.8, 0, 6)
[node name="Wall44" parent="Resturant/Walls" unique_id=2021916640 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.2, 0, 6)
[node name="Wall45" parent="Resturant/Walls" unique_id=1289086279 instance=ExtResource("11_slo47")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.8, 0, 6)
[node name="Wall46" parent="Resturant/Walls" unique_id=396503450 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.2000003)
[node name="Wall47" parent="Resturant/Walls" unique_id=300373285 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 0.6000004)
[node name="Wall49" parent="Resturant/Walls" unique_id=1072273787 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 1.8000002)
[node name="Wall50" parent="Resturant/Walls" unique_id=896022741 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 2.4000006)
[node name="Wall51" parent="Resturant/Walls" unique_id=2089599721 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.7999992)
[node name="Wall52" parent="Resturant/Walls" unique_id=965479737 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -2.3999996)
[node name="Wall53" parent="Resturant/Walls" unique_id=43762332 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3)
[node name="Wall54" parent="Resturant/Walls" unique_id=921007094 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -1.1999998)
[node name="Wall55" parent="Resturant/Walls" unique_id=2144411980 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, -0.5999994)
[node name="Wall56" parent="Resturant/Walls" unique_id=370330637 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.2000003)
[node name="Wall57" parent="Resturant/Walls" unique_id=537562206 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.6000004)
[node name="Wall58" parent="Resturant/Walls" unique_id=1918288432 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 3.0000002)
[node name="Wall59" parent="Resturant/Walls" unique_id=944759951 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 4.8000007)
[node name="Wall60" parent="Resturant/Walls" unique_id=1128237563 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8, 0, 5.4000006)
[node name="Wall61" parent="Resturant/Walls" unique_id=1755969864 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -3.5999994)
[node name="Wall62" parent="Resturant/Walls" unique_id=949006312 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.2)
[node name="Wall63" parent="Resturant/Walls" unique_id=1826688195 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -4.799999)
[node name="Wall64" parent="Resturant/Walls" unique_id=116523059 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.8000007, 0, -5.3999996)
[node name="Wall65" parent="Resturant/Walls" unique_id=711153775 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.2000003)
[node name="Wall66" parent="Resturant/Walls" unique_id=741047 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 0.6000004)
[node name="Wall67" parent="Resturant/Walls" unique_id=664067327 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 1.8000002)
[node name="Wall68" parent="Resturant/Walls" unique_id=1294537251 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 2.4000006)
[node name="Wall69" parent="Resturant/Walls" unique_id=1152383 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.7999992)
[node name="Wall70" parent="Resturant/Walls" unique_id=1710172322 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -2.3999996)
[node name="Wall71" parent="Resturant/Walls" unique_id=597518110 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3)
[node name="Wall72" parent="Resturant/Walls" unique_id=1028573693 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -1.1999998)
[node name="Wall73" parent="Resturant/Walls" unique_id=1232042046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, -0.5999994)
[node name="Wall74" parent="Resturant/Walls" unique_id=1159091046 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.2000003)
[node name="Wall75" parent="Resturant/Walls" unique_id=904470924 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.6000004)
[node name="Wall76" parent="Resturant/Walls" unique_id=1709758099 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 3.0000002)
[node name="Wall77" parent="Resturant/Walls" unique_id=1252446997 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 4.8000007)
[node name="Wall78" parent="Resturant/Walls" unique_id=1207579491 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.8, 0, 5.4000006)
[node name="Wall79" parent="Resturant/Walls" unique_id=1798073342 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -3.5999994)
[node name="Wall80" parent="Resturant/Walls" unique_id=36005990 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.2)
[node name="Wall81" parent="Resturant/Walls" unique_id=79516947 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -4.799999)
[node name="Wall82" parent="Resturant/Walls" unique_id=1363235805 instance=ExtResource("11_slo47")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, 4.7999997, 0, -5.3999996)
[node name="Hatches" type="Node3D" parent="Resturant" unique_id=1561045769]
[node name="ServingCounter" parent="Resturant/Hatches" unique_id=1341321603 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter2" parent="Resturant/Hatches" unique_id=1325232371 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.8000001, 0, 0)
[node name="ServingCounter3" parent="Resturant/Hatches" unique_id=539914523 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0, 0)
[node name="ServingCounter4" parent="Resturant/Hatches" unique_id=2078770951 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.4, 0, 0)
[node name="ServingCounter5" parent="Resturant/Hatches" unique_id=2019049083 instance=ExtResource("12_dpf3b")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, 0, 0)
[node name="Table2" parent="Resturant" unique_id=1457688277 instance=ExtResource("13_yjosk")]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0.5999999, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hob" parent="Resturant" unique_id=172418174 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.2000003, 0.54, 1.7999992)
[node name="Hob2" parent="Resturant" unique_id=980569400 instance=ExtResource("14_2ndvi")]
transform = Transform3D(1.3113416e-07, 0, -1, 0, 1, 0, 1, 0, 1.3113416e-07, 4.200001, 0.54, 1.1999999)
[node name="Counter" parent="Resturant" unique_id=1487893288 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 2.3999996)
[node name="Counter2" parent="Resturant" unique_id=5128912 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.200001, 0.54, 3)
[node name="Counter3" parent="Resturant" unique_id=1298458612 instance=ExtResource("15_di04w")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 4.2000003, 0.54, 0.5999999)
[node name="Counter4" parent="Resturant" unique_id=1764980142 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 2.3999996)
[node name="Counter5" parent="Resturant" unique_id=1015820252 instance=ExtResource("15_di04w")]
transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 4.7683716e-07, 0.54, 3)
[node name="PlateDispenser" parent="Resturant" unique_id=710538846 instance=ExtResource("15_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.6)
[node name="Sink" parent="Resturant" unique_id=2055277359 instance=ExtResource("16_u5c1m")]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 0.6, 0.48000002, -0.6)
[node name="Counter6" parent="Resturant" unique_id=2141915043 instance=ExtResource("15_di04w")]
transform = Transform3D(-1, 0, 8.742277e-08, 0, 1, 0, -8.742277e-08, 0, -1, 4.7683716e-07, 0.54, -0.6000006)
[node name="RawBurgerDispenser" parent="Resturant" unique_id=235630131 instance=ExtResource("17_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.2)
[node name="BurgerBunsDispenser" parent="Resturant" unique_id=1720683779 instance=ExtResource("18_wvcs1")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1.8000001)
[node name="Table3" parent="Resturant" unique_id=1863572470 instance=ExtResource("13_yjosk")]
transform = Transform3D(-1, 0, 2.6226832e-07, 0, 1, 0, -2.6226832e-07, 0, -1, 3, 0.48000002, -3)
thinking_duration = null
ordering_duration = null
primary_duration = null
friend_duration = null
eating_duration = null
[node name="Hamburger" parent="." unique_id=1675596942 instance=ExtResource("11_c8vo7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8000001, -0.6)
[node name="Plate" parent="." unique_id=190487773 instance=ExtResource("12_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.3800001, -0.6)
[node name="PickableObject" parent="." unique_id=1084951838 instance=ExtResource("13_1f3bw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Chips" parent="." unique_id=1028364693 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 1.2, -0.6)
[node name="Knife" parent="." unique_id=1789694138 instance=ExtResource("23_qxyk8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2, 3)
[node name="Potato" parent="." unique_id=275760487 instance=ExtResource("24_u5c1m")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600005, 1.2, 2.2800002)
[node name="ChoppedPotato" parent="." unique_id=1564262551 instance=ExtResource("25_y7baw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9, 1.2, 1.8000001)
[node name="Chips2" parent="." unique_id=2054749156 instance=ExtResource("22_2ndvi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9600003, 1.2, 1.08)
-72
View File
@@ -1,72 +0,0 @@
[gd_scene format=3 uid="uid://bbg7dwsbxxh1t"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://Stations/item_dispenser.gd" id="1_4m60m"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://Items/PickupCube.tscn" id="2_nn8tr"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_ahn1e"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://Prefabs/slide_off_dome.tscn" id="4_nn8tr"]
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
radius = 0.29541016
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.1764706, 1, 1, 1)
[sub_resource type="BoxMesh" id="BoxMesh_irf4n"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector3(0.1, 0.1, 0.1)
[node name="CubeSideDispenser2" type="StaticBody3D" unique_id=200950572]
script = ExtResource("1_4m60m")
item_scene = ExtResource("2_nn8tr")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=1018021004]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0440714, -0.002165556)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("3_ahn1e")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=182042233]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.15291119, 0)
shape = SubResource("SphereShape3D_xmbo2")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1974757539]
shape = SubResource("CylinderShape3D_24d3s")
[node name="SlideOffDome" parent="." unique_id=1427609426 instance=ExtResource("4_nn8tr")]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=1172420592]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1073546772]
radius = 0.3
sides = 32
[node name="Cubes" type="Node3D" parent="." unique_id=100532970]
[node name="MeshInstance3D" type="MeshInstance3D" parent="Cubes" unique_id=2040729886]
transform = Transform3D(0.9709369, 0, 0.23933554, 0, 1, 0, -0.23933554, 0, 0.9709369, -0.0038359165, 1.0421022, -0.1349423)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="Cubes" unique_id=2119335322]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1336323, 1.0421022, 0.049409628)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="Cubes" unique_id=896999260]
transform = Transform3D(0.94914126, 0, -0.31485054, 0, 1, 0, 0.31485054, 0, 0.94914126, 0.021345377, 1.0421022, 0.13508391)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="Cubes" unique_id=1055210121]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.14830339, 1.0421022, 0.054090023)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="Cubes" unique_id=1800524097]
transform = Transform3D(0.966823, 0, -0.2554472, 0, 1, 0, 0.2554472, 0, 0.966823, 0.12695658, 1.0421022, -0.07926583)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D6" type="MeshInstance3D" parent="Cubes" unique_id=192094054]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.11111963, 1.0421022, -0.094003916)
mesh = SubResource("BoxMesh_irf4n")
+58
View File
@@ -0,0 +1,58 @@
class_name DayController
extends Node
# DayController Emits singals to spawn customers.
var day_time_remaining: float = 0.0
var customers_spawned: int = 0
var customers_served: int = 0
func _ready() -> void:
GameManager.set_game_state(GameManager.GameState.BUILDING)
Signals.game_state_changed.connect(_on_game_state_changed)
func _on_game_state_changed(new_state: GameManager.GameState) -> void:
if new_state == GameManager.GameState.RUNNING:
start_next_day()
# Returns 0-1 progress of the day time
func get_day_progression() -> float:
return 1 - (day_time_remaining / GameManager.day_length_seconds)
func _reset_values() -> void:
day_time_remaining = GameManager.day_length_seconds
customers_spawned = 0
customers_served = 0
func start_next_day() -> void:
SweetLogger.info("starting next day")
_reset_values()
GameManager.set_customers_per_day(GameManager.customers_per_day + GameManager.customers_count_increase_per_day)
GameManager.set_day_number(GameManager.day_number + 1)
func finish_current_day() -> void:
SweetLogger.info("finishing current day")
_reset_values()
func _process(delta: float) -> void:
if GameManager.game_state != GameManager.GameState.RUNNING:
return
day_time_remaining -= delta
var customers_at_this_time = GameManager.customers_per_day * get_day_progression()
#print("DayController: customers_at_this_time: ", customers_at_this_time)
if customers_spawned < customers_at_this_time:
customers_spawned += 1
SweetLogger.debug("spawning customer")
Signals.request_customer_spawn.emit()
# If day complete
if GameManager.customers_per_day == customers_served and customers_spawned == GameManager.customers_per_day:
SweetLogger.info("day complete")
finish_current_day()
+1
View File
@@ -0,0 +1 @@
uid://bbr5arulbeuvq
+26 -21
View File
@@ -1,20 +1,20 @@
[gd_scene format=3 uid="uid://c1nv4w33fedj6"] [gd_scene format=3 uid="uid://c1nv4w33fedj6"]
[ext_resource type="Script" uid="uid://b4ldkd3ngs0vp" path="res://main.gd" id="1_72gy5"] [ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Net/multiplayer_world.gd" id="1_jfr2g"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://XROrigin.tscn" id="2_8wkh3"] [ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="2_8wkh3"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_m56cs"] [ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="3_m56cs"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="4_5kvh0"] [ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="4_5kvh0"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="5_l1qm6"] [ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="5_l1qm6"]
[ext_resource type="PackedScene" uid="uid://c0lknik4noobs" path="res://Items/BurgerBuns.tscn" id="6_bktvt"] [ext_resource type="PackedScene" uid="uid://c0lknik4noobs" path="res://items/BurgerBuns.tscn" id="6_bktvt"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://Stations/BurgerBunsDispenser.tscn" id="7_1nkd0"] [ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="7_1nkd0"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="8_l1owj"] [ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="8_l1owj"]
[ext_resource type="PackedScene" uid="uid://dpot5qie20vf6" path="res://Items/burger.tscn" id="9_220hi"] [ext_resource type="PackedScene" uid="uid://dpot5qie20vf6" path="res://items/burger.tscn" id="9_220hi"]
[ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://Items/hamburger.tscn" id="10_qacki"] [ext_resource type="PackedScene" uid="uid://b3m2ag8g5rj4r" path="res://items/hamburger.tscn" id="10_qacki"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://Items/PickupCube.tscn" id="11_npf8s"] [ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="11_npf8s"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://Stations/sink.tscn" id="12_8apyq"] [ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="12_8apyq"]
[ext_resource type="PackedScene" uid="uid://cnjwtnhwh0i8q" path="res://Stations/dirt_station.tscn" id="13_jnwcx"] [ext_resource type="PackedScene" uid="uid://cnjwtnhwh0i8q" path="res://stations/dirt_station.tscn" id="13_jnwcx"]
[ext_resource type="PackedScene" uid="uid://cfc4ho67u4r5e" path="res://Items/cooked_burger.tscn" id="14_1lg2m"] [ext_resource type="PackedScene" uid="uid://cfc4ho67u4r5e" path="res://items/cooked_burger.tscn" id="14_1lg2m"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://Stations/Counter.tscn" id="15_yy81s"] [ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="15_yy81s"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="16_vp"] [ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="16_vp"]
[ext_resource type="PackedScene" path="res://UI/main_menu_panel.tscn" id="17_panel"] [ext_resource type="PackedScene" path="res://UI/main_menu_panel.tscn" id="17_panel"]
@@ -35,7 +35,8 @@ ssil_enabled = true
sdfgi_enabled = true sdfgi_enabled = true
[node name="Main" type="Node3D" unique_id=1312265607] [node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_72gy5") script = ExtResource("1_jfr2g")
populate_from_layout = false
[node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("2_8wkh3")] [node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("2_8wkh3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.36171648, 0, 0.81835127) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.36171648, 0, 0.81835127)
@@ -61,7 +62,7 @@ shape = SubResource("BoxShape3D_vlqg6")
mesh = SubResource("BoxMesh_24d3s") mesh = SubResource("BoxMesh_24d3s")
[node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("4_5kvh0")] [node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("4_5kvh0")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.29336345, 0.5, -1.484) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.29336345, 0.015500337, -1.484)
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250] [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1") environment = SubResource("Environment_bvwq1")
@@ -112,7 +113,7 @@ transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, 0, -2.6
transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, -5.293956e-23, -2.6077032e-08, 1.4901161e-08, 1, 0.7462772, 1.0768684, -1.1673055) transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, -5.293956e-23, -2.6077032e-08, 1.4901161e-08, 1, 0.7462772, 1.0768684, -1.1673055)
[node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("12_8apyq")] [node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("12_8apyq")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.3147688, 0.5, -1.4940417) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.3147688, 0.015500337, -1.4940417)
[node name="DirtStation" parent="." unique_id=160842153 instance=ExtResource("13_jnwcx")] [node name="DirtStation" parent="." unique_id=160842153 instance=ExtResource("13_jnwcx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.0864775, 0.5, -1.244947) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.0864775, 0.5, -1.244947)
@@ -148,19 +149,23 @@ transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, 0, -2.6
transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, -5.293956e-23, -2.6077032e-08, 1.4901161e-08, 1, -1.4505737, 1.0734154, 0.16882455) transform = Transform3D(1, 0, -2.2351742e-08, -2.9802322e-08, 1.0000001, -5.293956e-23, -2.6077032e-08, 1.4901161e-08, 1, -1.4505737, 1.0734154, 0.16882455)
[node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("15_yy81s")] [node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("15_yy81s")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.7124918, 0.5, -1.4886917) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.7124918, 0.015500337, -1.4886917)
[node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_yy81s")] [node name="Counter2" parent="." unique_id=368890752 instance=ExtResource("15_yy81s")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.5, -0.4458799) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.015500337, -0.4458799)
[node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_yy81s")] [node name="Counter3" parent="." unique_id=1498817646 instance=ExtResource("15_yy81s")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.5, 0.55367994) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.015500337, 0.55367994)
[node name="Counter4" parent="." unique_id=906748771 instance=ExtResource("15_yy81s")] [node name="Counter4" parent="." unique_id=906748771 instance=ExtResource("15_yy81s")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.5, 1.5539298) transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -1.7648025, 0.015500337, 1.5539298)
[node name="Hamburger3" parent="." unique_id=369573848 instance=ExtResource("10_qacki")] [node name="Hamburger3" parent="." unique_id=369573848 instance=ExtResource("10_qacki")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.7201865, 1.142413, 0.14773655) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.7201865, 1.142413, 0.14773655)
[node name="Plate3" parent="." unique_id=2004250522 instance=ExtResource("8_l1owj")] [node name="Plate3" parent="." unique_id=2004250522 instance=ExtResource("8_l1owj")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5818124, 1.1085004, -0.4634577) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.5818124, 1.1085004, -0.4634577)
[node name="WorldContent" type="Node3D" parent="." unique_id=1660879286]
[node name="Players" type="Node3D" parent="." unique_id=494935131]
+26 -4
View File
@@ -1,9 +1,15 @@
[gd_scene format=3 uid="uid://c30i6h32w8p47"] [gd_scene format=3 uid="uid://c30i6h32w8p47"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Scenes/multiplayer_world.gd" id="1_kdan8"] [ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Net/multiplayer_world.gd" id="1_kdan8"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://XROrigin.tscn" id="2_g30gi"] [ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://Prefabs/XROrigin.tscn" id="2_g30gi"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_75ecy"] [ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="3_75ecy"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="5_c3xgf"] [ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="5_c3xgf"]
[ext_resource type="Script" uid="uid://fyd2rjramhbb" path="res://Prefabs/kitchen_instantiator.gd" id="6_pw2j5"]
[ext_resource type="PackedScene" uid="uid://damrxtlt7uswf" path="res://content/station_layouts/small_line.tscn" id="7_0sjqq"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="8_0sjqq"]
[ext_resource type="PackedScene" uid="uid://dm70ynyuw1a5u" path="res://Prefabs/day_controller.tscn" id="9_5wx0o"]
[ext_resource type="PackedScene" uid="uid://bnwb7imcotkod" path="res://Prefabs/build_mode_controller.tscn" id="10_464r1"]
[ext_resource type="PackedScene" uid="uid://dxe05wp60jg3l" path="res://Scenes/queue_controller.tscn" id="11_de1dy"]
[ext_resource type="Script" uid="uid://biu4qr3nr1eny" path="res://test/mp_test_driver.gd" id="99_mptst"] [ext_resource type="Script" uid="uid://biu4qr3nr1eny" path="res://test/mp_test_driver.gd" id="99_mptst"]
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"] [sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
@@ -25,8 +31,10 @@ sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_arao0"] [sub_resource type="BoxShape3D" id="BoxShape3D_arao0"]
size = Vector3(15, 20, 0.1) size = Vector3(15, 20, 0.1)
[node name="Main" type="Node3D" unique_id=1312265607] [node name="Main" type="Node3D" unique_id=1312265607 node_paths=PackedStringArray("items_spawner", "players_spawner")]
script = ExtResource("1_kdan8") script = ExtResource("1_kdan8")
items_spawner = NodePath("ItemsSpawner")
players_spawner = NodePath("PlayersSpawner")
[node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_g30gi")] [node name="XROrigin3D" parent="." unique_id=2055526621 groups=["local_xr_origin"] instance=ExtResource("2_g30gi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.36171648, 0, 0.81835127) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.36171648, 0, 0.81835127)
@@ -55,6 +63,7 @@ environment = SubResource("Environment_bvwq1")
spawn_path = NodePath("../WorldContent") spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=106645565] [node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=106645565]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players") spawn_path = NodePath("../Players")
[node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=4404969] [node name="StaticBody3D" type="StaticBody3D" parent="." unique_id=4404969]
@@ -75,5 +84,18 @@ shape = SubResource("BoxShape3D_arao0")
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 7.502467, 9.197384, -0.018813023) transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 7.502467, 9.197384, -0.018813023)
shape = SubResource("BoxShape3D_arao0") shape = SubResource("BoxShape3D_arao0")
[node name="TestDriver" type="Node" parent="."] [node name="TestDriver" type="Node" parent="." unique_id=580575192]
script = ExtResource("99_mptst") script = ExtResource("99_mptst")
[node name="KitchenInstantiator" type="Node3D" parent="." unique_id=1328198547]
transform = Transform3D(1, 0, -1.7484555e-07, 0, 1, 0, 1.7484555e-07, 0, 1, 0, 0, -1.2)
script = ExtResource("6_pw2j5")
kitchen_scene = ExtResource("7_0sjqq")
hob_scene = ExtResource("8_0sjqq")
[node name="DayController" parent="." unique_id=1418639156 instance=ExtResource("9_5wx0o")]
[node name="BuildModeController" parent="." unique_id=552013109 instance=ExtResource("10_464r1")]
[node name="QueueController" parent="." unique_id=326512876 instance=ExtResource("11_de1dy")]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 7.2000003)
-145
View File
@@ -1,145 +0,0 @@
extends Node3D
## World script for the multiplayer scene. Starts the host/join the menu asked
## for, turns the authored kitchen into replicated objects, gives every connected
## peer an avatar, and returns to the menu when the session ends.
##
## The world's contents are NOT left baked into the scene file. Whatever the
## scene authors is treated as a template: the server spawns real copies of it
## through NetWorld and every peer drops its own authored originals. A client
## therefore shows the server's world rather than assuming its local copy of the
## scene matches — which is also exactly the path a player joining mid-session
## takes.
const PLAYER_SCENE := "res://Player/net_player.tscn"
## Whether to build the full kitchen on the machine that owns the world. The real
## game scene wants this; focused debug scenes bake their own handful of objects
## and turn it off, so the thing under test is not sharing the world with a
## second copy of the whole kitchen.
@export var populate_from_layout: bool = true
var xr_interface: XRInterface
var _net_world: NetWorld
var _populated := false
func _ready() -> void:
xr_interface = XRServer.find_interface("OpenXR")
if xr_interface and xr_interface.is_initialized():
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
get_viewport().use_xr = true
# Both roots go through the same generic replication hook, so a player avatar
# is just another replicated object — nothing about it is special-cased.
_net_world = NetWorld.new()
_net_world.name = "NetWorld"
add_child(_net_world)
_net_world.setup($ItemsSpawner, $WorldContent)
$PlayersSpawner.add_spawnable_scene(PLAYER_SCENE)
$Players.child_entered_tree.connect(_on_player_entered)
NetworkManager.register_world(self, _net_world)
NetworkManager.player_joined.connect(_on_player_joined)
NetworkManager.player_left.connect(_on_player_left)
NetworkManager.session_started.connect(_on_session_started)
NetworkManager.session_ended.connect(_on_session_ended)
NetworkManager.connection_failed.connect(_on_connection_failed)
# world_ready() is what actually calls host()/join() (or the command-line
# equivalent). Populating before this point would be wrong for every case, not
# just offline: is_online() is still false until host()/join() runs, so
# owns_world() reads true for a joining client too and it would build its own
# copy instead of receiving the server's. host() emits session_started
# synchronously, which populates via _on_session_started; the call after
# world_ready() only covers the case where neither ran — this scene opened
# directly, offline.
NetworkManager.world_ready()
_populate_world_if_owner()
func _on_player_entered(node: Node) -> void:
if node is MultiplayerSynchronizer:
return
NetReplication.attach(node)
func _exit_tree() -> void:
NetworkManager.unregister_world()
func _on_session_started(_is_server: bool) -> void:
_populate_world_if_owner()
## Turns the authored template into replicated objects, exactly once, on the
## machine that owns world logic. Safe to call from several entry points.
func _populate_world_if_owner() -> void:
if _populated or not populate_from_layout:
return
# WorldLayout reads the live scene tree to find what to replicate, so it has
# to be an instance sitting in that tree.
var layout := WorldLayout.new()
add_child(layout)
var authored := layout.get_authored_nodes()
# Every peer drops its authored copies. The client would otherwise show its
# local originals on top of the server's replicated ones, and the two sets
# would drift apart because only the server's are synced.
if not NetworkManager.owns_world():
NetworkManager.log_line("Clearing %d authored nodes; the server's copies replace them" % authored.size())
_remove_authored(authored)
layout.queue_free()
return
_populated = true
GameManager.meals_in_play = ["hamburger"]
var objects := layout.describe(authored)
layout.queue_free()
_remove_authored(authored)
NetworkManager.log_line("Populating world: %d objects" % objects.size())
for d in objects:
NetworkManager.spawn_item(d["scene"], d["xform"], d["name"], d["props"])
NetworkManager.log_line("World populated")
# Freed immediately rather than queue_free()d, so the names are released before
# the replicated copies are spawned under the same ones.
func _remove_authored(nodes: Array[Node]) -> void:
for node in nodes:
if is_instance_valid(node):
node.get_parent().remove_child(node)
node.free()
## Only the server (or the single offline machine) creates avatars;
## MultiplayerSpawner replicates the result to everyone else, late joiners
## included.
func _on_player_joined(peer_id: int) -> void:
if not NetworkManager.owns_world() or $Players.has_node(str(peer_id)):
return
var p: Node = load(PLAYER_SCENE).instantiate()
# The name is the peer id, which is how net_player.gd knows whose avatar it
# is on every peer — MultiplayerSpawner replicates the name.
p.name = str(peer_id)
$Players.add_child(p)
NetworkManager.log_line("Spawned avatar for peer %d" % peer_id)
func _on_player_left(peer_id: int) -> void:
if not NetworkManager.owns_world():
return
var p := $Players.get_node_or_null(str(peer_id))
if p:
p.queue_free()
NetworkManager.log_line("Despawned avatar for peer %d" % peer_id)
func _on_session_ended() -> void:
NetworkManager.log_line("Session ended, returning to main menu")
get_tree().change_scene_to_file("res://Scenes/mainMenu.tscn")
func _on_connection_failed() -> void:
NetworkManager.log_line("Connection failed, returning to main menu")
get_tree().change_scene_to_file("res://Scenes/mainMenu.tscn")
+213
View File
File diff suppressed because one or more lines are too long
+63
View File
@@ -0,0 +1,63 @@
class_name QueueController
extends Node3D
@export var queue_patience: float = 120
@export var progress_bar_3d: ProgressBar3D
@export var label_3d: Label3D
var _customers: Array[float] = [] # Temp. Array of their patience
var _tables: Array[Node3D] = []
func _ready() -> void:
progress_bar_3d.override_fill_color(Color.YELLOW)
progress_bar_3d.exponential = true
Signals.request_customer_spawn.connect(_on_request_customer_spawn)
Signals.game_state_changed.connect(_on_game_state_changed)
func _on_game_state_changed(new_state: GameManager.GameState) -> void:
if new_state == GameManager.GameState.RUNNING:
_rebuild_table_list()
func _on_request_customer_spawn() -> void:
spawn_customer()
func spawn_customer() -> void:
_customers.append(queue_patience)
func _rebuild_table_list() -> void:
_tables.clear()
_tables.append_array(get_tree().get_nodes_in_group("table"))
SweetLogger.debug("_rebuild_table_list complete: {0}", [_tables])
func _try_to_assign_customers() -> void:
for customer in _customers:
for table: Table in _tables:
var result: bool = table.try_consume_customer()
if result == true:
_customers.pop_front()
break
func _process(delta: float) -> void:
# Process customers patience
for i in range(0, _customers.size()):
_customers[i] -= delta
if _customers[i] <= 0:
GameManager.game_over()
_try_to_assign_customers()
# Update visuals
if not _customers.is_empty():
label_3d.text = "Customers in queue: " + str(_customers.size())
progress_bar_3d.set_progress(_customers.front() / queue_patience)
else:
progress_bar_3d.set_progress(0)
label_3d.text = "No Customers"
+1
View File
@@ -0,0 +1 @@
uid://dww2icfivdsai
+18
View File
@@ -0,0 +1,18 @@
[gd_scene format=3 uid="uid://dxe05wp60jg3l"]
[ext_resource type="Script" uid="uid://dww2icfivdsai" path="res://scenes/queue_controller.gd" id="1_ieivv"]
[ext_resource type="PackedScene" uid="uid://bxbocxdaayvwx" path="res://UI/progress_bar.tscn" id="2_fn3y7"]
[node name="QueueController" type="Node3D" unique_id=326512876 node_paths=PackedStringArray("progress_bar_3d", "label_3d")]
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
script = ExtResource("1_ieivv")
progress_bar_3d = NodePath("ProgressBar3D")
label_3d = NodePath("Label3D")
[node name="ProgressBar3D" parent="." unique_id=654673176 instance=ExtResource("2_fn3y7")]
transform = Transform3D(2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2.4, 0)
exponential = true
[node name="Label3D" type="Label3D" parent="." unique_id=994715754]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.147749, 0)
text = "X customers in queue"
+68 -17
View File
@@ -1,13 +1,21 @@
[gd_scene format=3 uid="uid://dbgu4r127ke5v"] [gd_scene format=3 uid="uid://dbgu4r127ke5v"]
[ext_resource type="Script" uid="uid://b4ldkd3ngs0vp" path="res://main.gd" id="1_1ymas"] [ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://Net/multiplayer_world.gd" id="1_atgwk"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://Textures/sky/NightSkyHDRI009_16K.tres" id="2_1jq86"] [ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="2_1jq86"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://XROrigin.tscn" id="3_bryd6"] [ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="3_bryd6"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://Textures/dev_material_3d.tres" id="4_kpgm6"] [ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="4_kpgm6"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://Stations/Hob.tscn" id="5_gfdi7"] [ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="5_gfdi7"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://Stations/sink.tscn" id="6_fmmg3"] [ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="7_jnxsa"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://Stations/Counter.tscn" id="7_jnxsa"] [ext_resource type="PackedScene" uid="uid://bnwb7imcotkod" path="res://prefabs/build_mode_controller.tscn" id="9_hooyg"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://Items/PickupCube.tscn" id="8_xl5nn"] [ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="11_gaw43"]
[ext_resource type="PackedScene" uid="uid://cwnwo4i28upap" path="res://stations/raw_burger_dispenser.tscn" id="12_hooyg"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="12_n58f2"]
[ext_resource type="PackedScene" uid="uid://c6rift56ql3f8" path="res://stations/BurgerBunsDispenser.tscn" id="13_cqmpj"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="13_hooyg"]
[ext_resource type="PackedScene" uid="uid://ck5tuftqmyiue" path="res://stations/plate_dispenser.tscn" id="14_bjwcu"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://prefabs/GameOvercontroler.gd" id="14_cqmpj"]
[ext_resource type="PackedScene" uid="uid://dxe05wp60jg3l" path="res://scenes/queue_controller.tscn" id="15_cqmpj"]
[ext_resource type="PackedScene" uid="uid://dm70ynyuw1a5u" path="res://prefabs/day_controller.tscn" id="17_bjwcu"]
[sub_resource type="Environment" id="Environment_bvwq1"] [sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2 background_mode = 2
@@ -32,17 +40,49 @@ size = Vector3(20, 0.1, 20)
size = Vector3(20, 10, 0.1) size = Vector3(20, 10, 0.1)
[node name="Main" type="Node3D" unique_id=1312265607] [node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_1ymas") script = ExtResource("1_atgwk")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250] [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1") environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("3_bryd6")] [node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("3_bryd6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9667189, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9667189, 2.4)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0) transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="WorldContent" type="Node3D" parent="." unique_id=1945394545]
[node name="Players" type="Node3D" parent="." unique_id=177940558]
[node name="Stations" type="Node3D" parent="." unique_id=1243299496]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=201060343]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=1840881658]
_spawnable_scenes = PackedStringArray("uid://c58ns7csdahjy")
spawn_path = NodePath("../Players")
[node name="GameOverPanel" parent="." unique_id=522901881 instance=ExtResource("12_n58f2")]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 2.7718225, 2.8122003, 1.8000003)
scene = ExtResource("13_hooyg")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=1442195864]
script = ExtResource("14_cqmpj")
[node name="BuildModeController" parent="." unique_id=552013109 instance=ExtResource("9_hooyg")]
[node name="QueueController" parent="." unique_id=326512876 instance=ExtResource("15_cqmpj")]
transform = Transform3D(-1, 0, -1.509958e-07, 0, 1, 0, 1.509958e-07, 0, -1, -1.2, 0, 4.8)
[node name="DayController" parent="." unique_id=1418639156 instance=ExtResource("17_bjwcu")]
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514] [node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
@@ -72,13 +112,24 @@ transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.93
shape = SubResource("BoxShape3D_24d3s") shape = SubResource("BoxShape3D_24d3s")
[node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("5_gfdi7")] [node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("5_gfdi7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.35077858, 0.50655985, -1.2833805)
[node name="Sink" parent="." unique_id=2055277359 instance=ExtResource("6_fmmg3")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.24685252, 0.51461196, -1.2828919)
[node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("7_jnxsa")] [node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("7_jnxsa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.94890714, 0.5115015, -1.3041471) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 0, 0)
[node name="PickableObject" parent="." unique_id=1675596942 instance=ExtResource("8_xl5nn")] [node name="Table" parent="." unique_id=1863572470 instance=ExtResource("11_gaw43")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.87560004, 1.5534955, -1.2869046) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0, 1.8)
[node name="Table2" parent="." unique_id=987495548 instance=ExtResource("11_gaw43")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0, 2.4)
[node name="Table3" parent="." unique_id=113648557 instance=ExtResource("11_gaw43")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8, 0, 3)
[node name="RawBurgerDispenser" parent="." unique_id=383615587 instance=ExtResource("12_hooyg")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0)
[node name="BurgerBunsDispenser" parent="." unique_id=1410160280 instance=ExtResource("13_cqmpj")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0, 0)
[node name="PlateDispenser" parent="." unique_id=53391541 instance=ExtResource("14_bjwcu")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.8000001, 0, 0.6)
+127
View File
@@ -0,0 +1,127 @@
[gd_scene format=3 uid="uid://dbgu4r127ke5v"]
[ext_resource type="Script" uid="uid://d1cefhe3yyyds" path="res://scenes/multiplayer_world.gd" id="1_atgwk"]
[ext_resource type="Sky" uid="uid://c1abtpwhdm2d5" path="res://textures/sky/NightSkyHDRI009_16K.tres" id="2_1jq86"]
[ext_resource type="PackedScene" uid="uid://j5s5wus7tuhb" path="res://prefabs/XROrigin.tscn" id="3_bryd6"]
[ext_resource type="Material" uid="uid://cmia50cfqxxo4" path="res://textures/dev_material_3d.tres" id="4_kpgm6"]
[ext_resource type="PackedScene" uid="uid://j7caslh27nor" path="res://stations/Hob.tscn" id="5_gfdi7"]
[ext_resource type="PackedScene" uid="uid://efaec6ymgabo" path="res://stations/Counter.tscn" id="7_jnxsa"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="8_1qeqw"]
[ext_resource type="PackedScene" uid="uid://dlw5geheupgpt" path="res://stations/hatch.tscn" id="8_atgwk"]
[ext_resource type="Script" uid="uid://bsdpd18i1i17s" path="res://prefabs/build_mode_controller.gd" id="9_atgwk"]
[ext_resource type="PackedScene" uid="uid://dvrk268s7gkxh" path="res://stations/sink.tscn" id="10_dhas4"]
[ext_resource type="PackedScene" uid="uid://caf0xanmxbshy" path="res://stations/table.tscn" id="11_gaw43"]
[ext_resource type="PackedScene" uid="uid://clujaf3u776a3" path="res://addons/godot-xr-tools/objects/viewport_2d_in_3d.tscn" id="12_n58f2"]
[ext_resource type="PackedScene" uid="uid://xtcei2uvd5li" path="res://UI/game_over_panel.tscn" id="13_hooyg"]
[ext_resource type="Script" uid="uid://cwijoksyou1ey" path="res://scenes/GameOvercontroler.gd" id="14_cqmpj"]
[sub_resource type="Environment" id="Environment_bvwq1"]
background_mode = 2
sky = ExtResource("2_1jq86")
ambient_light_source = 3
ambient_light_color = Color(1, 1, 1, 1)
ambient_light_sky_contribution = 0.9
reflected_light_source = 2
ssr_enabled = true
ssao_enabled = true
ssil_enabled = true
sdfgi_enabled = true
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxMesh" id="BoxMesh_24d3s"]
material = ExtResource("4_kpgm6")
size = Vector3(20, 0.1, 20)
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(20, 10, 0.1)
[node name="Main" type="Node3D" unique_id=1312265607]
script = ExtResource("1_atgwk")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1177077250]
environment = SubResource("Environment_bvwq1")
[node name="XROrigin3D" parent="." unique_id=2055526621 instance=ExtResource("3_bryd6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9667189, 2.4)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=1376644384]
transform = Transform3D(-0.8660254, -0.43301278, 0.24999999, 0.3022632, -0.05510214, 0.9516306, -0.39829266, 0.8997021, 0.17860365, 0, 0, 0)
[node name="WorldContent" type="Node3D" parent="." unique_id=1945394545]
[node name="Players" type="Node3D" parent="." unique_id=177940558]
[node name="Stations" type="Node3D" parent="." unique_id=1243299496]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, 1.8000001, 0, 1.8000001)
[node name="ItemsSpawner" type="MultiplayerSpawner" parent="." unique_id=201060343]
spawn_path = NodePath("../WorldContent")
[node name="PlayersSpawner" type="MultiplayerSpawner" parent="." unique_id=1840881658]
_spawnable_scenes = PackedStringArray("res://Player/net_player.tscn")
spawn_path = NodePath("../Players")
[node name="Floor" type="StaticBody3D" parent="." unique_id=122279514]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.05, 0)
[node name="CollisionShape3D" type="CollisionShape3D" parent="Floor" unique_id=958841648]
shape = SubResource("BoxShape3D_vlqg6")
[node name="MeshInstance3D" type="MeshInstance3D" parent="Floor/CollisionShape3D" unique_id=1939997056]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00018164515, 0.0006352663, -0.002532661)
mesh = SubResource("BoxMesh_24d3s")
[node name="InvisibleWalls" type="StaticBody3D" parent="." unique_id=315740174]
[node name="CollisionShape3D" type="CollisionShape3D" parent="InvisibleWalls" unique_id=33059670]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, 8.838269)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="InvisibleWalls" unique_id=2018792171]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.688614, -10.243342)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D3" type="CollisionShape3D" parent="InvisibleWalls" unique_id=757662929]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, -9.807113, 4.688614, -0.018813243)
shape = SubResource("BoxShape3D_24d3s")
[node name="CollisionShape3D4" type="CollisionShape3D" parent="InvisibleWalls" unique_id=1468386997]
transform = Transform3D(-4.371139e-08, 0, -1, 0, 1, 0, 1, 0, -4.371139e-08, 9.934778, 4.297072, -0.018813023)
shape = SubResource("BoxShape3D_24d3s")
[node name="Hob" parent="." unique_id=1687971542 instance=ExtResource("5_gfdi7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.507, 0)
[node name="Counter" parent="." unique_id=1487893288 instance=ExtResource("7_jnxsa")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.6, 0.512, 0)
[node name="Potato" parent="." unique_id=962444046 instance=ExtResource("8_1qeqw")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.273382, 1.5940565, -0.036002517)
[node name="Hatch" parent="." unique_id=1341321603 instance=ExtResource("8_atgwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.2, 0, 0)
[node name="Hatch2" parent="." unique_id=1755144529 instance=ExtResource("8_atgwk")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0)
[node name="BuildModeController" type="Node" parent="." unique_id=1876729190]
script = ExtResource("9_atgwk")
[node name="Sink" parent="." unique_id=1559059799 instance=ExtResource("10_dhas4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2, 0.5, 0)
[node name="Table" parent="." unique_id=1863572470 instance=ExtResource("11_gaw43")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4, 0.5, 1.8)
[node name="GameOverPanel" parent="." unique_id=522901881 instance=ExtResource("12_n58f2")]
transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -4.428178, 2.8122003, 3)
scene = ExtResource("13_hooyg")
viewport_size = Vector2(900, 600)
transparent = 0
filter = false
scene_properties_keys = PackedStringArray("game_over_panel.gd")
[node name="controler" type="Node" parent="GameOverPanel" unique_id=1442195864]
script = ExtResource("14_cqmpj")
+207
View File
@@ -0,0 +1,207 @@
extends TileMapLayer
@export var tile_map: TileMapLayer
@export_enum("Small", "medeam", "large") var map_size: int
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
tile_map.clear()
var mane_size = Vector2i(randi_range(16,20), randi_range(12,16))
if map_size == 1:
mane_size = Vector2i(randi_range(20,26), randi_range(12,18))
if map_size == 2:
mane_size = Vector2i(randi_range(26,32), randi_range(18,24))
#mane_size = Vector2i(10, 10)
var walls = draw_room(mane_size)
var next_room = Vector2i(randi_range(mane_size[0]/2,(mane_size[0]/3)*2), randi_range(mane_size[1]/2,(mane_size[1]/3)*2))
var good = []
for x in range(mane_size[0]):
for y in range(mane_size[1]):
if test_pos(Vector2i(x, y), next_room, walls, mane_size):
#tile_map.set_cell(Vector2i(x,y), 0, Vector2i(1,4))
good.append([x,y])
if good.size()>0:
for wall in draw_room(next_room, good.pick_random()):
walls.append(wall)
for i in range(8):
next_room = Vector2i(randi_range(mane_size[0]/(3+i),mane_size[0]/(2+i)), randi_range(mane_size[1]/(3+i), mane_size[1]/(2+i)))
good = []
if next_room[0]>4 and next_room[1]>4:
for x in range(mane_size[0]):
for y in range(mane_size[1]):
if test_pos(Vector2i(x, y), next_room, walls, mane_size):
#tile_map.set_cell(Vector2i(x,y), 0, Vector2i(5,3))
good.append([x,y])
if good.size()>0:
for wall in draw_room(next_room, good.pick_random()):
walls.append(wall)
func overLap(pos1, len1, pos2, len2):
#print("pos1: ", pos1, " len1: ", len1, " pos2: ", pos2, " len2: ", len2)
if pos1 <= pos2 and pos1+len1 >= pos2: return true
if pos2 <= pos1 and pos2+len2 >= pos1: return true
return false
func overLapWall(wall, pos, size):
var totle = 0
var wall_tiles = []
for i in range(wall["len"]):
if wall["der"][1] == 0:wall_tiles.append(wall["pos"]+Vector2i(i,0))
else:wall_tiles.append(wall["pos"]+Vector2i(0,i))
for x in range(size[0]+1):
for y in range(size[1]+1):
if Vector2i(x+pos[0], y+pos[1]) in wall_tiles: totle+=1
return totle
func test_pos(pos, size, walls, mane_size):
if pos[0]+size[0] > mane_size[0]:return false
if pos[1]+size[1] > mane_size[1]:return false
var overlap = 0
for wall in walls:
overlap += overLapWall(wall, pos, size)
if wall["der"][1] == 0:#horisontal wall
if overLap(wall["pos"][0], wall["len"], pos[0], size[0]):
if wall["pos"][1]+1 == pos[1]: return false
if wall["pos"][1]+2 == pos[1]: return false
if wall["pos"][1]-1 == pos[1]: return false
if wall["pos"][1]-2 == pos[1]: return false
if wall["pos"][1]+1 == pos[1]+size[1]: return false
if wall["pos"][1]+2 == pos[1]+size[1]: return false
if wall["pos"][1]-1 == pos[1]+size[1]: return false
if wall["pos"][1]-2 == pos[1]+size[1]: return false
else:#virtical wall
if overLap(wall["pos"][1], wall["len"], pos[1], size[1]):
if wall["pos"][0]+1 == pos[0]: return false
if wall["pos"][0]+2 == pos[0]: return false
if wall["pos"][0]-1 == pos[0]: return false
if wall["pos"][0]-2 == pos[0]: return false
if wall["pos"][0]+1 == pos[0]+size[0]: return false
if wall["pos"][0]+2 == pos[0]+size[0]: return false
if wall["pos"][0]-1 == pos[0]+size[0]: return false
if wall["pos"][0]-2 == pos[0]+size[0]: return false
#if pos[1]+size[1] > wall["len"]:return false
if overlap < 3: return false
return true
func get_next(size, walls):
var offset = [-1,-1]
walls.shuffle()
SweetLogger.debug("get_next size: {0}", [size])
for wall in walls:
SweetLogger.debug("get_next wall: {0}", [wall])
if wall["der"][1] == 0:
SweetLogger.debug("get_next horizontal wall")
if size[0]<wall["len"]-6:
SweetLogger.debug("TileMapLayer get_next length 6 less can go anywhere")
if wall["der"][0] == 1:offset[1] = wall["pos"][1]
else: offset[1] = wall["pos"][1]-size[1]
offset[0] = randi_range(0, wall["len"]-size[0])
if offset[0]>wall["pos"][0] and offset[0]<wall["pos"][0]+3:offset[0]=wall["pos"][0]+3
if size[0]+offset[0]>wall["pos"][0]+wall["len"]-3:offset[0] = wall["len"]-(3+size[0])
elif size[0]<=wall["len"]-3:
SweetLogger.debug("TileMapLayer get_next 3 less needs to be on a corner")
if wall["der"][0] == 1:offset[1] = wall["pos"][1]
else: offset[1] = wall["pos"][1]-size[1]
if randi_range(0, 1):offset[0]=wall["pos"][0]+wall["len"]-size[0]
else:offset[0] = wall["pos"][0]
else:
SweetLogger.debug("get_next vertical wall")
if size[1]<wall["len"]-6:
SweetLogger.debug("TileMapLayer get_next length 6 less can go anywhere")
if wall["der"][1] == 1:offset[0] = wall["pos"][0]
else: offset[0] = wall["pos"][0]-size[0]
offset[1] = randi_range(0, wall["len"]-size[1])
if offset[1]>wall["pos"][1] and offset[1]<wall["pos"][1]+3:offset[1]=wall["pos"][1]+3
if size[1]+offset[1]>wall["len"]-3:offset[1] = wall["len"]-(3+size[1])
elif size[1]<=wall["len"]-3:
SweetLogger.debug("TileMapLayer get_next 3 less needs to be on a corner")
if wall["der"][1] == 1:offset[0] = wall["pos"][0]
else: offset[0] = wall["pos"][0]-size[0]
SweetLogger.debug("get_next offset: {0}", [offset])
if randi() % 2:offset[1]=wall["pos"][1]+wall["len"]-size[1]
else:offset[1] = wall["pos"][1]
if offset[0] != -1:break
return offset
func draw_room(Size, offset=Vector2i(0, 0)):
var walls = []
offset = Vector2i(offset[0], offset[1])
SweetLogger.debug("draw_room size: {0} offset: {1}", [Size, offset])
for i in range(Size[0]):
tile_map.set_cell(Vector2i(i+offset[0],offset[1]), 0, Vector2i(1,1))
walls.append({"pos": offset, "der":Vector2i(1, 0), "len":Size[0]})
for i in range(Size[0]):
tile_map.set_cell(Vector2i(i+offset[0],Size[1]+offset[1]), 0, Vector2i(1,1))
walls.append({"pos": Vector2i(offset[0],Size[1]+offset[1]), "der":Vector2i(-1, 0), "len":Size[0]})
for i in range(Size[1]):
tile_map.set_cell(Vector2i(offset[0],i+offset[1]), 0, Vector2i(2,1))
walls.append({"pos": offset, "der":Vector2i(0, 1), "len":Size[1]})
for i in range(Size[1]):
tile_map.set_cell(Vector2i(Size[0]+offset[0],i+offset[1]), 0, Vector2i(2,1))
walls.append({"pos": Vector2i(Size[0]+offset[0],offset[1]), "der":Vector2i(0, -1), "len":Size[1]})
for x in range(Size[0]-1):
for y in range(Size[1]-1):
tile_map.erase_cell(Vector2i(x+1+offset[0],y+1+offset[1]))
tile_map.set_cell(Vector2i(offset[0],offset[1]), 0, Vector2i(5,1))
tile_map.set_cell(Vector2i(Size[0]+offset[0],offset[1]), 0, Vector2i(6,1))
tile_map.set_cell(Vector2i(offset[0],Size[1]+offset[1]), 0, Vector2i(4,1))
tile_map.set_cell(Vector2i(Size[0]+offset[0],Size[1]+offset[1]), 0, Vector2i(3,1))
return walls
func set_room(tile_pos, size, pos):
for x in size[0]:
for y in size[1]:
tile_map.set_cell(Vector2i(x+pos[0],y+pos[1]), 0, tile_pos)
+1
View File
@@ -0,0 +1 @@
uid://br7dvjpr0pmag
-4
View File
@@ -1,4 +0,0 @@
extends Node
signal game_over
signal restart_game
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://mmasxwqyqmib" uid="uid://mmasxwqyqmib"
path="res://.godot/imported/220175__gameaudio__pop-click.wav-1330523e09eacb15d341a14b80e4481e.sample" path="res://.godot/imported/220175__gameaudio__pop-click.wav-6ef2d3317a82c347b715936ede79653a.sample"
[deps] [deps]
source_file="res://Sounds/220175__gameaudio__pop-click.wav" source_file="res://sounds/220175__gameaudio__pop-click.wav"
dest_files=["res://.godot/imported/220175__gameaudio__pop-click.wav-1330523e09eacb15d341a14b80e4481e.sample"] dest_files=["res://.godot/imported/220175__gameaudio__pop-click.wav-6ef2d3317a82c347b715936ede79653a.sample"]
[params] [params]
+3 -3
View File
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://ecva70pect61" uid="uid://ecva70pect61"
path="res://.godot/imported/220178__gameaudio__click.wav-ca46bf33c1c48e1e526f04c43ca7d450.sample" path="res://.godot/imported/220178__gameaudio__click.wav-566ebf31c82573e187ff8a1db97a7861.sample"
[deps] [deps]
source_file="res://Sounds/220178__gameaudio__click.wav" source_file="res://sounds/220178__gameaudio__click.wav"
dest_files=["res://.godot/imported/220178__gameaudio__click.wav-ca46bf33c1c48e1e526f04c43ca7d450.sample"] dest_files=["res://.godot/imported/220178__gameaudio__click.wav-566ebf31c82573e187ff8a1db97a7861.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://b3wxawyrvuc6s" uid="uid://b3wxawyrvuc6s"
path="res://.godot/imported/220179__gameaudio__click-metal-ting.wav-b01c457287fe42298a36c3de7c536c68.sample" path="res://.godot/imported/220179__gameaudio__click-metal-ting.wav-82be282871110eef8fea8249619832d7.sample"
[deps] [deps]
source_file="res://Sounds/220179__gameaudio__click-metal-ting.wav" source_file="res://sounds/220179__gameaudio__click-metal-ting.wav"
dest_files=["res://.godot/imported/220179__gameaudio__click-metal-ting.wav-b01c457287fe42298a36c3de7c536c68.sample"] dest_files=["res://.godot/imported/220179__gameaudio__click-metal-ting.wav-82be282871110eef8fea8249619832d7.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://b7sr2sb1ks5en" uid="uid://b7sr2sb1ks5en"
path="res://.godot/imported/220180__gameaudio__click-pop.wav-9e467150046193d705dd830885c89cd1.sample" path="res://.godot/imported/220180__gameaudio__click-pop.wav-32216325683d314fa3adc66d13e633f4.sample"
[deps] [deps]
source_file="res://Sounds/220180__gameaudio__click-pop.wav" source_file="res://sounds/220180__gameaudio__click-pop.wav"
dest_files=["res://.godot/imported/220180__gameaudio__click-pop.wav-9e467150046193d705dd830885c89cd1.sample"] dest_files=["res://.godot/imported/220180__gameaudio__click-pop.wav-32216325683d314fa3adc66d13e633f4.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://1ccsqbju32ey" uid="uid://1ccsqbju32ey"
path="res://.godot/imported/220187__gameaudio__loosedeny-casual-1.wav-cb0e560d42c6026ded2d2e240e614433.sample" path="res://.godot/imported/220187__gameaudio__loosedeny-casual-1.wav-2e7c1356ffec0a1e5b732b21f42e21a0.sample"
[deps] [deps]
source_file="res://Sounds/220187__gameaudio__loosedeny-casual-1.wav" source_file="res://sounds/220187__gameaudio__loosedeny-casual-1.wav"
dest_files=["res://.godot/imported/220187__gameaudio__loosedeny-casual-1.wav-cb0e560d42c6026ded2d2e240e614433.sample"] dest_files=["res://.godot/imported/220187__gameaudio__loosedeny-casual-1.wav-2e7c1356ffec0a1e5b732b21f42e21a0.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://bdnsgt7xt3261" uid="uid://bdnsgt7xt3261"
path="res://.godot/imported/220194__gameaudio__click-heavy.wav-aca40ed286d93eb365d527a162fd3129.sample" path="res://.godot/imported/220194__gameaudio__click-heavy.wav-43269bff3c60e2451b470f929c6b6bb8.sample"
[deps] [deps]
source_file="res://Sounds/220194__gameaudio__click-heavy.wav" source_file="res://sounds/220194__gameaudio__click-heavy.wav"
dest_files=["res://.godot/imported/220194__gameaudio__click-heavy.wav-aca40ed286d93eb365d527a162fd3129.sample"] dest_files=["res://.godot/imported/220194__gameaudio__click-heavy.wav-43269bff3c60e2451b470f929c6b6bb8.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://daiv8ubwdbidf" uid="uid://daiv8ubwdbidf"
path="res://.godot/imported/220195__gameaudio__click-wooden-1.wav-9368ef861eabf2cf1d5bd0db33c616c8.sample" path="res://.godot/imported/220195__gameaudio__click-wooden-1.wav-f161e2c5a53d686c65d143b45f33acb1.sample"
[deps] [deps]
source_file="res://Sounds/220195__gameaudio__click-wooden-1.wav" source_file="res://sounds/220195__gameaudio__click-wooden-1.wav"
dest_files=["res://.godot/imported/220195__gameaudio__click-wooden-1.wav-9368ef861eabf2cf1d5bd0db33c616c8.sample"] dest_files=["res://.godot/imported/220195__gameaudio__click-wooden-1.wav-f161e2c5a53d686c65d143b45f33acb1.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://qed775b4j1gg" uid="uid://qed775b4j1gg"
path="res://.godot/imported/220196__gameaudio__click-wooden-2.wav-45bb63efefaf817b60155beec9343d74.sample" path="res://.godot/imported/220196__gameaudio__click-wooden-2.wav-372f3d1af9c561baf2360e14b5b7050b.sample"
[deps] [deps]
source_file="res://Sounds/220196__gameaudio__click-wooden-2.wav" source_file="res://sounds/220196__gameaudio__click-wooden-2.wav"
dest_files=["res://.godot/imported/220196__gameaudio__click-wooden-2.wav-45bb63efefaf817b60155beec9343d74.sample"] dest_files=["res://.godot/imported/220196__gameaudio__click-wooden-2.wav-372f3d1af9c561baf2360e14b5b7050b.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://bqtk1adk8umbx" uid="uid://bqtk1adk8umbx"
path="res://.godot/imported/220197__gameaudio__click-basic.wav-9f173e2b7206278e95710ab077d62c32.sample" path="res://.godot/imported/220197__gameaudio__click-basic.wav-61aa24994882b9ab5848ecead3d7aba9.sample"
[deps] [deps]
source_file="res://Sounds/220197__gameaudio__click-basic.wav" source_file="res://sounds/220197__gameaudio__click-basic.wav"
dest_files=["res://.godot/imported/220197__gameaudio__click-basic.wav-9f173e2b7206278e95710ab077d62c32.sample"] dest_files=["res://.godot/imported/220197__gameaudio__click-basic.wav-61aa24994882b9ab5848ecead3d7aba9.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://ysgfx76jkx2q" uid="uid://ysgfx76jkx2q"
path="res://.godot/imported/220198__gameaudio__click-with-two-parts.wav-089977567529b37b0fd9cd019eb7b3c2.sample" path="res://.godot/imported/220198__gameaudio__click-with-two-parts.wav-23adbbdcc4d995994bf9700f6b6e244d.sample"
[deps] [deps]
source_file="res://Sounds/220198__gameaudio__click-with-two-parts.wav" source_file="res://sounds/220198__gameaudio__click-with-two-parts.wav"
dest_files=["res://.godot/imported/220198__gameaudio__click-with-two-parts.wav-089977567529b37b0fd9cd019eb7b3c2.sample"] dest_files=["res://.godot/imported/220198__gameaudio__click-with-two-parts.wav-23adbbdcc4d995994bf9700f6b6e244d.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://dtyh22ccebiv5" uid="uid://dtyh22ccebiv5"
path="res://.godot/imported/220199__gameaudio__click-higher.wav-d1c1550d99a0cc873012c4010877005b.sample" path="res://.godot/imported/220199__gameaudio__click-higher.wav-0ea6f7a1d32e528aace111f0ce8b9631.sample"
[deps] [deps]
source_file="res://Sounds/220199__gameaudio__click-higher.wav" source_file="res://sounds/220199__gameaudio__click-higher.wav"
dest_files=["res://.godot/imported/220199__gameaudio__click-higher.wav-d1c1550d99a0cc873012c4010877005b.sample"] dest_files=["res://.godot/imported/220199__gameaudio__click-higher.wav-0ea6f7a1d32e528aace111f0ce8b9631.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://cywjbbeintjew" uid="uid://cywjbbeintjew"
path="res://.godot/imported/220208__gameaudio__click-pop-two-part.wav-04cb5eb3e0b3459771dbab42bbd24be9.sample" path="res://.godot/imported/220208__gameaudio__click-pop-two-part.wav-9e40de3d9bebd124d0fe54a4f4cc4db9.sample"
[deps] [deps]
source_file="res://Sounds/220208__gameaudio__click-pop-two-part.wav" source_file="res://sounds/220208__gameaudio__click-pop-two-part.wav"
dest_files=["res://.godot/imported/220208__gameaudio__click-pop-two-part.wav-04cb5eb3e0b3459771dbab42bbd24be9.sample"] dest_files=["res://.godot/imported/220208__gameaudio__click-pop-two-part.wav-9e40de3d9bebd124d0fe54a4f4cc4db9.sample"]
[params] [params]
@@ -3,12 +3,12 @@
importer="wav" importer="wav"
type="AudioStreamWAV" type="AudioStreamWAV"
uid="uid://claw3d2wnyr6a" uid="uid://claw3d2wnyr6a"
path="res://.godot/imported/220212__gameaudio__ping-bing.wav-2a1049829e71a0034c7e8d18745663f1.sample" path="res://.godot/imported/220212__gameaudio__ping-bing.wav-04a5460471fa8fe82fe5d9bc5d946bb0.sample"
[deps] [deps]
source_file="res://Sounds/220212__gameaudio__ping-bing.wav" source_file="res://sounds/220212__gameaudio__ping-bing.wav"
dest_files=["res://.godot/imported/220212__gameaudio__ping-bing.wav-2a1049829e71a0034c7e8d18745663f1.sample"] dest_files=["res://.godot/imported/220212__gameaudio__ping-bing.wav-04a5460471fa8fe82fe5d9bc5d946bb0.sample"]
[params] [params]
+3 -3
View File
@@ -3,12 +3,12 @@
importer="mp3" importer="mp3"
type="AudioStreamMP3" type="AudioStreamMP3"
uid="uid://clkjwcawdqvta" uid="uid://clkjwcawdqvta"
path="res://.godot/imported/money.mp3-95c717b8402507d80974f4f4287b0b63.mp3str" path="res://.godot/imported/money.mp3-e3eae11b0c1923c268268b900bde9157.mp3str"
[deps] [deps]
source_file="res://Sounds/money.mp3" source_file="res://sounds/money.mp3"
dest_files=["res://.godot/imported/money.mp3-95c717b8402507d80974f4f4287b0b63.mp3str"] dest_files=["res://.godot/imported/money.mp3-e3eae11b0c1923c268268b900bde9157.mp3str"]
[params] [params]
+55 -30
View File
@@ -1,24 +1,46 @@
[gd_scene format=3 uid="uid://c6rift56ql3f8"] [gd_scene format=3 uid="uid://c6rift56ql3f8"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://Stations/item_dispenser.gd" id="1_myl3s"] [ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://stations/item_dispenser.gd" id="1_myl3s"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_p30r1"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_p30r1"]
[ext_resource type="PackedScene" uid="uid://c0lknik4noobs" path="res://Items/BurgerBuns.tscn" id="2_1q74o"] [ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_u2p81"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://Prefabs/slide_off_dome.tscn" id="4_rf1b2"] [ext_resource type="PackedScene" uid="uid://c0lknik4noobs" path="res://items/BurgerBuns.tscn" id="2_1q74o"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://prefabs/slide_off_dome.tscn" id="4_rf1b2"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_u2p81"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath(".:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"] [sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3 radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
height = 1.0
radius = 0.3 radius = 0.3
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(0.6784191, 0.54546416, 0.016760282, 1) albedo_color = Color(0.6784191, 0.54546416, 0.016760282, 1)
[node name="BurgerBunsDispenser" type="StaticBody3D" unique_id=1720683779] [node name="BurgerBunsDispenser" type="Node3D" unique_id=1410160280]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_u2p81")]
station = NodePath("../BurgerBunsDispenser")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=904562637]
root_path = NodePath("../BurgerBunsDispenser")
replication_config = SubResource("SceneReplicationConfig_u2p81")
[node name="BurgerBunsDispenser" type="StaticBody3D" parent="." unique_id=1720683779 groups=["station"]]
script = ExtResource("1_myl3s") script = ExtResource("1_myl3s")
item_scene = ExtResource("2_1q74o") item_scene = ExtResource("2_1q74o")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=805334513] [node name="XRToolsSnapZone" type="Area3D" parent="BurgerBunsDispenser" unique_id=805334513 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0162505, -0.002165556) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0162505, -0.002165556)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65536 collision_mask = 65536
@@ -26,40 +48,43 @@ script = ExtResource("1_p30r1")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=1104626493] [node name="CollisionShape3D" type="CollisionShape3D" parent="BurgerBunsDispenser/XRToolsSnapZone" unique_id=1104626493]
shape = SubResource("SphereShape3D_xmbo2") shape = SubResource("SphereShape3D_xmbo2")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1470079357] [node name="CollisionShape3D" type="CollisionShape3D" parent="BurgerBunsDispenser" unique_id=1470079357]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("CylinderShape3D_24d3s") shape = SubResource("CylinderShape3D_24d3s")
[node name="SlideOffDome" parent="." unique_id=1427609426 instance=ExtResource("4_rf1b2")] [node name="SlideOffDome" parent="BurgerBunsDispenser" unique_id=1427609426 instance=ExtResource("4_rf1b2")]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=1746426494] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="BurgerBunsDispenser" unique_id=1746426494]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=858311379] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=858311379]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
radius = 0.3 radius = 0.3
height = 1.0
sides = 32 sides = 32
[node name="CSGCombiner3DBuns" type="CSGCombiner3D" parent="CSGCombiner3D" unique_id=1459017790] [node name="CSGCombiner3DBuns" type="CSGCombiner3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=1459017790]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.16038476, 1.0341886, -0.09012994) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.16038476, 1.0341886, -0.09012994)
autosmooth = true autosmooth = true
smoothing_angle = 138.9 smoothing_angle = 138.9
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns" unique_id=1328221793] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns" unique_id=1328221793]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns" unique_id=686624728] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns" unique_id=686624728]
transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0) transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns/CSGCylinder3D3" unique_id=1113894081] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns/CSGCylinder3D3" unique_id=1113894081]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
@@ -67,26 +92,26 @@ sides = 16
cone = true cone = true
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCombiner3DBuns2" type="CSGCombiner3D" parent="CSGCombiner3D" unique_id=1636439623] [node name="CSGCombiner3DBuns2" type="CSGCombiner3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=1636439623]
transform = Transform3D(0.42896286, 0, -0.90332216, 0, 1, 0, 0.90332216, 0, 0.42896286, 0.13564643, 1.0341886, 0.20497215) transform = Transform3D(0.42896286, 0, -0.90332216, 0, 1, 0, 0.90332216, 0, 0.42896286, 0.13564643, 1.0341886, 0.20497215)
autosmooth = true autosmooth = true
smoothing_angle = 138.9 smoothing_angle = 138.9
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns2" unique_id=190780737] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns2" unique_id=190780737]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns2" unique_id=557804311] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns2" unique_id=557804311]
transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0) transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns2/CSGCylinder3D3" unique_id=605379447] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns2/CSGCylinder3D3" unique_id=605379447]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
@@ -94,26 +119,26 @@ sides = 16
cone = true cone = true
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCombiner3DBuns3" type="CSGCombiner3D" parent="CSGCombiner3D" unique_id=1594575583] [node name="CSGCombiner3DBuns3" type="CSGCombiner3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=1594575583]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.17070979, 1.0341885, 0.07147646) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.17070979, 1.0341885, 0.07147646)
autosmooth = true autosmooth = true
smoothing_angle = 138.9 smoothing_angle = 138.9
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns3" unique_id=1686142490] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns3" unique_id=1686142490]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns3" unique_id=1773290691] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns3" unique_id=1773290691]
transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0) transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns3/CSGCylinder3D3" unique_id=801922493] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns3/CSGCylinder3D3" unique_id=801922493]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
@@ -121,26 +146,26 @@ sides = 16
cone = true cone = true
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCombiner3DBuns4" type="CSGCombiner3D" parent="CSGCombiner3D" unique_id=2055085730] [node name="CSGCombiner3DBuns4" type="CSGCombiner3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=2055085730]
transform = Transform3D(0.95670986, 0, 0.29104328, 0, 1, 0, -0.29104328, 0, 0.95670986, -0.08665481, 1.0341886, -0.10344604) transform = Transform3D(0.95670986, 0, 0.29104328, 0, 1, 0, -0.29104328, 0, 0.95670986, -0.08665481, 1.0341886, -0.10344604)
autosmooth = true autosmooth = true
smoothing_angle = 138.9 smoothing_angle = 138.9
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns4" unique_id=547208858] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns4" unique_id=547208858]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns4" unique_id=185898007] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns4" unique_id=185898007]
transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0) transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns4/CSGCylinder3D3" unique_id=2117029178] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns4/CSGCylinder3D3" unique_id=2117029178]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
@@ -148,26 +173,26 @@ sides = 16
cone = true cone = true
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCombiner3DBuns5" type="CSGCombiner3D" parent="CSGCombiner3D" unique_id=546748728] [node name="CSGCombiner3DBuns5" type="CSGCombiner3D" parent="BurgerBunsDispenser/CSGCombiner3D" unique_id=546748728]
transform = Transform3D(0.20608562, 0, -0.978534, 0, 1, 0, 0.978534, 0, 0.20608562, -0.047733016, 1.0341886, 0.19433105) transform = Transform3D(0.20608562, 0, -0.978534, 0, 1, 0, 0.978534, 0, 0.20608562, -0.047733016, 1.0341886, 0.19433105)
autosmooth = true autosmooth = true
smoothing_angle = 138.9 smoothing_angle = 138.9
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns5" unique_id=102374914] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns5" unique_id=102374914]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.004122257, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns5" unique_id=189923990] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns5" unique_id=189923990]
transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0) transform = Transform3D(0.82770383, -0.5611652, 0, 0.5611652, 0.82770383, 0, 0, 0, 1, -0.048392475, 0.029736161, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D/CSGCombiner3DBuns5/CSGCylinder3D3" unique_id=1980594001] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="BurgerBunsDispenser/CSGCombiner3D/CSGCombiner3DBuns5/CSGCylinder3D3" unique_id=1980594001]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 0.040259957, 0)
radius = 0.085 radius = 0.085
height = 0.04 height = 0.04
+89 -20
View File
@@ -1,10 +1,38 @@
[gd_scene format=3 uid="uid://efaec6ymgabo"] [gd_scene format=3 uid="uid://efaec6ymgabo"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_3jbl6"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_dlkho"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_dlkho"]
[ext_resource type="AudioStream" uid="uid://bqtk1adk8umbx" path="res://Sounds/220197__gameaudio__click-basic.wav" id="2_0aadn"] [ext_resource type="Script" uid="uid://cql13y8da4auf" path="res://stations/counter.gd" id="1_oapbh"]
[ext_resource type="AudioStream" uid="uid://bqtk1adk8umbx" path="res://sounds/220197__gameaudio__click-basic.wav" id="2_0aadn"]
[ext_resource type="AudioStream" uid="uid://daiv8ubwdbidf" path="res://sounds/220195__gameaudio__click-wooden-1.wav" id="2_lg82m"]
[ext_resource type="PackedScene" uid="uid://dgk88esxip5xi" path="res://items/knife.tscn" id="3_3gvdi"]
[ext_resource type="PackedScene" uid="uid://bxbocxdaayvwx" path="res://UI/progress_bar.tscn" id="6_racgh"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_3jbl6"]
properties/0/path = NodePath("Counter:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("Counter:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("Counter:process_result")
properties/2/spawn = false
properties/2/replication_mode = 1
properties/3/path = NodePath("Counter:process_result_work")
properties/3/spawn = false
properties/3/replication_mode = 1
properties/4/path = NodePath("Counter:work_progress")
properties/4/spawn = false
properties/4/replication_mode = 1
properties/5/path = NodePath("Counter:visible")
properties/5/spawn = false
properties/5/replication_mode = 1
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"] [sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(0.6, 1, 0.6) size = Vector3(0.48521727, 0.040039063, 0.41994628)
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(0.3, 0.05, 0.3)
[sub_resource type="BoxShape3D" id="BoxShape3D_1ntq7"] [sub_resource type="BoxShape3D" id="BoxShape3D_1ntq7"]
size = Vector3(0.6, 0.12802735, 0.6) size = Vector3(0.6, 0.12802735, 0.6)
@@ -18,13 +46,47 @@ albedo_color = Color(0.66595805, 0.53976387, 0.4331022, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(1.1759251, 0.741115, 0.5692133, 1) albedo_color = Color(1.1759251, 0.741115, 0.5692133, 1)
[node name="Counter" type="StaticBody3D" unique_id=1487893288 groups=["station"]] [node name="Counter" type="Node3D" unique_id=672880121]
[node name="CollisionShape3DCuttingBoard" type="CollisionShape3D" parent="." unique_id=706340473] [node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_3jbl6")]
station = NodePath("../Counter")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=1583772931]
replication_config = SubResource("SceneReplicationConfig_3jbl6")
[node name="Counter" type="StaticBody3D" parent="." unique_id=1487893288 node_paths=PackedStringArray("audio", "knife", "progress_bar") groups=["station"]]
script = ExtResource("1_oapbh")
audio = NodePath("AudioStreamPlayer3D")
chop_audio = ExtResource("2_lg82m")
knife = NodePath("Knife")
progress_bar = NodePath("ProgressBar3D")
[node name="CollisionShape3DCuttingBoard" type="CollisionShape3D" parent="Counter" unique_id=706340473]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00088502467, 1.0178218, 0.0009101778)
shape = SubResource("BoxShape3D_24d3s") shape = SubResource("BoxShape3D_24d3s")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=1647380272 groups=["station"]] [node name="CollisionShape3DCounter" type="CollisionShape3D" parent="Counter" unique_id=895680269]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5608841, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5038623, 0)
shape = SubResource("BoxShape3D_24d3s")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Counter" unique_id=1941838513]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5038623, 0)
[node name="GestureArea" type="Area3D" parent="Counter" unique_id=398687137]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0438623, 0)
collision_layer = 0
collision_mask = 65536
[node name="CollisionShape3D" type="CollisionShape3D" parent="Counter/GestureArea" unique_id=1450988028]
shape = SubResource("BoxShape3D_vlqg6")
[node name="Knife" parent="Counter" unique_id=1675596942 instance=ExtResource("3_3gvdi")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2838624, 0)
freeze = true
release_mode = 1
[node name="XRToolsSnapZone" type="Area3D" parent="Counter" unique_id=1647380272 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0647464, 0)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65540 collision_mask = 65540
script = ExtResource("1_dlkho") script = ExtResource("1_dlkho")
@@ -32,59 +94,66 @@ stash_sound = ExtResource("2_0aadn")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=969340130] [node name="CollisionShape3D2" type="CollisionShape3D" parent="Counter/XRToolsSnapZone" unique_id=969340130]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.002, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.002, 0)
shape = SubResource("BoxShape3D_1ntq7") shape = SubResource("BoxShape3D_1ntq7")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="XRToolsSnapZone" unique_id=1786831079] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Counter/XRToolsSnapZone" unique_id=1786831079]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=451757283] [node name="ProgressBar3D" parent="Counter" unique_id=654673176 instance=ExtResource("6_racgh")]
use_collision = true transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2838624, -0.18)
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D" unique_id=305755330] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="Counter" unique_id=451757283]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5038623, 0)
[node name="CSGBox3D" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=305755330]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.046, -0.025) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.046, -0.025)
size = Vector3(0.6, 0.908, 0.55) size = Vector3(0.6, 0.908, 0.55)
material = SubResource("StandardMaterial3D_24d3s") material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D7" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1086568272] [node name="CSGBox3D7" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=1086568272]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.39999902, 0.22965088) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.39999902, 0.22965088)
operation = 2 operation = 2
size = Vector3(0.6, 0.22992969, 0.14069825) size = Vector3(0.6, 0.22992969, 0.14069825)
material = SubResource("StandardMaterial3D_24d3s") material = SubResource("StandardMaterial3D_24d3s")
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=43663195] [node name="CSGBox3D2" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=43663195]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
size = Vector3(0.6, 0.202, 0.6) size = Vector3(0.6, 0.202, 0.6)
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1210567516] [node name="CSGBox3D3" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=1210567516]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5617909, 0.060281754) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5617909, 0.060281754)
operation = 2 operation = 2
size = Vector3(0.6, 0.12051563, 0.6402156) size = Vector3(0.6, 0.12051563, 0.6402156)
[node name="CSGBox3D4" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1533996708] [node name="CSGBox3D4" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=1533996708]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0.08, 0.26034504) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15, 0.08, 0.26034504)
size = Vector3(0.25, 0.6, 0.024) size = Vector3(0.25, 0.6, 0.024)
material = SubResource("StandardMaterial3D_pt8vn") material = SubResource("StandardMaterial3D_pt8vn")
[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1983709234] [node name="CSGBox3D5" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=1983709234]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.15, 0.08, 0.26034504) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.15, 0.08, 0.26034504)
size = Vector3(0.25, 0.6, 0.024) size = Vector3(0.25, 0.6, 0.024)
material = SubResource("StandardMaterial3D_pt8vn") material = SubResource("StandardMaterial3D_pt8vn")
[node name="CSGSphere3D" type="CSGSphere3D" parent="CSGCombiner3D" unique_id=1785057925] [node name="CSGSphere3D" type="CSGSphere3D" parent="Counter/CSGCombiner3D" unique_id=1785057925]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.057649717, 0.12459713, 0.29140875) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.057649717, 0.12459713, 0.29140875)
radius = 0.025492515 radius = 0.025492515
[node name="CSGSphere3D2" type="CSGSphere3D" parent="CSGCombiner3D" unique_id=1224446005] [node name="CSGSphere3D2" type="CSGSphere3D" parent="Counter/CSGCombiner3D" unique_id=1224446005]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.060837455, 0.12459713, 0.29140875) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.060837455, 0.12459713, 0.29140875)
radius = 0.025492515 radius = 0.025492515
[node name="CSGBox3D6" type="CSGBox3D" parent="CSGCombiner3D" unique_id=187377667] [node name="CSGBox3D6" type="CSGBox3D" parent="Counter/CSGCombiner3D" unique_id=187377667]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.514, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.514, 0)
size = Vector3(0.48251343, 0.037231445, 0.42160034) size = Vector3(0.48251343, 0.037231445, 0.42160034)
material = SubResource("StandardMaterial3D_vlqg6") material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D6" type="CSGBox3D" parent="CSGCombiner3D/CSGBox3D6" unique_id=1146824846] [node name="CSGBox3D6" type="CSGBox3D" parent="Counter/CSGCombiner3D/CSGBox3D6" unique_id=1146824846]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1899699, 0.01924485, -0.0039587095) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1899699, 0.01924485, -0.0039587095)
operation = 2 operation = 2
size = Vector3(0.037109375, 0.092285156, 0.26757813) size = Vector3(0.037109375, 0.092285156, 0.26757813)
[connection signal="body_entered" from="Counter/GestureArea" to="Counter" method="_on_gesture_area_body_entered"]
[connection signal="has_dropped" from="Counter/XRToolsSnapZone" to="Counter" method="_on_snap_zone_dropped"]
[connection signal="has_picked_up" from="Counter/XRToolsSnapZone" to="Counter" method="_on_snap_zone_picked_up"]
+77 -42
View File
@@ -1,11 +1,35 @@
[gd_scene format=3 uid="uid://j7caslh27nor"] [gd_scene format=3 uid="uid://j7caslh27nor"]
[ext_resource type="Script" uid="uid://bsn8vhv5adxdo" path="res://Stations/hob.gd" id="1_7jc4g"] [ext_resource type="Script" uid="uid://bsn8vhv5adxdo" path="res://stations/hob.gd" id="1_7jc4g"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_pydjp"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="2_er1dp"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="2_er1dp"]
[ext_resource type="AudioStream" uid="uid://bqtk1adk8umbx" path="res://Sounds/220197__gameaudio__click-basic.wav" id="3_6oyg1"] [ext_resource type="AudioStream" uid="uid://bqtk1adk8umbx" path="res://sounds/220197__gameaudio__click-basic.wav" id="3_6oyg1"]
[ext_resource type="PackedScene" uid="uid://bxbocxdaayvwx" path="res://UI/progress_bar.tscn" id="3_7uuqv"] [ext_resource type="PackedScene" uid="uid://bxbocxdaayvwx" path="res://UI/progress_bar.tscn" id="3_7uuqv"]
[ext_resource type="Material" uid="uid://d1djvskv4n4m3" path="res://Textures/hob_off.tres" id="4_8qpxk"] [ext_resource type="Material" uid="uid://d1djvskv4n4m3" path="res://textures/hob_off.tres" id="4_8qpxk"]
[ext_resource type="Material" uid="uid://db7c7w4apwti7" path="res://Textures/hob_on.tres" id="6_m7l4u"] [ext_resource type="Material" uid="uid://db7c7w4apwti7" path="res://textures/hob_on.tres" id="6_m7l4u"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_hob"]
properties/0/path = NodePath("Hob:time_cooked")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("Hob:cooking_result")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("Hob:cooking_result_time")
properties/2/spawn = false
properties/2/replication_mode = 1
properties/3/path = NodePath("Hob:position")
properties/3/spawn = false
properties/3/replication_mode = 1
properties/4/path = NodePath("Hob:rotation")
properties/4/spawn = false
properties/4/replication_mode = 1
properties/5/path = NodePath("Hob:visible")
properties/5/spawn = false
properties/5/replication_mode = 1
properties/6/path = NodePath("Hob/XRToolsSnapZone:picked_up_ranged")
properties/6/spawn = false
properties/6/replication_mode = 1
[sub_resource type="BoxShape3D" id="BoxShape3D_kdxnr"] [sub_resource type="BoxShape3D" id="BoxShape3D_kdxnr"]
size = Vector3(0.6, 1, 0.6) size = Vector3(0.6, 1, 0.6)
@@ -20,7 +44,7 @@ length = 0.001
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("CSGCombiner3D/CSGTorus3D3:material") tracks/0/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D3:material")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -32,7 +56,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("CSGCombiner3D/CSGTorus3D2:material") tracks/1/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D2:material")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -44,7 +68,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("CSGCombiner3D/CSGTorus3D:material") tracks/2/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D:material")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -56,7 +80,7 @@ tracks/2/keys = {
tracks/3/type = "value" tracks/3/type = "value"
tracks/3/imported = false tracks/3/imported = false
tracks/3/enabled = true tracks/3/enabled = true
tracks/3/path = NodePath("CSGCombiner3D/CSGTorus3D3:material:emission_energy_multiplier") tracks/3/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D3:material:emission_energy_multiplier")
tracks/3/interp = 1 tracks/3/interp = 1
tracks/3/loop_wrap = true tracks/3/loop_wrap = true
tracks/3/keys = { tracks/3/keys = {
@@ -68,7 +92,7 @@ tracks/3/keys = {
tracks/4/type = "value" tracks/4/type = "value"
tracks/4/imported = false tracks/4/imported = false
tracks/4/enabled = true tracks/4/enabled = true
tracks/4/path = NodePath("OmniLight3D:light_energy") tracks/4/path = NodePath("Hob/OmniLight3D:light_energy")
tracks/4/interp = 1 tracks/4/interp = 1
tracks/4/loop_wrap = true tracks/4/loop_wrap = true
tracks/4/keys = { tracks/4/keys = {
@@ -84,7 +108,7 @@ loop_mode = 1
tracks/0/type = "value" tracks/0/type = "value"
tracks/0/imported = false tracks/0/imported = false
tracks/0/enabled = true tracks/0/enabled = true
tracks/0/path = NodePath("CSGCombiner3D/CSGTorus3D3:material") tracks/0/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D3:material")
tracks/0/interp = 1 tracks/0/interp = 1
tracks/0/loop_wrap = true tracks/0/loop_wrap = true
tracks/0/keys = { tracks/0/keys = {
@@ -96,7 +120,7 @@ tracks/0/keys = {
tracks/1/type = "value" tracks/1/type = "value"
tracks/1/imported = false tracks/1/imported = false
tracks/1/enabled = true tracks/1/enabled = true
tracks/1/path = NodePath("CSGCombiner3D/CSGTorus3D2:material") tracks/1/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D2:material")
tracks/1/interp = 1 tracks/1/interp = 1
tracks/1/loop_wrap = true tracks/1/loop_wrap = true
tracks/1/keys = { tracks/1/keys = {
@@ -108,7 +132,7 @@ tracks/1/keys = {
tracks/2/type = "value" tracks/2/type = "value"
tracks/2/imported = false tracks/2/imported = false
tracks/2/enabled = true tracks/2/enabled = true
tracks/2/path = NodePath("CSGCombiner3D/CSGTorus3D:material") tracks/2/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D:material")
tracks/2/interp = 1 tracks/2/interp = 1
tracks/2/loop_wrap = true tracks/2/loop_wrap = true
tracks/2/keys = { tracks/2/keys = {
@@ -120,7 +144,7 @@ tracks/2/keys = {
tracks/3/type = "value" tracks/3/type = "value"
tracks/3/imported = false tracks/3/imported = false
tracks/3/enabled = true tracks/3/enabled = true
tracks/3/path = NodePath("CSGCombiner3D/CSGTorus3D3:material:emission_energy_multiplier") tracks/3/path = NodePath("Hob/CSGCombiner3D/CSGTorus3D3:material:emission_energy_multiplier")
tracks/3/interp = 1 tracks/3/interp = 1
tracks/3/loop_wrap = true tracks/3/loop_wrap = true
tracks/3/keys = { tracks/3/keys = {
@@ -132,7 +156,7 @@ tracks/3/keys = {
tracks/4/type = "value" tracks/4/type = "value"
tracks/4/imported = false tracks/4/imported = false
tracks/4/enabled = true tracks/4/enabled = true
tracks/4/path = NodePath("OmniLight3D:light_energy") tracks/4/path = NodePath("Hob/OmniLight3D:light_energy")
tracks/4/interp = 1 tracks/4/interp = 1
tracks/4/loop_wrap = true tracks/4/loop_wrap = true
tracks/4/keys = { tracks/4/keys = {
@@ -148,14 +172,23 @@ _data = {
&"hob": SubResource("Animation_6oyg1") &"hob": SubResource("Animation_6oyg1")
} }
[node name="Hob" type="StaticBody3D" unique_id=1687971542 groups=["station"]] [node name="Hob" type="Node3D" unique_id=172418174]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_pydjp")]
station = NodePath("../Hob")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=768992259]
replication_config = SubResource("SceneReplicationConfig_np_hob")
[node name="Hob" type="StaticBody3D" parent="." unique_id=1332123047 groups=["station"]]
script = ExtResource("1_7jc4g") script = ExtResource("1_7jc4g")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1283846023] [node name="CollisionShape3D" type="CollisionShape3D" parent="Hob" unique_id=1283846023]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.51483154, 0)
shape = SubResource("BoxShape3D_kdxnr") shape = SubResource("BoxShape3D_kdxnr")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=538157739 groups=["station"]] [node name="XRToolsSnapZone" type="Area3D" parent="Hob" unique_id=538157739 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5270121, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0418437, 0)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65540 collision_mask = 65540
script = ExtResource("2_er1dp") script = ExtResource("2_er1dp")
@@ -163,102 +196,104 @@ stash_sound = ExtResource("3_6oyg1")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=370920392] [node name="CollisionShape3D2" type="CollisionShape3D" parent="Hob/XRToolsSnapZone" unique_id=370920392]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.000975132, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.000975132, 0)
shape = SubResource("BoxShape3D_7uuqv") shape = SubResource("BoxShape3D_7uuqv")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="XRToolsSnapZone" unique_id=1991627595] [node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="Hob/XRToolsSnapZone" unique_id=1991627595]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.022546828, -0.5270121, 0.36528283) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.022546828, -0.5270121, 0.36528283)
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=70901698] [node name="ProgressBar3D" parent="Hob" unique_id=654673176 instance=ExtResource("3_7uuqv")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2621956, -0.09216304)
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1111505172] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="Hob" unique_id=70901698]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.00894776) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.51483154, 0)
[node name="CSGBox3D" type="CSGBox3D" parent="Hob/CSGCombiner3D" unique_id=1111505172]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00071543455, 3.7252903e-09, -0.008516133)
size = Vector3(0.6, 1, 0.5821045) size = Vector3(0.6, 1, 0.5821045)
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D/CSGBox3D" unique_id=1338463939] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="Hob/CSGCombiner3D/CSGBox3D" unique_id=1338463939]
transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5103538, -7.827557e-05) transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5103538, -7.827557e-05)
operation = 2 operation = 2
radius = 0.25976563 radius = 0.25976563
height = 0.08898926 height = 0.08898926
sides = 32 sides = 32
[node name="CSGTorus3D3" type="CSGTorus3D" parent="CSGCombiner3D" unique_id=666891341] [node name="CSGTorus3D3" type="CSGTorus3D" parent="Hob/CSGCombiner3D" unique_id=666891341]
transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05) transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05)
inner_radius = 0.09153879 inner_radius = 0.09153879
outer_radius = 0.120084204 outer_radius = 0.120084204
sides = 32 sides = 32
material = ExtResource("4_8qpxk") material = ExtResource("4_8qpxk")
[node name="CSGTorus3D2" type="CSGTorus3D" parent="CSGCombiner3D" unique_id=24541894] [node name="CSGTorus3D2" type="CSGTorus3D" parent="Hob/CSGCombiner3D" unique_id=24541894]
transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05) transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05)
inner_radius = 0.15036294 inner_radius = 0.15036294
outer_radius = 0.17592031 outer_radius = 0.17592031
sides = 32 sides = 32
material = ExtResource("4_8qpxk") material = ExtResource("4_8qpxk")
[node name="CSGTorus3D" type="CSGTorus3D" parent="CSGCombiner3D" unique_id=1901978664] [node name="CSGTorus3D" type="CSGTorus3D" parent="Hob/CSGCombiner3D" unique_id=1901978664]
transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05) transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.5003869, -7.827557e-05)
inner_radius = 0.20426142 inner_radius = 0.20426142
outer_radius = 0.2321898 outer_radius = 0.2321898
sides = 32 sides = 32
material = ExtResource("4_8qpxk") material = ExtResource("4_8qpxk")
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1107239311] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=1107239311]
transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.4498226, -7.827557e-05) transform = Transform3D(0.8943019, 0, 0, 0, 0.8943019, 0, 0, 0, 0.8943019, 0, 0.4498226, -7.827557e-05)
radius = 0.071777344 radius = 0.071777344
height = 0.09637451 height = 0.09637451
sides = 32 sides = 32
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=435540815] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=435540815]
transform = Transform3D(0.8943019, 0, 0, 0, -3.9091177e-08, 0.8943019, 0, -0.8943019, -3.9091177e-08, 0, 0.48668858, -0.0020651226) transform = Transform3D(0.8943019, 0, 0, 0, -3.9091177e-08, 0.8943019, 0, -0.8943019, -3.9091177e-08, 0, 0.48668858, -0.0020651226)
radius = 0.008 radius = 0.008
height = 0.44487303 height = 0.44487303
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=878171801] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=878171801]
transform = Transform3D(-3.9091177e-08, -0.8943019, -3.9091177e-08, 0, -3.9091177e-08, 0.8943019, -0.8943019, 3.9091177e-08, 1.7087296e-15, 0, 0.48668858, -0.0020651226) transform = Transform3D(-3.9091177e-08, -0.8943019, -3.9091177e-08, 0, -3.9091177e-08, 0.8943019, -0.8943019, 3.9091177e-08, 1.7087296e-15, 0, 0.48668858, -0.0020651226)
radius = 0.008 radius = 0.008
height = 0.44487303 height = 0.44487303
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1619646436] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=1619646436]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, -0.20412213, 0.42728558, 0.26171687) transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, -0.20412213, 0.42728558, 0.26171687)
radius = 0.044433594 radius = 0.044433594
height = 0.10932617 height = 0.10932617
material = SubResource("StandardMaterial3D_gkb3v") material = SubResource("StandardMaterial3D_gkb3v")
[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=548846612] [node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=548846612]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0.12531614, 0.42728558, 0.26171687) transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0.12531614, 0.42728558, 0.26171687)
radius = 0.044433594 radius = 0.044433594
height = 0.10932617 height = 0.10932617
material = SubResource("StandardMaterial3D_gkb3v") material = SubResource("StandardMaterial3D_gkb3v")
[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1208989647] [node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Hob/CSGCombiner3D" unique_id=1208989647]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0.22979808, 0.42728558, 0.26171687) transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0.22979808, 0.42728558, 0.26171687)
radius = 0.044433594 radius = 0.044433594
height = 0.10932617 height = 0.10932617
material = SubResource("StandardMaterial3D_gkb3v") material = SubResource("StandardMaterial3D_gkb3v")
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=465340362] [node name="CSGBox3D2" type="CSGBox3D" parent="Hob/CSGCombiner3D" unique_id=465340362]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.039733887, -0.07685089, 0.29250562) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.039733887, -0.07685089, 0.29250562)
operation = 2 operation = 2
size = Vector3(1.0999756, 0.8462982, 0.072387695) size = Vector3(1.0999756, 0.8462982, 0.072387695)
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1813079759] [node name="CSGBox3D3" type="CSGBox3D" parent="Hob/CSGCombiner3D" unique_id=1813079759]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.003479004, -0.08253479, 0.2656765) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.003479004, -0.08253479, 0.2656765)
size = Vector3(0.55, 0.835, 0.072) size = Vector3(0.55, 0.835, 0.072)
[node name="CSGBox3D4" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1978186019] [node name="CSGBox3D4" type="CSGBox3D" parent="Hob/CSGCombiner3D" unique_id=1978186019]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.003479004, -0.45215607, 0.24655426) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.003479004, -0.45215607, 0.24655426)
size = Vector3(0.55, 0.096, 0.14) size = Vector3(0.55, 0.096, 0.14)
[node name="ProgressBar3D" parent="." unique_id=654673176 instance=ExtResource("3_7uuqv")] [node name="AnimationPlayer" type="AnimationPlayer" parent="Hob" unique_id=1525460719]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.74736404, -0.09216304) root_node = NodePath("../..")
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1525460719]
libraries/ = SubResource("AnimationLibrary_ac5f3") libraries/ = SubResource("AnimationLibrary_ac5f3")
[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=1618457623] [node name="OmniLight3D" type="OmniLight3D" parent="Hob" unique_id=1618457623]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5053487, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0201802, 0)
light_color = Color(1, 0.13725491, 0, 1) light_color = Color(1, 0.13725491, 0, 1)
light_energy = 0.0 light_energy = 0.0
omni_range = 0.5 omni_range = 0.5
+134
View File
@@ -0,0 +1,134 @@
[gd_scene format=3 uid="uid://cvucwxibtol5f"]
[ext_resource type="Script" uid="uid://bu0g23cfrqy0m" path="res://stations/station_movement.gd" id="1_ldy6a"]
[ext_resource type="Script" uid="uid://bfrlpbsqg5lqr" path="res://addons/godot-xr-tools/objects/pickable.gd" id="2_tbkb3"]
[ext_resource type="PackedScene" uid="uid://c25yxb0vt53vc" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_left.tscn" id="3_36r14"]
[ext_resource type="Animation" uid="uid://db62hs5s4n2b3" path="res://addons/godot-xr-tools/hands/animations/left/Grip 4.res" id="4_dy2gh"]
[ext_resource type="Script" uid="uid://dvobm6vcfnqe8" path="res://addons/godot-xr-tools/hands/poses/hand_pose_settings.gd" id="5_2muex"]
[ext_resource type="PackedScene" uid="uid://ctw7nbntd5pcj" path="res://addons/godot-xr-tools/objects/grab_points/grab_point_hand_right.tscn" id="6_372qd"]
[ext_resource type="Animation" uid="uid://d1xnpyc08njjx" path="res://addons/godot-xr-tools/hands/animations/right/Grip 4.res" id="7_uxgrt"]
[ext_resource type="Script" uid="uid://bwd0pe2udb5xo" path="res://Net/net_pickable.gd" id="8_7mccn"]
[sub_resource type="BoxShape3D" id="BoxShape3D_m1xbq"]
size = Vector3(0.1, 0.1, 0.1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.1764706, 1, 1, 1)
[sub_resource type="BoxMesh" id="BoxMesh_vlqg6"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector3(0.1, 0.1, 0.1)
[sub_resource type="Resource" id="Resource_lc22d"]
script = ExtResource("5_2muex")
closed_pose = ExtResource("4_dy2gh")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="Resource" id="Resource_qyiot"]
script = ExtResource("5_2muex")
closed_pose = ExtResource("7_uxgrt")
metadata/_custom_type_script = "uid://dvobm6vcfnqe8"
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_cube"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:quaternion")
properties/1/spawn = false
properties/1/replication_mode = 1
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(0.5, 0.87231445, 0.5)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
transparency = 1
albedo_color = Color(1, 0.78999996, 0.39999998, 0.4627451)
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ldy6a"]
properties/0/path = NodePath(".:visible")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:position")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath(".:rotation")
properties/2/spawn = false
properties/2/replication_mode = 1
[node name="StationMovement" type="Node3D" unique_id=946873975 node_paths=PackedStringArray("move_handle", "move_ghost")]
script = ExtResource("1_ldy6a")
move_handle = NodePath("MoveHandle")
move_ghost = NodePath("MoveGhost")
[node name="MoveHandle" type="RigidBody3D" parent="." unique_id=954108203 groups=["platalbe_item"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
collision_layer = 262144
collision_mask = 196615
axis_lock_linear_y = true
axis_lock_angular_x = true
axis_lock_angular_z = true
mass = 0.001
gravity_scale = 0.5
linear_damp = 100.0
angular_damp = 100.0
script = ExtResource("2_tbkb3")
picked_up_layer = 64
release_mode = 1
[node name="CollisionShape3D" type="CollisionShape3D" parent="MoveHandle" unique_id=1692047616]
shape = SubResource("BoxShape3D_m1xbq")
[node name="MeshInstance3D" type="MeshInstance3D" parent="MoveHandle" unique_id=1134464542]
mesh = SubResource("BoxMesh_vlqg6")
[node name="GrabPointHandLeft" parent="MoveHandle" unique_id=358095191 instance=ExtResource("3_36r14")]
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="MoveHandle" unique_id=694601824 instance=ExtResource("6_372qd")]
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="MoveHandle" unique_id=404907673]
replication_config = SubResource("SceneReplicationConfig_np_cube")
script = ExtResource("8_7mccn")
[node name="MoveGhost" type="Area3D" parent="." unique_id=1305344236]
collision_layer = 0
collision_mask = 524291
[node name="CollisionShape3D" type="CollisionShape3D" parent="MoveGhost" unique_id=2074041383]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.44934082, 0)
shape = SubResource("BoxShape3D_vlqg6")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="MoveGhost" unique_id=283929246]
collision_layer = 0
collision_mask = 524291
[node name="CSGBox3D" type="CSGBox3D" parent="MoveGhost/CSGCombiner3D" unique_id=1786907045]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
size = Vector3(0.6, 1, 0.6)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D2" type="CSGBox3D" parent="MoveGhost/CSGCombiner3D" unique_id=684823657]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
size = Vector3(0.03, 0.03, 0.3)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D2" type="CSGBox3D" parent="MoveGhost/CSGCombiner3D/CSGBox3D2" unique_id=286640707]
transform = Transform3D(0.70451534, 0, -0.7096888, 0, 1, 0, 0.7096888, 0, 0.70451534, -0.046803005, 0.5, -0.096979)
size = Vector3(0.03, 0.03, 0.12021485)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D3" type="CSGBox3D" parent="MoveGhost/CSGCombiner3D/CSGBox3D2" unique_id=1791902851]
transform = Transform3D(0.7073421, 0, 0.7068714, 0, 1, 0, -0.7068714, 0, 0.7073421, 0.04550519, 0.5, -0.096264325)
size = Vector3(0.03, 0.03, 0.12021485)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D4" type="CSGBox3D" parent="MoveGhost/CSGCombiner3D/CSGBox3D2" unique_id=83757100]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -0.020843491)
size = Vector3(0.03, 0.03, 0.25904542)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="MoveGhost" unique_id=29758342]
replication_config = SubResource("SceneReplicationConfig_ldy6a")
+156
View File
@@ -0,0 +1,156 @@
extends StaticBody3D
@export var chop_work_steps: float = 5.0
@export var chop_min_speed: float = 2.0
@export var audio: AudioStreamPlayer3D
@export var chop_audio: AudioStream
@export var knife: XRToolsPickable
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
@export var progress_bar: ProgressBar3D
# Chopping state. Follow the hob/sink pattern so the display refreshes when
# values change; only the world owner runs the station's process in practice.
@export var process_result: String = "": set = _set_result
@export var process_result_work: float = 0.0: set = _set_result_work
@export var work_progress: float = 0.0: set = _set_work_progress
func _ready() -> void:
if not audio:
push_error("Counter is missing reference to AudioStreamPlayer3D")
if not chop_audio:
push_error("Counter is missing reference to chop_audio AudioStream")
if not progress_bar or progress_bar is not ProgressBar3D:
push_error("Counter missing reference to progressbar, or wrong type:", progress_bar)
if not knife or knife is not XRToolsPickable:
push_error("Counter missing reference to knife, or wrong type:", knife)
if not snap_zone or snap_zone is not XRToolsSnapZone:
push_error("Counter missing reference to snap_zone, or wrong type:", snap_zone)
snap_zone.has_picked_up.connect(_on_object_picked_up)
snap_zone.has_dropped.connect(_on_object_dropped)
progress_bar.override_fill_color(Color.GREEN)
_hide_all_tools()
_refresh_progress_bar()
func _set_work_progress(value: float) -> void:
work_progress = value
_refresh_progress_bar()
func _set_result(value: String) -> void:
process_result = value
_refresh_progress_bar()
# When a chopping recipe is set, show the knife for the player to use.
if not process_result.is_empty():
knife.visible = true
knife.enabled = true
SweetLogger.debug("chopping recipe set: {0}", [process_result])
else:
_hide_all_tools()
func _set_result_work(value: float) -> void:
process_result_work = value
_refresh_progress_bar()
func _refresh_progress_bar() -> void:
if not progress_bar:
return
var progress := 0.0
if process_result != "" and process_result_work > 0:
progress = clampf(float(work_progress) / process_result_work, 0.0, 1.0)
progress_bar.set_progress(progress)
progress_bar.set_bar_visible(not process_result.is_empty())
progress_bar.override_fill_color(Color.GREEN)
# Add work from gesture area (knife hits). This increments the chopping progress.
func add_work(work: float) -> void:
SweetLogger.debug("add_work: {0}", [work])
# Only the world owner should drive the authoritative state. Guarding is
# handled by higher-level NetworkManager logic elsewhere, mirror hob's
# convert_held_to_item which checks ownership before spawning.
work_progress += work
# Play chopping sound if available
if audio and chop_audio:
audio.stream = chop_audio
audio.play()
# If we've reached the required time, convert the held item
if process_result != "" and process_result_work > 0 and work_progress >= process_result_work:
SweetLogger.debug("chopping complete, converting item to: {0}", [process_result])
work_progress = 0
convert_held_to_item(process_result)
func _on_gesture_area_body_entered(body: Node3D) -> void:
SweetLogger.debug("gesture area entered: {0}", [body])
if body.is_in_group("chopping_tool"):
if process_result == "":
SweetLogger.debug("knife entered but nothing to chop")
return
var speed := 0.0
if body is RigidBody3D:
speed = body.linear_velocity.length()
elif body is CharacterBody3D:
speed = body.velocity.length()
if speed < chop_min_speed:
SweetLogger.debug("knife too slow for chopping: {0}", [speed])
return
add_work(chop_work_steps)
func _on_object_picked_up(_item: Variant) -> void:
SweetLogger.debug("object picked up: {0}", [_item])
var food_item = Helper.find_food_item(_item)
if not food_item:
SweetLogger.debug("held object is not a FoodItem")
return
var result = RecipeManager.get_chopping_result(food_item.id)
if not result:
SweetLogger.debug("held a FoodItem that is not choppable, id: {0} process_result: {1}", [food_item.id, result])
return
process_result = result
process_result_work = RecipeManager.get_chopping_work(food_item.id)
SweetLogger.debug("set process_result {0} work: {1}", [process_result, process_result_work])
func _on_object_dropped(_item: Variant) -> void:
SweetLogger.debug("object drop")
work_progress = 0
process_result = ""
process_result_work = 0
_hide_all_tools()
func convert_held_to_item(_item: String) -> void:
if not NetworkManager.owns_world():
return
SweetLogger.debug("converting {0}", [_item])
var old_pickable = snap_zone.picked_up_object
if not old_pickable:
push_warning("Counter finished processing _item, but snap zone is missing its reference")
return
var original_transform = old_pickable.global_transform
var new_scene_instance = NetworkManager.spawn_item(RecipeManager.get_item_scene(_item).resource_path, original_transform)
SweetLogger.debug("freeing old_pickable {0}", [old_pickable])
snap_zone.drop_object()
NetworkManager.despawn_item(old_pickable)
snap_zone.pick_up_object(new_scene_instance)
func _hide_all_tools():
knife.visible = false
knife.enabled = false
+1
View File
@@ -0,0 +1 @@
uid://cql13y8da4auf
-4
View File
@@ -1,4 +0,0 @@
[gd_scene format=3 uid="uid://cwwnbx5uat3fw"]
[node name="CSGBox3D" type="CSGBox3D" unique_id=725518829]
+96
View File
@@ -0,0 +1,96 @@
[gd_scene format=3 uid="uid://bbg7dwsbxxh1t"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://stations/item_dispenser.gd" id="1_4m60m"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_qooyy"]
[ext_resource type="PackedScene" uid="uid://e4i6o5oriecx" path="res://items/PickupCube.tscn" id="2_nn8tr"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_ahn1e"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://prefabs/slide_off_dome.tscn" id="4_nn8tr"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_0wtc7"]
properties/0/path = NodePath("CubeSideDispenser:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("CubeSideDispenser:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("CubeSideDispenser:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
height = 1.0
radius = 0.29541016
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_24d3s"]
albedo_color = Color(0.1764706, 1, 1, 1)
[sub_resource type="BoxMesh" id="BoxMesh_irf4n"]
material = SubResource("StandardMaterial3D_24d3s")
size = Vector3(0.1, 0.1, 0.1)
[node name="CubeSideDispenser" type="Node3D" unique_id=1285718741]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_qooyy")]
station = NodePath("../CubeSideDispenser")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=821487160]
replication_config = SubResource("SceneReplicationConfig_0wtc7")
[node name="CubeSideDispenser" type="StaticBody3D" parent="." unique_id=200950572 groups=["station"]]
script = ExtResource("1_4m60m")
item_scene = ExtResource("2_nn8tr")
[node name="XRToolsSnapZone" type="Area3D" parent="CubeSideDispenser" unique_id=1018021004 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0440714, -0.002165556)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("3_ahn1e")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="CubeSideDispenser/XRToolsSnapZone" unique_id=182042233]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.15291119, 0)
shape = SubResource("SphereShape3D_xmbo2")
[node name="CollisionShape3D" type="CollisionShape3D" parent="CubeSideDispenser" unique_id=1974757539]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("CylinderShape3D_24d3s")
[node name="SlideOffDome" parent="CubeSideDispenser" unique_id=1427609426 instance=ExtResource("4_nn8tr")]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="CubeSideDispenser" unique_id=1172420592]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CubeSideDispenser/CSGCombiner3D" unique_id=1073546772]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
radius = 0.3
height = 1.0
sides = 32
[node name="Cubes" type="Node3D" parent="CubeSideDispenser" unique_id=100532970]
[node name="MeshInstance3D" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=2040729886]
transform = Transform3D(0.9709369, 0, 0.23933554, 0, 1, 0, -0.23933554, 0, 0.9709369, -0.0038359165, 1.0421022, -0.1349423)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=2119335322]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.1336323, 1.0421022, 0.049409628)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=896999260]
transform = Transform3D(0.94914126, 0, -0.31485054, 0, 1, 0, 0.31485054, 0, 0.94914126, 0.021345377, 1.0421022, 0.13508391)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=1055210121]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.14830339, 1.0421022, 0.054090023)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=1800524097]
transform = Transform3D(0.966823, 0, -0.2554472, 0, 1, 0, 0.2554472, 0, 0.966823, 0.12695658, 1.0421022, -0.07926583)
mesh = SubResource("BoxMesh_irf4n")
[node name="MeshInstance3D6" type="MeshInstance3D" parent="CubeSideDispenser/Cubes" unique_id=192094054]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.11111963, 1.0421022, -0.094003916)
mesh = SubResource("BoxMesh_irf4n")
+1 -1
View File
@@ -11,7 +11,7 @@ func _makeDirty(item) -> void:
return return
var plate: PlateController = item.get_node_or_null("PlateController") as PlateController var plate: PlateController = item.get_node_or_null("PlateController") as PlateController
if not plate: if not plate:
print("Dirt Station: held object is not a Plate") SweetLogger.debug("held object is not a Plate")
return return
if not plate.is_dirty: if not plate.is_dirty:
plate.is_dirty = true plate.is_dirty = true
+30 -8
View File
@@ -1,8 +1,20 @@
[gd_scene format=3 uid="uid://cnjwtnhwh0i8q"] [gd_scene format=3 uid="uid://cnjwtnhwh0i8q"]
[ext_resource type="Script" uid="uid://q7tpwmrbmu1m" path="res://Stations/dirt_station.gd" id="1_hc1d4"] [ext_resource type="Script" uid="uid://q7tpwmrbmu1m" path="res://stations/dirt_station.gd" id="1_hc1d4"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_ucg2q"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="2_v0ytd"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="2_v0ytd"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_ku4h3"]
properties/0/path = NodePath(".:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath(".:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath(".:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"] [sub_resource type="BoxShape3D" id="BoxShape3D_24d3s"]
size = Vector3(0.5, 1, 0.5) size = Vector3(0.5, 1, 0.5)
@@ -16,28 +28,38 @@ size = Vector3(0.5, 1, 0.5)
[sub_resource type="BoxShape3D" id="BoxShape3D_mep2a"] [sub_resource type="BoxShape3D" id="BoxShape3D_mep2a"]
size = Vector3(0.81640625, 0.5635376, 0.79351807) size = Vector3(0.81640625, 0.5635376, 0.79351807)
[node name="DirtStation" type="StaticBody3D" unique_id=160842153 groups=["station"]] [node name="DirtStation" type="Node3D" unique_id=784427347]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_ucg2q")]
station = NodePath("../DirtStation")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=1485614825]
root_path = NodePath("../DirtStation")
replication_config = SubResource("SceneReplicationConfig_ku4h3")
[node name="DirtStation" type="StaticBody3D" parent="." unique_id=160842153 groups=["station"]]
script = ExtResource("1_hc1d4") script = ExtResource("1_hc1d4")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1400366312] [node name="CollisionShape3D" type="CollisionShape3D" parent="DirtStation" unique_id=1400366312]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("BoxShape3D_24d3s") shape = SubResource("BoxShape3D_24d3s")
[node name="MeshInstance3D" type="MeshInstance3D" parent="CollisionShape3D" unique_id=55726639] [node name="MeshInstance3D" type="MeshInstance3D" parent="DirtStation/CollisionShape3D" unique_id=55726639]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.008318901, 0, -0.022509098) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.008318901, 0, -0.022509098)
mesh = SubResource("BoxMesh_ay2w6") mesh = SubResource("BoxMesh_ay2w6")
[node name="Label3D" type="Label3D" parent="CollisionShape3D" unique_id=1251766743] [node name="Label3D" type="Label3D" parent="DirtStation/CollisionShape3D" unique_id=1251766743]
transform = Transform3D(0.9999992, 0, 0, 0, 0.99999946, 0, 0, 0, 0.9999992, 0.002797456, 0.6309581, -0.2812457) transform = Transform3D(0.9999992, 0, 0, 0, 0.99999946, 0, 0, 0, 0.9999992, 0.002797456, 0.6309581, -0.2812457)
text = "Dirt" text = "Dirt"
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=333161027 groups=["station"]] [node name="XRToolsSnapZone" type="Area3D" parent="DirtStation" unique_id=333161027 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5270121, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0313971, 0)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65540 collision_mask = 65540
script = ExtResource("2_v0ytd") script = ExtResource("2_v0ytd")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=1398712192] [node name="CollisionShape3D2" type="CollisionShape3D" parent="DirtStation/XRToolsSnapZone" unique_id=1398712192]
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.008666992, -0.11009073, -0.009353638) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0.008666992, -0.11009073, -0.009353638)
shape = SubResource("BoxShape3D_mep2a") shape = SubResource("BoxShape3D_mep2a")
+75
View File
@@ -0,0 +1,75 @@
[gd_scene format=3 uid="uid://dlw5geheupgpt"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="1_oowyn"]
[ext_resource type="AudioStream" uid="uid://bqtk1adk8umbx" path="res://sounds/220197__gameaudio__click-basic.wav" id="2_4mvh7"]
[sub_resource type="BoxShape3D" id="BoxShape3D_hgrxd"]
size = Vector3(0.6, 0.12802735, 0.6)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vlqg6"]
albedo_color = Color(0.45, 0.3012, 0.17099999, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p8umn"]
albedo_color = Color(0.38, 0.35162666, 0.3268, 1)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_oowyn"]
albedo_color = Color(0.38, 0.35162666, 0.3268, 1)
[sub_resource type="BoxShape3D" id="BoxShape3D_vlqg6"]
size = Vector3(0.6, 0.34027833, 0.6)
[node name="Hatch" type="StaticBody3D" unique_id=1341321603 groups=["persistent_inventory"]]
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=2093161322 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.2495586, 0)
collision_layer = 65536
collision_mask = 65540
script = ExtResource("1_oowyn")
stash_sound = ExtResource("2_4mvh7")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D2" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=1997533747]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.002, 0)
shape = SubResource("BoxShape3D_hgrxd")
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="XRToolsSnapZone" unique_id=1729156185]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=2092063969]
use_collision = true
[node name="CSGBox3D" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1242328035]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.48000002, 0)
size = Vector3(0.599, 1, 0.3)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D2" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1252817409]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.07, 0)
size = Vector3(0.6, 0.3, 0.6)
material = SubResource("StandardMaterial3D_p8umn")
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D/CSGBox3D2" unique_id=1648749119]
transform = Transform3D(-4.371139e-08, -1, 0, 1, -4.371139e-08, 0, 0, 0, 1, 0.005000025, 0, 0)
operation = 1
radius = 0.25
height = 0.67
sides = 32
[node name="CSGBox3D3" type="CSGBox3D" parent="CSGCombiner3D" unique_id=740791264]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.14530161, 0.48000002, -0.15)
size = Vector3(0.120000005, 1, 0.120000005)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D4" type="CSGBox3D" parent="CSGCombiner3D" unique_id=249869254]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.14650056, 0.48000002, -0.15)
size = Vector3(0.120000005, 1, 0.120000005)
material = SubResource("StandardMaterial3D_vlqg6")
[node name="CSGBox3D5" type="CSGBox3D" parent="CSGCombiner3D" unique_id=1242869868]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3.1, 0)
size = Vector3(0.6, 1.8000001, 0.6)
material = SubResource("StandardMaterial3D_oowyn")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=1832317008]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0501393, 0)
shape = SubResource("BoxShape3D_vlqg6")
+14 -15
View File
@@ -1,6 +1,5 @@
extends StaticBody3D extends StaticBody3D
const RECIPE_MANAGER = preload("res://RecipeManager.gd")
@export var cook_speed = 1 @export var cook_speed = 1
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone @onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
@@ -11,9 +10,9 @@ const RECIPE_MANAGER = preload("res://RecipeManager.gd")
## on a client: only the world owner runs the station's _process and its snap ## on a client: only the world owner runs the station's _process and its snap
## zone, so a client never reaches the code below by itself and would otherwise ## zone, so a client never reaches the code below by itself and would otherwise
## show a hob that never lights up. ## show a hob that never lights up.
var time_cooked: float = 0.0: set = _set_time_cooked @export var time_cooked: float = 0.0: set = _set_time_cooked
var cooking_result: String = "": set = _set_cooking_result @export var cooking_result: String = "": set = _set_cooking_result
var cooking_result_time: float = 0.0: set = _set_cooking_result_time @export var cooking_result_time: float = 0.0: set = _set_cooking_result_time
func _set_time_cooked(value: float) -> void: func _set_time_cooked(value: float) -> void:
@@ -68,26 +67,26 @@ func _refresh_display() -> void:
progress_bar.override_fill_color(Color.RED if cooking_result == "charcoal" else Color.GREEN) progress_bar.override_fill_color(Color.RED if cooking_result == "charcoal" else Color.GREEN)
func _on_object_picked_up(_item) -> void: func _on_object_picked_up(_item) -> void:
print("Hob: object picked up: ", _item) SweetLogger.debug("object picked up: {0}", [_item])
# Find the CookableItem in held object # Find the CookableItem in held object
var _food_item = _item.get_node_or_null("FoodItem") as FoodItem var _food_item = _item.get_node_or_null("FoodItem") as FoodItem
if not _food_item: if not _food_item:
print("Hob: held object is not a FoodItem") SweetLogger.debug("held object is not a FoodItem")
return return
var result = RECIPE_MANAGER.get_cooking_result(_food_item.id) var result = RecipeManager.get_cooking_result(_food_item.id)
if not result: if not result:
print("Hob: held a FoodItem that is not cookable, id: %s result: %s" % [_food_item.id, result]) SweetLogger.debug("held a FoodItem that is not cookable, id: {0} result: {1}", [_food_item.id, result])
return return
cooking_result = result cooking_result = result
cooking_result_time = RECIPE_MANAGER.get_cooking_time(_food_item.id) cooking_result_time = RecipeManager.get_cooking_time(_food_item.id)
print("Hob: set cooking_result ", cooking_result) SweetLogger.debug("set cooking_result {0}", [cooking_result])
# The setters above already refresh the display and start the flames. # The setters above already refresh the display and start the flames.
func _on_object_dropped() -> void: func _on_object_dropped(_item) -> void:
print("Hob: object drop ") SweetLogger.debug("object drop")
time_cooked = 0 time_cooked = 0
cooking_result = "" cooking_result = ""
cooking_result_time = 0 cooking_result_time = 0
@@ -96,7 +95,7 @@ func _on_object_dropped() -> void:
func convert_held_to_item(_item: String) -> void: func convert_held_to_item(_item: String) -> void:
if not NetworkManager.owns_world(): if not NetworkManager.owns_world():
return return
print("Hob converting ", _item) SweetLogger.debug("converting {0}", [_item])
var old_pickable = snap_zone.picked_up_object var old_pickable = snap_zone.picked_up_object
if not old_pickable: if not old_pickable:
@@ -106,10 +105,10 @@ func convert_held_to_item(_item: String) -> void:
# Spawn the new item through the server so it replicates to every peer # Spawn the new item through the server so it replicates to every peer
# (including late joiners), in the old item's position. # (including late joiners), in the old item's position.
var original_transform = old_pickable.global_transform var original_transform = old_pickable.global_transform
var new_scene_instance = NetworkManager.spawn_item(RECIPE_MANAGER.get_item_scene(_item).resource_path, original_transform) var new_scene_instance = NetworkManager.spawn_item(RecipeManager.get_item_scene(_item).resource_path, original_transform)
# Drop and free the old item and pick up the new one # Drop and free the old item and pick up the new one
print("Hob freeing old_pickable ", old_pickable) SweetLogger.debug("freeing old_pickable {0}", [old_pickable])
snap_zone.drop_object() snap_zone.drop_object()
NetworkManager.despawn_item(old_pickable) NetworkManager.despawn_item(old_pickable)
snap_zone.pick_up_object(new_scene_instance) snap_zone.pick_up_object(new_scene_instance)
+9 -3
View File
@@ -3,7 +3,6 @@ extends StaticBody3D
@export var item_scene : PackedScene @export var item_scene : PackedScene
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone @onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
# Called when the node enters the scene tree for the first time.
func _ready() -> void: func _ready() -> void:
if not item_scene: if not item_scene:
push_error("Item dispenser is missing a reference to it's item to dispense") push_error("Item dispenser is missing a reference to it's item to dispense")
@@ -11,10 +10,17 @@ func _ready() -> void:
push_error("Item dispenser is missing a reference to its snap zone child") push_error("Item dispenser is missing a reference to its snap zone child")
# Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta: float) -> void:
func _process(delta: float) -> void:
if not NetworkManager.owns_world(): if not NetworkManager.owns_world():
return return
#if snap_zone.picked_up_object: # Player picked up this station
#if visible:
#snap_zone.picked_up_object.enabled = true
#else:
#snap_zone.picked_up_object.enabled = false
#return
#
if not snap_zone.picked_up_object: if not snap_zone.picked_up_object:
SweetLogger.debug("missing item, spawning new item")
var new_item = NetworkManager.spawn_item(item_scene.resource_path, snap_zone.global_transform) var new_item = NetworkManager.spawn_item(item_scene.resource_path, snap_zone.global_transform)
snap_zone.pick_up_object(new_item) snap_zone.pick_up_object(new_item)
+46 -22
View File
@@ -1,21 +1,42 @@
[gd_scene format=3 uid="uid://ck5tuftqmyiue"] [gd_scene format=3 uid="uid://ck5tuftqmyiue"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://Stations/item_dispenser.gd" id="1_jm0ik"] [ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_jgjsq"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://stations/item_dispenser.gd" id="1_jm0ik"]
[ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="2_tfo2i"] [ext_resource type="PackedScene" uid="uid://bp3v1jl8pctro" path="res://Containers/plate.tscn" id="2_tfo2i"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_lr065"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_lr065"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://Prefabs/slide_off_dome.tscn" id="4_tfo2i"] [ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://prefabs/slide_off_dome.tscn" id="4_tfo2i"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_jgjsq"]
properties/0/path = NodePath("PlateDispenser:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("PlateDispenser:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("PlateDispenser:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"] [sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3 radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
height = 1.0
radius = 0.3 radius = 0.3
[node name="PlateDispenser" type="StaticBody3D" unique_id=710538846] [node name="PlateDispenser" type="Node3D" unique_id=53391541]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_jgjsq")]
station = NodePath("../PlateDispenser")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=901684173]
replication_config = SubResource("SceneReplicationConfig_jgjsq")
[node name="PlateDispenser" type="StaticBody3D" parent="." unique_id=710538846 groups=["station"]]
script = ExtResource("1_jm0ik") script = ExtResource("1_jm0ik")
item_scene = ExtResource("2_tfo2i") item_scene = ExtResource("2_tfo2i")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=238176038] [node name="XRToolsSnapZone" type="Area3D" parent="PlateDispenser" unique_id=238176038 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.1603245, -0.002165556) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.1603245, -0.002165556)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65536 collision_mask = 65536
@@ -23,85 +44,88 @@ script = ExtResource("3_lr065")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=1942470044] [node name="CollisionShape3D" type="CollisionShape3D" parent="PlateDispenser/XRToolsSnapZone" unique_id=1942470044]
shape = SubResource("SphereShape3D_xmbo2") shape = SubResource("SphereShape3D_xmbo2")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=831688237] [node name="CollisionShape3D" type="CollisionShape3D" parent="PlateDispenser" unique_id=831688237]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("CylinderShape3D_24d3s") shape = SubResource("CylinderShape3D_24d3s")
[node name="SlideOffDome" parent="." unique_id=1427609426 instance=ExtResource("4_tfo2i")] [node name="SlideOffDome" parent="PlateDispenser" unique_id=1427609426 instance=ExtResource("4_tfo2i")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.061363697, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.061363697, 0)
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=696108271] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="PlateDispenser" unique_id=696108271]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1339763385] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/CSGCombiner3D" unique_id=1339763385]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
radius = 0.3 radius = 0.3
height = 1.0
sides = 32 sides = 32
[node name="Plates" type="Node3D" parent="." unique_id=1364909922] [node name="Plates" type="Node3D" parent="PlateDispenser" unique_id=1364909922]
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="Plates" unique_id=2128650644] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="PlateDispenser/Plates" unique_id=2128650644]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0289642, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0289642, 0)
autosmooth = true autosmooth = true
smoothing_angle = 103.9 smoothing_angle = 103.9
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D" unique_id=472067854] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D" unique_id=472067854]
radius = 0.2 radius = 0.2
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D/CSGCylinder3D" unique_id=7092994] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D/CSGCylinder3D" unique_id=7092994]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0)
operation = 2 operation = 2
radius = 0.15 radius = 0.15
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Plates/CSGCombiner3D" unique_id=23957958] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D" unique_id=23957958]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0)
radius = 0.15 radius = 0.15
height = 0.02 height = 0.02
[node name="CSGCombiner3D2" type="CSGCombiner3D" parent="Plates" unique_id=404631280] [node name="CSGCombiner3D2" type="CSGCombiner3D" parent="PlateDispenser/Plates" unique_id=404631280]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0762081, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0762081, 0)
autosmooth = true autosmooth = true
smoothing_angle = 103.9 smoothing_angle = 103.9
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D2" unique_id=943162425] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D2" unique_id=943162425]
radius = 0.2 radius = 0.2
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D2/CSGCylinder3D" unique_id=218364524] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D2/CSGCylinder3D" unique_id=218364524]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0)
operation = 2 operation = 2
radius = 0.15 radius = 0.15
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Plates/CSGCombiner3D2" unique_id=1548327331] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D2" unique_id=1548327331]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0)
radius = 0.15 radius = 0.15
height = 0.02 height = 0.02
[node name="CSGCombiner3D3" type="CSGCombiner3D" parent="Plates" unique_id=1506211353] [node name="CSGCombiner3D3" type="CSGCombiner3D" parent="PlateDispenser/Plates" unique_id=1506211353]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1214186, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1214186, 0)
autosmooth = true autosmooth = true
smoothing_angle = 103.9 smoothing_angle = 103.9
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D3" unique_id=739830577] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D3" unique_id=739830577]
radius = 0.2 radius = 0.2
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Plates/CSGCombiner3D3/CSGCylinder3D" unique_id=1882120753] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D3/CSGCylinder3D" unique_id=1882120753]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.010312311, 0)
operation = 2 operation = 2
radius = 0.15 radius = 0.15
height = 0.03 height = 0.03
sides = 16 sides = 16
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Plates/CSGCombiner3D3" unique_id=1904629745] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="PlateDispenser/Plates/CSGCombiner3D3" unique_id=1904629745]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.027119078, 0)
radius = 0.15 radius = 0.15
height = 0.02 height = 0.02
+141
View File
@@ -0,0 +1,141 @@
[gd_scene format=3 uid="uid://sc6i0i1f0o48"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="1_8orw3"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://stations/item_dispenser.gd" id="2_30d2d"]
[ext_resource type="PackedScene" uid="uid://drwuhqb3pjtiy" path="res://items/potato.tscn" id="3_mjqsn"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="4_fx1kw"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://prefabs/slide_off_dome.tscn" id="5_ur331"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_8orw3"]
properties/0/path = NodePath("PotatoDispenser:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("PotatoDispenser:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("PotatoDispenser:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
height = 1.0
radius = 0.3
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_d4wpw"]
albedo_color = Color(0.48, 0.34336, 0.1872, 1)
[node name="PotatoDispenser" type="Node3D" unique_id=1410160280]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("1_8orw3")]
station = NodePath("../PotatoDispenser")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=41449367]
replication_config = SubResource("SceneReplicationConfig_8orw3")
[node name="PotatoDispenser" type="StaticBody3D" parent="." unique_id=1720683779 groups=["station"]]
script = ExtResource("2_30d2d")
item_scene = ExtResource("3_mjqsn")
[node name="XRToolsSnapZone" type="Area3D" parent="PotatoDispenser" unique_id=805334513 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0162505, -0.002165556)
collision_layer = 65536
collision_mask = 65536
script = ExtResource("4_fx1kw")
snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="PotatoDispenser/XRToolsSnapZone" unique_id=1104626493]
shape = SubResource("SphereShape3D_xmbo2")
[node name="CollisionShape3D" type="CollisionShape3D" parent="PotatoDispenser" unique_id=1470079357]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("CylinderShape3D_24d3s")
[node name="SlideOffDome" parent="PotatoDispenser" unique_id=1427609426 instance=ExtResource("5_ur331")]
collision_layer = 4
collision_mask = 0
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="PotatoDispenser" unique_id=1746426494]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="PotatoDispenser/CSGCombiner3D" unique_id=858311379]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
radius = 0.3
height = 1.0
sides = 32
[node name="CSGCombiner3DPotato" type="CSGCombiner3D" parent="PotatoDispenser/CSGCombiner3D" unique_id=462017195]
[node name="CSGSphere3D" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato" unique_id=359972032]
transform = Transform3D(0.7382242, 0, -0.6745554, 0, 1, 0, 0.6745554, 0, 0.7382242, -0.15066577, 1.0408545, 0.076017424)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato/CSGSphere3D" unique_id=1185082311]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato" unique_id=1791611208]
transform = Transform3D(0.9110552, 0.37138447, -0.17903017, -0.38194957, 0.92377764, -0.02737245, 0.15521842, 0.09331828, 0.98346263, 0.07202275, 1.0408545, 0.17340909)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato/CSGSphere3D2" unique_id=421732580]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D3" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato" unique_id=1846822725]
transform = Transform3D(0.915982, 0, 0.4012194, 0, 1, 0, -0.4012194, 0, 0.915982, -0.023129582, 1.0408545, -0.17174377)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato/CSGSphere3D3" unique_id=186002472]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D4" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato" unique_id=1463825677]
transform = Transform3D(-0.6086207, 0, 0.79346126, 0, 1, 0, -0.79346126, 0, -0.6086207, -0.06466554, 1.0408545, 0.15114635)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato/CSGSphere3D4" unique_id=1513828324]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D5" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato" unique_id=1192971071]
transform = Transform3D(-0.9572301, 0, -0.2893278, 0, 1, 0, 0.2893278, 0, -0.9572301, -0.13095556, 1.0408545, -0.10415963)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGCombiner3DPotato/CSGSphere3D5" unique_id=216752249]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D" unique_id=502335906]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15826963, 1.0408545, -0.03307341)
radius = 0.06
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
[node name="CSGSphere3D2" type="CSGSphere3D" parent="PotatoDispenser/CSGCombiner3D/CSGSphere3D" unique_id=1283597847]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.06550818)
radius = 0.053
radial_segments = 32
material = SubResource("StandardMaterial3D_d4wpw")
+43 -19
View File
@@ -1,25 +1,46 @@
[gd_scene format=3 uid="uid://cwnwo4i28upap"] [gd_scene format=3 uid="uid://cwnwo4i28upap"]
[ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://Stations/item_dispenser.gd" id="1_gkb3v"] [ext_resource type="Script" uid="uid://0y6wnjcsum6" path="res://stations/item_dispenser.gd" id="1_gkb3v"]
[ext_resource type="PackedScene" uid="uid://dpot5qie20vf6" path="res://Items/burger.tscn" id="2_mep2a"] [ext_resource type="PackedScene" uid="uid://dpot5qie20vf6" path="res://items/burger.tscn" id="2_mep2a"]
[ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_3xuvi"] [ext_resource type="Script" uid="uid://cquqe4f1m1sw6" path="res://addons/godot-xr-tools/objects/snap_zone.gd" id="3_3xuvi"]
[ext_resource type="Texture2D" uid="uid://cexxfyw03hr81" path="res://Textures/1.png" id="4_1f5le"] [ext_resource type="Texture2D" uid="uid://cexxfyw03hr81" path="res://textures/1.png" id="4_1f5le"]
[ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://Prefabs/slide_off_dome.tscn" id="5_mep2a"] [ext_resource type="PackedScene" uid="uid://mpapt5mkbuao" path="res://prefabs/slide_off_dome.tscn" id="5_mep2a"]
[ext_resource type="PackedScene" uid="uid://cvucwxibtol5f" path="res://stations/StationMovement.tscn" id="6_8ou8n"]
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_8ou8n"]
properties/0/path = NodePath("RawBurgerDispenser:position")
properties/0/spawn = false
properties/0/replication_mode = 1
properties/1/path = NodePath("RawBurgerDispenser:rotation")
properties/1/spawn = false
properties/1/replication_mode = 1
properties/2/path = NodePath("RawBurgerDispenser:visible")
properties/2/spawn = false
properties/2/replication_mode = 1
[sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"] [sub_resource type="SphereShape3D" id="SphereShape3D_xmbo2"]
radius = 0.3 radius = 0.3
[sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_24d3s"]
height = 1.0
radius = 0.3 radius = 0.3
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_di04w"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_di04w"]
albedo_texture = ExtResource("4_1f5le") albedo_texture = ExtResource("4_1f5le")
[node name="RawBurgerDispenser" type="StaticBody3D" unique_id=235630131] [node name="RawBurgerDispenser" type="Node3D" unique_id=383615587]
[node name="StationMovement" parent="." unique_id=946873975 node_paths=PackedStringArray("station") instance=ExtResource("6_8ou8n")]
station = NodePath("../RawBurgerDispenser")
[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="." unique_id=1886082284]
replication_config = SubResource("SceneReplicationConfig_8ou8n")
[node name="RawBurgerDispenser" type="StaticBody3D" parent="." unique_id=235630131 groups=["station"]]
script = ExtResource("1_gkb3v") script = ExtResource("1_gkb3v")
item_scene = ExtResource("2_mep2a") item_scene = ExtResource("2_mep2a")
[node name="XRToolsSnapZone" type="Area3D" parent="." unique_id=1523586273] [node name="XRToolsSnapZone" type="Area3D" parent="RawBurgerDispenser" unique_id=1523586273 groups=["station_zone"]]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0645258, -0.002165556) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00070536137, 1.0645258, -0.002165556)
collision_layer = 65536 collision_layer = 65536
collision_mask = 65536 collision_mask = 65536
@@ -27,70 +48,73 @@ script = ExtResource("3_3xuvi")
snap_mode = 1 snap_mode = 1
metadata/_custom_type_script = "uid://cquqe4f1m1sw6" metadata/_custom_type_script = "uid://cquqe4f1m1sw6"
[node name="CollisionShape3D" type="CollisionShape3D" parent="XRToolsSnapZone" unique_id=2105824734] [node name="CollisionShape3D" type="CollisionShape3D" parent="RawBurgerDispenser/XRToolsSnapZone" unique_id=2105824734]
shape = SubResource("SphereShape3D_xmbo2") shape = SubResource("SphereShape3D_xmbo2")
[node name="SlideOffDome" parent="." unique_id=1427609426 instance=ExtResource("5_mep2a")] [node name="SlideOffDome" parent="RawBurgerDispenser" unique_id=1427609426 instance=ExtResource("5_mep2a")]
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=378049928] [node name="CollisionShape3D" type="CollisionShape3D" parent="RawBurgerDispenser" unique_id=378049928]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
shape = SubResource("CylinderShape3D_24d3s") shape = SubResource("CylinderShape3D_24d3s")
[node name="CSGCombiner3D" type="CSGCombiner3D" parent="." unique_id=1275577257] [node name="CSGCombiner3D" type="CSGCombiner3D" parent="RawBurgerDispenser" unique_id=1275577257]
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1973748218] [node name="CSGCylinder3D" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=1973748218]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
radius = 0.3 radius = 0.3
height = 1.0
sides = 32 sides = 32
[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=590219609] [node name="CSGCylinder3D2" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=590219609]
transform = Transform3D(1, 0, 0, 0, 0.9532462, 0.30219492, 0, -0.30219492, 0.9532462, -0.1276815, 1.0521446, -0.052202225) transform = Transform3D(1, 0, 0, 0, 0.9532462, 0.30219492, 0, -0.30219492, 0.9532462, -0.1276815, 1.0521446, -0.052202225)
radius = 0.08300781 radius = 0.08300781
height = 0.028435059 height = 0.028435059
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=177377476] [node name="CSGCylinder3D3" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=177377476]
transform = Transform3D(1, 0, 0, 0, 0.9694763, 0.245185, 0, -0.245185, 0.9694763, 0.08106685, 1.0391599, -0.119440794) transform = Transform3D(1, 0, 0, 0, 0.9694763, 0.245185, 0, -0.245185, 0.9694763, 0.08106685, 1.0391599, -0.119440794)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=622291452] [node name="CSGCylinder3D4" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=622291452]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.19005477, 1.0198405, 0.049397707) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.19005477, 1.0198405, 0.049397707)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=703594207] [node name="CSGCylinder3D5" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=703594207]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.026051283, 1.0175319, 0.0042250156) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.026051283, 1.0175319, 0.0042250156)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=955808722] [node name="CSGCylinder3D6" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=955808722]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.05739355, 1.0197641, 0.13219571) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.05739355, 1.0197641, 0.13219571)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D7" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=1066788957] [node name="CSGCylinder3D7" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=1066788957]
transform = Transform3D(0.9111114, 0.40515354, 0.075673, -0.41123694, 0.8813372, 0.2326565, 0.027568169, -0.24309555, 0.9696106, 0.14799988, 1.0345665, 0.11710405) transform = Transform3D(0.9111114, 0.40515354, 0.075673, -0.41123694, 0.8813372, 0.2326565, 0.027568169, -0.24309555, 0.9696106, 0.14799988, 1.0345665, 0.11710405)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D8" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=553053058] [node name="CSGCylinder3D8" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=553053058]
transform = Transform3D(0.9541017, 0.29948288, 0, -0.29948288, 0.9541017, 0, 0, 0, 1, 0.041060925, 1.0337045, 0.18304396) transform = Transform3D(0.9541017, 0.29948288, 0, -0.29948288, 0.9541017, 0, 0, 0, 1, 0.041060925, 1.0337045, 0.18304396)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
sides = 16 sides = 16
material = SubResource("StandardMaterial3D_di04w") material = SubResource("StandardMaterial3D_di04w")
[node name="CSGCylinder3D9" type="CSGCylinder3D" parent="CSGCombiner3D" unique_id=980376661] [node name="CSGCylinder3D9" type="CSGCylinder3D" parent="RawBurgerDispenser/CSGCombiner3D" unique_id=980376661]
transform = Transform3D(0.8510151, 0.22759955, 0.47325662, -0.16729629, 0.97174567, -0.16649997, -0.49778044, 0.06251989, 0.8650468, 0.2036674, 1.0335208, -0.024382353) transform = Transform3D(0.8510151, 0.22759955, 0.47325662, -0.16729629, 0.97174567, -0.16649997, -0.49778044, 0.06251989, 0.8650468, 0.2036674, 1.0335208, -0.024382353)
radius = 0.08300781 radius = 0.08300781
height = 0.03 height = 0.03
+8 -8
View File
@@ -10,9 +10,9 @@ const plate_wash_time: float = 3.0
## display when they change. Only the world owner runs this station's _process ## display when they change. Only the world owner runs this station's _process
## and snap zone, so without this a client never updates its bar — it stayed ## and snap zone, so without this a client never updates its bar — it stayed
## frozen on screen long after the plate came out clean. ## frozen on screen long after the plate came out clean.
var time_washed: float = 0.0: set = _set_time_washed @export var time_washed: float = 0.0: set = _set_time_washed
var is_washing: bool = false: set = _set_is_washing @export var is_washing: bool = false: set = _set_is_washing
var plate: PlateController = null @export var plate: PlateController = null
func _set_time_washed(value: float) -> void: func _set_time_washed(value: float) -> void:
@@ -59,15 +59,15 @@ func _refresh_progress_bar() -> void:
func _on_object_picked_up(_item) -> void: func _on_object_picked_up(_item) -> void:
print("Sink: object picked up: ", _item) SweetLogger.debug("object picked up: {0}", [_item])
plate = _item.get_node_or_null("PlateController") as PlateController plate = _item.get_node_or_null("PlateController") as PlateController
if plate: if plate:
# The setter starts the effects and shows the bar, here and on clients. # The setter starts the effects and shows the bar, here and on clients.
is_washing = plate.is_dirty is_washing = plate.is_dirty
func _on_object_dropped() -> void: func _on_object_dropped(_item) -> void:
print("Sink: object drop ") SweetLogger.debug("object drop")
_reset_sink() _reset_sink()
@@ -81,14 +81,14 @@ func complete_washing():
return return
plate.is_dirty = false plate.is_dirty = false
_reset_sink() _reset_sink()
print("Sink washing complete!") SweetLogger.debug("washing complete!")
func _process(delta: float) -> void: func _process(delta: float) -> void:
if is_washing: if is_washing:
time_washed += wash_speed * delta time_washed += wash_speed * delta
_refresh_progress_bar() _refresh_progress_bar()
print("Sink washing plate: ", time_washed) SweetLogger.debug("washing plate: {0}", [time_washed])
if time_washed >= plate_wash_time: if time_washed >= plate_wash_time:
complete_washing() complete_washing()

Some files were not shown because too many files have changed in this diff Show More