~Fiona's Script Library~

← Zurück zur Bibliothek

vibe.lsl | 3.26 KB
Herunterladen
//Copyright 2025 Fiona Sweet - free to use for any purpose including but not limited to masturbation
// Dildo: play a one-shot animation on attach (OpenSim/SL-compatible)

string ANIM_NAME = "F MasterbateDildo3";   
float  ANIM_TIME = 180.0;         

key gWearer;
integer gHasPerms;

do_swat()
{
    if (llGetInventoryType(ANIM_NAME) != INVENTORY_ANIMATION)
    {
        llOwnerSay("[Fiona's Vibrator] Missing animation '" + ANIM_NAME + "'.");
        return;
    }
    if (!gHasPerms) {
        // request (again) in case we lost perms after crossing, etc.
        gWearer = llGetOwner();
        llRequestPermissions(gWearer, PERMISSION_TRIGGER_ANIMATION);
        return;
    }
    llStartAnimation(ANIM_NAME);
    llSetTimerEvent(ANIM_TIME);
}

default
{
    state_entry()
    {
        gWearer = llGetOwner();
        gHasPerms = FALSE;

        // If the script is dropped in while already worn, attach() won’t fire
        if (llGetAttached()) {
    	    llOwnerSay("Hi baby, are you ready to masturbate? My batteries are fully charged... If you want some help getting off, give me a ring. hop://login.zetaworlds.com/app/agent/3faa2410-7ada-423c-98e4-cec0b6194ba5/about");
            llRequestPermissions(gWearer, PERMISSION_TRIGGER_ANIMATION);
        }
    }

    on_rez(integer start_param)
    {
        // fresh start if rezzed on the ground and then worn later
        llResetScript();
    }

    // Works on platforms where it fires reliably
    attach(key id)
    {
        if (id != NULL_KEY) {
            gWearer = id;
            gHasPerms = FALSE;
            llOwnerSay("[Fiona's Vibrator] attach() fired; requesting perms.");
            llRequestPermissions(gWearer, PERMISSION_TRIGGER_ANIMATION);
        } else {
            // detaching
            llSetTimerEvent(0.0);
            llStopAnimation(ANIM_NAME);
            gHasPerms = FALSE;
        }
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION) {
            gHasPerms = TRUE;
            do_swat();
        } else {
            llOwnerSay("[Fiona's Vibrator] Permission denied.");
        }
    }

    timer()
    {
        llStopAnimation(ANIM_NAME);
        llSetTimerEvent(0.0);
    }

    changed(integer c)
    {
        // Owner change: wipe and re-perm
        if (c & CHANGED_OWNER) llResetScript();

        // Inventory update: animation might have been added/renamed
        if ((c & CHANGED_INVENTORY) && llGetAttached()) {
            // Try again if we have perms
            if (gHasPerms) do_swat();
        }

        // Region crossing / teleport can drop perms or miss attach()
        if ((c & (CHANGED_REGION | CHANGED_TELEPORT)) && llGetAttached()) {
            gHasPerms = FALSE; // be safe; re-ask
            llOwnerSay("[Fiona's Vibrator] Crossing/teleport detected; requesting perms.");
            llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
        }

        // Fallback for some OpenSim forks: link changes on attach/detach
        if ((c & CHANGED_LINK)) {
            if (llGetAttached()) {
                gHasPerms = FALSE;
                llRequestPermissions(llGetOwner(), PERMISSION_TRIGGER_ANIMATION);
            } else {
                llSetTimerEvent(0.0);
                llStopAnimation(ANIM_NAME);
            }
        }
    }
}