AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Spanish (https://forums.alliedmods.net/forumdisplay.php?f=135)
-   -   Detectar movimiento del screen del player (https://forums.alliedmods.net/showthread.php?t=191258)

Swaycher 07-28-2012 02:54

Detectar movimiento del screen del player
 
Hola gente, me surgió una idea en un mod que estoy haciendo, pero para poder llevarla a cabo tengo que detectar algo y no se si esto es posible.
A lo que voy, es posible detectar si el player hace un movimiento de 360º? (no con el cuerpo, si no lo que sería el screen del player).

Gracias.

meTaLiCroSS 07-28-2012 22:35

Re: Detectar movimiento del screen del player
 
Quote:

Originally Posted by Swaycher (Post 1759743)
Hola gente, me surgió una idea en un mod que estoy haciendo, pero para poder llevarla a cabo tengo que detectar algo y no se si esto es posible.
A lo que voy, es posible detectar si el player hace un movimiento de 360º? (no con el cuerpo, si no lo que sería el screen del player).

Gracias.

Se mas especifico a lo que quieres lograr

Swaycher 07-28-2012 22:59

Re: Detectar movimiento del screen del player
 
Quote:

Originally Posted by meTaLiCroSS (Post 1760260)
Se mas especifico a lo que quieres lograr

Bueno, tengo un sistema de trofeos en mi mod, entonces se me ocurrió la idea de que haya un "trofeo de 360 kills", y para lograrlo habría que hacer X kills haciendo un giro de 360º con el mouse y al segundo en que termina el giro hacer el kill. No se si se entiende :S

xPredat0r 07-29-2012 00:57

Re: Detectar movimiento del screen del player
 
En realidad seria 180º, porque 360º te dejaria en la misma posicion, para que darias una vuelta para matar a alguien :3, lo siento no poder ayudarte ya que soy nuevo;), pienso que seria así.

fearAR 07-29-2012 00:57

Re: Detectar movimiento del screen del player
 
Supongo que se refiere a esto...

[IMG]http://desmond.**************/Himg221/scaled.php?server=221&filename=dibujogts.jpg& res=landing[/IMG]

Y luego que realiza el giro de 360º, el jugador mismo que realizó el giro, asesine en ese momento a una victima.

Supongo que seria fácil si previenes que el ángulo de la vista del usuario, pasa por los diferentes puntos tomando como referencia de inicio ese momento en que apunto por primera vez a la victima, y luego realizas cálculos en caso de que el usuario haya intercedido entre 4 puntos como minimo, tales como 90º, 180º, 270º y luego el final y verificar si asesino a tal.

Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.

Saludos.

PD: Arte.

Swaycher 07-29-2012 01:59

Re: Detectar movimiento del screen del player
 
Quote:

Originally Posted by fearAR (Post 1760317)
Supongo que se refiere a esto...

[IMG]http://desmond.**************/Himg221/scaled.php?server=221&filename=dibujogts.jpg& res=landing[/IMG]

Y luego que realiza el giro de 360º, el jugador mismo que realizó el giro, asesine en ese momento a una victima.

Supongo que seria fácil si previenes que el ángulo de la vista del usuario, pasa por los diferentes puntos tomando como referencia de inicio ese momento en que apunto por primera vez a la victima, y luego realizas cálculos en caso de que el usuario haya intercedido entre 4 puntos como minimo, tales como 90º, 180º, 270º y luego el final y verificar si asesino a tal.

Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.

Saludos.

PD: Arte.

[]Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo[/]

Me encantó.. alta explicación y despues tu respuesta, sinceramente me encantó xDD, igual gracias voy a ver si en scripting help saben algo :)

Edit: vas a mi firma idolo xD

fearAR 07-30-2012 14:20

Re: Detectar movimiento del screen del player
 
La verdad me la pase pensando estos últimos dias en tu idea, y llegue a una conclusión que vas a tener que sobreescribirlo vos en PAWN, como un simple calculo...

No es sencillo pero tampoco dificil de comprender el calculo.

Tomas el angulo del screen del player, y refiriendo al de YAW.

