integer grappled = FALSE; float beamlength = 6.0; key beamtarget; vector otherpos; default { state_entry() { llListen(33894,"","",(string)llGetOwner()+"Grapple"); } listen(integer channel, string name, key id, string msg) { if (1 == 1) { otherpos = <0,0,0>; grappled = 1; beamtarget = id; llOwnerSay("Grappled!"); llSensorRepeat("",beamtarget,SCRIPTED,200000,7000*PI,0.1); llSensorRepeat("",beamtarget,PASSIVE,200000,7000*PI,0.1); } } sensor(integer num_detected) { vector pos = llGetPos(); if(otherpos == <0,0,0>) { otherpos = llDetectedPos(0); } float dist = llVecDist(pos,otherpos); vector fwd = llVecNorm(otherpos-pos); vector vel = llGetVel(); vector velback; if(vel.z <= 0) { velback = *-3; } if(dist > beamlength && grappled) { llSetForce((*(dist*3))+velback,0); } else { llSetForce(<0,0,0>,0); } } }