///////hook//////

 

integer stick=FALSE;
key target=NULL_KEY;
vector agent_pos;
vector agent_size;
vector my_pos;
vector offset;
vector size;
vector new_pos;
float dist=0.0;
integer chan;
integer listen_chan;

default
{
state_entry()
{

}
on_rez(integer num)
{
chan=num;
llSetStatus(STATUS_DIE_AT_EDGE,TRUE);
llCollisionSound("",0.0);
llSetBuoyancy(1.0);
listen_chan=llListen(chan,"",NULL_KEY,"");
}
collision_start(integer num)
{
if(!stick)
{
llTriggerSound("MetalClink",1.0);
stick=TRUE;
my_pos=llGetPos();
target=llDetectedKey(0);
llSetStatus(STATUS_PHYSICS,TRUE);
list aaa=llGetObjectDetails(target,[OBJECT_POS,OBJECT_ROT]);
agent_pos=llList2Vector(aaa,0);
rotation agent_rot=llList2Rot(aaa,1);
if(llGetAgentSize(target)!=ZERO_VECTOR){llRezObject("Box",agent_pos,ZERO_VECTOR,agent_rot,chan);}
offset=agent_pos-my_pos;
agent_size=llGetAgentSize(target);
llMoveToTarget(agent_pos-offset,0.05);
llRegionSay(chan,"Hook@@@" + (string) target);
llSleep(0.2);
llSetTimerEvent(0.1);
}
if(stick && llDetectedKey(0)==target)
{
my_pos=llGetPos();
llSetStatus(STATUS_PHYSICS,FALSE);
llSetStatus(STATUS_PHANTOM,TRUE);
offset=agent_pos-my_pos;
}
}
land_collision_start(vector num)
{
if(target==NULL_KEY)
{
llTriggerSound("MetalClink",1.0);
stick=TRUE;
agent_pos=llGetPos();
llRegionSay(chan,"Hook@@@Land");
llSetStatus(STATUS_PHYSICS,TRUE);
llMoveToTarget(agent_pos,0.05);
llMessageLinked(LINK_THIS,0,"grow",NULL_KEY);
llSleep(0.1);
llSetStatus(STATUS_PHYSICS,FALSE);
llSetStatus(STATUS_PHANTOM,FALSE);
}
}
listen(integer channel, string name, key id, string msg)
{
if(msg=="Hook Die")
{
llDie();
}
}
timer()
{
list aaa=llGetObjectDetails(target,[OBJECT_POS]);
agent_pos=llList2Vector(aaa,0);
if(agent_pos==ZERO_VECTOR){llDie();}
my_pos=llGetPos();

if(llVecDist(agent_pos-offset,my_pos)<0.1 && llGetStatus(STATUS_PHYSICS))
{
llSetStatus(STATUS_PHYSICS,FALSE);
llSetStatus(STATUS_PHANTOM,TRUE);
offset=agent_pos-my_pos;
}

if(llGetStatus(STATUS_PHYSICS)){llMoveToTarget(agent_pos-offset,0.05);}
if(!llGetStatus(STATUS_PHYSICS))
{
if(llVecDist(agent_pos-offset,llGetPos())>dist){llSetPos(agent_pos-offset);}
}
}
}