aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortpart <tpart120@proton.me>2025-12-11 23:15:23 +0100
committertpart <tpart120@proton.me>2025-12-11 23:15:23 +0100
commitbddafa18ad005cd68a413355a2d7b1952eb71ee6 (patch)
tree1e3d3fd46e2b7fed1356c0c13bdb3ea01331c954
parent2056f0cebf2118437df724e93562055d2d5bb730 (diff)
downloadhurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar
hurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar.bz2
hurrycurry-bddafa18ad005cd68a413355a2d7b1952eb71ee6.tar.zst
Add player interactions to fps interact target
-rw-r--r--client/player/controllable_player.gd50
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