1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  3. 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.
    Information ausblenden

Server Side AO (enttaeuschend)

Dieses Thema im Forum "Animationen & Gesten" wurde erstellt von Daemonika Nightfire, 1. Juli 2013.

  1. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.219
    Zustimmungen:
    149
    Punkte für Erfolge:
    63
    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: 1. Juli 2013
  2. Jojo1905 Guardian

    Jojo1905 Guardian Aktiver Nutzer

    Beiträge:
    330
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    huhu Dae,
    also das was du beschreibst hatte der FS in der 3.sowieso Version mal, mitlerweile is die eingebaute AO im FS wirklich super
    denke aber das dir das nicht wirklich hilft..... Vieleicht kannste dir den AO Code ja mal aus dem FS http://hg.phoenixviewer.com/phoenix-firestorm-lgpl rausklauen

    jojo
     
  3. Mareta Dagostino

    Mareta Dagostino Superstar

    Beiträge:
    1.315
    Zustimmungen:
    99
    Punkte für Erfolge:
    49
    @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:
     
  4. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.219
    Zustimmungen:
    149
    Punkte für Erfolge:
    63
    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
     
  5. sven Homewood

    sven Homewood R.I.P.

    Beiträge:
    1.894
    Zustimmungen:
    85
    Punkte für Erfolge:
    48
    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.
     
  6. Mareta Dagostino

    Mareta Dagostino Superstar

    Beiträge:
    1.315
    Zustimmungen:
    99
    Punkte für Erfolge:
    49
    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.
     
  7. Shirley Iuga

    Shirley Iuga Forumsgott/göttin

    Beiträge:
    7.507
    Zustimmungen:
    2
    Punkte für Erfolge:
    36
    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: 2. Juli 2013
  8. Shirley Iuga

    Shirley Iuga Forumsgott/göttin

    Beiträge:
    7.507
    Zustimmungen:
    2
    Punkte für Erfolge:
    36
    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);
                }
            }
        }
    }
    
     
  9. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.219
    Zustimmungen:
    149
    Punkte für Erfolge:
    63
    @ 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:
    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: 2. Juli 2013