The active beacon explosion script would help.
All the functions:
package ETOISmokeBeaconPackage
{
function Armor::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f)
{
if(%col.dataBlock $= "ETOISmokeBeaconItem" && %col.canPickup)
{
for(%i=0;%i<%this.maxTools;%i++)
{
%item = %obj.tool[%i];
if(%item $= 0 || %item $= "")
{
%freeSlot = 1;
break;
}
}
if(%freeSlot)
{
%obj.pickup(%col);
return;
}
}
Parent::onCollision(%this, %obj, %col, %a, %b, %c, %d, %e, %f);
}
};
activatePackage(ETOISmokeBeaconPackage);
function ETOISmokeBeaconImage::onCharge(%this, %obj, %slot)
{
%obj.playthread(2, spearReady);
%obj.lastHESlot = %obj.currTool;
}
function ETOISmokeBeaconImage::onAbortCharge(%this, %obj, %slot)
{
%obj.playthread(2, root);
}
function ETOISmokeBeaconImage::onFire(%this, %obj, %slot)
{
%obj.playthread(2, spearThrow);
Parent::OnFire(%this, %obj, %slot);
%currSlot = %obj.lastHESlot;
%obj.tool[%currSlot] = 0;
%obj.weaponCount--;
messageClient(%obj.client,'MsgItemPickup','',%currSlot,0);
serverCmdUnUseTool(%obj.client);
}
function ETOISmokeBeaconImage::onDone(%this,%obj,%slot)
{
%obj.unMountImage(%slot);
}
function InactiveETOIBeaconProjectile::OnExplode(%this,%obj,%pos)
{
%p = new Projectile()
{
dataBlock = ActiveETOIBeaconProjectile;
initialPosition = vectorAdd(%pos, "0 0 1");
client = %obj.client;
};
MissionCleanup.add(%p);
}
function energystrike(%pos, %client)
{
%x = getWord(%pos, 0);
%y = getword(%pos, 1);
%z = getWord(%pos, 2);
%r = containerRayCast(vectoradd("0 0 1", %x SPC %y SPC %z), vectorAdd("0 0 -200", %x SPC %y SPC %z), $typemasks::InteriorObjectType);
if(%r)
{
%hitheight = getWord(%r, 3);
%newVertDist = %hitHeight - %z;
if(%newvertDist < 90)
{
dropshell(%beacon);
return;
}
else
%vertDist = %newVertDist - 1;
}
else
%vertdist = 500;
%p = new Projectile()
{
dataBlock = ETOIBeamProjectile;
initialPosition = vectorAdd(%x SPC %y SPC %z, "0 0" SPC %vertDist);
initialVelocity = "0 0 -200";
client = %client;
};
MissionCleanup.add(%p);
}