58 lines
1.9 KiB
GDScript
58 lines
1.9 KiB
GDScript
extends Node
|
|
|
|
var inventories: Dictionary = {}
|
|
var equipment: Dictionary = {}
|
|
|
|
func _ready() -> void:
|
|
EventBus.entity_deregistered.connect(_on_dereg)
|
|
|
|
func _on_dereg(entity: Node) -> void:
|
|
inventories.erase(entity)
|
|
equipment.erase(entity)
|
|
|
|
func add_item(player: Node, item_id: StringName, amount: int) -> void:
|
|
if not (multiplayer.is_server() or multiplayer.multiplayer_peer == null):
|
|
return
|
|
if not player in inventories:
|
|
inventories[player] = {}
|
|
inventories[player][item_id] = inventories[player].get(item_id, 0) + amount
|
|
EventBus.inventory_changed.emit(player)
|
|
if not player.is_multiplayer_authority():
|
|
_sync_inventory.rpc_id(player.get_multiplayer_authority(), inventories[player])
|
|
|
|
func remove_item(player: Node, item_id: StringName, amount: int) -> bool:
|
|
if not (multiplayer.is_server() or multiplayer.multiplayer_peer == null):
|
|
return false
|
|
if not player in inventories:
|
|
return false
|
|
if inventories[player].get(item_id, 0) < amount:
|
|
return false
|
|
inventories[player][item_id] -= amount
|
|
if inventories[player][item_id] <= 0:
|
|
inventories[player].erase(item_id)
|
|
EventBus.inventory_changed.emit(player)
|
|
if not player.is_multiplayer_authority():
|
|
_sync_inventory.rpc_id(player.get_multiplayer_authority(), inventories[player])
|
|
return true
|
|
|
|
func get_amount(player: Node, item_id: StringName) -> int:
|
|
if not player in inventories:
|
|
return 0
|
|
return inventories[player].get(item_id, 0)
|
|
|
|
func get_inventory(player: Node) -> Dictionary:
|
|
return inventories.get(player, {})
|
|
|
|
@rpc("authority", "reliable", "call_local")
|
|
func _sync_inventory(data: Dictionary) -> void:
|
|
var local: Node = _find_local_player()
|
|
if local:
|
|
inventories[local] = data
|
|
EventBus.inventory_changed.emit(local)
|
|
|
|
func _find_local_player() -> Node:
|
|
for p in get_tree().get_nodes_in_group("player"):
|
|
if p.is_multiplayer_authority():
|
|
return p
|
|
return null
|