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

Wo ist der neue HUD jetzt?

Dieses Thema im Forum "Scripting" wurde erstellt von Daemonika Nightfire, 6. März 2017.

  1. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.187
    Zustimmungen:
    93
    Punkte für Erfolge:
    48
    huhu,

    Die Frage im Titel hat sich bestimmt schon jeder selbst gestellt, wenn man sich manuell einen AttachPoint auf dem HUD ausgesucht hat. Wenn das nicht zufaellig der selbe war, wie der Ersteller voreingestellt hat, muss man schon wissen wie man daran kommt, wenn der HUD ploetzlich weit ausserhalb der Bildschirms gelandet ist.

    Wenn man nicht gerade zufaellig einen anderen HUD auf dem Bildschirm hat, den man mit dem Baumenue fassen um heraus zoomen kann, hat man erst einmal ein Problem. So oder so ist das nicht besonders Benutzerfreundlich.

    Darum habe ich mir diesbezueglich ein paar gedanken gemacht. Die Funktion ist so alt wie Metusalem, denn Ziggy Puff hat das Problem schon vor etlichen Jahren geloest, doch scheint da kaum jemand darauf zurueck zu greifen. Ja ich spreche von der alten ZHAO, darin befindet sich naemlich ein Script namens "ZHAO-II-HUD Position handler", welches dafuer sorgt, das der HUD immer sichtbar ist, egal wo man ihn anhaengt.

    Hier als Beispiel das Original.
    Code:
    vector rothidden_d = <270, 0, 0>;
    vector rotshown_d = <270, 0, 270>;
    rotation rotshown;
    rotation rothidden;
    integer hudshown = TRUE;
    rotation calcrot(vector rot)
    {
        rot *= DEG_TO_RAD;
        return llEuler2Rot(rot);
    }
    position(integer show)
    {
        integer attachPoint = llGetAttached();
       
        if(attachPoint != 0)
        {
            float y;
            float z;
            vector size = llGetScale();
            y = size.z / 2.0;
            if(show)
            {
                llSetRot(rotshown);
                z = size.x - 0.025;
            }
            else
            {
                llSetRot(rothidden);
                z = size.y;
            }
            if (attachPoint == 32) // HUD Top Right
            {
                llSetPos(<0, y, z>);
            }
            else if (attachPoint == 33) // HUD Top
            {
                llSetPos(<0,0,-z>);
            }
            else if (attachPoint == 34) // HUD Top Left
            {
                llSetPos(<0,-y,-z>);
            }
            else if (attachPoint == 36) // HUD Bottom Left
            {
                llSetPos(<0, -y, z>);
            }
            else if (attachPoint == 37) // HUD Bottom
            {
                llSetPos(<0, 0, z>);
            }
            else if (attachPoint == 38) // HUD Bottom Right
            {
                llSetPos(<0, y, z>);
            }  
        }
    }
    
    default
    {
        state_entry()
        {
            rotshown = calcrot(rotshown_d);
            rothidden = calcrot(rothidden_d);
           
            position(hudshown);
        }
        attach(key id)
        {
            if (id != NULL_KEY)
            {
                position(hudshown);
            }
        }
        link_message(integer sender, integer num, string msg, key id)
        {
            if("ZHAO_TOGGLE_SHOW" == msg)
            {
                hudshown = !hudshown;
                position(hudshown);
            }
            if("ZHAO_SHOW" == msg)
            {
                hudshown = TRUE;
                position(hudshown);
            }
        }
    }
    
    Nun will ich nicht ueberall eine Retorte verwenden und auf meine Scripte anpassen, da dieses Script auch nicht viel Spielraum zulaesst, weil die Positionen entgueltig sind.
    Mir geht es lediglich darum, den HUD auf Anhieb zu finden. Desweiteren soll man den HUD dort positionieren koennen, wo man ihn haben will und dort soll er auch bleiben.

    Hier kommt nun meine Version.
    Code:
    integer StoredPoint;
    
    list AttachPointPos = [31, <0.000, 0.000, 0.000>,   // HUD Center 2
                           32, <0.000, 0.200, -0.100>,  // HUD Top Right
                           33, <0.000, 0.000, -0.100>,  // HUD Top
                           34, <0.000, -0.200, -0.100>, // HUD Top Left
                           35, <0.000, 0.000, 0.000>,   // HUD Center
                           36, <0.000, -0.200, 0.100>,  // HUD Bottom Left
                           37, <0.000, 0.000, 0.100>,   // HUD Bottom
                           38, <0.000, 0.200, 0.100>];  // HUD Bottom Right
    
    default
    {
        state_entry()
        {
            llSay(0, "Hello, Avatar!");
        }
       
        attach(key id)
        {
            integer AttachPoint = llGetAttached();
       
            if(AttachPoint != 0)
            {
                if(AttachPoint != StoredPoint)
                {
                    integer index = llListFindList(AttachPointPos, [AttachPoint]);
                    llSetPos(llList2Vector(AttachPointPos, index+1));
                   
                    StoredPoint = AttachPoint;
                }  
            }
        }
    }
    Wie ihr sehen koennt, habe ich eine Liste verwendet welche die Attachpoint Nummern enthaelt, welche durch llGetAttached() zurueck gegeben werden. In der selben Liste befinden sich fixe Positionen, welche nach belieben angepasst werden koennen. Das macht in sofern Sinn weil alle Huds unterschiedliche Groessen und Formate haben.

    Folgende Abfrage if(AttachPoint != 0) ist noetig, damit der integer StoredPoint; nicht beim ausziehen mit einer 0 ueberchrieben wird, da der attach(key id) Event auch beim Ausziehen ausgeloest wird.

    Warum speichere ich den aktuellen Attachpoint im StoredPoint?
    Ganz einfach, damit die Position des Huds nicht jedesmal neu ausgerichtet wird wenn man ihn wieder anlegt. Nur wenn man einen neuen Attachpoint waehlt soll die passende Position gesetzt werden. Ansonsten verbleibt der Hud immer dort, wo man ihn mit dem Baumenue verschoben hat.

    Aus diesem Grund habe ich diese Funktion nicht im on_rez oder state_entry Event, weil der Hud nicht alle Nase lang auf Wanderschaft gehen soll.

    LG
    Dae
     
    Zuletzt bearbeitet: 6. März 2017
  2. Gitta4 Setzer

    Gitta4 Setzer Aktiver Nutzer

    Beiträge:
    308
    Zustimmungen:
    55
    Punkte für Erfolge:
    39
    Ich kann im Inventar Edit wählen, bei angezogenen Sachen, ist aber glaub nicht bei allen Viewern so.