stacking pickup

This commit is contained in:
veclavtalica 2025-02-13 11:23:31 +03:00
parent 12ed20c26c
commit cb48515d69
6 changed files with 33 additions and 34 deletions

View File

@ -8,5 +8,5 @@ script = ExtResource("3_fe16f")
icon = ExtResource("1_vrj0d")
name = "Coin Flower"
id = &"coin_flower"
stackable = false
stackable = true
stack_limit = 8

View File

@ -59,13 +59,17 @@ func _physics_process(delta: float) -> void:
## Process interactivity selection.
if id == multiplayer.get_unique_id():
var collider: Object = null
if empty_handed() and _line_of_sight.is_colliding():
collider = _line_of_sight.get_collider(0)
if _line_of_sight.is_colliding():
var possible_collider = _line_of_sight.get_collider(0)
if empty_handed(): collider = possible_collider
elif possible_collider and \
GameState.are_bundles_stackable(held_thing, possible_collider.owner.item_bundle):
collider = possible_collider
if collider != _interaction_selection:
if _interaction_selection != null:
_interaction_selection.get_parent().mark_non_interactive()
if collider != null:
collider.get_parent().mark_interactive()
collider.owner.mark_interactive()
_interaction_selection = collider
# Add the gravity.
@ -114,7 +118,7 @@ func hold_thing(p_bundle: Dictionary) -> void:
base_node.add_child(model)
else:
# Create a icon sprite based one instead.
var model := preload("res://src/quad_viewmodel.tscn").instantiate()
var model := preload("res://src/ingame/quad_viewmodel.tscn").instantiate()
model.reflect_bundle(p_bundle)
base_node.add_child(model)
@ -151,10 +155,15 @@ func _unhandled_input(event: InputEvent) -> void:
_camera_pivot.rotation.x = clamp(_camera_pivot.rotation.x, -1.2, 1.2)
return
if event.is_action_pressed("pick") and empty_handed():
if event.is_action_pressed("pick"):
if _interaction_selection != null:
if empty_handed():
_interaction_selection.owner.get_picked_up.rpc()
hold_thing.rpc(_interaction_selection.owner.item_bundle)
elif GameState.are_bundles_stackable(held_thing, _interaction_selection.owner.item_bundle):
_interaction_selection.owner.get_picked_up.rpc()
var bundle := GameState.combine_bundles(held_thing, _interaction_selection.owner.item_bundle)
hold_thing.rpc(bundle)
if event.is_action_pressed("fire") and not empty_handed():
var new_projectile: Node3D = _projectile_scene.instantiate()

View File

@ -23,3 +23,18 @@ static func save() -> void:
static func fetch() -> GameState:
return _instance
# TODO: better place for those?
static func are_bundles_stackable(p_a_bundle: Dictionary, p_b_bundle: Dictionary) -> bool:
var item = GameState.fetch().INVENTORY_ITEM_DB[p_a_bundle["item_id"]]
return p_a_bundle["item_id"] == p_b_bundle["item_id"] and \
item.stackable and p_a_bundle["count"] + p_b_bundle["count"] <= item.stack_limit
static func combine_bundles(p_a_bundle: Dictionary, p_b_bundle: Dictionary) -> Dictionary:
assert(are_bundles_stackable(p_a_bundle, p_b_bundle))
return {
"item_id": p_a_bundle["item_id"],
"count": p_a_bundle["count"] + p_b_bundle["count"],
}

View File

@ -1,5 +1,4 @@
class_name InventoryItem
extends Resource
class_name InventoryItem extends Resource
@export var icon: Texture2D = preload("res://icon.svg")
@export var model: PackedScene

View File

@ -1,5 +0,0 @@
extends Node3D
func reflect_bundle(p_bundle: Dictionary) -> void:
$Sprite3D.texture = GameState.fetch().INVENTORY_ITEM_DB[p_bundle["item_id"]].icon
$CountLabel.text = str(p_bundle["count"])

View File

@ -1,19 +0,0 @@
[gd_scene load_steps=3 format=3 uid="uid://dxb5f3il2h1ur"]
[ext_resource type="Script" path="res://src/quad_viewmodel.gd" id="1_vidqb"]
[ext_resource type="Texture2D" uid="uid://dw3x3h3f34sy3" path="res://assets/coin_flower.png" id="2_3hbqi"]
[node name="QuadViewmodel" type="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.179242, 0)
script = ExtResource("1_vidqb")
[node name="CountLabel" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.181474, 0)
billboard = 1
text = "3"
[node name="Sprite3D" type="Sprite3D" parent="."]
pixel_size = 0.015
billboard = 1
texture_filter = 0
texture = ExtResource("2_3hbqi")