Si no recuerdo mal era Pitch, Yaw, y Roll, por lo tanto el de la posicion '1' en el vector asociado al angulo, es Yaw.

PHP Code:

enum AXIS
{
    
PITCH 0,
    
YAW,
    
ROLL
};

new 
AXIS:Vector]; 

Luego de tomarlos los últimos angulos verificar cada uno de ellos, por lo tanto debes de pasar sus valores a un valor absoluto, ¿Que me refiero con esto?

Si tengo un angulo obtenido en el CS el cual su valor es:

-90º => | ( -90º ) | = 270º.

Por lo tanto uno ves que se obtuvo dicho valor, pasamos a calculos su valor en radianes.

Rad = Deg * ( K.pi / 180 );

Español:

Radianes = Grados * ( pi / 180 );

Una ves que obtuvistes dicho valor en radianes puedes verificar los diferentes puntos mediante un simple if x1 == x2, claro que estariamos pasando una linea de consumo, supongo que es infima, ya que el unico valor que recorremos y verificamos son valores con coma flotante o decimales, como les quieras llamar.

Te dejo un lindo dibujo:
[IMG]http://img404.**************/img404/4194/superimagensenusradian.jpg[/IMG]

Edit:
Te sigo dejando datos...

Para obtener el valor absoluto del angulo que se presente en un valor negativo:

PHP Code:

stock absolute_degree( &Float:fAngle )
{
        
fAngle fAngle ? ( 360.0 fAngle ) : fAngle


Edit2:

Te dejo el plugin que estuve desarrollando hasta ahora, sirve, lo unico es que esta adaptado para funcionar correctamente si el giro se hace hacia la izquierda, hacia la derecha habria que cambiar unas lineas.

PHP Code:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

#define PLUGIN "Detectar Giro 360º Izquierda"
#define VERSION "1.0"
#define AUTHOR "fearAR"

//#define SET_USER_ANGLES

new Float:fViewAngles33 ][ ], Float:fGameTime33 ], iInit33 ];

new 
Float:g_fViewAngles33 ][ ];

#define MAX_POINT_RADIANS    5
#define    MAX_TIME        0.5

new const Float:fValoresMAX_POINT_RADIANS ] =
{
    
0.0,
    
1.57,
    
3.14,
    
4.71,
    
0.0
};


public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)

    
register_clcmd"say iniciar""function_init" );
    
register_forwardFM_PlayerPostThink"fw_PlayerPostThink" );
}

public 
client_putinserverid )
{
    
iInitid ] = 0;
}

public 
function_initid )
{
    if( !
is_user_aliveid ) || iInitid ] ) return PLUGIN_HANDLED;
        
    
pevidpev_anglesfViewAnglesid ] );
        
    
absolute_degreefViewAnglesid ][ ] );
    
    
fGameTimeid ] = get_gametime();
    
    
iInitid ] = 1;
        
    
client_printidprint_chat"Empezo..." );
    
    return 
PLUGIN_HANDLED;
}

public 
fw_PlayerPostThinkid )
{
    if ( !( 
<= id <= 32 ) || !is_user_aliveid ) ) return FMRES_IGNORED;
    
    if ( !
iInitid ] ) return FMRES_IGNORED;
    
    if ( 
get_gametime() > ( fGameTimeid ] + MAX_TIME ) )
    {
        
client_printidprint_chat"Termino..." );
        
iInitid ] = 0;
        return 
FMRES_IGNORED;
    }
    else
    {
        
pevidpev_anglesg_fViewAnglesid ] );
        
        
absolute_degreeg_fViewAnglesid ][ ] );
        
        
g_fViewAnglesid ][ ] = floatsubg_fViewAnglesid ][ ], fViewAnglesid ][ ] );
        
        
absolute_degreeg_fViewAnglesid ][ ] );
        
        
degrees_to_radiang_fViewAnglesid ][ ], g_fViewAnglesid ][ ] );
        
        if ( 
compare_floatsg_fViewAnglesid ][ ], fValoresiInitid ] ] ) && iInitid ] )
        {
            
client_printidprint_chat"Radianes pasados: %.2f"g_fViewAnglesid ][ ] );
            
