diff options
author | metamuffin <metamuffin@disroot.org> | 2025-09-30 02:08:54 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-09-30 02:08:54 +0200 |
commit | d2c793ec7632a5da8065fd52436cfd676cc96a7b (patch) | |
tree | 3868f0f858bc9766925723b6479315bacde4b040 | |
parent | 5033c326094edc1ff4234b994e95d987cb937fc4 (diff) | |
download | hurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar hurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar.bz2 hurrycurry-d2c793ec7632a5da8065fd52436cfd676cc96a7b.tar.zst |
Tile placeable items client side and interactable empty special case
-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 | ||||
-rw-r--r-- | data/maps/junior.yaml | 4 | ||||
-rw-r--r-- | server/protocol/src/lib.rs | 1 | ||||
-rw-r--r-- | server/src/data/mod.rs | 8 | ||||
-rw-r--r-- | server/src/interaction.rs | 5 |
9 files changed, 43 insertions, 16 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 diff --git a/data/maps/junior.yaml b/data/maps/junior.yaml index 1d246627..bc9472e0 100644 --- a/data/maps/junior.yaml +++ b/data/maps/junior.yaml @@ -87,3 +87,7 @@ collider: - wall - wall-window - tree + - steak-crate + - tomato-crate + - flour-crate + - lettuce-crate diff --git a/server/protocol/src/lib.rs b/server/protocol/src/lib.rs index 00ef62d7..66f41a6e 100644 --- a/server/protocol/src/lib.rs +++ b/server/protocol/src/lib.rs @@ -87,6 +87,7 @@ pub struct Gamedata { pub tile_names: Vec<String>, pub tile_walkable: HashSet<TileIndex>, pub tile_placeable_items: BTreeMap<TileIndex, HashSet<ItemIndex>>, + pub tile_interactable_empty: HashSet<TileIndex>, pub maps: Vec<(String, MapMetadata)>, pub bot_algos: Vec<String>, pub recipes: Vec<Recipe>, diff --git a/server/src/data/mod.rs b/server/src/data/mod.rs index e5cd4552..17ebd5bf 100644 --- a/server/src/data/mod.rs +++ b/server/src/data/mod.rs @@ -307,6 +307,7 @@ pub fn build_data( maps.sort_by_key(|(_, m)| m.players); let mut tile_placeable_items = BTreeMap::new(); + let mut tile_interactable_empty = HashSet::new(); for tile_name in map_in.collider.iter().chain(map_in.walkable.iter()) { let tile = reg.register_tile(tile_name.to_string()); let whitelist = recipes @@ -314,7 +315,13 @@ pub fn build_data( .filter(|r| r.tile() == Some(tile)) .flat_map(|e| e.inputs()) .collect(); + let int_empty = recipes + .iter() + .any(|r| r.tile() == Some(tile) && r.inputs().is_empty()); tile_placeable_items.insert(tile, whitelist); + if int_empty { + tile_interactable_empty.insert(tile); + } } let tile_walkable = map_in .walkable @@ -338,6 +345,7 @@ pub fn build_data( maps, tile_walkable, tile_placeable_items, + tile_interactable_empty, recipes, item_names, demands, diff --git a/server/src/interaction.rs b/server/src/interaction.rs index 8f591db1..5a8372ee 100644 --- a/server/src/interaction.rs +++ b/server/src/interaction.rs @@ -35,10 +35,7 @@ pub fn interact( automated: bool, packet_out: &mut VecDeque<PacketC>, ) { - // let interactable = automated - // || tile - // .map(|tile| data.is_tile_interactable(tile)) - // .unwrap_or(true); + let _ = automated; //? what was this used for?? if other.is_none() { if let Some(item) = this { if let Some(active) = &mut item.active { |