- Enemy droppt Loot bei Tod (Gold + Items basierend auf LootTable) - LootWindow zeigt Beute an mit "Alles aufheben" Button - Gold-Anzeige im HUD unter XP-Leiste - Beispiel LootTables: Goblin (2-8 Gold) und Skeleton (5-15 Gold) - Loot-System in World verdrahtet Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
69 lines
2.1 KiB
GDScript
69 lines
2.1 KiB
GDScript
# World.gd
|
|
# Initialisiert die Spielwelt: weist dem Gegner den Spieler als Ziel zu
|
|
extends Node3D
|
|
|
|
const ENEMY_SCENE = preload("res://enemy.tscn")
|
|
const CLASS_SELECTION_MENU = preload("res://class_selection_menu.tscn")
|
|
const RESPAWN_TIME = 5.0
|
|
|
|
# Startausrüstung
|
|
const STARTER_WEAPON = preload("res://equipment/iron_sword.tres")
|
|
const STARTER_CHEST = preload("res://equipment/leather_chest.tres")
|
|
|
|
# Loot Tables
|
|
const GOBLIN_LOOT = preload("res://loot_tables/goblin_loot.tres")
|
|
|
|
@onready var player = $Player
|
|
|
|
func _ready():
|
|
# Klassenauswahl-Menü anzeigen
|
|
var menu = CLASS_SELECTION_MENU.instantiate()
|
|
add_child(menu)
|
|
menu.class_selected.connect(_on_class_selected)
|
|
|
|
# Klasse ausgewählt: Spieler initialisieren
|
|
func _on_class_selected(character_class: CharacterClass):
|
|
player.character_class = character_class
|
|
|
|
# Startausrüstung geben
|
|
player.equip_item(STARTER_WEAPON)
|
|
player.equip_item(STARTER_CHEST)
|
|
|
|
player._calculate_stats()
|
|
player.current_hp = player.max_hp
|
|
player.hud.update_health(player.current_hp, player.max_hp)
|
|
print("Klasse gewählt: ", character_class.class_name_de)
|
|
|
|
# Jetzt Gegner initialisieren
|
|
var enemy = get_node("Enemy")
|
|
_setup_enemy(enemy)
|
|
|
|
# Gegner initialisieren und Signal verbinden
|
|
func _setup_enemy(enemy):
|
|
if enemy and player:
|
|
enemy.target = player
|
|
if enemy.loot_table == null:
|
|
enemy.loot_table = GOBLIN_LOOT
|
|
enemy.enemy_died.connect(_on_enemy_died)
|
|
enemy.enemy_dropped_loot.connect(_on_enemy_dropped_loot)
|
|
else:
|
|
print("Fehler: Player oder Enemy nicht gefunden!")
|
|
|
|
# Loot-Drop an Spieler weiterleiten
|
|
func _on_enemy_dropped_loot(loot: Dictionary, world_pos: Vector3):
|
|
if player:
|
|
player.receive_loot(loot, world_pos)
|
|
|
|
# Gegner gestorben: Nach 5 Sekunden respawnen
|
|
func _on_enemy_died(spawn_position: Vector3, _xp_reward: int):
|
|
print("Respawn in ", RESPAWN_TIME, " Sekunden...")
|
|
await get_tree().create_timer(RESPAWN_TIME).timeout
|
|
_spawn_enemy(spawn_position)
|
|
|
|
# Neuen Gegner an Position spawnen
|
|
func _spawn_enemy(position: Vector3):
|
|
var new_enemy = ENEMY_SCENE.instantiate()
|
|
add_child(new_enemy)
|
|
new_enemy.global_position = position
|
|
_setup_enemy(new_enemy)
|
|
print("Gegner respawned!")
|