// SPDX-License-Identifier: MIT // Copyright (c) 2026 Incoprea // Three-bar linked chart // Not compiled or tested in-world // Setup: Name three root-aligned box children bar1,bar2,bar3. Use nonphysical root. Owner-touch arms; root script sends code8062 and three comma-separated integers0–100. // Stop / restore: Owner-touch disarms and restores each position and scale. // Notes: Use a spare modifiable build. Snapshot state is held only in script memory; restore before reset/removal. Do not relink during a preview. Zero values retain a0.01m sliver; no automatic physics or link changes. Intended for small exhibit bars, not structural parts. // License: see LICENSE in this distribution. // Original Incoprea. MIT. Not compiled or tested in-world. list links; list saved; integer active; integer valid=TRUE; default { state_entry() { integer i; for(i=1;i<=3;++i) { integer j; integer found; integer count; for(j=2;j<=llGetObjectPrimCount(llGetKey());++j)if(llGetLinkName(j)=="bar"+(string)i) { found=j; ++count; } if(count!=1) { valid=FALSE; return; } links+=[found]; saved+=llGetLinkPrimitiveParams(found,[PRIM_SIZE,PRIM_POS_LOCAL]); } } touch_start(integer n) { if(llDetectedKey(0)!=llGetOwner()||llGetLinkNumber()>1||llGetStatus(STATUS_PHYSICS)||!valid)return; active=!active; if(!active) { integer i; for(i=0;i<3;++i)llSetLinkPrimitiveParamsFast(llList2Integer(links,i),[PRIM_SIZE,llList2Vector(saved,i*2),PRIM_POS_LOCAL,llList2Vector(saved,i*2+1)]); } } link_message(integer sender,integer code,string s,key data) { if(!active||!valid||sender!=1||code!=8062||llGetStatus(STATUS_PHYSICS))return; list values=llCSV2List(s); if(llGetListLength(values)!=3)return; integer i; for(i=0;i<3;++i) { string value=llStringTrim(llList2String(values,i),STRING_TRIM); integer number=(integer)value; if((string)number!=value||number<0||number>100)return; } for(i=0;i<3;++i) { vector size=llList2Vector(saved,i*2); vector p=llList2Vector(saved,i*2+1); float old=size.z; size.z*=llList2Integer(values,i)/100.0; if(size.z<0.01)size.z=0.01; p.z+=(size.z-old)*0.5; llSetLinkPrimitiveParamsFast(llList2Integer(links,i),[PRIM_SIZE,size,PRIM_POS_LOCAL,p]); } } changed(integer change) { if(change&CHANGED_LINK) { valid=FALSE; active=FALSE; } } }