// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Velocity direction arrow // Not compiled or tested in-world // Setup: Put in an arrow child on an already moving object. For this example use nonphysical scripted movement that reports velocity meaningfully. // Stop / restore: Owner-touch to stop and restore the captured starting pose before removing, resetting, or relinking. // Notes: Use a small nonphysical rezzed build with clear space. Actual prim transforms change. Original poses live only in script memory. Do not change physical status or link topology during use. It never enables physics or drives the vehicle. Position jumps may have zero reported velocity. Stationary states preserve the last direction. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Not compiled or tested in-world. vector home; rotation rest; integer active; integer valid=TRUE; default { state_entry() { home=llGetLocalPos(); rest=llGetLocalRot(); } touch_start(integer count) { if(llDetectedKey(0)!=llGetOwner()||!valid||llGetLinkNumber()<2||llGetStatus(STATUS_PHYSICS))return; active=!active; if(active) { llResetTime(); vector velocity=llGetVel(); if(llVecMag(velocity)>0.05) { vector local=llVecNorm(velocity)/llGetRootRotation(); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROT_LOCAL,llRotBetween(<1.0,0.0,0.0>,local)]); } llSetTimerEvent(0.5); } else { llSetTimerEvent(0.0); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_POS_LOCAL,home,PRIM_ROT_LOCAL,rest]); } } timer() { if(llGetLinkNumber()<2||llGetStatus(STATUS_PHYSICS)) { llSetTimerEvent(0.0); active=FALSE; return; } vector velocity=llGetVel(); if(llVecMag(velocity)>0.05) { vector local=llVecNorm(velocity)/llGetRootRotation(); llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROT_LOCAL,llRotBetween(<1.0,0.0,0.0>,local)]); } } changed(integer change) { if(change&CHANGED_LINK) { valid=FALSE; active=FALSE; llSetTimerEvent(0.0); llOwnerSay("Links changed; stopped without restoring. Reposition and reset before reuse."); } } }