Raised This Month: $51 Target: $400
 12% 

Detectar movimiento del screen del player


  
 
 
Thread Tools Display Modes
Author Message
Swaycher
Senior Member
Join Date: Feb 2009
Location: Arg/MyHome/PawnStudio
Old 07-28-2012 , 02:54   Detectar movimiento del screen del player
#1

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.
__________________
Quote:
Originally Posted by fearAR View Post
Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.
http://forums.alliedmods.net/showthread.php?t=196349
Swaycher is offline
Send a message via MSN to Swaycher Send a message via Skype™ to Swaycher
meTaLiCroSS
Gaze Upon My Hat
Join Date: Feb 2009
Location: Viña del Mar, Chile
Old 07-28-2012 , 22:35   Re: Detectar movimiento del screen del player
#2

Quote:
Originally Posted by Swaycher View Post
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
__________________
Quote:
Originally Posted by joropito View Post
You're right Metalicross
meTaLiCroSS is offline
Swaycher
Senior Member
Join Date: Feb 2009
Location: Arg/MyHome/PawnStudio
Old 07-28-2012 , 22:59   Re: Detectar movimiento del screen del player
#3

Quote:
Originally Posted by meTaLiCroSS View Post
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
__________________
Quote:
Originally Posted by fearAR View Post
Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.
http://forums.alliedmods.net/showthread.php?t=196349
Swaycher is offline
Send a message via MSN to Swaycher Send a message via Skype™ to Swaycher
xPredat0r
Junior Member
Join Date: Jul 2012
Location: Venezuela
Old 07-29-2012 , 00:57   Re: Detectar movimiento del screen del player
#4

En realidad seria 180º, porque 360º te dejaria en la misma posicion, para que darias una vuelta para matar a alguien , lo siento no poder ayudarte ya que soy nuevo;), pienso que seria así.
xPredat0r is offline
fearAR
Veteran Member
Join Date: Oct 2010
Old 07-29-2012 , 00:57   Re: Detectar movimiento del screen del player
#5

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.
__________________
~~~~ NPC AI ~~~~

[ Pathfinding - OK ]
[ Citizen AI - OK ]
[ Handle Weapons - --- ]

Last edited by fearAR; 07-29-2012 at 01:03.
fearAR is offline
Send a message via MSN to fearAR
Old 07-29-2012, 01:03
fearAR
This message has been deleted by fearAR.
Swaycher
Senior Member
Join Date: Feb 2009
Location: Arg/MyHome/PawnStudio
Old 07-29-2012 , 01:59   Re: Detectar movimiento del screen del player
#6

Quote:
Originally Posted by fearAR View Post
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
__________________
Quote:
Originally Posted by fearAR View Post
Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.
http://forums.alliedmods.net/showthread.php?t=196349

Last edited by Swaycher; 07-29-2012 at 02:09.
Swaycher is offline
Send a message via MSN to Swaycher Send a message via Skype™ to Swaycher
fearAR
Veteran Member
Join Date: Oct 2010
Old 07-30-2012 , 14:20   Re: Detectar movimiento del screen del player
#7

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.
__________________
~~~~ NPC AI ~~~~

[ Pathfinding - OK ]
[ Citizen AI - OK ]
[ Handle Weapons - --- ]

Last edited by fearAR; 07-31-2012 at 11:07.
fearAR is offline
Send a message via MSN to fearAR
Swaycher
Senior Member
Join Date: Feb 2009
Location: Arg/MyHome/PawnStudio
Old 07-31-2012 , 11:43   Re: Detectar movimiento del screen del player
#8

Impresionante fear, muchísimas gracias por tu tiempo (se nota que te gusto la idea); ahora lo pruebo.
__________________
Quote:
Originally Posted by fearAR View Post
Claro esta que no tengo idea de como verificar los diferentes cortes de ángulo.
http://forums.alliedmods.net/showthread.php?t=196349
Swaycher is offline
Send a message via MSN to Swaycher Send a message via Skype™ to Swaycher
meTaLiCroSS
Gaze Upon My Hat
Join Date: Feb 2009
Location: Viña del Mar, Chile
Old 07-31-2012 , 15:35   Re: Detectar movimiento del screen del player
#9

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.
__________________
Quote:
Originally Posted by joropito View Post
You're right Metalicross
meTaLiCroSS is offline
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


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


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