// * Um die im Würfel gespeicherten 12 NPC-Erscheinungsbilder (Appearance) vor dem Erstellen auszuwählen,
// * müssen Sie die Erscheinungsdaten als Notizkarten (Notecards) im Inventar des Objekts ablegen.
// * Das Skript liest diese Namen aus und zeigt sie in einem Dialogmenü an.
// * Es liest automatisch alle Notizkarten im Würfel, öffnet bei Berührung ein Menü und erstellt den ausgewählten NPC direkt neben dem Würfel:
// Konfiguration
integer DIALOG_CHANNEL = -9999;
integer listener_handle;
// Liste für die Namen der Notizkarten (max. 12 für ein Standard-Menü)
list npc_list;
update_npc_list()
{
npc_list = [];
integer count = llGetInventoryNumber(INVENTORY_NOTECARD);
integer i;
for (i = 0; i < count; ++i)
{
// Fügt den Namen der Notizkarte zur Liste hinzu
string name = llGetInventoryName(INVENTORY_NOTECARD, i);
npc_list += [name];
}
}
default
{
state_entry()
{
update_npc_list();
}
changed(integer change)
{
// Aktualisiert die Liste, wenn Notizkarten hinzugefügt/gelöscht werden
if (change & CHANGED_INVENTORY)
{
update_npc_list();
}
}
touch_start(integer total_number)
{
key user = llDetectedKey(0);
if (llGetListLength(npc_list) == 0)
{
llRegionSayTo(user, 0, "Keine NPC-Notizkarten im Würfel gefunden!");
return;
}
// Listener für das Menü öffnen
llListenRemove(listener_handle);
listener_handle = llListen(DIALOG_CHANNEL, "", user, "");
// Dialogmenü anzeigen (maximal 12 Buttons möglich)
llDialog(user, "Wählen Sie einen NPC zum Erstellen aus:", npc_list, DIALOG_CHANNEL);
// Timeout nach 60 Sekunden, falls niemand drückt
llSetTimerEvent(60.0);
}
listen(integer channel, string name, key id, string message)
{
// Timer und Listener stoppen
llSetTimerEvent(0.0);
llListenRemove(listener_handle);
// Prüfen, ob die gewählte Notizkarte noch existiert
if (llGetInventoryType(message) == INVENTORY_NOTECARD)
{
llRegionSayTo(id, 0, "Erstelle NPC: " + message + "...");
// Position: 1 Meter neben dem Würfel
vector spawn_pos = llGetPos() + <1.0, 0.0, 0.0>;
// OSSL-Aufruf: Erstellt den NPC basierend auf der ausgewählten Notizkarte
// Der Name des NPCs wird hier aus dem Namen der Notizkarte abgeleitet
osNpcCreate(message, "NPC", spawn_pos, message, OS_NPC_CREATOR_OWNED);
}
}
timer()
{
// Menü-Timeout
llSetTimerEvent(0.0);
llListenRemove(listener_handle);
}
}