Godot Version
Godot 4.6
Question
I’m not creating a new item in “items”.
Code:
func _on_ench_butt_pressed() -> void:
if $TradeSystem/Enchat/Texture.texture != null:
var file = preload("res://INVENTORY/items.tscn").instantiate()
var new_item = file.get_child(int($TradeSystem/Enchat.editor_description)).duplicate()
print(new_item.item_name)
new_item.name = str(file.get_children().size())
new_item.item_id = file.get_children().size()
new_item.item_x = randi_range(0, 5)
new_item.item_name = str(new_item.item_x) + new_item.item_name
file.add_child(new_item)
print(file.get_children().size()-1)
inv_add_item(file.get_children().size()-1)
func inv_add_item(item_id):
var file = preload("res://INVENTORY/items.tscn").instantiate()
var item = file.get_child(item_id)
var item_shab = Button.new()
item_shab.text = item.item_name + " X01"
item_shab.editor_description = item.name
...
p.s. inv_add_item adds an item to the player’s inventory, but not to the global database of all items.
Video:
Why do you instantiate the items scene all the time? You should instantiate it only once when the game starts, keep a reference to it and let all of the functions use that same reference.. Otherwise, each time you instantiate - it will reset to its initial state.
Like this?:
var file = preload("res://INVENTORY/items.tscn").instantiate()
#---very many code ---
func inv_add_item(item_id):
var item = file.get_child(item_id)
var item_shab = Button.new()
item_shab.text = item.item_name + " X01"
item_shab.editor_description = item.name
...
p.s. If that’s what you meant, then thank you for the advice, but it doesn’t fix the error.
You need to post the complete code and the exact error message.
Error:
Invalid access to property or key ‘item_name’ on a base object of type ‘null instance’.
Complete code:
extends Control
var mouse_inside = null
var file = preload("res://INVENTORY/items.tscn").instantiate()
func _ready() -> void:
core.inv_way = self
inv_add_item(1)
inv_add_item(2)
for i in 4:
inv_add_item(3)
inv_add_item(4)
inv_add_item(5)
inv_add_item(6)
for i in 200:
inv_add_item(0)
func _process(delta: float) -> void:
$Moneys.text = "Money: " + str(core.player_money) + " Bubliks"
if mouse_inside != null:
if Input.is_action_just_pressed("left_mouse"):
var item_id = core.antiUse_Equipment(mouse_inside)
inv_add_item(item_id)
mouse_inside = null
@onready var sepll_1_cd = $HotBar/HotBarBG/Spell1/CD
@onready var sepll_2_cd = $HotBar/HotBarBG/Spell2/CD
@onready var sepll_3_cd = $HotBar/HotBarBG/Spell3/CD
@onready var sepll_4_cd = $HotBar/HotBarBG/Spell4/CD
func cd_vis(spell_n : int, cd_time : float):
var cd_time_plus = cd_time / 100.0
if spell_n == 1:
for i in range(101):
await get_tree().create_timer(cd_time_plus).timeout
$HotBar/HotBarBG/Spell1/CD.text = str(i) + "%"
if spell_n == 2:
for i in range(101):
await get_tree().create_timer(cd_time_plus).timeout
$HotBar/HotBarBG/Spell2/CD.text = str(i) + "%"
if spell_n == 3:
for i in range(101):
await get_tree().create_timer(cd_time_plus).timeout
$HotBar/HotBarBG/Spell3/CD.text = str(i) + "%"
if spell_n == 4:
for i in range(101):
await get_tree().create_timer(cd_time_plus).timeout
$HotBar/HotBarBG/Spell4/CD.text = str(i) + "%"
func inv_add_item(item_id):
var item = file.get_child(item_id)
var item_shab = Button.new()
item_shab.text = item.item_name + " X01"
item_shab.editor_description = item.name
item_shab.tooltip_text = item.item_name + "\n Cost: " + str(item.cost) + " Bubliks\n" + \
("+Max HP: " + str(item.max_HP) + "\n" if item.max_HP != 0 else "") + \
("+Max mana: " + str(item.max_MANA) + "\n" if item.max_MANA != 0 else "") + \
("+Max stamina: " + str(item.max_STAMINA) + "\n" if item.max_STAMINA != 0 else "") + \
("+HP regen: " + str(item.HP_reg) + "\n" if item.HP_reg != 0 else "") + \
("+Mana regen: " + str(item.MANA_reg) + "\n" if item.MANA_reg != 0 else "") + \
("+Stamina regen: " + str(item.STAMINA_reg) + "\n" if item.STAMINA_reg != 0 else "") + \
("+Reg Speed: " + str(item.reg_speed) + "\n" if item.reg_speed != 0 else "") + \
("Cooldown: " + str(item.cd) + "\n" if item.cd != 1.0 else "") + \
("Time: " + str(item.time) + " seconds\n" if item.time != 0 else "") + \
("Defend type: " + str(item.defend_type) + "\n" if item.defend_type != "None" else "") + \
("Defend type value: " + str(item.defend_type_int) + "\n" if item.defend_type_int != "None" else "") + \
("Defend: " + str(item.defend) + "\n" if item.defend != 0 else "") + \
("Attack type: " + str(item.attack_type) + "\n" if item.attack_type != "None" else "") + \
("Attack type value: " + str(item.attack_type_int) + "\n" if item.attack_type_int != "None" else "") + \
("Radius attack: " + str(item.radus_attack) + "\n" if item.radus_attack != 10 else "") + \
("Attack: " + str(item.attack) + "\n" if item.attack != 0 else "") + \
("Dex: " + str(item.dex) + "\n" if item.dex != 1 else "") + \
("Luck: " + str(item.luck) + "\n" if item.luck != 1 else "") + \
("Speed: " + str(item.speed) + "\n" if item.speed != 1 else "") + \
("Power: " + str(item.power) + "\n" if item.power != 1 else "") + \
("Stamina cost: " + str(item.stamina_spell) + "\n" if item.stamina_spell != 0 else "") + \
("Mana cost: " + str(item.mana_spell) + "\n" if item.mana_spell != 0 else "") + \
("HP cost: " + str(item.hp_spell) + "\n" if item.hp_spell != 0 else "") + \
("Melee: " + str(item.mellee) + "\n" if item.mellee != false else "") + \
("Attack speed: " + str(item.attack_speed) + "\n" if item.attack_speed != 1 else "")
var for_count = 0
core.inv_items.append(item_id)
for i in $Back/ItemsList/Container.get_children():
for_count += 1
if i.editor_description == item_shab.editor_description and i.text.right(3) != "199":
var count_items = i.text.right(2)
if count_items[1] == "9":
i.text[i.text.length()-1] = ""
i.text[i.text.length()-1] = ""
i.text = i.text + str(int(count_items)+1)
else:
if count_items[0] == "0":
i.text[i.text.length()-1] = ""
i.text = i.text + str(int(count_items)+1)
else:
i.text[i.text.length()-1] = ""
i.text[i.text.length()-1] = ""
i.text = i.text + str(int(count_items)+1)
break
elif for_count == $Back/ItemsList/Container.get_children().size():
item_shab.connect("pressed", use, 123)
$Back/ItemsList/Container.add_child(item_shab)
func use(asd, delete:=false):
var useless = []
var useless_count = []
var can_delete = false
var file = preload("res://INVENTORY/items.tscn").instantiate()
var item = file.get_child(int(asd.editor_description))
#---Тут писать обработчики типа предмета---
if $TradeSystem/Enchant.visible == true:
can_delete = true
$TradeSystem/Enchat/Texture.texture = item.icon
$TradeSystem/Enchat.editor_description = str(item.item_id)
if !delete:
if item.item_type == "Poison":
core.Use_Poison(item)
can_delete = true
if item.item_type == "Head":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Tors":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Hands":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Gloves":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Trousers":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Boots":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Weapon":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Bracelet":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Ring":
var ret = core.Use_Equipment(item)
can_delete = ret
if item.item_type == "Spell":
var ret = core.Use_Equipment(item)
can_delete = ret
else:
can_delete = true
#---Конец---
if can_delete:
if item.item_type == "Poison":
core.inv_items.pop_at(core.inv_items.find(item))
for i in $Back/ItemsList/Container.get_children():
if i.editor_description == asd.editor_description:
useless.append(i)
for i in useless:
if i.text[i.text.length()-3] == "X":
useless_count.append(str(i.text[i.text.length()-2]) + str(i.text[i.text.length()-1]))
else:
useless_count.append(str(i.text[i.text.length()-3]) + str(i.text[i.text.length()-2]) + str(i.text[i.text.length()-1]))
var us_min = useless[useless_count.find(useless_count.min())].text
var integ = us_min.right(2)
if int(integ) == 1 and us_min[us_min.length()-3] == "X":
useless[useless_count.find(useless_count.min())].queue_free()
if int(us_min.right(3)) == 100:
us_min[us_min.length()-1] = ""
us_min[us_min.length()-1] = ""
us_min[us_min.length()-1] = ""
useless[useless_count.find(useless_count.min())].text = us_min + "99"
elif int(integ) <= 9:
us_min[us_min.length()-1] = ""
useless[useless_count.find(useless_count.min())].text = us_min + str(int(integ)-1)
elif int(integ) >= 10:
if int(integ) == 10:
us_min[us_min.length()-1] = ""
us_min[us_min.length()-1] = ""
useless[useless_count.find(useless_count.min())].text = us_min + "0" + str(int(integ)-1)
else:
us_min[us_min.length()-1] = ""
us_min[us_min.length()-1] = ""
useless[useless_count.find(useless_count.min())].text = us_min + str(int(integ)-1)
func get_item_node(item_id: int):
var item = file.get_child(item_id)
return item
var trade_info = [-1, -1, "none"]
func trader_system(trader: Node3D):
$TradeSystem/TraderName.text = trader.Name
for i in trader.trades:
var trade_temp = Button.new()
if i[2] == "sell":
trade_temp.text = "Продаю " + str(get_item_node(i[0]).item_name) + " за " + str(i[1]) + " бубликов"
elif i[2] == "buy":
trade_temp.text = "Покупаю " + str(get_item_node(i[0]).item_name) + " за " + str(i[1]) + " бубликов"
trade_info[0] = i[0]
trade_info[1] = i[1]
trade_info[2] = i[2]
trade_temp.connect("pressed", bs, 123)
$TradeSystem/TradeList/Container.add_child(trade_temp)
func trader_del():
for i in $TradeSystem/TradeList/Container.get_children():
i.queue_free()
func bs(asd):
if trade_info[2] == "sell":
if core.player_money >= trade_info[1]:
core.player_money -= trade_info[1]
inv_add_item(trade_info[0])
elif trade_info[2] == "buy":
for i in core.inv_items:
if i == trade_info[0]:
core.player_money += trade_info[1]
use(trade_info[0], true)
break
# --- Обработчики mouse_entered/exited для всех слотов экипировки ---
func _on_head_mouse_entered() -> void:
if core.Head != null:
mouse_inside = "Head"
func _on_head_mouse_exited() -> void:
mouse_inside = null
func _on_tors_mouse_entered() -> void:
if core.Tors != null:
mouse_inside = "Tors"
func _on_tors_mouse_exited() -> void:
mouse_inside = null
func _on_hands_mouse_entered() -> void:
if core.Hands != null:
mouse_inside = "Hands"
func _on_hands_mouse_exited() -> void:
mouse_inside = null
func _on_gloves_mouse_entered() -> void:
if core.Gloves != null:
mouse_inside = "Gloves"
func _on_gloves_mouse_exited() -> void:
mouse_inside = null
func _on_trousers_mouse_entered() -> void:
if core.Trousers != null:
mouse_inside = "Trousers"
func _on_trousers_mouse_exited() -> void:
mouse_inside = null
func _on_boots_mouse_entered() -> void:
if core.Boots != null:
mouse_inside = "Boots"
func _on_boots_mouse_exited() -> void:
mouse_inside = null
func _on_weapon_1_mouse_entered() -> void:
if core.Weapon1 != null:
mouse_inside = "Weapon1"
func _on_weapon_1_mouse_exited() -> void:
mouse_inside = null
func _on_weapon_2_mouse_entered() -> void:
if core.Weapon2 != null:
mouse_inside = "Weapon2"
func _on_weapon_2_mouse_exited() -> void:
mouse_inside = null
func _on_bracelet_1_mouse_entered() -> void:
if core.Bracelet1 != null:
mouse_inside = "Bracelet1"
func _on_bracelet_1_mouse_exited() -> void:
mouse_inside = null
func _on_bracelet_2_mouse_entered() -> void:
if core.Bracelet2 != null:
mouse_inside = "Bracelet2"
func _on_bracelet_2_mouse_exited() -> void:
mouse_inside = null
func _on_ring_1_mouse_entered() -> void:
if core.Ring1 != null:
mouse_inside = "Ring1"
func _on_ring_1_mouse_exited() -> void:
mouse_inside = null
func _on_ring_2_mouse_entered() -> void:
if core.Ring2 != null:
mouse_inside = "Ring2"
func _on_ring_2_mouse_exited() -> void:
mouse_inside = null
func _on_ring_3_mouse_entered() -> void:
if core.Ring3 != null:
mouse_inside = "Ring3"
func _on_ring_3_mouse_exited() -> void:
mouse_inside = null
func _on_spell_1_mouse_entered() -> void:
if core.Spell1 != null:
mouse_inside = "Spell1"
func _on_spell_1_mouse_exited() -> void:
mouse_inside = null
func _on_spell_2_mouse_entered() -> void:
if core.Spell2 != null:
mouse_inside = "Spell2"
func _on_spell_2_mouse_exited() -> void:
mouse_inside = null
func _on_spell_3_mouse_entered() -> void:
if core.Spell3 != null:
mouse_inside = "Spell3"
func _on_spell_3_mouse_exited() -> void:
mouse_inside = null
func _on_spell_4_mouse_entered() -> void:
if core.Spell4 != null:
mouse_inside = "Spell4"
func _on_spell_4_mouse_exited() -> void:
mouse_inside = null
#---система торговли---
func _on_trade_pressed() -> void:
$TradeSystem/Enchat.visible = false
$TradeSystem/TradeList.visible = true
func _on_enchant_pressed() -> void:
$TradeSystem/TradeList.visible = false
$TradeSystem/Enchat.visible = true
#------
func _on_ench_butt_pressed() -> void:
if $TradeSystem/Enchat/Texture.texture != null:
var file = preload("res://INVENTORY/items.tscn").instantiate()
var new_item = file.get_child(int($TradeSystem/Enchat.editor_description)).duplicate()
print(new_item.item_name)
new_item.name = str(file.get_children().size())
new_item.item_id = file.get_children().size()
new_item.item_x = randi_range(0, 5)
new_item.item_name = str(new_item.item_x) + new_item.item_name
file.add_child(new_item)
print(file.get_children().size()-1)
inv_add_item(file.get_children().size()-1)
You’re still doing the var file = preload(... thing in multiple places in your code, creating the multiple instances. Do it only once.
@onready var file = preload("res://INVENTORY/items.tscn").instantiate()
Now wherever you need it just access it as file. Don’t preload/instantiate again and don’t re-declare inside functions like var file
This way all of your functions will refer to the same branch of nodes.
I removed everything unnecessary, and it started working. Thank you for your prompt assistance and attention.