Inventory Reducers
Reducers voor het inventory systeem: containers, items, resources.
Container Management
give_container
Geef een container aan een speler.
#[reducer]
pub fn give_container(
ctx: &ReducerContext,
player_username: String,
container_type_id: String,
) -> Result<(), String>
Parameters:
| Param | Type | Beschrijving |
|---|---|---|
| player_username | String | Speler username |
| container_type_id | String | Container type ID |
Validatie:
- Speler bestaat
- Container type bestaat
- Speler heeft < 5 containers
Voorbeeld:
# Admin geeft starter bag
client.reducers.give_container("milena123", "starter_bag")
Item Management
add_item_to_container
Voeg item(s) toe aan een container.
#[reducer]
pub fn add_item_to_container(
ctx: &ReducerContext,
container_id: u64,
item_id: String,
quantity: u32,
) -> Result<(), String>
Parameters:
| Param | Type | Beschrijving |
|---|---|---|
| container_id | u64 | Container ID |
| item_id | String | Item definitie ID |
| quantity | u32 | Aantal toe te voegen |
Logica:
- Check container ownership
- Check item definition bestaat
- Stacking: Probeer eerst bij bestaande stacks te voegen
- Nieuwe slots: Rest in lege slots plaatsen
// Stacking logica
for mut existing in ctx.db.container_item().iter() {
if existing.container_id == container_id && existing.item_id == item_id {
let can_add = item_def.max_stack.saturating_sub(existing.quantity);
if can_add > 0 {
let add_amount = remaining.min(can_add);
existing.quantity += add_amount;
ctx.db.container_item().id().update(existing);
remaining -= add_amount;
}
}
}
Errors:
| Error | Oorzaak |
|---|---|
| "Container not found" | Container ID bestaat niet |
| "Not your container" | Niet de eigenaar |
| "Item not found" | Item definitie bestaat niet |
| "Container full" | Geen ruimte meer |
move_item
Verplaats item tussen slots/containers.
#[reducer]
pub fn move_item(
ctx: &ReducerContext,
from_container: u64,
from_slot: u8,
to_container: u64,
to_slot: u8,
quantity: u32,
) -> Result<(), String>
Parameters:
| Param | Type | Beschrijving |
|---|---|---|
| from_container | u64 | Bron container |
| from_slot | u8 | Bron slot |
| to_container | u64 | Doel container |
| to_slot | u8 | Doel slot |
| quantity | u32 | Aantal (voor stack splitting) |
Use cases:
- Reorganiseren: Binnen zelfde container
- Transfer: Naar andere container
- Splitten: Deel van stack verplaatsen
- Swappen: Als doel slot bezet is
Client Code:
# Drag & drop handler
func _on_item_dropped(from_slot: ItemSlot, to_slot: ItemSlot) -> void:
client.reducers.move_item(
from_slot.container_id,
from_slot.slot_index,
to_slot.container_id,
to_slot.slot_index,
from_slot.item_quantity # Of minder voor split
)
remove_item
Verwijder item uit container (bij gebruik/verkoop).
#[reducer]
pub fn remove_item(
ctx: &ReducerContext,
container_id: u64,
slot: u8,
quantity: u32,
) -> Result<(), String>
Resource Management
add_resource
Voeg resource toe aan speler.
#[reducer]
pub fn add_resource(
ctx: &ReducerContext,
resource_type: String,
amount: u64,
) -> Result<(), String>
Resource Types:
| Type | Beschrijving |
|---|---|
| eikels | Premium valuta |
| beukenootjes | Basis valuta |
| hout | Bouwmateriaal |
| steen | Bouwmateriaal |
| mest | Farming |
| potgrond | Farming |
Voorbeeld:
# Na quest completion
client.reducers.add_resource("eikels", 100)
client.reducers.add_resource("beukenootjes", 500)
spend_resource
Geef resource uit.
#[reducer]
pub fn spend_resource(
ctx: &ReducerContext,
resource_type: String,
amount: u64,
) -> Result<(), String>
Validatie:
- Speler heeft genoeg van de resource
Error: "Not enough resources"
transfer_currency
Maak geld over naar andere speler.
#[reducer]
pub fn transfer_currency(
ctx: &ReducerContext,
to_username: String,
eikels: u64,
beukenootjes: u64,
) -> Result<(), String>
Parameters:
| Param | Type | Beschrijving |
|---|---|---|
| to_username | String | Ontvanger |
| eikels | u64 | Aantal eikels |
| beukenootjes | u64 | Aantal beukenootjes |
Validatie:
- Ontvanger bestaat
- Verzender heeft genoeg
- Niet naar jezelf
Client Integration
InventoryManager
Zie scripts/inventory/inventory_manager.gd:
class_name InventoryManager extends Node
signal containers_changed
signal container_items_changed(container_id: int)
signal resources_changed
var _client = null
var _player_identity: String = ""
var _containers: Array = []
var _container_items: Dictionary = {} # container_id -> {slot -> item}
var _resources: Dictionary = {} # type -> amount
func setup(client, player_identity: String) -> void:
_client = client
_player_identity = player_identity
_connect_to_db_updates()
func _connect_to_db_updates() -> void:
var db = _client.db
# Container updates
db.player_container.subscribe_to_inserts(&"Container", _on_container_inserted)
db.player_container.subscribe_to_updates(&"Container", _on_container_updated)
db.player_container.subscribe_to_deletes(&"Container", _on_container_deleted)
# Item updates
db.container_item.subscribe_to_inserts(&"Item", _on_item_inserted)
db.container_item.subscribe_to_updates(&"Item", _on_item_updated)
db.container_item.subscribe_to_deletes(&"Item", _on_item_deleted)
# Resource updates
db.player_resource.subscribe_to_inserts(&"Resource", _on_resource_inserted)
db.player_resource.subscribe_to_updates(&"Resource", _on_resource_updated)
UI Updates
# In inventory_panel.gd
func _ready() -> void:
inventory_manager.containers_changed.connect(_rebuild_ui)
inventory_manager.container_items_changed.connect(_update_container)
inventory_manager.resources_changed.connect(_update_resources)
func _update_container(container_id: int) -> void:
var items = inventory_manager.get_container_items(container_id)
for slot_index in items:
var item = items[slot_index]
var slot_ui = _get_slot_ui(container_id, slot_index)
slot_ui.set_item(item.item_id, item.quantity)