Asignar EV_BYTE_controller según ángulo.
#1
Hola,

Cómo puedo modificar el EV_BYTE_controller1 de una entidad según un ángulo dado ?

Tengo esta entidad:
[Imagen: 1a2BcU3.png]

Yo tengo el ángulo de dónde quiero que apunte, y si modifico el EV_VEC_angles de la entidad apunta correctamente, el problema es que me mueve absolutamente todo el modelo, lo cual no es lo que busco ya que la base del modelo debería quedar intacta mientras que la parte de arriba debería ser la que se mueva, lo cual lo controla el EV_BYTE_controller1.

Mi problema es que no sé exactamente los valores, si no me equivoco, el rango del EV_BYTE_controller es de 0-255, pero dado un ángulo, una posición o algún dato, cómo puedo transformarlo en este valor ?

Gracias de antemano.
Responder
#2
usa set_controller(entity, controller, Floatpacmanalue); de fakemeta
en value le metes directamente el angle
Responder
#3
(18/11/2016, 02:33 PM)Destro escribió: usa set_controller(entity, controller, Floatpacmanalue); de fakemeta
en value le metes directamente el angle

Hola Destro,
Gracias por esa native, no estaba al tanto.

Por otro lado, ahora la parte superior se mueve pero no apunta correctamente al objetivo, así que asumo que el número que lo estoy dando es incorrecto, podrías darme una mano ?

Probé de estas dos maneras, ninguna apunta correctamente:

Manera 1:
Código PHP:
static Float:vC[3];
static 
Float:vD[3];

xs_vec_sub(vecTargetOriginvecEntOriginvC);
vector_to_angle(vCvD);

set_controller(ent0vD[0]); // Probé con vD[1] y vD[2] también. 


Manera 2 (el código lo saque del plugin Sentry Guns):
Código PHP:
new Float:fRadians;
new 
Float:fDegress;
new 
Float:fDegressByte;
new 
Float:fTilt;
new 
Float:x;
new 
Float:y;
new 
Float:h;
new 
Float:b;

vecTargetOrigin[0] - vecEntOrigin[0];
vecTargetOrigin[1] - vecEntOrigin[1];
fRadians floatatan(y/xradian);

vecTargetOrigin[2] - vecEntOrigin[2];
vector_distance(vecEntOriginvecTargetOrigin);

fRadians floatatan(h/bradian);
fDegress fRadians THE_MAGIC;

fDegressByte 3.2421875;
fTilt 127.0 - (fDegressByte fDegress);

set_controller(ent0fTilt); 


Por cierto, vecTargetOrigin y vecEntOrigin son los EV_VEC_origin del target y de la torreta respectivamente.
Responder
#4
Revisa el code de las Turret en el HLSDK, practicamente fue mi dolor de cabeza mas grande al momento de portar código de ahí y hacer que calce en un plugin.
Responder
#5
le erra por mucho ?, la diferencia es siempre la misma o funciona todo loco (random) ?

proba, una vez hice algo parecido pero ya no tengo el code :S
Código PHP:
static Float:vC[3];
static 
Float:vD[3];

xs_vec_sub(vecTargetOriginvecEntOriginvC);
vector_to_angle(vCvD);

if(
vD[1] < 0.0vD[1] += 360.0;
else if (
vD[1] >= 360.0vD[1] -= 360.0;

set_controller(ent0vD[1]); 
A la entidad la creas con los angulos en cero ?, sino al angulo Y le tenes que restar el actual Y.
Responder
#6
Probá algo así, siendo iEnt tu entidad de la torreta y iTarget el objetivo al que la torreta va a atacar:

Código PHP:
SetEntityAimingiEntiTarget )
{
    static 
Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];

    
entity_get_vectoriEntEV_VEC_originflOrigin );
    
entity_get_vectoriTargetEV_VEC_originflTemp );
    
entity_get_vectoriEntEV_VEC_anglesflAngles );

    
xs_vec_subflTempflOriginflTemp );
    
xs_vec_normalizeflTempflTemp );
    
vector_to_angleflTempflTemp );
    
    new 
iValue[2], iController;
    
    if( (
iValue[0] = floatroundflAngles[1] / 1.41floatround_floor )) > 255 iValue[0] -= 255;
    if( (
iValue[1] = floatroundflTemp[1] / 1.41floatround_floor )) > 255 iValue[1] -= 255;
    
    if( (
iController iValue[1] - iValue[0]) < iController += 255;
    if( (
iController += 127) > 255 iController -= 255;

    
entity_set_intiEntEV_INT_sequence);
    
entity_set_byteiEntEV_BYTE_controller1iController );

    return 
1;

No hago trabajos privados. Si necesitás ayuda, abrí un nuevo tema.
¿Buscás un ejemplo o algún modo de juego? Podés echarle un vistazo a mis aportes
.
Responder
#7
(18/11/2016, 10:00 PM)Destro escribió: le erra por mucho ?, la diferencia es siempre la misma o funciona todo loco (random) ?

proba, una vez hice algo parecido pero ya no tengo el code :S
Código PHP:
static Float:vC[3];
static 
Float:vD[3];

xs_vec_sub(vecTargetOriginvecEntOriginvC);
vector_to_angle(vCvD);

