function Player::startSkiJumping(%obj)
{
//make a new ski vehicle and mount the player on it
%client = %obj.client;
%position = %obj.getTransform();
%posX = getword(%position, 0);
%posY = getword(%position, 1);
%posZ = getword(%position, 2);
%rot = getWords(%position, 3, 8);
%posZ += 0.3;
%vel = %obj.getVelocity();
%newcar = new WheeledVehicle()
{
dataBlock = skijumpvehicle;
client = %client;
initialPosition = %posX @ " " @ %posY @ " " @ %posZ;
};
%newcar.setVelocity(%vel);
%newcar.setTransform(%posX @ " " @ %posY @ " " @ %posZ @ " " @ %rot);
%newcar.schedule(250, mountObject, %obj, 0);
}
function ParkourJumpCheckImage::onCheck(%this,%obj,%slot)
{
%pos = %obj.getPosition();
%targets = $TypeMasks::FxBrickAlwaysObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::StaticObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::VehicleObjectType;
%ray = ContainerRayCast(%pos, vectorAdd(%pos,"0 0 -0.3"), %targets, %obj);
%col = getWord(%ray,0);
if(!isObject(%col))
return;
if(%col.getType() & $TypeMasks::FxBrickAlwaysObjectType && !%col.isColliding())
return;
%obj.unMountImage(%slot);
}
package ParkourPhysics
{
function Armor::onTrigger(%this,%obj,%slot,%on)
{
%r = Parent::onTrigger(%this,%obj,%slot,%on);
if(%slot == 2 && %on)
{
%bat = 0;
for(%i=0;%i<%this.maxTools;%i++)
{
if(%obj.tool[%i] == TF2BatItem.getID())
{
%bat = 1;
break;
}
}
if(%obj.getMountedImage(2) == ParkourJumpCheckImage.getID())
return %r;
%pos = %obj.getPosition();
%targets = $TypeMasks::FxBrickAlwaysObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::StaticObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::VehicleObjectType;
%ray = ContainerRayCast(%pos, vectorAdd(%pos,"0 0 -0.3"), %targets, %obj);
%col = getWord(%ray,0);
if(isObject(%col) && (!(%col.getType() & $TypeMasks::FxBrickAlwaysObjectType) || %col.isColliding()))
return %r;
%obj.mountImage(ParkourJumpCheckImage,2);
%obj.setVelocity("0 0 0");
%obj.applyImpulse("0 0 0","0 0" SPC %obj.dataBlock.jumpForce);
%obj.schedule(0,"startSkiJumping");
%obj.playThread(3,jump);
//Only change if you're a 'standard' player type and not already using a different datablock
if(fileName(%obj.dataBlock.shapeFile) $= "m.dts" && %obj.dataBlock.getID() != PlayerBatJumpArmor.getID() && %obj.getState() !$= "Dead" && %obj.altDataNum <= 1)
{
%health = %obj.dataBlock.maxDamage - %obj.getDamageLevel();
%flash = %obj.getDamageFlash();
%obj.pushDatablock(PlayerBatJumpArmor.getID());
%obj.resetTF2Data = %obj.schedule(200,popDatablock,PlayerBatJumpArmor.getID());
}
}
return %r;
}
};
activatePackage(ParkourPhysics);
Yeah for whatever reason, the player sometimes flips automatically, instead of you having full control over the flip.