• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Server Side AO (enttaeuschend)

Daemonika Nightfire

Forumsgott/göttin
huhu,

jetzt bastel ich schon eine ganze Weile an einer Server Side AO mit den neuen befehlen llSetAnimtionOverride, wodurch die Standard Animationen des Viewers ersetzt statt ueberschrieben werden sollen. So weit so gut, das klappt auch ganz gut, aber wenn die Technik so bleibt wie se aktuell ist, verzichte ich lieber auf den Kram und verwende weiterhin die gute alte ZHAO, welche meiner Meinung immer noch die beste ist.

Heute Morgen war ich entlich so weit, meine AO einmal zu testen und habe saemtliche Anim_States mit guten Animationen von Vista (welche ich aktuell auch in meiner ZHAO verwende) ueberschrieben.
Zuerst habe ich es natuerlich mit dem Cool VL Viewer probiert und stellte diverse Fehler fest, welche sich dadurch bemerkbar machten, dass die Animationen nicht wie gewohnt funktionieren.

Das PreJump zum beispiel spielt grundsaetzlich erst einmal zu Ende, bevor die eigentliche Jump Animation gestartet wird. Natuerlich ist man dann quasi fast schon wieder auf dem Boden, wenn die Jump Animation gerade mitten drin ist.
Dann waere da der Walk, nach etwa 5 - 10 Sekunden bleibt die Animation einfach haengen und es tut sich ueberhaupt nichts mehr, man bewegt den Avatar statisch wie eine Statue ueber den Boden.
Ganz aetzend ist es bei der HardLanding Animation, wird die erst einmal gestartet, darf man die AO bzw die Anim_States komplett resetten, damit die wider beendet wird.

Alles in allem werden saemtliche Animationen ziemlich laamarschig getriggert, was aussieht wie LAG, also total verzoegert und das kann man deutlich sehen.
Dann waeren da noch Animationen, die man gewollt stoppen will, naja, das gestaltet sich recht schwierig bis unmoeglich, da man die ersetzen Animationen naemlich nicht wirklich abfragen kann, weil die Namen der Animationen nicht getriggert werden, sondern dessen UUIDs, welche ein Script definitiv nicht auslesen kann, sobald eine Permission (copy), (modify) oder (transfer) fehlt. Soweit ich das im Kopf habe, sind UUIDs von Animationen so oder so nicht anwendbar.

Jedenfalls dachte ich mir, naja, vielleicht liegt es ja am Viewer und habe mal auf den offiziellen Linden Viewer gewechselt. Allerdings wirkt die Server Side AO auch im Linden Viewer schwerfaellig und diverse Animationen, besonders der Walk bleiben einfach nach einigen Sekunden haengen.

Mein momentanes Fazit dieser Technik ist schlicht und ergreifend enttaeuschend.
Eigentlich bin ich sogar stink sauer, denn die ganze Arbeit und Zeit haette ich mir auch sparen koennen.

LG
Dae
 
Zuletzt bearbeitet:
@Jojo: Es geht hier um Server Side AO, also Animation Overrider, die mit dem neuen LSL-Befehl "llSetAnimtionOverride" direkt vom Regionenserver gesteuert werden. Dass einige Viewer auch AO Features haben ist zwar nett, aber eine andere Baustelle. :wink:
 
Stimmt, es geht um Server Side AO und nicht um Viewer Side AO. Was mich am meisten daran aergert ist, dass ich die Server Side Animation Override nicht erst ausprobiert habe. Statt dessen habe ich mich gleich daran gesetzt, einen kompletten HUD mit saemtlichen notwendigen Funktionen fuer Stand wechseln und der gleichen zu schreiben.
Im Endeffekt aergere ich mich ueber mich selber, denn haette ich das vorher getestet, waeren mir Wochen lange Arbeit erspart geblieben. Haette ich vorher gesehen, wie unsauber die Animationen vom Viewer getriggert werden, haette ich gar nicht erst damit angefangen.
Jetzt wird mir allmaelig auch deutlich klar, warum in der alten ZHAO gerade die Walk-Animation im Control Event permanent neu getriggert wird. Darueber habe ich mich die ganze Zeit gewundert, aber wer mal die AO auszieht bzw. aus macht, wird feststellen, dass sogar die Standard Animation "walking" schon nach einigen secunden den Dienst versagt. Also war dieses Problem vor 10 Jahren schon bekannt.