if(
vD[1] < 0.0vD[1] += 360.0;
else if (
vD[1] >= 360.0vD[1] -= 360.0;

set_controller(ent0vD[1]); 
A la entidad la creas con los angulos en cero ?, sino al angulo Y le tenes que restar el actual Y.

La funcion AngleVectors del goldsrc al parecer es distinta del 1.6 que al del Half-Life. Realiza una conversion que obliga editar un Ángulo, pero no se especificamente cual es el error ya que el comportamiento de la función misma es un tanto complicada, igual que el sistema de coordenadas del juego Roflmao

Lo que si, como quieres que sea el comportamiento de tu entidad? A lo mejor podriamos ayudarte mas aun
Responder
#8
(18/11/2016, 05:39 PM)meTaLiCroSS escribió: Revisa el code de las Turret en el HLSDK, practicamente fue mi dolor de cabeza mas grande al momento de portar código de ahí y hacer que calce en un plugin.

Metal,
Lo miré pero no llegué a hacer nada al respecto, gracias.



(18/11/2016, 10:00 PM)Destro escribió: le erra por mucho ?, la diferencia es siempre la misma o funciona todo loco (random) ?

proba, una vez hice algo parecido pero ya no tengo el code :S
Código PHP:
static Float:vC[3];
static 
Float:vD[3];

xs_vec_sub(vecTargetOriginvecEntOriginvC);
vector_to_angle(vCvD);

if(
vD[1] < 0.0vD[1] += 360.0;
else if (
vD[1] >= 360.0vD[1] -= 360.0;

set_controller(ent0vD[1]); 
A la entidad la creas con los angulos en cero ?, sino al angulo Y le tenes que restar el actual Y.

Destro,
No funciona el código pero gracias, dispara a cualquier lado todo loco, no tiene ningún sentido.



(19/11/2016, 12:50 AM)Treki escribió: Probá algo así, siendo iEnt tu entidad de la torreta y iTarget el objetivo al que la torreta va a atacar:

Código PHP:
SetEntityAimingiEntiTarget )
{
    static 
Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];

    
entity_get_vectoriEntEV_VEC_originflOrigin );
    
entity_get_vectoriTargetEV_VEC_originflTemp );
    
entity_get_vectoriEntEV_VEC_anglesflAngles );

    
xs_vec_subflTempflOriginflTemp );
    
xs_vec_normalizeflTempflTemp );
    
vector_to_angleflTempflTemp );
    
    new 
iValue[2], iController;
    
    if( (
iValue[0] = floatroundflAngles[1] / 1.41floatround_floor )) > 255 iValue[0] -= 255;
    if( (
iValue[1] = floatroundflTemp[1] / 1.41floatround_floor )) > 255 iValue[1] -= 255;
    
    if( (
iController iValue[1] - iValue[0]) < iController += 255;
    if( (
iController += 127) > 255 iController -= 255;

    
entity_set_intiEntEV_INT_sequence);
    
entity_set_byteiEntEV_BYTE_controller1iController );

    return 
1;


Treki,
De momento es lo más similar que he conseguido.

La torreta apunta hacia el lado contrario del enemigo, así que simplemente le sume 127 al iController, creí que lo iba a solucionar, y lo hace, pero hay situaciones donde vuelve a apuntar hacia el lado contrario, asumo que es por la posición del enemigo.

Alguna idea ?
Responder
#9
Las unidades angulares y las que usa el controller no son las mismas, tenlo por seguro, es un enredo horrible
Responder
#10
(20/11/2016, 09:30 AM)KISKE escribió:
(19/11/2016, 12:50 AM)Treki escribió: Probá algo así, siendo iEnt tu entidad de la torreta y iTarget el objetivo al que la torreta va a atacar:

Código PHP:
SetEntityAimingiEntiTarget )
{
    static 
Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];

    
entity_get_vectoriEntEV_VEC_originflOrigin );
    
entity_get_vectoriTargetEV_VEC_originflTemp );
    
entity_get_vectoriEntEV_VEC_anglesflAngles );

    
xs_vec_subflTempflOriginflTemp );
    
xs_vec_normalizeflTempflTemp );
    
vector_to_angleflTempflTemp );
    
    new 
iValue[2], iController;
    
    if( (
iValue[0] = floatroundflAngles[1] / 1.41floatround_floor )) > 255 iValue[0] -= 255;
    if( (
iValue[1] = floatroundflTemp[1] / 1.41floatround_floor )) > 255 iValue[1] -= 255;
    
    if( (
iController iValue[1] - iValue[0]) < iController += 255;
    if( (
iController += 127) > 255 iController -= 255;

    
entity_set_intiEntEV_INT_sequence);
    
entity_set_byteiEntEV_BYTE_controller1iController );

    return 
1;


Treki,
De momento es lo más similar que he conseguido.

La torreta apunta hacia el lado contrario del enemigo, así que simplemente le sume 127 al iController, creí que lo iba a solucionar, y lo hace, pero hay situaciones donde vuelve a apuntar hacia el lado contrario, asumo que es por la posición del enemigo.

Alguna idea ?

Hmm... respecto a eso, ese código lo armé de esa forma porque mi modelo de la torreta ya apuntaba hacia el lado contrario naturalmente, capaz tu modelo apunta bien, por lo que tendrías que borrar esta línea (y no sumarle 127 después):

Código PHP:
if( (iController += 127) > 255 iController -= 255

PD: Si el valor del controller se pasa de los límites de un byte (tanto para el lado negativo como positivo contando que el byte es unsigned) entonces la entidad deja de rotar. El controller tiene que ser si o si { x / x e Z; 0 <= x <= 255 } sino va a actuar raro o directamente no va a actuar jaja. Capaz que cuando le sumaste 127, se pasó de 255 e hizo quilombo.
No hago trabajos privados. Si necesitás ayuda, abrí un nuevo tema.
¿Buscás un ejemplo o algún modo de juego? Podés echarle un vistazo a mis aportes
.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)