attach_view (tal vez un problema)
#1
Buenos días, hacia mucho tiempo que no pasaba por aquí, hasta que el destino me desvió acá de nuevo ?)...en fin.

Recientemente estuve realizando algunas pruebas y experimente algo para mi gusto no tan agradable, por lo que me decidí a pedir ayuda en el foro-ingles, pero tal parece que nadie ha podido responder a mi cuestionamiento (quizás tengan sus razones, no empezare a jugarlos tampoco). El punto es que, como dije, realizando pruebas con la native attach_view me paso algo raro (o simplemente algo que quizá por nunca cuestionarlo no llegue a descubrir) y es que, al hace uso de esta función tenia un "issue" con respecto a los ángulos de visualización; para una mejor comprensión explicare toda la historia (y si no les interesa puede ir al final donde estará lo relacionado al issue):

Lo que estaba haciendo era crear una entidad de tipo info_target que quería utilizar para "simular" un arma (creo que ya ven a donde me dirijo).

Primeramente pensé, en que era mas sencillo hacer que dicha entidad siempre apareciera en frente de la vista del jugador (vía AddtoFullPack, aunque podría haber utiliza otras alternativas con igual efecto), pero eso me traía consigo el problema de la tan odiada predicción del cliente, cosa que se nota en un dedicado así tus ms sean 3~6 (imagina como serian a 30~60, horroroso). En este punto imagine por un segundo diseñar un algoritmo para de alguna manera "predecir" las acciones del jugador con respecto a esta "arma" para hacer mas fluido su movimiento, pero luego cai en la cuenta de que, dejando de lado lo costoso que me saldría en mi opinión, igual tendría que esperar a que el server le enviara la info al cliente -> por lo cual la predicción -> algoritmo inservible.

Así que luego pensé (en realidad vi un código y se me vivo a la mente utilizarla) en usar la native attach_view (pfnSetView) y ver que tal. Obviamente, como es de esperar, con esto por defecto la cámara estaría fija en la posición donde la colocara sin posibilidad de actualizar sus ángulos (en este punto ya no quería seguir)......hasta que recordé que si actualizaba los pev->angles de esta entidad con los del jugador quizá tal ves podría servir, y vaya que funciono pero utilizando en vez los pev->v_angles del jugador; todo bien hasta acá.

El problema viene debido a que, al actualizar los ángulos de la entidad con los v_angles (pasa lo mismo si uso los angles) del jugador, al efectuar un movimiento de mirada hacia arriba, el modelo que tiene la cámara ira en la posición opuesta ,esto es, hacia abajo; mientras que los ángulos de la entidad y por ende tu visión (debido al uso de attach_view) seguirán los ángulos correctos del jugador, por lo tanto --> issue.

Resumiendo: si yo utilizo attach_view y asigno la visión del jugador a una entidad, y luego renderizo esta entidad (no lo había aclarado, por cierto), y luego actualizo los ángulos de esta "cámara" con los del jugador, y luego miro hacia arriba o hacia abajo -> el modelo de la entidad que estoy renderizando ira hacia abajo/arriba mientras que tus ángulos de visión irán arriba/abajo, dependiendo del movimiento.

Algunas cosas que quisiera dejar en claro:
  • Si, la intención principal de esto es encontrar la forma de customizar las armas via server-side (no solo poder cambiar cosas como el pev->body, si no también el pev->skin, darle glow al arma, luz propia, etc).

  • Todo esto debido a que, si se percataron, lo que utilizo es una entidad del server.

  • Independientemente de si se puede hacer lo que dije en el primer punto o no, quiero compartir esto, por que quizá alguien pueda sacar a la luz mas información.

  • Utilizando esta manera de custom-weapons podemos obtener una mejor fluidez con el arma (debido a la predicción del jugador), cosa que no pasa cuando, por ejemplo, usamos AddtoFullPack para situar la entidad en frente de la vista del jugador todo el tiempo (para que vean un caso mas conocido).

  • Debido a que no tengo acceso al source-code del engine de la parte del cliente del hlds, muchas cosas de las que estoy diciendo podrían no ser ciertas o ser algo diferences. Si, se que primero debía informarme bien, pero debido a limitaciones de tiempo por el trabajo y la experiencia, es lo que pude observar.


Y ya para culminar, quiero dejar el código que estoy utilizando actualmente:
Código PHP:
#include    AMXMODX 
#include    ENGINE 

new bool:g_bInvertYaw

public 
plugin_init() 

    register_clcmd("__weapon__""__give_weapon__"); 
    register_clcmd("invert_angle""invert_angle"); 


public 
invert_angle() g_bInvertYaw = !g_bInvertYaw

