diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/game.gd | 24 | ||||
-rw-r--r-- | client/map/item_factory.gd | 5 | ||||
-rw-r--r-- | client/map/items/item.gd | 2 | ||||
-rw-r--r-- | client/player/controllable_player.gd | 6 | ||||
-rw-r--r-- | client/player/player.gd | 4 |
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 |