//Variables temporales
ANGLE atemp;
VECTOR vtemp;
// CBabe
action robotico()
{
while(!player) wait(1);
c_setminmax(me);
// Variables locales
var Porcentaje_Animacion = 0;
var Velocidad_Vertical = 0;
// Colocar en el suelo
c_trace( vector( my.x, my.y, my.z + 1000 ), vector( my.x, my.y, my.z - 1000 ), IGNORE_ME | IGNORE_PASSABLE | USE_BOX );
my.z = target.z + 1;
while( player ) // Bucle principal
{
vec_diff( vtemp, player.x, my.x ); // Obtener vector de diferencia entre el jugador y my
vec_to_angle( atemp, vtemp ); // Transformar de coordenadas XYZ a coordenadas angulares Rotación/Inclinación/Alabeo
my.pan = atemp.pan; // Orientar malla según el ángulo de rotación
if ( ( vec_length(vtemp) > 150 ) || ( Velocidad_Vertical != 0 ) ) // Si está a más de 150 quants del jugador o está saltando
{
c_move (my, vector( 2 * time_step, 0, 0 ), vector( 0, 0, Velocidad_Vertical * time_step ), GLIDE ); // Mover malla
if ( trace_hit && ( Velocidad_Vertical == 0 ) ) // Si en el movimiento a tocado algo y no está saltando
{
Velocidad_Vertical = 7; // Iniciar salto
}
if ( ( c_trace( my.x, vector( my.x, my.y, my.z - 3 ), IGNORE_ME | IGNORE_PASSABLE ) > 0 ) && ( Velocidad_Vertical <= 0 ) ) // Si hay suelo cerca y no está subiendo en el salto
{
my.z = target.z + 1; // Colocar en el suelo
Velocidad_Vertical = 0; // Detener movimiento vertical
}
else // Si está en el aire
{
Velocidad_Vertical -= time_step * 2; // Aplicar gravedad
}
ent_animate(my, "walk", Porcentaje_Animacion, ANM_CYCLE); // Animar 'andar'
}
else // Si está a menos de 150 quants y no está saltando
{
ent_animate(my, "idle", Porcentaje_Animacion, ANM_CYCLE); // Animar 'parado'
}
Porcentaje_Animacion += 6 * time_step; // Aumenta el porcentaje de animación de forma constante
Porcentaje_Animacion %= 100; // Obteniendo el resto de su división por 100 conseguimos que haga un ciclo de 0 a 99.99^
wait(1);
}
ent_remove ( me );
return;
}