fGameTimeid ] = get_gametime();
            if ( ++
iInitid ] == ( sizeof fValores ) )
            {
                
iInitid ] = 0;
                
                
client_printidprint_chat"Distes una vuelta!" );
                
                
#if defined SET_USER_ANGLES
            
                
new parm];
                
                
parm] = id;
                            
                
parm] = floatroundfViewAnglesid ][ ] );
                
parm] = floatroundfViewAnglesid ][ ] );
                
parm] = floatroundfViewAnglesid ][ ] );
                
                
set_task1.0"setAngles"_parmsizeof parm );
            
                
#endif
            
}
        }
    }
    
    
    return 
FMRES_IGNORED;
}

public 
setAnglesparm] )
{
    static 
id;
    
    
id parm];
    
    new 
Float:fAngles];
    
    for( new 
0sizeof fAnglesi++ )
        
fAngles] = floatparm] );
        
    
set_pevidpev_v_anglefAngles );
    
set_pevidpev_anglesfAngles );
    
set_pevidpev_fixangle);
}

stock absolute_degree( &Float:fAngle )
{
    
fAngle fAngle ? ( 360.0 fAngle ) : fAngle
}

stock degrees_to_radianFloat:fIn, &Float:fOut )
    
fOut floatmulfInfloatdiv3.14159264180.0 ) );
    
stock radian_to_degreesFloat:fIn, &Float:fOut )
    
fOut floatmulfInfloatdiv180.03.14159264 ) );

stock compare_floatsFloat:fIn1Float:fIn2 )
{
    static 
Float:valor;
    
    
valor floatsubfIn1fIn2 );
    
    
valor valor 0.0 floatmulvalor, -1.0 ) : valor;
    
    if( 
valor 0.1) return 1
    
    
return 0


Edit3:

Detecta hacia los 2 lados, cuanto menor sea el tiempo aceptable para llegar a cada valor del vector fValores, es menos propenso a errores.

PHP Code:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>

#define PLUGIN "Detectar Giro 360º Izquierda"
#define VERSION "1.0"
#define AUTHOR "fearAR"

//#define SET_USER_ANGLES

enum MAX_DIRECCIONES
{
    
LEFT 0,
    
RIGHT
};

new 
Float:fViewAngles33 ][ ], Float:fGameTime33 ], Float:g_fViewAngles33 ][ ], Float:fGameTime233 ];

new 
iInit33 ], MAX_DIRECCIONES:g_iDirection33 ];

#define MAX_POINT_RADIANS    5
#define    MAX_TIME        0.2

new const Float:fValoresMAX_POINT_RADIANS ] =
{
    
0.0,
    
1.57,
    
3.14,
    
4.71,
    
0.0
};


public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)

    
register_clcmd"say iniciar""function_init" );
    
register_forwardFM_PlayerPostThink"fw_PlayerPostThink" );
}

public 
client_putinserverid )
{
    
iInitid ] = -1;
    
g_iDirectionid ] = LEFT;
    
    
fGameTime2id ] = get_gametime();
}

public 
function_initid )
{
    if( !
is_user_aliveid ) || iInitid ] >= ) return PLUGIN_HANDLED;
        
    
pevidpev_anglesfViewAnglesid ] );
        
    
absolute_degreefViewAnglesid ][ ] );
    
    
g_iDirectionid ] = LEFT;
    
    
fGameTimeid ] = get_gametime();
    
    
fGameTime2id ] = get_gametime();
    
    
iInitid ] = 1;
        
    
client_printidprint_chat"Empezo..." );
    
    return 
PLUGIN_HANDLED;
}

public 
fw_PlayerPostThinkid )
{
    if ( !( 
<= id <= 32 ) || !is_user_aliveid ) ) return FMRES_IGNORED;
    
    if ( 
iInitid ] < ) return FMRES_IGNORED;
    
    if ( 
get_gametime() > ( fGameTimeid ] + MAX_TIME ) )
    {
        
client_printidprint_chat"Termino..." );
        
iInitid ] = -1;
        return 
