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;
	}
}