26.02.2026, 13:13
(Dieser Beitrag wurde zuletzt bearbeitet: 26.02.2026, 13:21 von Manfred Aabye.)
Ich werden das ganze Skript austauschen so das die alten Animationstexturen gelesen werden können und die neuen eine Notecard bekommen.
Prototyp:
Texture-Animation-Script.lsl
bildname.notecard
bildname.png
Prototyp:
Texture-Animation-Script.lsl
PHP-Code:
// Universal LSL Texture Animation Script (Texture-based Notecard)
// Uses: <textureName>.notecard
integer animOn = TRUE;
list defaultEffects = [LOOP];
integer defaultMovement = 0; // 0=SLIDE, ROTATE, SCALE
integer face = ALL_SIDES;
integer sideX = 1;
integer sideY = 1;
float start = 0.0;
float length = 1.0;
float speed = 10.0;
string textureName = "";
string configNotecard = "";
key notecardQuery;
integer notecardLine = 0;
string trim(string v)
{
return llStringTrim(v, STRING_TRIM);
}
list parseEffects(string value)
{
list t = llParseString2List(llToUpper(value), [",",";","|"," "], []);
list r = [];
integer i;
for(i=0;i<llGetListLength(t);i++)
{
string s = trim(llList2String(t,i));
if(s == "LOOP") r += [LOOP];
else if(s == "SMOOTH") r += [SMOOTH];
else if(s == "REVERSE") r += [REVERSE];
else if(s == "PING_PONG" || s == "PINGPONG") r += [PING_PONG];
}
if(llGetListLength(r) == 0) return defaultEffects;
return r;
}
integer parseMovement(string v)
{
v = llToUpper(trim(v));
if(v == "ROTATE") return ROTATE;
if(v == "SCALE") return SCALE;
return 0;
}
integer parseFace(string v)
{
v = llToUpper(trim(v));
if(v == "ALL" || v == "ALL_SIDES") return ALL_SIDES;
return (integer)v;
}
stopAnim()
{
llSetTextureAnim(FALSE, face, 0,0,0,0,0);
}
initAnim()
{
integer bits = 0;
integer i;
for(i=0;i<llGetListLength(defaultEffects);i++)
bits |= llList2Integer(defaultEffects,i);
llSetTextureAnim(ANIM_ON | bits | defaultMovement,
face, sideX, sideY, start, length, speed);
}
parseConfig(string line)
{
line = trim(line);
if(line == "" || llGetSubString(line,0,0) == "#" || llGetSubString(line,0,1) == "//")
return;
integer eq = llSubStringIndex(line,"=");
if(eq == -1) return;
string k = llToLower(trim(llGetSubString(line,0,eq-1)));
string v = trim(llGetSubString(line,eq+1,-1));
if(k == "columns") sideX = (integer)v;
else if(k == "rows") sideY = (integer)v;
else if(k == "speed" || k == "fps") speed = (float)v;
else if(k == "start") start = (float)v;
else if(k == "effects") defaultEffects = parseEffects(v);
else if(k == "movement") defaultMovement = parseMovement(v);
else if(k == "face") face = parseFace(v);
else if(k == "animon")
animOn = (llToUpper(v) == "TRUE" || v == "1" || v == "ON");
}
apply()
{
if(textureName == "")
{
llOwnerSay("Keine Textur gefunden.");
return;
}
llSetTexture(textureName, face);
length = (float)(sideX * sideY);
if(animOn) initAnim();
else stopAnim();
}
loadNotecard()
{
if(llGetInventoryType(configNotecard) == INVENTORY_NOTECARD)
{
notecardLine = 0;
notecardQuery = llGetNotecardLine(configNotecard, notecardLine);
}
else
{
llOwnerSay("Keine Notecard gefunden: " + configNotecard);
apply();
}
}
default
{
state_entry()
{
stopAnim();
textureName = llGetInventoryName(INVENTORY_TEXTURE,0);
if(textureName == "")
return;
configNotecard = textureName + ".notecard";
loadNotecard();
}
dataserver(key q, string data)
{
if(q != notecardQuery) return;
if(data != EOF)
{
parseConfig(data);
notecardLine++;
notecardQuery = llGetNotecardLine(configNotecard, notecardLine);
}
else
{
apply();
}
}
changed(integer c)
{
if(c & CHANGED_INVENTORY)
llResetScript();
}
touch_start(integer t)
{
animOn = !animOn;
apply();
}
}
bildname.notecard
Code:
# Konfiguration für bildname
columns = 6
rows = 5
speed = 5
start = 0
effects = LOOP
movement = SLIDE
face = ALL
animOn = TRUEbildname.png
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)