//********************************************************************
//PingPong.cs - Allows dynamic movement of objects such as buildings
//By - EvilCheese
//
//Usage: PingPongInit(%obj, %marker, %time, %smoothness, %delay)
//
//%obj = Object to move
//%marker = Destination position marker
//%time = time in milliseconds for one half of the ping-pong
//%smoothness = Number of movement updates per second, more = smoother = more CPU taxing.
//%delay = time delay in ms at each end of the path
//********************************************************************
//********************************************************************
// 3-21-2013
// Updates to code and additions by Defender, for use in my maps for Legions Overdrive.
//********************************************************************
//********************************************************************
function CancelPingPongEvents(){
if ( isEventPending($PingPongMoveEvent))
cancel($PingPongMoveEvent);// delete the event
echo("<>>>>> cancel $PingPongMoveEvent <<<<<>");
$PingPongActive = 0;
DeactivatePackage(PingPongPackage);
}
//********************************************************************
function posFromTransform(%transform) // Tribes2, function
{
// the first three words of an object's transform are the object's position
%position = getWord(%transform, 0) SPC getWord(%transform, 1) SPC getWord(%transform, 2);
return %position;
}
function rotFromTransform(%transform) // Tribes2, function
{
// the last four words of an object's transform are the object's rotation
%rotation = getWord(%transform, 3) SPC getWord(%transform, 4) SPC getWord(%transform, 5) SPC getWord(%transform, 6);
return %rotation;
}
//********************************************************************
function PingPongInit(%obj , %marker, %time, %smoothness, %delay)
{
$PingPongActive = 1;
//This will move object (%obj) to the position marker specified, and then back again, in a ping-pong loop
if(!isObject(%obj)) //If it isnt an object, error
{
echo("Unable to set movement on non-object classes, First parameter invalid");
}
if(!isObject(%marker)) //no marker
{
echo("Unable to set movement, marker object not found / invalid");
}
//Some maffs wizardry now, figure out the size of step required etc to make this work
%startpos = posFromTransform(%obj.getTransform());
%endpos = posFromTransform(%marker.getTransForm());
//Find a vector from one to the other
%Longvec = VectorSub(%endpos, %startpos);
//How many steps is the movement going to take for the smoothness level?
//%numsteps = (%time/1000) * %smoothness;
//%interval = 1000 / %smoothness;
%numsteps = (%time/250) * %smoothness;
%interval = 250 / %smoothness;
//Chop the big vector into that many parts to work out each step size.
%stepvec = VectorScale(%Longvec, (1/%numsteps));
%numstepsleft = %numsteps;
%currpos = %startpos;
//Start the movement
PingPongMove(%obj, %startpos, %endpos, %numsteps, %numstepsleft, %stepvec, %currpos, %interval, %delay);
}
function PingPongMove(%obj, %startpos, %endpos, %numsteps, %numstepsleft, %stepvec, %currpos, %interval, %delay)
{
%rot = rotFromTransform(%obj.getTransform());
//echo("OldPos:" @ %currpos);
%currpos = VectorAdd(%currpos, %stepvec);
//echo ("NewPos:" @ %currpos);
//echo ("Steps Remaining :" @ %numstepsleft);
%obj.setTransForm(%currpos SPC %rot);
//Movement Done, setup for next one
%numstepsleft--;
if(%numstepsleft < 1)
{
//Loop backwards after %delay ms
%stepvec = VectorScale(%stepvec, -1);
%numstepsleft = %numsteps;
%currpos = %endpos;
$PingPongMoveEvent = schedule( (%interval + %delay) , %obj, "PingPongMove", %obj, %endpos, %startpos, %numsteps, %numstepsleft, %stepvec, %currpos, %interval, %delay);
}
else
{
//Schedule another move
$PingPongMoveEvent = schedule(%interval, %obj, "PingPongMove", %obj, %startpos, %endpos, %numsteps, %numstepsleft, %stepvec, %currpos, %interval, %delay);
}
}