Ga naar hoofdinhoud

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:

ParamTypeBeschrijving
player_usernameStringSpeler username
container_type_idStringContainer 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:

ParamTypeBeschrijving
container_idu64Container ID
item_idStringItem definitie ID
quantityu32Aantal toe te voegen

Logica:

  1. Check container ownership
  2. Check item definition bestaat
  3. Stacking: Probeer eerst bij bestaande stacks te voegen
  4. 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:

ErrorOorzaak
"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:

ParamTypeBeschrijving
from_containeru64Bron container
from_slotu8Bron slot
to_containeru64Doel container
to_slotu8Doel slot
quantityu32Aantal (voor stack splitting)

Use cases:

  1. Reorganiseren: Binnen zelfde container
  2. Transfer: Naar andere container
  3. Splitten: Deel van stack verplaatsen
  4. 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:

TypeBeschrijving
eikelsPremium valuta
beukenootjesBasis valuta
houtBouwmateriaal
steenBouwmateriaal
mestFarming
potgrondFarming

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:

ParamTypeBeschrijving
to_usernameStringOntvanger
eikelsu64Aantal eikels
beukenootjesu64Aantal 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)

Volgende