Ein Türskript
Ein Tür-Skript mit Zugangsliste wie es wohl viele gibt :-) Einfach das Skript in eine Tür legen und wie unten beschrieben verfahren. Am besten eignen sich welche, die in der Mitte halbiert wurden, wegen der Drehachse.
// script copyright by Rebekka Revnik
// Ein Türskript für beliebige Türen. Die Tür muss nicht verlinkt sein.
// Speicherung der Positionen im offenen und geschlossenen Zustand.
// Zugriffskontrolle durch Zugangsliste
// 1. Einstellen der Tür in geschlossenem Zustand
// 2. Sag /333 position zu, um die Position zu speichern
// 3. Einstellen der Tür im offenen Zustand
// 4. Sag /333 position auf, um diese Position zu speichern
// 5. Sag /333 tuer start, um die Tür zu benutzen
// Die Punkte 1-4 können vertauscht und beliebig oft wiederholt werden
// Für erneutes Einstellen der Positionen muss die Tür neu gerezzt werden
// Zugangsliste:
// Mit /333 add Name wird der Zugangsliste ein neuer Name hinzugefügt
// Mit /333 del Name wird ein Name aus der Zugangsliste entfernt
// Mit /333 list wird die Zugangsliste angezeigt
// Sicherheit:
// /333 unlock - die Tür wird für alle freigegeben
// /333 lock - die Tür lässt sich nur vom Eigentümer und den Avataren in der Zugangsliste bedienen
// /333 private - die Tür lässt sich nur vom Eigentümer bedienen
// Sonstiges:
// /333 channel x - stellt den Chatkanal auf Nr. x um
// /333 help - zeigt eine Übersicht der Befehle an
// Chatkanal, kann geändert werden
integer CHANNEL = 333;
// Sounds
string TUER_AUF = "cb340647-9680-dd5e-49c0-86edfa01b3ac";
string TUER_ZU = "e7ff1054-003d-d134-66be-207573f2b535";
string KLINGEL = "ee871042-e272-d8ec-3d40-0b0cb3371346";
// Konstanten für die Sicherheitsstufe
integer FREI = 0;
integer VERSCHLOSSEN = 1;
integer PRIVAT = 2;
float ZEITOFFEN = 30; // Zeit in s, die die Tür offen bleibt (0 für kein automatisches Schliessen)
integer ScanRange = 0; // Entfernung für automatisches Öffnen (0 wenn keine Automatik)
vector OffenPos = ZERO_VECTOR; // Positionen für offen und zu
rotation OffenRot = ZERO_ROTATION;
vector OffenSkal = ZERO_VECTOR;
vector ZuPos = ZERO_VECTOR;
rotation ZuRot = ZERO_ROTATION;
vector ZuSkal = ZERO_VECTOR;
list Zugang; // Zugangsliste
string Name; //
integer Status = FREI; // Sicherheitsstufe
integer Listener; //
integer Erlaubnis(string name)
{
if(Status == FREI) return TRUE;
if(name == llKey2Name(llGetOwner())) return TRUE;
if(Status == VERSCHLOSSEN && llListFindList(Zugang, [name]) != -1) return TRUE;
return FALSE;
}
Add(string name)
{
if(llListFindList(Zugang, [name]) == -1)
{
Zugang += [name];
llOwnerSay(name + " erfolgreich eingetragen.");
} else llOwnerSay(name + " ist bereits in der Liste.");
}
Delete(string name)
{
integer i = llListFindList(Zugang, [name]);
if(i != -1)
{
Zugang = llDeleteSubList(Zugang, i, i);
llOwnerSay(name + " erfolgreich gelöscht.");
} else llOwnerSay(name + " ist nicht in der Liste.");
}
ListZugang()
{
integer i;
llOwnerSay("Zugangsliste:");
llSay(0, llKey2Name(llGetOwner()));
for(i = 0; i < llGetListLength(Zugang); i++) llSay(0, llList2String(Zugang, i));
}
Kommandos(string msg)
{
list l = llParseString2List(msg, [" "], []);
string s = llToLower(llList2String(l, 0));
integer i;
if(s == "lock")
{
Status = VERSCHLOSSEN;
llOwnerSay("Türstatus: Zugang nur für den Eigentümer und Personen in der Zugangsliste");
} else if(s == "unlock")
{
Status = FREI;
llOwnerSay("Türstatus: Zugang für alle");
} else if(s == "private")
{
Status = PRIVAT;
llOwnerSay("Türstatus: Zugang nur für den Eigentümer");
} else if(s == "list") ListZugang();
else if(s == "add")
{
Name = llList2String(l, 1) + " " + llList2String(l, 2);
Add(Name);
} else if(s == "del")
{
Name = llList2String(l, 1) + " " + llList2String(l, 2);
Delete(Name);
} else if(s == "channel")
{
i = llList2Integer(l, 1);
if(i != 0)
{
CHANNEL = i;
llOwnerSay("Der Chatkanal für diese Tür ist jetzt " + (string)CHANNEL + ".");
llListenRemove(Listener);
Listener = llListen(CHANNEL, "", NULL_KEY, "");
}
} else if(s == "help")
{
llOwnerSay("/" + (string)CHANNEL + " unlock - Jeder kann die Tür bedienen.");
llOwnerSay("/" + (string)CHANNEL + " lock - Nur Personen, die in die Zugangsliste eingetragen sind und der Eigentümer können sie bedienen.");
llOwnerSay("/" + (string)CHANNEL + " private - Nur der Eigentümer kann die Tür bedienen.");
llOwnerSay("/" + (string)CHANNEL + " list - Zeigt den Inhalt der Zugangsliste.");
llOwnerSay("/" + (string)CHANNEL + " add name - Fügt den Namen name zur Zugangsliste hinzu.");
llOwnerSay("/" + (string)CHANNEL + " del name - Entfernt den Namen name aus der Zugangsliste.");
llOwnerSay("/" + (string)CHANNEL + " channel x - Setzt den Chatkanal auf x. Alle weiteren Befehle können nur über diesen Kanal gegeben werden.");
llOwnerSay("/" + (string)CHANNEL + " help - Diese Befehlsübersicht.");
}
}
default
{
on_rez(integer start_param)
{
llOwnerSay("Sag /" + (string)CHANNEL + " position zu, um die geschlossene Position zu speichern.");
llOwnerSay("Sag /" + (string)CHANNEL + " position auf, um die offene Position zu speichern.");
llOwnerSay("Sag /" + (string)CHANNEL + " tuer start, um die Tür bedienen zu können.");
llOwnerSay("Neue Positionen können dann erst wieder bei erneutem Rezzen der Tür gesetzt werden.");
Listener = llListen(CHANNEL, "", llGetOwner(), "");
}
listen(integer channel, string name, key id, string msg)
{
list l = llParseString2List(llToLower(msg), [" "], []);
string s = llList2String(l, 0);
if(s == "position")
{
if(llList2String(l, 1) == "zu")
{
ZuPos = llGetPos();
ZuRot = llGetRot();
ZuSkal = llGetScale();
llOwnerSay("Position geschlossen wurde gespeichert.");
} else if(llList2String(l, 1) == "auf")
{
OffenPos = llGetPos();
OffenRot = llGetRot();
OffenSkal = llGetScale();
llOwnerSay("Position offen wurde gespeichert.");
}
} else if(s == "tuer" && llList2String(l, 1) == "start")
{
if(!(ZuPos == ZERO_VECTOR && ZuRot == ZERO_ROTATION && ZuSkal == ZERO_VECTOR) && !(OffenPos == ZERO_VECTOR && OffenRot == ZERO_ROTATION && OffenSkal == ZERO_VECTOR))
{
Zugang = [];
Status = FREI;
llOwnerSay("Sag /" + (string)CHANNEL + " lock, unlock, private für die Sicherheitsstufe");
llOwnerSay("Sag /" + (string)CHANNEL + " list, add name, del name um die Zugangsliste zu bearbeiten.");
llOwnerSay("Sag /" + (string)CHANNEL + " channel x um einen anderen Chatkanal einzustellen");
llOwnerSay("Sag /" + (string)CHANNEL + " help für eine Übersicht der Befehle");
state zu;
} else llOwnerSay("Es sind noch nicht beide Positionen gespeichert.");
}
}
}
state zu
{
state_entry()
{
llSetTimerEvent(0);
llSay(0, Name + " ist an der Tür.");
llPlaySound(TUER_ZU, 0.5);
llSetPrimitiveParams([PRIM_POSITION, ZuPos, PRIM_ROTATION, ZuRot, PRIM_SIZE, ZuSkal]);
llListenRemove(Listener);
Listener = llListen(CHANNEL, "", NULL_KEY, "");
if(ScanRange > 0) llSensorRepeat("", NULL_KEY, AGENT, ScanRange, PI, 1);
}
touch_start(integer total_number)
{
Name = llDetectedName(0);
if(Erlaubnis(Name)) state offen;
else
{
llSay(0, "Die Tür ist verschlosssen, deshalb klingelst du lieber.");
llPlaySound(KLINGEL, 0.5);
}
}
listen(integer channel, string name, key id, string msg)
{
if(Erlaubnis(llKey2Name(id))) Kommandos(msg);
}
sensor(integer total_number)
{
Name = llDetectedName(0);
if(Erlaubnis(Name)) state offen;
}
}
state offen
{
state_entry()
{
llSensorRemove();
llSay(0, Name + " ist an der Tür.");
llPlaySound(TUER_AUF, 0.5);
llSetPrimitiveParams([PRIM_POSITION, OffenPos, PRIM_ROTATION, OffenRot, PRIM_SIZE, OffenSkal]);
Listener = llListen(CHANNEL, "", NULL_KEY, "");
llSetTimerEvent(ZEITOFFEN);
}
touch_start(integer total_number)
{
Name = llDetectedName(0);
if(Erlaubnis(Name)) state zu;
}
listen(integer channel, string name, key id, string msg)
{
if(Erlaubnis(llKey2Name(id))) Kommandos(msg);
}
timer()
{
state zu;
}
}