Clockturn made a script that does this for me because I was doing something similar and completely baffled. Here you go:
//by clockturn
function Player::getRelativePosition(%player,%vec,%slot)
{
if(getWordCount(%vec) != 3 || !isObject(%player))
{
return;
}
// X is left/right
// Y is forward/back
// Z is up/down
%x = getWord(%vec,0);
%y = getWord(%vec,1);
%z = getWord(%vec,2);
%scale = %player.getScale();
%sx = getWord(%scale,0);
%sy = getWord(%scale,1);
%sz = getWord(%scale,2);
%x *= %sx;
%y *= %sy;
%z *= %sz;
if(%slot $= "eye")
{
%yv = vectorNormalize(%player.getEyeVector());
} else {
%yv = vectorNormalize(%player.getForwardVector());
}
%zv = vectorNormalize(%player.getUpVector());
%xv = vectorNormalize(vectorCross(%yv,%zv));
if(%slot $= "eye")
{
%pos = %player.getEyePoint();
} else if(%slot !$= "") {
%pos = getWords(%player.getSlotTransform(%slot),0,2);
} else {
%pos = %player.getHackPosition();
}
%pos = vectorAdd(%pos,vectorScale(%xv,%x));
%pos = vectorAdd(%pos,vectorScale(%yv,%y));
%pos = vectorAdd(%pos,vectorScale(%zv,%z));
return %pos;
}
function Player::getRelativeVector(%player,%vec,%slot)
{
%pos2 = %player.getRelativePosition(%vec,%slot);
if(%slot $= "eye")
{
%pos = %player.getEyePoint();
} else if(%slot !$= "") {
%pos = getWords(%player.getSlotTransform(%slot),0,2);
} else {
%pos = %player.getHackPosition();
}
return vectorNormalize(vectorSub(%pos2,%pos));
}So for the example you just said, you would use %obj.addVelocity(%obj.getRelativeVector("0 0 6"));.