I've been trying to port this guys pseudocode @
http://gamedev.stackexchange.com/que...t-in-a-3d-game to work with sourcepawn and to support 3D space and heres what i have done.
PHP Code:
public OnEntityCreated(entity, const String:classname[])
{
if (StrEqual(classname, "tf_projectile_rocket"))
{
SDKHook(entity, SDKHook_SpawnPost, OnRocketSpawn);
}
}
public OnRocketSpawn(rocket)
{
if(IsValidEntity(rocket))
{
new rOwner = GetEntPropEnt(rocket, Prop_Data, "m_hOwnerEntity");
if(IsValidClient(rOwner))
{
new target = GetClosestPlayer(rOwner);
decl Float:vecTargetPos[3], Float:vecTargetVel[3], Float:vecShooterPos[3], Float:vecRocketVel[3], Float:vecToTarget[3];
GetEntPropVector(target, Prop_Data, "m_vecVelocity", vecTargetVel);
GetEntPropVector(rocket, Prop_Data, "m_vecVelocity", vecRocketVel);
GetClientAbsOrigin(target, vecTargetPos);
GetClientAbsOrigin(rOwner, vecShooterPos);
vecToTarget[0] = vecTargetPos[0] - vecShooterPos[0];
vecToTarget[1] = vecTargetPos[1] - vecShooterPos[1];
vecToTarget[2] = vecTargetPos[2] - vecShooterPos[2];
new Float:a = GetVectorDotProduct(vecTargetVel, vecTargetVel) - (vecRocketVel[0] * vecRocketVel[0] +
vecRocketVel[1] * vecRocketVel[1] +
vecRocketVel[2] * vecRocketVel[2]);
new Float:b = 2 * GetVectorDotProduct(vecTargetVel, vecToTarget);
new Float:c = GetVectorDotProduct(vecToTarget, vecToTarget);
new Float:p = -b / (2 * a);
new Float:q = SquareRoot((b * b) - 4 * a * c) / (2 * a);
new Float:t1 = p - q;
new Float:t2 = p + q;
new Float:t;
if (t1 > t2 && t2 > 0)
t = t2;
else
t = t1;
decl Float:aimSpot[3];
aimSpot[0] = vecTargetPos[0] + vecTargetVel[0] * t;
aimSpot[1] = vecTargetPos[1] + vecTargetVel[1] * t;
aimSpot[1] = vecTargetPos[2] + vecTargetVel[2] * t;
PrintToServer("%f %f %f", aimSpot[0], aimSpot[1], aimSpot[2]);
decl Float:bulletPath[3];
bulletPath[0] = aimSpot[0] - vecShooterPos[0];
bulletPath[1] = aimSpot[1] - vecShooterPos[1];
bulletPath[2] = aimSpot[2] - vecShooterPos[2];
}
}
}
I don't know whats wrong, if the target isn't moving at all it just prints NaN NaN NaN to the server console, otherwise it will just error with ""SquareRoot" reported: Cannot evaluate the square root of a negative number"
I am not a mathmagician
__________________