FMRES_IGNORED;
    }
    else
    {
        
pevidpev_anglesg_fViewAnglesid ] );
        
        
absolute_degreeg_fViewAnglesid ][ ] );
        
        
g_fViewAnglesid ][ ] = floatsubg_fViewAnglesid ][ ], fViewAnglesid ][ ] );
        
        
absolute_degreeg_fViewAnglesid ][ ] );
        
        
degrees_to_radiang_fViewAnglesid ][ ], g_fViewAnglesid ][ ] );
        
        if ( 
iInitid ] == && compare_floatsg_fViewAnglesid ][ ], fValoressizeof fValores ] ) ) {
            
iInitid ] = 3;
            
g_iDirectionid ] = RIGHT;
        }
        
        if ( 
get_gametime() >= ( fGameTime2id ] + 0.2 ) )
        {
            
client_printidprint_chat"%.2f"g_fViewAnglesid ][ ] );
            
fGameTime2id ] = get_gametime();
        }
        
        if ( 
compare_floatsg_fViewAnglesid ][ ], fValoresiInitid ] ] ) && iInitid ] >= )
        {
            
client_printidprint_chat"Radianes pasados: %.2f"g_fViewAnglesid ][ ] );
            
            
iInitid ] += g_iDirectionid ] == LEFT 0;
            
            if (    ( 
g_iDirectionid ] == LEFT && iInitid ] >= ( sizeof fValores ) ) ||
                ( 
g_iDirectionid ] == RIGHT && iInitid ] <= ) )
            {
                
iInitid ] = -1;
                
                
client_printidprint_chat"Distes una vuelta!" );
                
                
#if defined SET_USER_ANGLES
            
                
new parm];
                
                
parm] = id;
                            
                
parm] = floatroundfViewAnglesid ][ ] );
                
parm] = floatroundfViewAnglesid ][ ] );
                
parm] = floatroundfViewAnglesid ][ ] );
                
                
set_task1.0"setAngles"_parmsizeof parm );
            
                
#endif
            
}
            
            
iInitid ] += g_iDirectionid ] == RIGHT ? -0;
            
            
fGameTimeid ] = get_gametime();
        }
    }
    
    
    return 
FMRES_IGNORED;
}

public 
setAnglesparm] )
{
    static 
id;
    
    
id parm];
    
    new 
Float:fAngles];
    
    for( new 
0sizeof fAnglesi++ )
        
fAngles] = floatparm] );
        
    
set_pevidpev_v_anglefAngles );
    
set_pevidpev_anglesfAngles );
    
set_pevidpev_fixangle);
}

stock absolute_degree( &Float:fAngle )
{
    
fAngle fAngle ? ( 360.0 fAngle ) : fAngle
}

stock degrees_to_radianFloat:fIn, &Float:fOut )
    
fOut floatmulfInfloatdiv3.14159264180.0 ) );
    
stock radian_to_degreesFloat:fIn, &Float:fOut )
    
fOut floatmulfInfloatdiv180.03.14159264 ) );

stock compare_floatsFloat:fIn1Float:fIn2 )
{
    static 
Float:valor;
    
    
valor floatsubfIn1fIn2 );
    
    
valor valor 0.0 floatmulvalor, -1.0 ) : valor;
    
    if( 
valor 0.1) return 1
    
    
return 0


Saludos.

Swaycher 07-31-2012 11:43

Re: Detectar movimiento del screen del player
 
Impresionante fear, muchísimas gracias por tu tiempo (se nota que te gusto la idea); ahora lo pruebo.

meTaLiCroSS 07-31-2012 15:35

Re: Detectar movimiento del screen del player
 
Usa la constante M_PI y no es necesario usar las natives floatmul y las otras de su categoria porque el compilador convierte los signos en sus natives respectivamente. Chequea los angulos en PreThink porque es llamado antes de la funcion PM_Move del engine. En Post/PreThink NUNCA el parametro principal sera mayor o menor a 32 y 1 respectivamente. En lo personal no gastaria tanto code para realizar tan pequeño detalle, solo se necesitan usar operatorias simples para lograr esto.


All times are GMT -4. The time now is 20:10.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.