Yeah, it has to do with how the springs are defined for dampening, etc.
As for having it work with any wheeled vehicle, you could modify this spin-out code I whipped up for Aloshi.
function startspinout(%vehicle,%timeinseconds,%impactvector,%impulse)
{
if(isObject(%vehicle) && %vehicle.getClassName() $= "WheeledVehicle")
{
schedule(%timeinseconds * 1000,0,"stopspinout",%vehicle);
%vehicle.eulerRot = 1;
%vehicle.impulsedecline = %impulse / %timeinseconds / 100;
%vehicle.spinout = 1;
%vehicle.setTransform(%vehicle.position SPC eulerToAxis(getWords(axisToEuler(getWords(%vehicle.getTransform(),3,6)),0,1) SPC %vehicle.eulerRot));
%velX = getWord(%impactVector,0) * %impulse + getWord(%vehicle.getVelocity(),0);
%velY = getWord(%impactVector,1) * %impulse + getWord(%vehicle.getVelocity(),1);
%velZ = getWord(%vehicle.getVelocity(),2);
%vehicle.setVelocity(%velX SPC %velY SPC %velZ);
schedule(10,0,"continuespinout",%vehicle,%impactvector,%impulse - %vehicle.impulsedecline);
}
}
function continuespinout(%vehicle,%impactvector,%impulse)
{
if(isObject(%vehicle) && %vehicle.getClassName() $= "WheeledVehicle")
{
if(%vehicle.eulerRot < 359)
{
%vehicle.eulerRot += 1;
}
else
{
%vehicle.eulerRot = 0;
}
%vehicle.setVelocity("0 0" SPC getWord(%vehicle.getVelocity(),2));
%vehicle.setTransform(%vehicle.position SPC eulerToAxis(getWords(axisToEuler(getWords(%vehicle.getTransform(),3,6)),0,1) SPC mCeil(%vehicle.eulerRot)));
%velX = getWord(%impactVector,0) * %impulse + getWord(%vehicle.getVelocity(),0);
%velY = getWord(%impactVector,1) * %impulse + getWord(%vehicle.getVelocity(),1);
%velZ = getWord(%vehicle.getVelocity(),2);
%vehicle.setVelocity(%velX SPC %velY SPC %velZ);
if(%vehicle.spinout)
{
schedule(10,0,"continuespinout",%vehicle,%impactvector,%impulse - %vehicle.impulsedecline);
}
}
}
function stopspinout(%vehicle)
{
if(isObject(%vehicle) && %vehicle.getClassName() $= "WheeledVehicle")
{
%vehicle.spinout = "";
%vehicle.eulerRot = "";
%vehicle.impulsedecline = "";
}
}