#library "crate_bob"
#include "zcommon.acs"
script "crate_bob" (int crate_ID, int water_ID)
{
int boxfloorheight=GetActorFloorZ(crate_ID)/65536;
int boxceilingheight=GetActorCeilingZ(crate_ID)/65536;
int waterlevel=1024;
int lastwater=-1024;
int floatstatus=0;
int box_height=64;
int float_height=16;
//initialize crates
waterlevel=GetSectorCeilingZ(water_ID,0,0)/65536;
if (waterlevel-boxfloorheight<box_height-float_height)//sitting on the ground
{
Floor_MoveToValue(crate_ID,256,boxfloorheight,0);
Ceiling_MoveToValue(crate_ID,256,boxfloorheight+box_height,0);
floatstatus=0;
}
else if (waterlevel-boxceilingheight>-float_height)//floating against the ceiling
{
Floor_MoveToValue(crate_ID,256,boxceilingheight-box_height,0);
Ceiling_MoveToValue(crate_ID,256,boxceilingheight,0);
floatstatus=0;
}
else//floating in the water
{
Floor_MoveToValue(crate_ID,256,waterlevel+float_height-box_height,0);
Ceiling_MoveToValue(crate_ID,256,waterlevel+float_height,0);
floatstatus=1;
}
//update crates
while (1)//infinite loop
{
//get current location
waterlevel=GetSectorCeilingZ(water_ID,0,0)/65536;
//if water height has changed, then see if box needs to get moved
if (lastwater!=waterlevel)
{
if (waterlevel-boxfloorheight<box_height-float_height)//sitting on the ground
{
Floor_MoveToValue(crate_ID,32,boxfloorheight,0);
Ceiling_MoveToValue(crate_ID,32,boxfloorheight+box_height,0);
floatstatus=0;
}
else if (waterlevel-boxceilingheight>-float_height)//floating against the ceiling
{
Floor_MoveToValue(crate_ID,32,boxceilingheight-box_height,0);
Ceiling_MoveToValue(crate_ID,32,boxceilingheight,0);
floatstatus=0;
}
else//floating in the water
{
Floor_MoveToValue(crate_ID,32,waterlevel+float_height-box_height,0);
Ceiling_MoveToValue(crate_ID,32,waterlevel+float_height,0);
floatstatus=1;
}
}
/*else if (floatstatus==1)//bobbing effect
{
}*/
lastwater=waterlevel;
Delay(1);
}
}