integer grappled = FALSE; float beamlength = 6.0; key beamtarget; vector otherpos; float mass; default { state_entry() { llListen(33894,"","",(string)llGetOwner()+"Grapple"); mass = llGetMass()*100; } 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); float hdist = llVecDist(,); vector fwd = llVecNorm(otherpos-pos); vector vel = llGetVel(); vector velback; vector acc = llGetAccel(); vector fvel = ; if(vel.z <= 0 && (fvel.x > 0.5 || fvel.y > 0.5)) { velback = <(vel.x+acc.x)*0.3,(vel.y+acc.y)*0.3,vel.z>*-(mass); } else if(vel.z <= 0) { velback = *-(mass); } if(dist > beamlength && grappled) { float distmult = dist*(mass); vector force = ; force -= <0,0,hdist/3>; llSetForce(force+velback,0); } else { llSetForce(<0,0,0>,0); } } }