mp fix
This commit is contained in:
@@ -22,6 +22,9 @@ properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:cooking_result_time")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
properties/2/path = NodePath(".:cooking_result")
|
||||
properties/2/spawn = true
|
||||
properties/2/replication_mode = 1
|
||||
|
||||
[sub_resource type="Animation" id="Animation_7uuqv"]
|
||||
length = 0.001
|
||||
|
||||
+47
-13
@@ -6,24 +6,63 @@ const RECIPE_MANAGER = preload("res://RecipeManager.gd")
|
||||
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
|
||||
@onready var progress_bar: ProgressBar3D = $ProgressBar3D
|
||||
|
||||
var time_cooked = 0
|
||||
var cooking_result: String
|
||||
var cooking_result_time = 0
|
||||
## Cooking state. All three are replicated (see Hob.tscn's Sync node) and each
|
||||
## refreshes the display when it changes, which is what makes the hob look alive
|
||||
## 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
|
||||
## show a hob that never lights up.
|
||||
var time_cooked: float = 0.0: set = _set_time_cooked
|
||||
var cooking_result: String = "": set = _set_cooking_result
|
||||
var cooking_result_time: float = 0.0: set = _set_cooking_result_time
|
||||
|
||||
|
||||
func _set_time_cooked(value: float) -> void:
|
||||
if is_equal_approx(time_cooked, value):
|
||||
return
|
||||
time_cooked = value
|
||||
_refresh_display()
|
||||
|
||||
|
||||
func _set_cooking_result(value: String) -> void:
|
||||
if cooking_result == value:
|
||||
return
|
||||
cooking_result = value
|
||||
_refresh_display()
|
||||
# The flames follow whether we're cooking, on every peer.
|
||||
_play_animation("hob" if not cooking_result.is_empty() else "RESET")
|
||||
|
||||
|
||||
func _set_cooking_result_time(value: float) -> void:
|
||||
if is_equal_approx(cooking_result_time, value):
|
||||
return
|
||||
cooking_result_time = value
|
||||
_refresh_display()
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not progress_bar or progress_bar is not ProgressBar3D:
|
||||
push_error("Hob missing reference to progressbar, or wrong type:", progress_bar)
|
||||
snap_zone.has_picked_up.connect(_on_object_picked_up)
|
||||
snap_zone.has_dropped.connect(_on_object_dropped)
|
||||
_refresh_progress_bar()
|
||||
_refresh_display()
|
||||
|
||||
|
||||
func _refresh_progress_bar() -> void:
|
||||
func _play_animation(name: String) -> void:
|
||||
# Replicated setters can fire before the node is in the tree (spawn payload),
|
||||
# when the @onready children don't exist yet.
|
||||
var player := get_node_or_null("AnimationPlayer") as AnimationPlayer
|
||||
if player:
|
||||
player.play(name)
|
||||
|
||||
|
||||
func _refresh_display() -> void:
|
||||
# Guarded for the same reason as _play_animation.
|
||||
if not progress_bar:
|
||||
return
|
||||
var progress := 0.0
|
||||
if cooking_result and cooking_result_time > 0:
|
||||
progress = clampf(float(time_cooked) / cooking_result_time, 0.0, 1.0)
|
||||
|
||||
#print("time_cooked: %s / cooking_result_time: %s = progress: %s" % [time_cooked, cooking_result_time, progress])
|
||||
progress_bar.set_progress(progress)
|
||||
progress_bar.set_bar_visible(not cooking_result.is_empty())
|
||||
progress_bar.override_fill_color(Color.RED if cooking_result == "charcoal" else Color.GREEN)
|
||||
@@ -44,25 +83,20 @@ func _on_object_picked_up(_item) -> void:
|
||||
cooking_result = result
|
||||
cooking_result_time = RECIPE_MANAGER.get_cooking_time(_food_item.id)
|
||||
print("Hob: set cooking_result ", cooking_result)
|
||||
_refresh_progress_bar()
|
||||
$AnimationPlayer.play("hob")
|
||||
# The setters above already refresh the display and start the flames.
|
||||
|
||||
|
||||
func _on_object_dropped() -> void:
|
||||
print("Hob: object drop ")
|
||||
$AnimationPlayer.play("RESET")
|
||||
time_cooked = 0
|
||||
cooking_result = ""
|
||||
cooking_result_time = 0
|
||||
_refresh_progress_bar()
|
||||
|
||||
|
||||
func convert_held_to_item(_item: String) -> void:
|
||||
if not NetworkManager.owns_world():
|
||||
return
|
||||
print("Hob converting ", _item)
|
||||
$AnimationPlayer.play("RESET")
|
||||
|
||||
|
||||
var old_pickable = snap_zone.picked_up_object
|
||||
if not old_pickable:
|
||||
@@ -86,7 +120,7 @@ func _process(delta: float) -> void:
|
||||
if cooking_result:
|
||||
#print("Hob cooking_result: ", cooking_result)
|
||||
time_cooked += cook_speed * delta
|
||||
_refresh_progress_bar()
|
||||
_refresh_display()
|
||||
if time_cooked >= cooking_result_time:
|
||||
time_cooked = 0
|
||||
convert_held_to_item(cooking_result)
|
||||
|
||||
+38
-12
@@ -6,10 +6,41 @@ const plate_wash_time: float = 3.0
|
||||
@onready var snap_zone: XRToolsSnapZone = $XRToolsSnapZone
|
||||
@onready var progress_bar: ProgressBar3D = $ProgressBar3D
|
||||
|
||||
var time_washed: float = 0.0
|
||||
var is_washing: bool = false
|
||||
## Washing state. Both are replicated (see sink.tscn's Sync node) and refresh the
|
||||
## 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
|
||||
## frozen on screen long after the plate came out clean.
|
||||
var time_washed: float = 0.0: set = _set_time_washed
|
||||
var is_washing: bool = false: set = _set_is_washing
|
||||
var plate: PlateController = null
|
||||
|
||||
|
||||
func _set_time_washed(value: float) -> void:
|
||||
if is_equal_approx(time_washed, value):
|
||||
return
|
||||
time_washed = value
|
||||
_refresh_progress_bar()
|
||||
|
||||
|
||||
func _set_is_washing(value: bool) -> void:
|
||||
if is_washing == value:
|
||||
return
|
||||
is_washing = value
|
||||
_refresh_progress_bar()
|
||||
_set_effects_playing(is_washing)
|
||||
|
||||
|
||||
# Water, bubbles and the animation follow the washing state on every peer, not
|
||||
# just the one running the logic.
|
||||
func _set_effects_playing(playing: bool) -> void:
|
||||
var player := get_node_or_null("AnimationPlayer") as AnimationPlayer
|
||||
if player:
|
||||
player.play("working" if playing else "RESET")
|
||||
for effect in ["water", "bubbles", "GPUParticles3D"]:
|
||||
var node := get_node_or_null(effect) as Node3D
|
||||
if node:
|
||||
node.visible = playing
|
||||
|
||||
func _ready() -> void:
|
||||
if not progress_bar or progress_bar is not ProgressBar3D:
|
||||
push_error("Sink missing reference to progressbar, or wrong type:", progress_bar)
|
||||
@@ -21,6 +52,8 @@ func _ready() -> void:
|
||||
|
||||
|
||||
func _refresh_progress_bar() -> void:
|
||||
if not progress_bar:
|
||||
return
|
||||
progress_bar.set_progress(clampf(float(time_washed) / plate_wash_time, 0.0, 1.0))
|
||||
progress_bar.set_bar_visible(is_washing)
|
||||
|
||||
@@ -29,12 +62,8 @@ func _on_object_picked_up(_item) -> void:
|
||||
print("Sink: object picked up: ", _item)
|
||||
plate = _item.get_node_or_null("PlateController") as PlateController
|
||||
if plate:
|
||||
# The setter starts the effects and shows the bar, here and on clients.
|
||||
is_washing = plate.is_dirty
|
||||
if is_washing:
|
||||
$AnimationPlayer.play("working")
|
||||
$bubbles.show()
|
||||
$water.show()
|
||||
$GPUParticles3D.show()
|
||||
|
||||
|
||||
func _on_object_dropped() -> void:
|
||||
@@ -46,13 +75,10 @@ func _reset_sink():
|
||||
time_washed = 0
|
||||
is_washing = false
|
||||
plate = null
|
||||
$AnimationPlayer.play("RESET")
|
||||
$water.hide()
|
||||
$bubbles.hide()
|
||||
$GPUParticles3D.hide()
|
||||
_refresh_progress_bar()
|
||||
|
||||
func complete_washing():
|
||||
if not plate:
|
||||
return
|
||||
plate.is_dirty = false
|
||||
_reset_sink()
|
||||
print("Sink washing complete!")
|
||||
|
||||
+4
-1
@@ -16,9 +16,12 @@ stereo = true
|
||||
size = Vector3(0.5, 0.128, 0.5)
|
||||
|
||||
[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_np_sink"]
|
||||
properties/0/path = NodePath(".:progress")
|
||||
properties/0/path = NodePath(".:time_washed")
|
||||
properties/0/spawn = true
|
||||
properties/0/replication_mode = 1
|
||||
properties/1/path = NodePath(".:is_washing")
|
||||
properties/1/spawn = true
|
||||
properties/1/replication_mode = 1
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_0gbf8"]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user