diff options
| author | tpart <tpart120@proton.me> | 2025-12-11 23:15:23 +0100 |
|---|---|---|
| committer | tpart <tpart120@proton.me> | 2025-12-11 23:15:23 +0100 |
| commit | bddafa18ad005cd68a413355a2d7b1952eb71ee6 (patch) | |
| tree | 1e3d3fd46e2b7fed1356c0c13bdb3ea01331c954 | |
| parent | 2056f0cebf2118437df724e93562055d2d5bb730 (diff) | |
| download | hurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar hurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar.bz2 hurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar.zst | |
Add player interactions to fps interact target
| -rw-r--r-- | client/player/controllable_player.gd | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index d1211e39..8660f589 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -25,10 +25,12 @@ class EmptyTarget extends InteractTarget: class PlayerTarget extends InteractTarget: var player: Player - func _init(player_: Player, target_visual_pos_: Vector3, target_visual_rot_: float) -> void: + var distance: float + func _init(player_: Player, target_visual_pos_: Vector3, target_visual_rot_: float, distance_: float) -> void: player = player_ target_visual_pos = target_visual_pos_ target_visual_rot = target_visual_rot_ + distance = distance_ class TileTarget extends InteractTarget: var pos: Vector2i @@ -279,7 +281,9 @@ func get_interact_target_fps() -> InteractTarget: int(floor(movement_base.position.z + cos(-fps_look.y + PI))) ) - # TODO: Player interactions + var target = get_best_player_target(target_tile, Vector2(movement_base.position.x, movement_base.position.z)) + if target is PlayerTarget and target.distance < 1.25: + best_interact_target = target var tile = game.map.get_tile_instance(target_tile) if game.is_tile_interactive(target_tile, hand): @@ -296,24 +300,11 @@ func get_interact_target() -> InteractTarget: ) var interact_target_pos_i := interact_target_pos.floor() - var best_interact_target: InteractTarget = EmptyTarget.new() - var best_distance := 100. - - for p: Player in game.players.values(): - if not p.is_chef: continue # Customers cannot be interacted with - if p.id == game.my_player_id: continue # I can't interact with myself - - var interact_possible := false - for i in range(p.hand.size()): - interact_possible = interact_possible or (p.hand[i] != null or hand[i] != null) - if not interact_possible: continue # Interaction not possible if all hand pairs are empty - - var distance: float = p.position_anim.distance_to(interact_target_pos) - var self_target_distance: float = p.position_anim.distance_to(movement_base_2d) - if self_target_distance < MAX_PLAYER_INTERACT_DIST and distance < best_distance: - best_distance = distance - best_interact_target = PlayerTarget.new(p, Vector3(p.position_anim.x, 0, p.position_anim.y), p.rotation_anim) + # Find the player closest to the interact target + var best_interact_target: InteractTarget = get_best_player_target(interact_target_pos, movement_base_2d) + var best_distance: float = best_interact_target.distance if best_interact_target is PlayerTarget else 100. + # Let's see if we can find a tile with an even better distance! # Test all tiles in a 3x3 square around the player for interactible tiles. # Return the one which is closest to interact_target_pos. for offset_x in range(-1, 2): @@ -331,3 +322,24 @@ func get_interact_target() -> InteractTarget: best_interact_target = TileTarget.new(offset_cursor, tile, tile.item_base.global_position, target_rot) return best_interact_target + +func get_best_player_target(interact_target_pos: Vector2, movement_base_2d: Vector2) -> InteractTarget: + var best_interact_target: InteractTarget = EmptyTarget.new() + var best_distance := 100. + + for p: Player in game.players.values(): + if not p.is_chef: continue # Customers cannot be interacted with + if p.id == game.my_player_id: continue # I can't interact with myself + + var interact_possible := false + for i in range(p.hand.size()): + interact_possible = interact_possible or (p.hand[i] != null or hand[i] != null) + if not interact_possible: continue # Interaction not possible if all hand pairs are empty + + var distance: float = p.position_anim.distance_to(interact_target_pos) + var self_target_distance: float = p.position_anim.distance_to(movement_base_2d) + if self_target_distance < MAX_PLAYER_INTERACT_DIST and distance < best_distance: + best_distance = distance + best_interact_target = PlayerTarget.new(p, Vector3(p.position_anim.x, 0, p.position_anim.y), p.rotation_anim, distance) + + return best_interact_target
\ No newline at end of file |