diff options
author | metamuffin <metamuffin@disroot.org> | 2025-06-19 21:04:24 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-06-19 21:04:24 +0200 |
commit | 1178300c12b85fa193ccbcfd585b1f321ad06966 (patch) | |
tree | c0c328cd4cd126c671994b6b9e1be2e29ebc2abd /client/player | |
parent | fe1695ef4857448f06d388a9b172aeeca364ef63 (diff) | |
download | hurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar hurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar.bz2 hurrycurry-1178300c12b85fa193ccbcfd585b1f321ad06966.tar.zst |
setting to change interact target behaviour
Diffstat (limited to 'client/player')
-rw-r--r-- | client/player/controllable_player.gd | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd index b8057348..367d4bfe 100644 --- a/client/player/controllable_player.gd +++ b/client/player/controllable_player.gd @@ -90,13 +90,7 @@ func _process_movement(delta): if Input.is_action_pressed("interact_left") or Input.is_action_just_released("interact_left") or Input.is_action_pressed("interact_right") or Input.is_action_just_released("interact_right"): input *= 0 else: - var targets := get_interact_target() - target_visual = targets[0] - target_tile = targets[1] - # target = Vector2i( - # int(floor(movement_base.position.x + sin(movement_base.rotation.y))), - # int(floor(movement_base.position.z + cos(movement_base.rotation.y))) - # ) + update_interact_target() if Global.get_setting("gameplay.accessible_movement"): if input.length() < 0.5: moving_duration -= delta * 2 @@ -235,14 +229,33 @@ func interact(): else: marker.visible = false -func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target: Vector2i] +func update_interact_target(): + match Global.get_setting("gameplay.interact_target"): + "dirsnap": return update_interact_target_dirsnap() + "dir": return update_interact_target_dir() + _: return update_interact_target_dir() + +func update_interact_target_dir(): + target_tile = Vector2i( + int(floor(movement_base.position.x + sin(movement_base.rotation.y))), + int(floor(movement_base.position.z + cos(movement_base.rotation.y))) + ) + var tile = game.map.get_tile_instance(target_tile) + if tile != null: + found_interact_target = game.get_tile_interactive(target_tile) + target_visual = tile.item_base.global_position + else: + found_interact_target = false + target_visual = Vector3(float(target_tile.x), 1., float(target_tile.y)) + +func update_interact_target_dirsnap(): var interact_target := Vector2( movement_base.position.x + sin(movement_base.rotation.y) * 0.7, movement_base.position.z + cos(movement_base.rotation.y) * 0.7 - ) + ) var interact_target_i := interact_target.floor() - var best_cursor_visual := Vector3(interact_target_i.x, 0, interact_target_i.y) - var best_cursor_i := interact_target_i + target_visual = Vector3(interact_target_i.x, 0, interact_target_i.y) + target_tile = interact_target_i var best_distance := 100. found_interact_target = false @@ -253,7 +266,7 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target: # Test all tiles in a 3x3 square around the player for interactible tiles. # Return the one which is closest to interact_target. - for offset_x in range(-1,2): + for offset_x in range(-1, 2): for offset_y in range (-1, 2): var offset_cursor := interact_target_i + Vector2(offset_x, offset_y) var tile_center := Vector2(offset_cursor) + Vector2(0.5, 0.5) @@ -267,8 +280,8 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target: if player_tile_distance < MAX_PLAYER_INTERACT_DIST && cursor_tile_distance < best_distance: found_interact_target = true best_distance = cursor_tile_distance - best_cursor_visual = game.map.get_tile_instance(offset_cursor).item_base.global_position - best_cursor_i = offset_cursor + target_visual = game.map.get_tile_instance(offset_cursor).item_base.global_position + target_tile = offset_cursor continue # Check if there are any players on this tile. @@ -288,7 +301,5 @@ func get_interact_target() -> Array: # -> [visual_target: Vector3, tile_target: if best_player_tile_distance < MAX_PLAYER_INTERACT_DIST && best_player_tile_distance < best_distance: found_interact_target = true best_distance = best_player_tile_distance - best_cursor_visual = best_player_pos - best_cursor_i = offset_cursor - - return [best_cursor_visual, best_cursor_i] + target_visual = best_player_pos + target_tile = offset_cursor |