Mensajes: 723
Temas: 23
Registro en: May 2014
Reputación:
22
Hola,
Cómo puedo modificar el EV_BYTE_controller1 de una entidad según un ángulo dado ?
Tengo esta entidad:
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.
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
18/11/2016, 02:33 PM
(Última modificación: 18/11/2016, 02:35 PM por Destro.)
usa set_controller(entity, controller, Float alue); de fakemeta
en value le metes directamente el angle
Mensajes: 723
Temas: 23
Registro en: May 2014
Reputación:
22
18/11/2016, 05:27 PM
(Última modificación: 18/11/2016, 05:30 PM por KISKE.)
(18/11/2016, 02:33 PM)Destro escribió: usa set_controller(entity, controller, Floatalue); 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(vecTargetOrigin, vecEntOrigin, vC); vector_to_angle(vC, vD);
set_controller(ent, 0, vD[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;
x = vecTargetOrigin[0] - vecEntOrigin[0]; y = vecTargetOrigin[1] - vecEntOrigin[1]; fRadians = floatatan(y/x, radian);
h = vecTargetOrigin[2] - vecEntOrigin[2]; b = vector_distance(vecEntOrigin, vecTargetOrigin);
fRadians = floatatan(h/b, radian); fDegress = fRadians * THE_MAGIC;
fDegressByte = 3.2421875; fTilt = 127.0 - (fDegressByte * fDegress);
set_controller(ent, 0, fTilt);
Por cierto, vecTargetOrigin y vecEntOrigin son los EV_VEC_origin del target y de la torreta respectivamente.
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
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.
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
18/11/2016, 10:00 PM
(Última modificación: 18/11/2016, 10:05 PM por Destro.)
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(vecTargetOrigin, vecEntOrigin, vC); vector_to_angle(vC, vD);
if(vD[1] < 0.0) vD[1] += 360.0; else if (vD[1] >= 360.0) vD[1] -= 360.0;
set_controller(ent, 0, vD[1]);
A la entidad la creas con los angulos en cero ?, sino al angulo Y le tenes que restar el actual Y.
Mensajes: 2,454
Temas: 14
Registro en: Oct 2013
Reputación:
51
Probá algo así, siendo iEnt tu entidad de la torreta y iTarget el objetivo al que la torreta va a atacar:
Código PHP: SetEntityAiming( iEnt, iTarget ) { static Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];
entity_get_vector( iEnt, EV_VEC_origin, flOrigin ); entity_get_vector( iTarget, EV_VEC_origin, flTemp ); entity_get_vector( iEnt, EV_VEC_angles, flAngles );
xs_vec_sub( flTemp, flOrigin, flTemp ); xs_vec_normalize( flTemp, flTemp ); vector_to_angle( flTemp, flTemp ); new iValue[2], iController; if( (iValue[0] = floatround( flAngles[1] / 1.41, floatround_floor )) > 255 ) iValue[0] -= 255; if( (iValue[1] = floatround( flTemp[1] / 1.41, floatround_floor )) > 255 ) iValue[1] -= 255; if( (iController = iValue[1] - iValue[0]) < 0 ) iController += 255; if( (iController += 127) > 255 ) iController -= 255;
entity_set_int( iEnt, EV_INT_sequence, 2 ); entity_set_byte( iEnt, EV_BYTE_controller1, iController );
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.
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
(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(vecTargetOrigin, vecEntOrigin, vC); vector_to_angle(vC, vD);
if(vD[1] < 0.0) vD[1] += 360.0; else if (vD[1] >= 360.0) vD[1] -= 360.0;
set_controller(ent, 0, vD[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
Lo que si, como quieres que sea el comportamiento de tu entidad? A lo mejor podriamos ayudarte mas aun
Mensajes: 723
Temas: 23
Registro en: May 2014
Reputación:
22
20/11/2016, 09:30 AM
(Última modificación: 20/11/2016, 09:30 AM por KISKE.)
(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(vecTargetOrigin, vecEntOrigin, vC); vector_to_angle(vC, vD);
if(vD[1] < 0.0) vD[1] += 360.0; else if (vD[1] >= 360.0) vD[1] -= 360.0;
set_controller(ent, 0, vD[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: SetEntityAiming( iEnt, iTarget ) { static Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];
entity_get_vector( iEnt, EV_VEC_origin, flOrigin ); entity_get_vector( iTarget, EV_VEC_origin, flTemp ); entity_get_vector( iEnt, EV_VEC_angles, flAngles );
xs_vec_sub( flTemp, flOrigin, flTemp ); xs_vec_normalize( flTemp, flTemp ); vector_to_angle( flTemp, flTemp ); new iValue[2], iController; if( (iValue[0] = floatround( flAngles[1] / 1.41, floatround_floor )) > 255 ) iValue[0] -= 255; if( (iValue[1] = floatround( flTemp[1] / 1.41, floatround_floor )) > 255 ) iValue[1] -= 255; if( (iController = iValue[1] - iValue[0]) < 0 ) iController += 255; if( (iController += 127) > 255 ) iController -= 255;
entity_set_int( iEnt, EV_INT_sequence, 2 ); entity_set_byte( iEnt, EV_BYTE_controller1, iController );
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 ?
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
Las unidades angulares y las que usa el controller no son las mismas, tenlo por seguro, es un enredo horrible
Mensajes: 2,454
Temas: 14
Registro en: Oct 2013
Reputación:
51
20/11/2016, 04:25 PM
(Última modificación: 20/11/2016, 04:52 PM por Manu.)
(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: SetEntityAiming( iEnt, iTarget ) { static Float:flOrigin[3], Float:flTemp[3], Float:flAngles[3];
entity_get_vector( iEnt, EV_VEC_origin, flOrigin ); entity_get_vector( iTarget, EV_VEC_origin, flTemp ); entity_get_vector( iEnt, EV_VEC_angles, flAngles );
xs_vec_sub( flTemp, flOrigin, flTemp ); xs_vec_normalize( flTemp, flTemp ); vector_to_angle( flTemp, flTemp ); new iValue[2], iController; if( (iValue[0] = floatround( flAngles[1] / 1.41, floatround_floor )) > 255 ) iValue[0] -= 255; if( (iValue[1] = floatround( flTemp[1] / 1.41, floatround_floor )) > 255 ) iValue[1] -= 255; if( (iController = iValue[1] - iValue[0]) < 0 ) iController += 255; if( (iController += 127) > 255 ) iController -= 255;
entity_set_int( iEnt, EV_INT_sequence, 2 ); entity_set_byte( iEnt, EV_BYTE_controller1, iController );
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.
|