project-dung/scripts/item_holder.gd

98 lines
2.4 KiB
GDScript

extends Spatial
signal item_changed(item)
export var start_with_item : Resource
export var remove_enabled := true
export var add_enabled := true
var item_in_hold
# Called when the node enters the scene tree for the first time.
func _ready():
if start_with_item != null:
add_item(start_with_item.spawn_node())
func has_item() -> bool:
return item_in_hold != null
func remove_item() -> Node:
assert(item_in_hold != null)
var removed_item = item_in_hold
$ItemSpawn.remove_child(item_in_hold)
item_in_hold = null
return removed_item
func add_item(item):
assert(item_in_hold == null)
$ItemSpawn.add_child(item)
item_in_hold = item
func spawn_item(item_type: Resource):
assert(!has_item())
assert(item_type is ItemType)
add_item(item_type.spawn_node())
emit_signal("item_changed", item_in_hold)
func destroy_item():
var removed_item = item_in_hold
$ItemSpawn.remove_child(item_in_hold)
item_in_hold = null
removed_item.queue_free()
emit_signal("item_changed", item_in_hold)
func swap_with_player(player) -> bool:
assert(has_item() and player.has_item())
if not remove_enabled or not add_enabled:
return false
var player_item = player.drop_item_in_hand()
player.pick_up_item(remove_item())
add_item(player_item)
$AudioStreamPlayer.play()
emit_signal("item_changed", item_in_hold)
return true
func give_to_player(player) -> bool:
assert(has_item() and not player.has_item())
if not remove_enabled:
return false
var player_item = player.pick_up_item(remove_item())
$AudioStreamPlayer.play()
emit_signal("item_changed", item_in_hold)
return true
func take_from_player(player) -> bool:
assert(not has_item() and player.has_item())
if not add_enabled:
return false
add_item(player.drop_item_in_hand())
$AudioStreamPlayer.play()
emit_signal("item_changed", item_in_hold)
return true
func on_player_interact(player) -> bool:
if has_item() and player.has_item():
return swap_with_player(player)
elif has_item() and not player.has_item():
return give_to_player(player)
elif not has_item() and player.has_item():
return take_from_player(player)
var player_item = player.get_item_in_hand()
if item_in_hold == null:
if player_item == null:
return false
add_item(player_item)
else:
var item_pickup = remove_item()
player.pick_up_item(item_pickup)
$AudioStreamPlayer.play()
if player_item != null:
add_item(player_item)
return true