User:Daemonika Nightfire/Scripts/Animation Sit

From Second Life Wiki
Jump to navigation Jump to search

*DS* Universal Sit Script (v3.0.07)

Diese neue Version verwendet die neue Funktioen llLinkSitTarget & llAvatarOnLinkSitTarget und kann sowohl im Root Prim als auch in Child Prims verwendet werden.

/*
    *DS* Universal Sit by Daemonika Nightfire
    
    Dieses Script besitzt alle noetigen funktionen um einen Avatar in bestimmter Position und individueller Animation zu setzen.
    Es ist moeglich das Script sowohl mit als auch ohne Animation zu verwenden.
    Weiterhin ist es moeglich, dieses Script zusammen mit einer Animation in verlinkte Child Prims zu legen,
    damit sich beispielsweise auf einem Sofa mit mehreren Polstern mehrere Avatare setzen koennen.
    
    Info:
    In diesem Script findest du die llKey2Name Abfrage.
    Das hat den Vorteil, das im Falle eines Logouts oder Teleports keine Fehlermeldung erscheint, wenn ploetzlich der Avatar weg ist.
*/

// Moegliche Werte fuer den LinkTarget
// LINK_ROOT oder 1 , LINK_THIS oder -4 , oder jede andere verfuegbare Linknummer 2 - 256
// Bei der Verwendung von LINK_ROOT und LINK_THIS ist darauf zu achten, dass das Script zusammen mit der jeweiligen Animation im betreffenden Child-Prim liegt.
// Bei jeder anderen Verwendungsart koennen eins oder mehrere Scripte zusammen mit den Animationen im Root Prim liegen.
integer LinkTarget = LINK_THIS;


// Mit den beiden folgenden Variablen kann die Position und Rotation des Avatars eingestellt werden.
// Das Script geht immer von der Orientierung des Prims aus, dessen Link angegeben ist.
vector Position = <0.00, -0.00, 0.43>;
vector Rotation = <00, 00, 00>;


// Moegliche Werte fuer die Animation
// Einfach leer     = System-Animation "sit" wird verwendet. (kann von eigener AO ueberschrieben werden)
// Leer + Animation = Script verwendet die erste beiliegende Animation aus dem Inhalt des Prims.
// Animations-Name  = Script verwendet eine bestimmte beiliegende "Animation" aus dem Inhalt des Prims.
string Animation = "";


/////////////// Ab hier bitte nichts mehr aendern \\\\\\\\\\\\\\\
key Avatar = "";
integer Sitting = FALSE;
integer Permission = FALSE;

default
{
    state_entry()
    {
        llSetMemoryLimit(12000); // Kuenstliches Memory-Limit fuer Mono Scripte in bytes.
        llLinkSitTarget(LinkTarget, Position, llEuler2Rot(Rotation * DEG_TO_RAD));
        
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0 && Animation == "")  // Prueft ob ein Eintrag bei Animationen und ob eine Animation im Inhalt vorhanden ist.
        {
            Animation = llGetInventoryName(INVENTORY_ANIMATION, 0); // Speichert den Namen der eingelegten Animation.
        }
        // llSay(0,(string)llGetUsedMemory() + " bytes memory in use."); // gibt den aktuellen Memoryverbrauch wieder.
    }
    
    run_time_permissions(integer Permission)
    {
        if(Permission & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit_generic");
            llStopAnimation("sit");
            llStartAnimation(Animation);
        }
    }
    
    changed(integer Change)
    {
        if(Change & CHANGED_LINK)
        {
            if(!Sitting)
            {
                Avatar = llAvatarOnLinkSitTarget(LinkTarget);
                if(Avatar)
                {
                    Sitting = TRUE;
                    if(Animation != "") // Wird nur ausgefuehrt, wenn eine Animation bekannt ist.
                    {
                        llRequestPermissions(Avatar, PERMISSION_TRIGGER_ANIMATION);
                    }
                }
            }
            else if(Sitting)
            {
                if(Permission) // Wird nur ausgefuehrt, wenn vorher die Permission abgefragt wurde.
                {
                    if(llKey2Name(Avatar) != "") // Prueft ob sich der Avatar noch auf der Region befindet.
                    {
                        llStopAnimation(Animation);
                    }
                    Permission = FALSE; // Entzieht dem Script das Recht dich weiter zu animieren.
                }
                Sitting = FALSE;
                Avatar = "";
            }
        }
        if(Change & CHANGED_INVENTORY)
        {
            llResetScript(); // resettet das Script, wenn das Inventar sich aendert.
        }
    }
    
    on_rez(integer Dae)
    {
        llResetScript(); // resettet das Script, sobald es gerezzt wird
    }
}