Langsam finde ich es ziemlich zum Kotzen, Linden Lab fuehrt immer mehr neue unausgegorene Features in Second Life ein, ohne mal daran zu denken alte Probleme zu loesen. Mittlerweile kommt mir Second Life vor wie eine einzige grosse Baustelle, wo an allen Ecken angefangen wurde und nirgends etwas fertig ist.

LG
Dae
 
Wie. Mein Avatar läuft auch nach 30 oder mehr sekunden OHNE eine AO anzuhaben mit der Standart Anie. Irgendwie versteh ich den Satz nicht.
 
Nun, ohne gescriptete Animation läuft die Standard-Animation schon seit etwas über 10 Jahren, sonst hätte SL ein grundsätzliches Problem. Dae hat in ihren Beiträgen eine ganz spezielle Art von Animation getestet, nämlich das neue Feature um den LSL-Befehl "llSetAnimtionOverride". Damit bewahrt sie uns Leser davor, ebenfalls viel Zeit in diese spezielle Funktionalität "llSetAnimtionOverride" zu investieren, und statt dessen auf Nachbesserungen zu warten oder eine der bekannten alten Methoden zu verwenden: AO im Viewer, AO mit dem ZHAO (o.ä.), oder eben ganz ohne AO.
 
Ich hab mir auch so ein Ding gebastelt und:

ServerSide AO funktionieren im großen und ganzen eigentlich schon ganz gut. D.h. die Wechsel zwischen den Animationen haben gepasst und hängen geblieben ist da auch nichts bei mir. D.h. die Animationen werden auch nicht nach 10s abgebrochen. Probleme gibt es allerdings mit den Pre-jumps und den Landings, wenn da nicht passende Animationen, d.h. mit einem loop abgespielt werden. Die können dann teilweise wirklich viel zu lange oder manchmal auch gar nicht abgespielt werden. Manchmal werden sie auch sonst einfach nicht gespielt...

Ansonsten bei Scripting-Problemen mit Animationen und AO:
Man kann sich über das Develop Menu direkt anzeigen lassen welche Animationen gerade vom Ava abgespielt werden. Die UUID von eigenen Animationen sieht man leider nicht mehr (sondern nur noch 00000000-0000-0000-0000000000000-2, d.h. eine Animation mit aus Kopierschutzgründen versteckter UUID und Priorität 2), aber man sieht bei den eingebauten Aninationen durchaus noch den Namen. Und hier zeigt der Viewer (Firestorm 4.4.2 gerade) dann beim Entenwatschelgang mit den Default Animationen auch deutlich an, dass zum einen female_walk_new mit Priorität 0 und ein walk_adjust mit Priorität 2 immer dann laufen, wenn ich mich gehenderweise bewege. Über diese Anzeige sieht man dann auch, dass die Prejump-Phase genau wie die Landing Phase selbst nur sehr kurz ist, maximal 2 Sekunden. Mit einem passenden (non loop) Animationsset für prejump und landing usw. passt das Springen dann wunderbar und wird auch genau wie beim ZHAO abgespielt. Das sieht kein bisschen anders aus. Wenn sie denn gespielt werden ;-), das passiert leider nicht immer.

