//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); } } } }