refactor
This commit is contained in:
49
systems/crafting_system.gd
Normal file
49
systems/crafting_system.gd
Normal file
@@ -0,0 +1,49 @@
|
||||
extends Node
|
||||
|
||||
@onready var inventory_system: Node = get_node("../InventorySystem")
|
||||
|
||||
var recipes: Array = []
|
||||
|
||||
func _ready() -> void:
|
||||
recipes = [
|
||||
{"id": &"wood", "name": "Wood", "out_count": 1, "inputs": {&"essence": 1}},
|
||||
{"id": &"stone", "name": "Stone", "out_count": 1, "inputs": {&"essence": 2}},
|
||||
{"id": &"iron", "name": "Iron", "out_count": 1, "inputs": {&"essence": 5}},
|
||||
{"id": &"sword", "name": "Sword", "out_count": 1, "inputs": {&"iron": 3, &"wood": 1}},
|
||||
]
|
||||
|
||||
func get_recipes() -> Array:
|
||||
return recipes
|
||||
|
||||
func can_craft(player: Node, recipe: Dictionary) -> bool:
|
||||
for input_id in recipe.inputs.keys():
|
||||
if inventory_system.get_amount(player, input_id) < recipe.inputs[input_id]:
|
||||
return false
|
||||
return true
|
||||
|
||||
func craft(player: Node, recipe_id: StringName) -> bool:
|
||||
if not (multiplayer.is_server() or multiplayer.multiplayer_peer == null):
|
||||
request_craft.rpc_id(1, player.get_path(), recipe_id)
|
||||
return false
|
||||
var recipe: Dictionary = _find_recipe(recipe_id)
|
||||
if recipe.is_empty():
|
||||
return false
|
||||
if not can_craft(player, recipe):
|
||||
return false
|
||||
for input_id in recipe.inputs.keys():
|
||||
inventory_system.remove_item(player, input_id, recipe.inputs[input_id])
|
||||
inventory_system.add_item(player, recipe.id, recipe.out_count)
|
||||
EventBus.item_crafted.emit(player, recipe.id)
|
||||
return true
|
||||
|
||||
@rpc("any_peer", "reliable")
|
||||
func request_craft(path: NodePath, recipe_id: StringName) -> void:
|
||||
var player: Node = get_node_or_null(path)
|
||||
if player:
|
||||
craft(player, recipe_id)
|
||||
|
||||
func _find_recipe(id: StringName) -> Dictionary:
|
||||
for r in recipes:
|
||||
if r.id == id:
|
||||
return r
|
||||
return {}
|
||||
Reference in New Issue
Block a user