Setzt man nun eine eigene Walk-Animation über llSetAnimationOverrider("Walking", "Neue_Ani"), dann werden hier sowohl female_walk_new als auch walk_adjust sauber durch die neue Animation "Neue_Ani" ersetzt, und diese wird eben so lange abgespielt, wie der Server die Informationen bekommt, dass man sich gehend bewegt, d.h. die entsprechende Taste drückt. Löscht man die eigenen Belegungen wieder mit einem einfachen llResetAnimationOverrider("ALL") oder einem llResetAnimationOverrider("Walking") um den Walking-Status wieder auf default Animationen zu setzen, dann werden beim gehen auch wieder die beiden default Animationen abgespielt. (So ähnlich kann man auch jeden anderen Ava-Status wieder resetten auf default, man muss dazu nicht mal die Animation kennen, die gerade durch den Status getriggert wird. Siehe http://wiki.secondlife.com/wiki/LlResetAnimationOverride )

Hat man eine "hard landing", etwa wenn man über paar hundert Meter runter fällt, dann geht der Ava in den Status "Standing up" und die entsprechende Animation "standup" wird getriggert und kurz danach die "brush" animation. Setzt man hier eine andere Animation ein mit llSetAnimationOverrider("StandingUp", "Null_Ani"), dann kann man z.B. mit einer "Null-Animation" (die einfach nichts macht) das Harte Landen (und die default Animationen) auch komplett abstellen.

Warum bei Daemonika die Geh-Animation nach 10s unterbrochen wird ist mir ein Rätsel, denn da muss der Viewer irgendwie annehmen, dass die "Gehen" Taste nicht mehr gedrückt wurde bzw. nicht gehalten wird. Normal ist dieses Verhalten jedenfalls nicht. Und der ZHAO und die anderen AOs triggern die Walk Animation eigentlich nur deswegen so häufig, weil sie eben nur über einen Ticker arbeiten konnten, der alle paar ms den Avatar-Status über llGetAgentInfo abgefragt haben bzw. weil sie alle paar ms llGetAnimation abgefragt haben. Um dann bei bedarf eben dazu passend Walk-Animationen zu triggern.
 
Zuletzt bearbeitet:
Hier mal der Code mit dem ich rumgespielt hab, aber alles ohne Gewähr.
Man kann mit "/4ao on" und /4ao off" den Overrider an- und abschalten und mit "/4ao nextstand" die Standings wechseln.
Zudem kann man mit "/4si cutie" z.B. die Animation "cutie" starten (oder jede andere Animation, die im Prim-Inventory ist) und mit "/4sirelease" wieder stoppen.
Das Ding ist nicht unbedingt als vollwertiger AO Ersatz geeignet (da fehlen noch Partner-Animationen z.B. oder ein typing overrider usw.), aber zum Spielen mit den neuen Funktionen sollte es schon mal reichen.


Code:
//Prefix für Chat-Befehle
string prefix = "si";

//alle Steh-Animationen in mehreren Listen, dann wird die Zeile nicht zu lang...
string stehen;
list stands = ["VISTAOCT3F08","D0073-Stand.N (Adult)","VISTAOCT7F08","D0078-Stand.N (Adult)"];
list stands2 = ["VISTAOCT2FFc08","D0088-Stand.N (Adult)","VACOOL4.4FAUG2","dz826-Stand.N (Adult)"];
list stands3 = ["D1175-Stand.N (Adult)"];

//Intervall für Wechsel der Steh-Animationen und Zähler
float intervall = 10.0;
integer count = 0;
integer countmax;

//Liste für alle Animationen, die im Prim sind
string Anim = "";
list Animationlist;

//Der AO kann an oder aus sein
integer AO_is_on = FALSE;

//AO wird angeschaltet
AO_on(){
    AO_is_on = TRUE;
    //Timer aktivieren für Standwechsel
    llSetTimerEvent(intervall);

    //Neue Belegungen:
    //llSetAnimationOverride("Crouching",         "SitKneel");
    //llSetAnimationOverride("CrouchWalking",     "KneelWalking");
    //llSetAnimationOverride("Falling Down",      "");
    //llSetAnimationOverride("Flying",            "D0173-Fly.N");
    //llSetAnimationOverride("FlyingSlow",        "D0173-Fly.N");
    //llSetAnimationOverride("Hovering",          "D0168-Hover.N");
    //llSetAnimationOverride("Hovering Down",     "D0170-Hover.D");
    //llSetAnimationOverride("Hovering Up",       "D0171-Hover.U");
    llSetAnimationOverride("Jumping",           "jump");
    //llSetAnimationOverride("Landing",           "VAcoolLAND1");
    llSetAnimationOverride("PreJumping",        "VISTAPREJUMP");
    llSetAnimationOverride("Running",           "VISTARUN");
    //llSetAnimationOverride("Sitting",           "D1543-Sit.N");
    //llSetAnimationOverride("Sitting on Ground", "SitKneel");
    llSetAnimationOverride("Standing",          stehen);
    //llSetAnimationOverride("Standing Up",       "D0166-Stand.U");
    //llSetAnimationOverride("Striding",          "");
    llSetAnimationOverride("Soft Landing",      "VAcoolLAND1");
    //llSetAnimationOverride("Taking Off",        "");
    //llSetAnimationOverride("Turning Left",      "dz602-Stand.N");
    //llSetAnimationOverride("Turning Right",     "dz602-Stand.N");
    llSetAnimationOverride("Walking",           "walk sexywalk");

    //Prim wird grün und zeigt "ON" an
    llSetPrimitiveParams([PRIM_COLOR,ALL_SIDES,<0,0.8,0.3>,0.25,
        PRIM_TEXTURE,ALL_SIDES,"34c43806-00f2-f724-57f7-0c43fc316942",<1,0.5,0>,<0,0.25,0>,0]);

}

//AO wird ausgeschaltet
AO_off(){
    AO_is_on = FALSE;
    //Timer abschalten
    llSetTimerEvent(0.0);
    llResetAnimationOverride("ALL");

    //Prim wird rot und zeigt "OFF" an
    llSetPrimitiveParams([PRIM_COLOR,ALL_SIDES,<0.8,0,0>,0.25,
        PRIM_TEXTURE,ALL_SIDES,"34c43806-00f2-f724-57f7-0c43fc316942",<1,0.5,0>,<0,-0.25,0>,0]);
}


default
{
    changed(integer change)
    {
        //Bei Änderungen an Script oder Animationen: Resetten
        if(change & CHANGED_INVENTORY){
            llResetScript();
        }

        //Nach einem TP: gegebenenfalls AO neu aktivieren bzw. animationen neu setzen
        if(change & (CHANGED_REGION|CHANGED_TELEPORT|CHANGED_REGION_START)){
            if( AO_is_on == TRUE){
                AO_on();
            }
        }
    }

    on_rez(integer start_param)
    {
        //Nach einem Relog: Gegebenenfalls AO neu aktivieren
        if (AO_is_on == TRUE){
            AO_on();
        }

    }

    state_entry()
    {
        //HUD Prim Grau bei Initialisierung
        llSetColor(<0.2,0.2,0.2>,ALL_SIDES);
        //Script Memory Nazis glücklich machen
        llSetMemoryLimit(20000);

        //Stands vorbereiten: Liste erzeugen
        stands = stands + stands2 + stands3;
        //Anzahl der Standanimationen holen
        countmax = llGetListLength(stands);        
        //erste Standanimation holen
        stehen = llList2String(stands,0);

        //Listener für Chatbefehle auf Kanal anschalten
        llListen(4,"",llGetOwner(),"");

        //Alle Animationen im Prim als Liste verfügbar machen
        integer i;
        for (i=0;i<llGetInventoryNumber(INVENTORY_ANIMATION);i++){
            Animationlist += llGetInventoryName(INVENTORY_ANIMATION,i);
        }

        //Berechtigungen holen für Overrider
        llRequestPermissions(llGetOwner(), PERMISSION_OVERRIDE_ANIMATIONS|PERMISSION_TRIGGER_ANIMATION);

    }

    run_time_permissions(integer perm)
    {
        //AO anschalten sobald Berechtigungen da sind
        if(perm & PERMISSION_OVERRIDE_ANIMATIONS)
        {
            AO_on();
        }
    }

    timer()
    {
        //wenn sonst keine Animation gespielt wird: Stand wechseln, dabei Liste loopen
        if(Anim == ""){
            count++;
            if(count == countmax){
                count = 0;
            }
            stehen = llList2String(stands,count);
            llResetAnimationOverride("Standing");
            llSetAnimationOverride("Standing", stehen);
        }
    }

    listen(integer channel, string name, key id, string message)
    {
        //AO an oder aus schalten, kompatibel mit ZHAO Befehlen
        if ( message == "ao off"){
            AO_off();
            llOwnerSay("AO is off");
        }
        else if(message == "ao on"){
            AO_on();
            llOwnerSay("AO is on");
        }

        //Auf nächsten Stand schalten, fals AO an ist
        //dabei Loop über Liste
        else if(message == "ao nextstand"){
            if(AO_is_on == TRUE){
                count++;
                if(count == countmax){
                    count = 0;
                }
                stehen = llList2String(stands,count);
                llResetAnimationOverride("Standing");
                llSetAnimationOverride("Standing", stehen);
                llOwnerSay("AO has next stand");
            }
        }

        //weitere Auswertung von Chatbefehlen
        else{
            //Leerzeichen entfernen aus Chatbefehlen
            list msglist = llParseString2List(message,[" "],[]);
            message = "";
            integer i;
            for(i= 0;i < llGetListLength(msglist);i++){
                message += llList2String(msglist,i);
            }

            //Prefix Checken und entfernen
            if(llToLower(llGetSubString(message,0,1)) == prefix){
                message = llGetSubString(message,2,-1);
            }

            //weitere Auswertung
            if(message == "release"){
                //Anmation Stoppen, wenn nicht schon gestoppt
                if(Anim != ""){
                    llStopAnimation(Anim);
                    //Anim auf leer setzen als Indikator
                    Anim = "";
                }
                //Bei Bedarf Timer & Standings wieder aktivieren
                if(AO_is_on == TRUE){
                    llSetAnimationOverride("Standing", stehen);
                    llSetTimerEvent(intervall);
                }
            }

            //Wenn Chatbefehl eine bekannte Animation aus Liste ist: Diese Starten
            else if (llListFindList(Animationlist,[message]) != -1){
                //erst mal andere Animation stoppen, wenn noch eine Läuft
                if(Anim != ""){
                    llStopAnimation(Anim);
                }
                //Animation in Anim speichern
                Anim = message;
                //Standings anhalten, timer stoppen
                llSetTimerEvent(0.0);
                llResetAnimationOverride("Standing");
                //Animation Starten
                llStartAnimation(Anim);
            }
        }
    }
}
 
@ Shirley

In einer normalen ZHAO wird ausschliesslich der Walk ueber den Control Event getriggert. Der Walk ist ueberhaupt nicht im Timer vorgesehen.
Nichts desto trotz habe ich mich weiter damit beschaeftigt und siehe da, aus unerklaerlichen Gruenden bricht der Walk heute gar nicht mehr ab. Sehr merkwuerdig, aber kannst dir denken, wie geschockt und sauer ich gestern war. Vielleicht wars auch einfach nur ordinaerer LAG.
Bleibt noch das Problem mit den PreJumping, Jumping, Landing, HardLanding Animationen. Ich wollte nicht glauben, dass es wirklich so grausig ist, leider ist es aber so. Man muss hoellisch aufpassen, gerade fuer diese States keine ANimationen zu verwenden, die Looped sind. Diesbezueglich habe ich Vista schon angeschrieben und ihn darauf hingewiesen, dass die Aktuelle "Standing Up" Animation fuer diesem State in einer Server Side AO ungeeignet ist, da sie tatsaechlich Looped ist. Das ist mir vorher nie aufgefallen, da die ZHAO diese Animation im Timer Triggert und ordnungsgemaess beendet. Mit einer Stein-Alten Animation von Vista konnte ich nun auch dieses Problem beheben.

Im grossen Ganzen scheint augenblicklich alles bis auf die PreJump Animation einwandfrei zu funktionieren. So wie es aussieht, darf diese Animation eine gewisse Zeitspanne bzw. Frame-Rate nicht uebersteigen, obwohl sie eigentlich schon so kurz ist. Genau genommen ist eine Motion-Capture Animation fuer diese Funktion voellig ueberkandidelt. Das sieht keine Sau, obs eine Manuell erstellte oder MoCap Ani ist.

Hier noch mal ein kleiner Auszug aus der Wiki:
Some states are transitional and have undefined behavior if set to continuously looping animations. These states are "PreJumping", "Landing", "Soft Landing" and "Standing Up".
Quelle: http://wiki.secondlife.com/wiki/LlSetAnimationOverride

Kurz gesagt, dieser Satz bedeutet: Animationen fuer "PreJumping", "Landing", "Soft Landing" und "Standing Up" duerfen nicht looped sein.

PS: Lediglich "Sitting" und "Sitting on Ground" lassen sich trotz ersetztem Anim_State wie gewohnt abfragen und beenden. Ich denke das haben sie gemacht, damit keine Probleme mit Pose-/Tanz-/Couple-Baellen und sonstigen Moebeln auftreten.

LG
Dae
 
Zuletzt bearbeitet:

Users who are viewing this thread

Zurück
Oben Unten