aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-09-30 02:08:54 +0200
committermetamuffin <metamuffin@disroot.org>2025-09-30 02:08:54 +0200
commitd2c793ec7632a5da8065fd52436cfd676cc96a7b (patch)
tree3868f0f858bc9766925723b6479315bacde4b040 /client
parent5033c326094edc1ff4234b994e95d987cb937fc4 (diff)
downloadhurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar
hurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar.bz2
hurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar.zst
Tile placeable items client side and interactable empty special case
Diffstat (limited to 'client')
-rw-r--r--client/game.gd24
-rw-r--r--client/map/item_factory.gd5
-rw-r--r--client/map/items/item.gd2
-rw-r--r--client/player/controllable_player.gd6
-rw-r--r--client/player/player.gd4
5 files changed, 29 insertions, 12 deletions
diff --git a/client/game.gd b/client/game.gd
index e5c14fdb..c1f515fe 100644
--- a/client/game.gd
+++ b/client/game.gd
@@ -48,6 +48,7 @@ var tile_names: Array = []
var tile_index_by_name: Dictionary = {}
var tile_walkable: Dictionary = {}
var tile_placeable_items: Dictionary = {}
+var tile_interactable_empty: Dictionary = {}
var maps: Array = []
var bot_algos: Array
var text_message_history: Array[TextMessage] = []
@@ -95,6 +96,8 @@ func handle_packet(p):
tile_names = p["data"]["tile_names"]
tile_walkable = {}
for tile in p["data"]["tile_walkable"]: tile_walkable[int(tile)] = true
+ tile_interactable_empty = {}
+ for tile in p["data"]["tile_interactable_empty"]: tile_interactable_empty[int(tile)] = true
tile_placeable_items = {}
for tile in p["data"]["tile_placeable_items"]:
tile_placeable_items[int(tile)] = p["data"]["tile_placeable_items"][tile].map(func(x): return int(x))
@@ -428,14 +431,19 @@ func get_tile_collision(pos: Vector2i) -> bool:
if t == null: return true
else: return not tile_walkable.has(tile_index_by_name[t])
-func get_tile_interactive(pos: Vector2i, item = null) -> bool:
- var t = map.get_tile_name(pos)
- if t == null: return false
- else:
- if map.get_tile_instance(pos).item != null: return true
- if !tile_placeable_items.has(tile_index_by_name[t]): return true
- if item == null: return false # TODO change to true then always supplied
- return item_index_by_name[item] in tile_placeable_items[tile_index_by_name[t]]
+func get_tile_interactive(pos: Vector2i, hands: Array) -> bool:
+ var tile_name = map.get_tile_name(pos)
+ if tile_name == null: return false
+ var tile = tile_index_by_name[tile_name]
+ if map.get_tile_instance(pos).item != null: return true
+ if !tile_placeable_items.has(tile): return true
+ for hand in hands:
+ if hand == null:
+ if tile_interactable_empty.has(tile): return true
+ else:
+ if item_index_by_name[hand.item_name] in tile_placeable_items[tile]: return true
+ return false
+
func update_center():
$FollowCamera.autozoom = spectating_mode == SpectatingMode.CENTER and join_state == JoinState.SPECTATING
diff --git a/client/map/item_factory.gd b/client/map/item_factory.gd
index 8261650d..0ebc3367 100644
--- a/client/map/item_factory.gd
+++ b/client/map/item_factory.gd
@@ -26,6 +26,11 @@ class ItemName:
contents = c[1].split(",") if c.size() > 1 else []
static func produce(raw_name: String, owned_by: Node3D) -> Item:
+ var item: Item = produce_inner(raw_name, owned_by)
+ item.item_name = raw_name
+ return item
+
+static func produce_inner(raw_name: String, owned_by: Node3D) -> Item:
var item = ItemName.new(raw_name)
match item.name:
"bun": return Bun.new(owned_by)
diff --git a/client/map/items/item.gd b/client/map/items/item.gd
index ea5b3937..5a43af2d 100644
--- a/client/map/items/item.gd
+++ b/client/map/items/item.gd
@@ -18,6 +18,8 @@ extends Node3D
const CHECKMARK: PackedScene = preload("uid://bdbw8whs3data")
+var item_name #: String
+
var owned_by: Node3D
var base: Node3D = Node3D.new()
var rotation_target: float = 0.
diff --git a/client/player/controllable_player.gd b/client/player/controllable_player.gd
index deb1f089..ec547c81 100644
--- a/client/player/controllable_player.gd
+++ b/client/player/controllable_player.gd
@@ -263,7 +263,7 @@ func update_interact_target_dir():
)
var tile = game.map.get_tile_instance(target_tile)
if tile != null:
- found_interact_target = game.get_tile_interactive(target_tile)
+ found_interact_target = game.get_tile_interactive(target_tile, hand)
target_visual = tile.item_base.global_position
else:
found_interact_target = false
@@ -276,7 +276,7 @@ func update_interact_target_fps():
)
var tile = game.map.get_tile_instance(target_tile)
if tile != null:
- found_interact_target = game.get_tile_interactive(target_tile)
+ found_interact_target = game.get_tile_interactive(target_tile, hand)
target_visual = tile.item_base.global_position
else:
found_interact_target = false
@@ -307,7 +307,7 @@ func update_interact_target_dirsnap():
var offset_cursor := interact_target_i + Vector2(offset_x, offset_y)
var tile_center := Vector2(offset_cursor) + Vector2(0.5, 0.5)
- if game.get_tile_interactive(offset_cursor):
+ if game.get_tile_interactive(offset_cursor, hand):
var cursor_tile_distance := interact_target.distance_to(tile_center)
var player_tile_distance := Vector2(
movement_base.position.x - tile_center.x,
diff --git a/client/player/player.gd b/client/player/player.gd
index 0ca08742..828a4495 100644
--- a/client/player/player.gd
+++ b/client/player/player.gd
@@ -46,7 +46,7 @@ var clear_effect_timer: Timer = Timer.new()
var is_despawning: bool = false
-var hand = [null, null]
+var hand = []
var hand_base
var character_style: Dictionary
var player_class: String
@@ -69,6 +69,8 @@ func _init(_id: int, name_: String, pos: Vector2, character_style_: Dictionary,
name = name_
username = name_
+ for _x in range(Global.hand_count): hand.append(null)
+
add_child(movement_base)
movement_base.add_child(character)
position_ = pos