/*
    Terms of use:
    You can use, edit and sell this script inside your creations with the following permissions in Second Life:
    • MOD Yes • COPY Yes • TRANSFER Yes
    
    Yes that means fullperm. Other settings, are against the following licenses.
    The permission of your Object (prim), remain unaffected by these terms
    
    https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/Animation_Sit
    http://wiki.secondlife.com/wiki/Project:Terms_of_Service
    http://creativecommons.org/licenses/by-sa/3.0/
    
    violation of this Terms are against the Second Life TOS at §7 Content Licenses and Intellectual Property Rights.
    http://secondlife.com/corporate/tos.php
*/

Older Versions

*DS* ~ Animation Sit with Show/Hide for Balls

To set the Position & Rotation of the Avatar, edit the following Line in each Script.

llSitTarget("Position in meters" <x,y,z>,llEuler2Rot("Rotation in degrees" <x,y,z>*DEG_TO_RAD));

This Script must be placed together with a Pose / Animation in the Object.

Sctipt Time ~0.002 ms
key avatar = "";
string animation = "";
integer sitting = 0;
integer permission = 0;

show()
{
    llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXT,"SIT HERE",<0.9,0.6,0.2>,1.0, PRIM_COLOR, ALL_SIDES,<1,1,1>,1.0]);
}

hide()
{
    llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXT,"",ZERO_VECTOR,0.0, PRIM_COLOR, ALL_SIDES,ZERO_VECTOR,0.0]);
}

default
{
    state_entry()
    {
        show();
        animation = llGetInventoryName(INVENTORY_ANIMATION, 0);
        llSitTarget(<-0.1,0.1,-0.43>,llEuler2Rot(<00,-90,-90>*DEG_TO_RAD));
    }
    
    run_time_permissions(integer permission)
    {
        if(permission & PERMISSION_TRIGGER_ANIMATION)
        {
            if(sitting)
            {
                llStopAnimation("sit_generic");
                llStopAnimation("sit");
                llStartAnimation(animation);
                hide();
            }
        }
    }
    
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            if(!sitting)
            {
                sitting = 1;
                avatar = llAvatarOnSitTarget();
                llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION);
            }
            else if(sitting)
            {
                if(llKey2Name(avatar) != "")
                {
                    llStopAnimation(animation);
                }
                avatar = "";
                permission = 0;
                sitting = 0;
                show();
            }
        }
        if(change & (CHANGED_OWNER|CHANGED_REGION_START|CHANGED_INVENTORY))
        {
            llResetScript();
        }
    }
    
    on_rez(integer start_param)
    {
        llResetScript();
    }
}

*DS* ~ Animation Sit without Show/Hide for Furniture

This Script must be placed together with a Pose / Animation in the Object.

Sctipt Time ~0.002 ms
key avatar = "";
string animation = "";
integer sitting = 0;
integer permission = 0;

default
{
    state_entry()
    {
        animation = llGetInventoryName(INVENTORY_ANIMATION, 0);
        llSitTarget(<-0.1,0.1,-0.43>,llEuler2Rot(<00,-90,-90>*DEG_TO_RAD));
    }
    
    run_time_permissions(integer permission)
    {
        if(permission & PERMISSION_TRIGGER_ANIMATION)
        {
            if(sitting)
            {
                llStopAnimation("sit_generic");
                llStopAnimation("sit");
                llStartAnimation(animation);
            }
        }
    }
    
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            if(!sitting)
            {
                sitting = 1;
                avatar = llAvatarOnSitTarget();
                llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION);
            }
            else if(sitting)
            {
                if(llKey2Name(avatar) != "")
                {
                    llStopAnimation(animation);
                }
                avatar = "";
                permission = 0;
                sitting = 0;
            }
        }
        if(change & (CHANGED_OWNER|CHANGED_REGION_START|CHANGED_INVENTORY))
        {
            llResetScript();
        }
    }
    
    on_rez(integer start_param)
    {
        llResetScript();
    }
}