aboutsummaryrefslogtreecommitdiff
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
parent5033c326094edc1ff4234b994e95d987cb937fc4 (diff)
downloadhurrycurry-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.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
-rw-r--r--data/maps/junior.yaml4
-rw-r--r--server/protocol/src/lib.rs1
-rw-r--r--server/src/data/mod.rs8
-rw-r--r--server/src/interaction.rs5
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 {