[SOLUCIONADO] Marca mal el daño TTT MOD
#1
Hola buenas tardes, tengo un problema con el ttt mod, empece a hacer un plugin para dicho mod el cual consiste en marcar el daño incorrecto del jugador, es decir si un jugador es detective y le hace daño a un inocente es incorrecto...
Probé de 3 formas diferentes checkear estos daños, pero siempre tuve un problema con las 3.

El primer método con takedamage tal cual como lo hace el TTT: De esta forma siempre me daba un daño que no realizamos, si habíamos echo 3 de daño marcaba como 7.
Código PHP:
public Ham_TakeDamage_postiVictimiEntiAttackerFloat:iDamageiBits )
{
    if( !
is_user_connectediAttacker ) || iAttacker == iVictim || ttt_return_checkiVictim ) || ttt_is_exceptioniVictim ) || !is_user_aliveiVictim ) )
        return;

    new 
tVictim ttt_get_alivestateiVictim );
    new 
tAttacker ttt_get_alivestateiAttacker );
    new 
Float:tDamage iDamage;

    if( ( 
tAttacker == PC_TRAITOR && tVictim == PC_TRAITOR 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_INNOCENT 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_INNOCENT ) )
    {
        new 
Float:iModifier ttt_get_playerdataiAttackerPD_KARMA ) / 1000.0;
        
        if( 
iModifier 0.05 && iDamage 0.1)
        {
            
tDamage *= iModifier 1.0;
            if( 
cs_get_user_teamiAttacker ) != cs_get_user_teamiVictim ) )
                
tDamage *= 0.35;

            if( 
iDamage 1.0 )
                
tDamage *= 1.0;
        }
        else 
tDamage 0.0;
        
        
gUserVariVictim ][ iAttacker ] = 1;
        
gUserDmgiAttacker ][ iVictim ] += floatroundtDamage );
    }


El segundo método también con takedamage usando la función entity_get_float del engine me marcaba perfectamente, pero al tener bajo karma el usuario exageraba el daño por así decirlo.
Código PHP:
public Ham_TakeDamage_postiVictimiEntiAttackerFloat:iDamageiBits )
{
    if( !
is_user_connectediAttacker ) || iAttacker == iVictim || ttt_return_checkiVictim ) || ttt_is_exceptioniVictim ) || !is_user_aliveiVictim ) )
        return;

    new 
tVictim ttt_get_alivestateiVictim );
    new 
tAttacker ttt_get_alivestateiAttacker );
    new 
Float:tDamage entity_get_floatiVictimEV_FL_dmg_take ) );

    if( ( 
tAttacker == PC_TRAITOR && tVictim == PC_TRAITOR 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_INNOCENT 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_INNOCENT ) )
    {
        
gUserVariVictim ][ iAttacker ] = 1;
        
gUserDmgiAttacker ][ iVictim ] += floatroundtDamage );
    }


El tercer método usando el evento damage me marcaba bien el daño realizado pero si el usuario tenia 10 de vida y le hacías un head haciendo 20 de daño sumaba esos 20 y no los 10.
Código PHP:
public on_damageiId )
{
    static 
iAttackeriDamage;
    
iAttacker get_user_attackeriId );
    
iDamage read_data);
    
    static 
tAttackertVictim;
    
tVictim ttt_get_alivestateiId );
    
tAttacker ttt_get_alivestateiAttacker );
    
    if( ( 
tAttacker == PC_TRAITOR && tVictim == PC_TRAITOR 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_DETECTIVE 
    || ( 
tAttacker == PC_INNOCENT && tVictim == PC_INNOCENT 
    || ( 
tAttacker == PC_DETECTIVE && tVictim == PC_INNOCENT ) )
    {
        
gUserVariId ][ iAttacker ] = 1;
        
        
gUserDmgiAttacker ][ iId ] += iDamage;
        
gUserDmgMiAttacker ] += iDamage;
        
gUserDmgTiAttacker ] += iDamage;
        
        
get_time"%H:%M"gUserHouriAttacker ][ iId ], charsmaxgUserHour[] ) );
    }


Desde ya el que me pueda ayudar muchísimas gracias!
Responder
#2
Cita:El tercer método usando el evento damage me marcaba bien el daño realizado pero si el usuario tenia 10 de vida y le hacías un head haciendo 20 de daño sumaba esos 20 y no los 10.

Puedes verificar si el daño es mayor a su vida tome el valor de la vida, si no el valor del daño generado
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016, 05:05 PM)meTaLiCroSS escribió: Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019, 05:32 PM)meTaLiCroSS escribió: grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
Responder
#3
(27/10/2018, 08:19 PM)totopizza escribió:
Cita:El tercer método usando el evento damage me marcaba bien el daño realizado pero si el usuario tenia 10 de vida y le hacías un head haciendo 20 de daño sumaba esos 20 y no los 10.

Puedes verificar si el daño es mayor a su vida tome el valor de la vida, si no el valor del daño generado

Hice algo similar, ya que chequeando la vida en el evento damage me tiraba valores negativos, lo que hice fue chequear en takedamage pre la vida y almacenarla en una variable y luego comprobar si el daño es mayor a su vida le seteo el valor de la vida.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)