diff options
| author | tpart <tpart120@proton.me> | 2025-10-16 21:02:44 +0200 |
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2025-10-16 21:02:50 +0200 |
| commit | 1532e80cf37c9ee77cd921a158499188a1e172b2 (patch) | |
| tree | d5ea0f47d4b5a0fed9b764d6a31f628bfe606c1d | |
| parent | 8fa812c2f55be090c950cff19b17e83ff5518879 (diff) | |
| download | hurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar hurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar.bz2 hurrycurry-1532e80cf37c9ee77cd921a158499188a1e172b2.tar.zst | |
Fix cutting animation not stopping when multiple people cut at once (Closes #472)
| -rw-r--r-- | client/game.gd | 8 | ||||
| -rw-r--r-- | client/global.gd | 6 | ||||
| -rw-r--r-- | client/map/tiles/cutting_board.gd | 30 | ||||
| -rw-r--r-- | client/map/tiles/rolling_board.gd | 30 | ||||
| -rw-r--r-- | client/map/tiles/tile.gd | 2 | ||||
| -rw-r--r-- | client/multiplayer.gd | 2 |
6 files changed, 44 insertions, 34 deletions
diff --git a/client/game.gd b/client/game.gd index 8edd4f8c..18b23e08 100644 --- a/client/game.gd +++ b/client/game.gd @@ -61,7 +61,7 @@ var tutorial_running := false var tutorial_queue := [] var last_position = null # : Vector2? -var players := {} +var players: Dictionary[float, Player] = {} var spectating_mode: SpectatingMode = SpectatingMode.CENTER @@ -178,7 +178,11 @@ func handle_packet(p): "set_progress": if "tile" in p.item: var t: Tile = map.get_tile_instance(p.item.tile) - t.progress(p.position, p.speed, p.warn, players.get(p.player)) + var acting_players: Array[Player] = [] + for id: float in p.players: + if !players.has(id): continue + acting_players.append(players[id]) + t.progress(p.position, p.speed, p.warn, acting_players) else: players[p.item.player[0]].progress(p.position, p.speed, p.warn, int(p.item.player[1])) "clear_progress": diff --git a/client/global.gd b/client/global.gd index 4f68f99f..7d44754f 100644 --- a/client/global.gd +++ b/client/global.gd @@ -133,6 +133,12 @@ static func unordered_array_eq(a: Array, b: Array) -> bool: static func unordered_array_subset(a: Array, b: Array) -> bool: return a.all(func(e): return b.has(e)) +static func unordered_array_difference(a: Array, b: Array) -> Array: + var c := [] + for i in a: + if not b.has(i): c.append(i) + return c + static func add_missing_keys(dict: Dictionary, reference: Dictionary): for k in reference.keys(): if !dict.has(k) or typeof(dict[k]) != typeof(reference[k]): diff --git a/client/map/tiles/cutting_board.gd b/client/map/tiles/cutting_board.gd index 300b5700..9ee93522 100644 --- a/client/map/tiles/cutting_board.gd +++ b/client/map/tiles/cutting_board.gd @@ -18,7 +18,7 @@ extends CounterBase var board = load("res://map/tiles/cutting_board.tscn").instantiate() var chopping: AudioStreamPlayer3D = AudioStreamPlayer3D.new() -var acting_player +var acting_players: Array[Player] = [] func _init(ctx: TileFactory.TileCC): super(ctx) @@ -26,29 +26,29 @@ func _init(ctx: TileFactory.TileCC): add_child(chopping) base.add_child(board) -func progress(position_: float, speed: float, warn: bool, acting_player_): - super(position_, speed, warn, acting_player) +func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]): + super(position_, speed, warn, acting_players) var knife: Node3D = board.get_node("Knife") - acting_player = acting_player_ - if not chopping.playing and speed != 0.: - chopping.play() - if acting_player != null: + if speed != 0.: + if not chopping.playing: chopping.play() + var players_who_stopped := G.unordered_array_difference(acting_players, acting_players_) + for p: Player in players_who_stopped: + if p != null: p.character.cutting = false + for p: Player in acting_players_: knife.visible = false - var acting_character: Character = acting_player.character - acting_character.cutting = true + p.character.cutting = true elif speed == 0: chopping.stop() knife.visible = true - if acting_player != null: - var acting_character: Character = acting_player.character - acting_character.cutting = false + for p: Player in acting_players: + p.character.cutting = false + acting_players = acting_players_ func finish(): super() - if is_instance_valid(acting_player): - var acting_character: Character = acting_player.character - acting_character.cutting = false + for p: Player in acting_players: + p.character.cutting = false board.get_node("Knife").visible = true chopping.stop() diff --git a/client/map/tiles/rolling_board.gd b/client/map/tiles/rolling_board.gd index 078897b1..fd118b72 100644 --- a/client/map/tiles/rolling_board.gd +++ b/client/map/tiles/rolling_board.gd @@ -18,7 +18,7 @@ extends CounterBase var board = load("res://map/tiles/rolling_board.tscn").instantiate() var rolling: AudioStreamPlayer3D = AudioStreamPlayer3D.new() -var acting_player +var acting_players: Array[Player] func _init(ctx: TileFactory.TileCC): super(ctx) @@ -27,29 +27,29 @@ func _init(ctx: TileFactory.TileCC): add_child(rolling) base.add_child(board) -func progress(position_: float, speed: float, warn: bool, acting_player_): - super(position_, speed, warn, acting_player) +func progress(position_: float, speed: float, warn: bool, acting_players_: Array[Player]): + super(position_, speed, warn, acting_players_) var pin: Node3D = board.get_node("RollingPin") - acting_player = acting_player_ - if not rolling.playing and speed != 0.: - rolling.play() - if acting_player != null: + if speed != 0.: + if not rolling.playing: rolling.play() + var players_who_stopped := G.unordered_array_difference(acting_players, acting_players_) + for p: Player in players_who_stopped: + if p != null: p.character.rolling = false + for p: Player in acting_players_: pin.visible = false - var acting_character: Character = acting_player.character - acting_character.rolling = true + p.character.rolling = true elif speed == 0: rolling.stop() pin.visible = true - if acting_player != null: - var acting_character: Character = acting_player.character - acting_character.rolling = false + for p: Player in acting_players: + p.character.rolling = false + acting_players = acting_players_ func finish(): super() - if is_instance_valid(acting_player): - var acting_character: Character = acting_player.character - acting_character.rolling = false + for p: Player in acting_players: + p.character.rolling = false board.get_node("RollingPin").visible = true rolling.stop() diff --git a/client/map/tiles/tile.gd b/client/map/tiles/tile.gd index 9d4d732e..27d791c3 100644 --- a/client/map/tiles/tile.gd +++ b/client/map/tiles/tile.gd @@ -57,7 +57,7 @@ static func interact_target() -> Vector3: func interact(): pass -func progress(position_: float, speed: float, warn: bool, _acting_player): +func progress(position_: float, speed: float, warn: bool, _acting_players: Array[Player]): if item != null: item.progress(position_, speed, warn) diff --git a/client/multiplayer.gd b/client/multiplayer.gd index e8747995..d635db41 100644 --- a/client/multiplayer.gd +++ b/client/multiplayer.gd @@ -19,7 +19,7 @@ extends Node signal packet(packet: Dictionary) signal connection_closed() -static var VERSION_MAJOR: int = 11 +static var VERSION_MAJOR: int = 12 static var VERSION_MINOR: int = 0 var connected := false |