import carla
import random

# Angenommen, wir haben bereits "world" und "blueprint_library" erhalten
# world = client.get_world()
# blueprint_library = world.get_blueprint_library()

# Holen Sie sich die Blueprints für Fußgänger und deren Steuerungs-KI
walker_blueprints = blueprint_library.filter("walker.pedestrian.*")
controller_bp = blueprint_library.find('controller.ai.walker')

# Anzahl der zu spawnenden Fußgänger festlegen
num_of_walkers = 50

# Erstellen der Spawn-Punkte für die Fußgänger (hier zufällig mit world.get_random_location_from_navigation())
spawn_points = []
for i in range(num_of_walkers):
    spawn_loc = world.get_random_location_from_navigation()
    if spawn_loc is not None:
        spawn_points.append(carla.Transform(spawn_loc, carla.Rotation(yaw=random.uniform(-180.0, 180.0))))

# Spawn der Fußgänger als Batch
walkers_id = []
batch = []
for spawn_point in spawn_points:
    walker_bp = random.choice(walker_blueprints)
    # Einige Fußgänger-Blueprints haben spezielle Attribute, z. B. Unverwundbarkeit
    # Diese können nach Bedarf angepasst werden
    if walker_bp.has_attribute('is_invincible'):
        walker_bp.set_attribute('is_invincible', 'false')  # Fußgänger können umgestoßen werden
    
    batch.append(carla.command.SpawnActor(walker_bp, spawn_point))

results = client.apply_batch_sync(batch, True)
for r in results:
    if r.error:
        print("Fehler beim Spawnen des Fußgängers:", r.error)
    else:
        walkers_id.append(r.actor_id)

# Erstellen eines KI-Controllers für jeden Fußgänger
controllers_id = []
batch = []
for wid in walkers_id:
    # Ein Controller wird mit dem jeweiligen Fußgänger verbunden (dritter Parameter ist die ID des Eltern-Actors)
    batch.append(carla.command.SpawnActor(controller_bp, carla.Transform(), wid))

results = client.apply_batch_sync(batch, True)
for r in results:
    if r.error:
        print("Fehler beim Spawnen des Controllers:", r.error)
    else:
        controllers_id.append(r.actor_id)

# Holen Sie sich die neu erstellten Fußgänger und ihre Controller
all_actors = world.get_actors(walkers_id + controllers_id)
walkers_list = all_actors.filter("*walker.pedestrian*")
controllers_list = all_actors.filter("*controller.ai.walker*")

# Starten der Controller, damit sich die Fußgänger zufällig bewegen
for controller in controllers_list:
    # Starten des KI-Controllers
    controller.start()
    # Zufälliges Ziel für den Fußgänger festlegen
    controller.go_to_location(world.get_random_location_from_navigation())
    # Geschwindigkeit des Fußgängers einstellen (in m/s)
    controller.set_max_speed(1.4)

print(f"Erfolgreich {len(walkers_list)} Fußgänger mit Controllern gespawnt.")