public 
__give_weapon__(const iPlayer

    // It's only for testing purpose; code can be improved a lot, I know :)... 
    
    
new Float:fCoords[3]; 
    entity_get_vector(iPlayerEV_VEC_originfCoords); 
    
    fCoords
[2] += 35.0
    
    
new iWeapon create_entity("info_target"); 
    
        entity_set_origin(iWeaponfCoords); 
        etity_set_model(iWeapon"models/v_ak47.mdl"); 
        
        entity_set_string
(iWeaponEV_SZ_classname"__custom_weapon__"); 
        entity_set_edict(iWeaponEV_ENT_owneriPlayer); 
        entity_set_float(iWeaponEV_FL_nextthink0.001); 
        
        
// I think doesn't necessary explain what it does.. 
        attach_view(iPlayeriWeapon); 
        
        register_think
("__custom_weapon__""__think_custom_weapon__"); 
    


public 
__think_custom_weapon__(const iEnt

    new iOwner entity_get_edict(iEntEV_ENT_owner); 
    
    
/* 
    Here I set custom-weapon's angles to the player's view-angles 
    However even if I reverse they (more precisely the yaw-angle), the up/down view will be reverse "again" 
    
    I can't explain better this, so when you test code you will see what i've saying 
    */ 
    
    
static Float:fViewAngles[3]; 
    entity_get_vector(iOwnerEV_VEC_v_anglefViewAngles); 
    
    
// What I'm doing here is reverse the up/down angle (for testing) but doesn't not have effect 
    if (g_bInvertYaw
        fViewAngles[0] = -fViewAngles[0]; 
    
    entity_set_vector
(iEntEV_VEC_anglesfViewAngles); 
    entity_set_float(iEntEV_FL_nextthink0.001); 
}
  

Y aquí una explicación de por qué en el think de la entidad estoy invirtiendo el angulo[0]
Cita:Now, the reason what I'm reverse the yaw-angle on weapon's think is because before testing this way, I was creating this entity and in each frame I put his coords in front on player's view (by hooking pfnAddToFullPack), nothing new really; The thing is if I use the player's v_angles I need to reverse the yaw-angle so that the custom-weapon ent will aim correctly. So i was thinking doing that here will work too, but it seems that not.

I hope you will understand now better this.

Again sorry for my bad english, and sorry if this can be considered "bump"

Asi que eso seria todo, espero con ansias cualquier respuesta, y espero sacar a la luz mas información por que sinceramente (no les voy a mentir), me dio esperanzas de que con esta manera podemos customizar mucho mas las armas.

Algunas capturas:

- Posición por defecto de la camara
[Imagen: wIbPwvi.jpg]

- Al mirar hacia arriba
[Imagen: FHtw4cm.jpg]

- Al mirar hacia abajo
[Imagen: d2L1cVy.jpg]


Saludos.
Responder
#2
El error parece estar en attach_view.

He probado esto (con el código que has puesto ahí, imagino que tendrás más).

Crea la entidad, y funciona a la inversa, es verdad.
Ahora reinicia la ronda, el model se queda flotando en el aire y sigue inverso.
Por último ejecuta el comando de invertir y prueba. Verás como funciona bien.

Ni idea de cómo solucionarlo por ahora. Solo te explico lo que pude probar.

Te sugiero crear el tema en dev-cs.ru y simplificar la forma de explicar. No es necesario tanta explicación jajajaja.

EDITO
Probado también con engfunc(EngFunc_SetView, iPlayer, iWeapon) y ocurre el mismo problema.

Todo tiene pinta de ser el SET_VIEW que usan las natives.
Una posible solución sería invertir el ángulo en el SET_VIEW que se manda de la native.
Para prevenir problemas de compatibilidad con otros plugins ya funcionando, hacer un nuevo parámetro para decidir invertir los ángulos o no.
No se me ocurre otra cosa, ni idea de cómo hacerlo, eso ya escapa de mis conocimientos.

Aquí me refiero:
Código:
// Attachview, this allows you to attach a player's view to an entity.
// use AttachView(player, player) to reset view.
//(vexd)
static cell AMX_NATIVE_CALL attach_view(AMX *amx, cell *params)
{
    int iIndex = params[1];
    int iTargetIndex = params[2];

    CHECK_ENTITY(iIndex);
    CHECK_ENTITY(iTargetIndex);

    SET_VIEW(TypeConversion.id_to_edict(iIndex), TypeConversion.id_to_edict(iTargetIndex));

    return 1;
}
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#3
(03/04/2021, 05:16 AM)RauliTop escribió: El error parece estar en attach_view.

He probado esto (con el código que has puesto ahí, imagino que tendrás más).

Crea la entidad, y funciona a la inversa, es verdad.
Ahora reinicia la ronda, el model se queda flotando en el aire y sigue inverso.
Por último ejecuta el comando de invertir y prueba. Verás como funciona bien.

Ni idea de cómo solucionarlo por ahora. Solo te explico lo que pude probar.

Te sugiero crear el tema en dev-cs.ru y simplificar la forma de explicar. No es necesario tanta explicación jajajaja.

EDITO
Probado también con engfunc(EngFunc_SetView, iPlayer, iWeapon) y ocurre el mismo problema.

Todo tiene pinta de ser el SET_VIEW que usan las natives.
Una posible solución sería invertir el ángulo en el SET_VIEW que se manda de la native.
Para prevenir problemas de compatibilidad con otros plugins ya funcionando, hacer un nuevo parámetro para decidir invertir los ángulos o no.
No se me ocurre otra cosa, ni idea de cómo hacerlo, eso ya escapa de mis conocimientos.

Aquí me refiero:
Código:
// Attachview, this allows you to attach a player's view to an entity.
// use AttachView(player, player) to reset view.
//(vexd)
static cell AMX_NATIVE_CALL attach_view(AMX *amx, cell *params)
{
int iIndex = params[1];
int iTargetIndex = params[2];

CHECK_ENTITY(iIndex);
CHECK_ENTITY(iTargetIndex);

SET_VIEW(TypeConversion.id_to_edict(iIndex), TypeConversion.id_to_edict(iTargetIndex));

return 1;
}

Excitedeyes


Muchas gracias por comentar; si el tema de la explicación creo que se me paso un poco jaja pero queria dejar detallado todo para que entendieran el panorama completo, en fin:


(03/04/2021, 05:16 AM)RauliTop escribió: Crea la entidad, y funciona a la inversa, es verdad.
Ahora reinicia la ronda, el model se queda flotando en el aire y sigue inverso.
Por último ejecuta el comando de invertir y prueba. Verás como funciona bien.


Esto fue una de las primeras cosas que me percate, y eso pasa (si usastes el código que di de ejemplo) por que usando el v_angle debo invertir el yaw de por si, para que el modelo vaya acorde a la visión del jugador pero el tema es que no funciona. Añade esto al código:


Código PHP:
public plugin_init() 
{
 
//...........
 
register_clcmd("__restore__""__restore__")


public 
__restore__(const iPlayer)
{
 new 
iEnt find_ent_by_class(-1"__custom_weapon__");
 
 if (
iEnt)
 
attach_view(iPlayeriEnt);



Y ejecuta los mismos pasos:
- Crea la entidad, luego mira al suelo
- Reinicia la ronda
- Invierte los angulos (todo bien aca)
- Ahora vuelve a cambiar la vista a la camara -> volves a lo mismo, el modelo se invierte  Whatdone


(03/04/2021, 05:16 AM)RauliTop escribió: Todo tiene pinta de ser el SET_VIEW que usan las natives.
Una posible solución sería invertir el ángulo en el SET_VIEW que se manda de la native.


Pero es que directamente todas las natives iran al mismo sitio -> PF_setview_I
la cual a su vez -> envia un SVC_SETVIEW al jugador afectado

Y en ningun momento de la rutina se ven involucrados angulos Whatdone

Sacado del ReHLDS:

Código PHP:
void EXT_FUNC PF_setview_I(const edict_t *clientent, const edict_t *viewent)
{
 
int clientnum NUM_FOR_EDICT(clientent);
 if (
clientnum || clientnum g_psvs.maxclients)
 
Host_Error("%s: not a client"__func__);

 
client_t *client = &g_psvs.clients[clientnum 1];
 if (!
client->fakeclient)
 {
 
client->pViewEntity viewent;
 
MSG_WriteByte(&client->netchan.messagesvc_setview); //  magia
 
MSG_WriteShort(&client->netchan.messageNUM_FOR_EDICT(viewent));
 }



Y no, enviando por mi cuenta un SVC_SETVIEW tampoco soluciona el problema

No sé por qué pero presiento que la causa se deba a la manera en que el cliente renderiza su view-ent, pero solo especulo.

De igual manera, muchas gracias por tu ayuda  Cutecry

Saludos.
Responder
#4
Estoy probando cosas y ya ni idea de qué hacer.

Has probado con otro model que no sea v_ ?
A ver si está ahí el problema, aunque lo dudo ya...
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#5
(03/04/2021, 09:22 AM)RauliTop escribió: Estoy probando cosas y ya ni idea de qué hacer.

Has probado con otro model que no sea v_ ?
A ver si está ahí el problema, aunque lo dudo ya...

Tranquilo, te entiendo yo pase por lo mismo Roflmao Whatdone
Y si, he probado con otros modelos (models/chick.mdl creo que se llamaba) y pasa lo mismo.

Algo que se me ocurrió era descargarme un HL vainilla y compilar el HLDSK (client-dll & server-dll) e ir testeando de los dos lados; hace tiempo que ya lo había hecho. Asi me dare cuenta en que parte ocurre el problema y si se puede fixear

De ultima tocara reportarlo como un issue en github pero ahorita no tengo tiempo para hacerlo xq ando en el trabajo; sin mencionar la pagina rusa que me comentaste jaja.

De igual manera, muchas gracias y si, tocara seguir probando Whatever

Saludos.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)