Here's what the agile player uses to check if they're on the ground.
function ag_bicheck(%obj)
{
if(!isObject(%obj))
{
return 0;
}
if(%obj.getClassName() $= "fxDTSbrick")
{
if(%obj.isColliding() && %obj.isRendering())
{
return 1;
}
return 0;
}
return 1;
}
function Player::IsOnGround(%player)
{
%pos = %player.getPosition();
%scale = %player.getScale();
%xs = getWord(%scale,0);
%ys = getWord(%scale,1);
%nw = vectorAdd(%pos,0 - (0.75 * %xs) SPC 0 - (0.75 * %ys) SPC 0);
%dnw = vectorAdd(%nw,"0 0 -0.5");
%ne = vectorAdd(%pos,(0.75 * %xs) SPC 0 - (0.75 * %ys) SPC 0);
%dne = vectorAdd(%ne,"0 0 -0.5");
%se = vectorAdd(%pos,(0.75 * %xs) SPC (0.75 * %ys) SPC 0);
%dse = vectorAdd(%se,"0 0 -0.5");
%sw = vectorAdd(%pos,0 - (0.75 * %xs) SPC (0.75 * %ys) SPC 0);
%dsw = vectorAdd(%sw,"0 0 -0.5");
%dpos = vectorAdd(%pos,"0 0 -0.5");
%raynw = ag_bicheck(getWord(containerRaycast(%nw,%dnw,$TypeMasks::FxBrickAlwaysObjectType|$TypeMasks::InteriorObjectType),0));
%rayne = ag_bicheck(getWord(containerRaycast(%ne,%dne,$TypeMasks::FxBrickAlwaysObjectType|$TypeMasks::InteriorObjectType),0));
%rayse = ag_bicheck(getWord(containerRaycast(%se,%dse,$TypeMasks::FxBrickAlwaysObjectType|$TypeMasks::InteriorObjectType),0));
%raysw = ag_bicheck(getWord(containerRaycast(%sw,%dsw,$TypeMasks::FxBrickAlwaysObjectType|$TypeMasks::InteriorObjectType),0));
%rayce = ag_bicheck(getWord(containerRaycast(%pos,%dpos,$TypeMasks::FxBrickAlwaysObjectType|$TypeMasks::InteriorObjectType),0));
if(%raynw || %rayne || %rayse || %raysw || %rayce)
{
return 1;
} else {
return 0;
}
}
Dunno how well it works.