I feel like I remember this being done before in what is probably a more efficient method but I figured I'd post this here regardless for feedback or something. Some of the code is adapted from weapon_chainsaw
function vectorClosestPointAngle(%vector, %startPoint, %point)
{
%vN = vectorNormalize(%vector);
%v2 = vectorSub(%point, %startPoint);
%dot = vectorDot(%vN, vectorNormalize(%v2));
%closestPoint = vectorAdd(%startPoint, vectorScale(%vN, %dot * vectorLen(%v2)));
%angle = mACos(%dot);
return %closestPoint SPC %angle;
}
function Player::getDamageLocation(%obj, %position)
{
if(%obj.getDatablock().shapeFile !$= "base/data/shapes/player/m.dts")
return 0;
// Some information about who we just shot
%scale = getWord(%obj.getScale(), 2);
// vectors
%forwardVector = %obj.getForwardVector(); // direction the bot is facing
%sideVector = vectorCross(%forwardVector, %obj.getUpVector()); // vector facing directly to the sides of the bot
// points
%centerPoint = %obj.getWorldBoxCenter(); // middle reference point
%CPR = vectorClosestPointAngle(%sideVector, %centerPoint, %position); // where we are on the side-to-side vector
%closestPoint = getWords(%CPR, 0, 2); // closest point to where our round hit on the side-to-side vector
%angle = mRadToDeg(getWord(%CPR, 3)); // angle from the reference point. 90 is center, 0 is right, 180 is left.
%distanceFromCenter = vectorDist(%closestPoint, %centerPoint); // distance from the reference point to the side-to-side vector. 0 is center, anything above .4 is an arm.
%zLocation = getWord(%position, 2); // Z position of our impact
%zWorldBox = getword(%obj.getWorldBoxCenter(), 2); // Where the middle of our player is on the z axis
if(%zLocation > %zWorldBox - 3.3 * %scale)
{
return "head";
}
else if(%zLocation > %zWorldBox - 4.5 * %scale)
{
if(%distanceFromCenter < (0.4 * %scale))
{
return "torso";
}
else
{
if(%angle < 90)
{
return "rarm";
}
else
{
return "larm";
}
}
}
else
{
if(%angle < 90)
{
return "rleg";
}
else
{
return "lleg";
}
}
}
Essentially you just call %player.getDamageLocation(%pos);, with %pos referring to where the bullet hit, and it returns either head, torso, rarm, larm, rleg or lleg depending on where it hit