23.07.2026, 11:30
NPC-Erscheinungsbilder (Appearance) Vorschau
NPC-Appearance.lsl
NPC-Appearance.lsl
PHP-Code:
// * 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);
}
}
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.


![[-]](https://www.gridtalk.de/images/collapse.png)