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.
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.
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.
Desde ya el que me pueda ayudar muchísimas gracias!
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_post( iVictim, iEnt, iAttacker, Float:iDamage, iBits )
{
if( !is_user_connected( iAttacker ) || iAttacker == iVictim || ttt_return_check( iVictim ) || ttt_is_exception( iVictim ) || !is_user_alive( iVictim ) )
return;
new tVictim = ttt_get_alivestate( iVictim );
new tAttacker = ttt_get_alivestate( iAttacker );
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_playerdata( iAttacker, PD_KARMA ) / 1000.0;
if( iModifier > 0.05 && iDamage > 0.1)
{
tDamage *= iModifier * 1.0;
if( cs_get_user_team( iAttacker ) != cs_get_user_team( iVictim ) )
tDamage *= 0.35;
if( iDamage < 1.0 )
tDamage *= 1.0;
}
else tDamage = 0.0;
gUserVar[ iVictim ][ iAttacker ] = 1;
gUserDmg[ iAttacker ][ iVictim ] += floatround( tDamage );
}
}
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_post( iVictim, iEnt, iAttacker, Float:iDamage, iBits )
{
if( !is_user_connected( iAttacker ) || iAttacker == iVictim || ttt_return_check( iVictim ) || ttt_is_exception( iVictim ) || !is_user_alive( iVictim ) )
return;
new tVictim = ttt_get_alivestate( iVictim );
new tAttacker = ttt_get_alivestate( iAttacker );
new Float:tDamage = entity_get_float( iVictim, EV_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 ) )
{
gUserVar[ iVictim ][ iAttacker ] = 1;
gUserDmg[ iAttacker ][ iVictim ] += floatround( tDamage );
}
}
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_damage( iId )
{
static iAttacker, iDamage;
iAttacker = get_user_attacker( iId );
iDamage = read_data( 2 );
static tAttacker, tVictim;
tVictim = ttt_get_alivestate( iId );
tAttacker = ttt_get_alivestate( iAttacker );
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 ) )
{
gUserVar[ iId ][ iAttacker ] = 1;
gUserDmg[ iAttacker ][ iId ] += iDamage;
gUserDmgM[ iAttacker ] += iDamage;
gUserDmgT[ iAttacker ] += iDamage;
get_time( "%H:%M", gUserHour[ iAttacker ][ iId ], charsmax( gUserHour[] ) );
}
}
Desde ya el que me pueda ayudar muchísimas gracias!