action actCameraCollider ()
{
proc_mode = PROC_LATE;
wait(1);
my->flags |= INVISIBLE | PASSABLE;
my->eflags = FAT | NARROW;
vec_set(&my->max_x, vector(8, 8, 8));
vec_set(&my->min_x, vector(-8, -8, -8));
vec_set(&my->skOriginX, vector(0, -7, 50)); // NEW
vec_set(&my->skOffsetX, vector(0, -25, 40)); // NEW
my->skDistance = 80; // NEW
my->skDistSoft = my->skDistance;
my->parent = player;
while (my->parent == player)
{
my->skDistance = clamp(my->skDistance + mickey.z * 0.3, 20,
400);
camera->pan = player->pan;
camera->tilt = clamp(camera->tilt - mickey.y * 0.2, -90, 90);
vec_set(&my->pan, &player->pan);
vec_set(&my->x, &my->skOriginX);
vec_rotate(&my->x, &player->pan);
vec_add(&my->x, &player->x);
vec_set(&my->skCenterX, &my->skOffsetX);
vec_rotate(&my->skCenterX, &player->pan);
vec_add(&my->skCenterX, &player->x);
vec_for_angle(&my->skDirX, &camera->pan);
vec_scale(&my->skDirX, -my->skDistance);
vec_set(&my->skTargetX, &my->skCenterX);
vec_add(&my->skTargetX, &my->skDirX);
you = player;
var nDist = c_trace(&my->x, &my->skTargetX, IGNORE_YOU |
IGNORE_PASSABLE | USE_BOX);
if (nDist > 0)
my->skDistSoft += (nDist - my->skDistSoft) * time_step * 2;
else
my->skDistSoft += (my->skDistance - my->skDistSoft) *
time_step * 2;
vec_diff(&my->skDirX, &my->skTargetX, &my->x);
vec_normalize(&my->skDirX, my->skDistSoft);
vec_set(&camera->x, &my->x);
vec_add(&camera->x, &my->skDirX);
wait(1);
}
ent_remove(me);
}
action player_code()
{
goToTheBeginning:
...
ent_create(NULL, &my->x, actCameraCollider);
wait(1);
...
// BOUNDING BOX FOR PLAYER OUT OF THE WATER, STANDING UPRIGHT.
vec_set(&my->max_x, vector(2, 23, 50.5));
vec_set(&my->min_x, vector(-2, -23, 0));
...
while (player_health > 0)
{
// IF PLAYER JUMPS INTO WATER, FROM OUT OF THE WATER.
if((water_mode == 0) && (inTheWater == 1))
{
// RESETS COLLISION BOX
vec_set(&my->max_x, vector(0, 0, 0));
vec_set(&my->min_x, vector(0, 0, 0));
// JUMPS TO BEGINNING OF THIS FUNCTION.
goto goToTheBeginning;
}
if((water_mode == 1) || (water_mode == 2) || (water_mode == 3))
// IF PLAYER IS INSIDE WATER
{
// COLLISION BOX CHANGES TO MATCH PLAYER'S HORIZONTALLY
// SWIMMING BODY, HOWEVER, CAMERA IS NOT GLIDING ON
// WALLS WHEN PLAYER TURNS ITS FEET FACING THE WALL
// WHILE SWIMMING.
vec_set(&my->max_x, vector(53, 2, 40));
vec_set(&my->min_x, vector(-23, -2, 30));
inTheWater = 1;
}
...
}
}