Daño recibido y provocado
#1
Bueno, se me ocurrió la idea de hacer un plugin sencillo con el mismo sistema del CS:GO que al morir te muestra el daño recibido y provocado. También te lo vuelve a mostrar cuando comienza la siguiente ronda (si no me equivoco) pero yo lo modifiqué para que lo muestre cuando termina la ronda, además si ya moriste no te lo vuelve a mostrar.

Utilicé arrays dinámicas, la verdad que no se utilizarlas muy bien pero estuve leyendo un poco y creo, CREO, que no rompí nada.
Tomo críticas y sugerencias.

Funciones:
Código:
- Funciona con el AMX OFF (para pcw, mix, etc).
- Almacena todos los atacantes, victimas, daños y cantidad de hit (se reinicia cada ronda).
- Muestra en consola el daño recibido y provocado al morir.
- En el caso de no morir, lo muestra al finalizar la ronda.

Código PHP:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>

#define PLUGIN "Damage Dealt"
#define VERSION "1.0"
#define AUTHOR "Ezq"

new Array:g_aAttackers, Array:g_aVictims, Array:g_aDamages, Array:g_aHits;
new 
bool:g_dead[33];

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR);
    
    
register_event("Damage""onDamage""b""2!0""3=0""4!0");
    
register_event("HLTV""newRound""a""1=0""2=0");
    
register_logevent("roundEnd"2"1=Round_End");
    
    
RegisterHam(Ham_Spawn"player""Ham_PlayerSpawn_Post"1);
    
    
// Creo las array
    
g_aAttackers ArrayCreate(1);
    
g_aVictims ArrayCreate(1);
    
g_aDamages ArrayCreate(1);
    
g_aHits ArrayCreate(1);
}

public 
plugin_end()
{
    
ArrayDestroy(g_aAttackers);
    
ArrayDestroy(g_aVictims);
    
ArrayDestroy(g_aDamages);
    
ArrayDestroy(g_aHits);
}

public 
plugin_cfg()
{
    
// Hago que funcione con el amx apagado (para mix, pcw, etc)
    
if(is_plugin_loaded("Pause Plugins") > -1)
    {
        
server_cmd("amx_pausecfg add ^"%s^""PLUGIN);
    }


public 
newRound()
{
    
// Limpio las array al comenzar la nueva ronda.
    
ArrayClear(g_aAttackers);
    
ArrayClear(g_aVictims);
    
ArrayClear(g_aDamages);
    
ArrayClear(g_aHits);
}

public 
roundEnd()
{
    new 
players[32], num;
    
get_players(playersnum"a");
    
    
/* Cuando termina la ronda le muestro el daño recibido y provocado
       de todos los players que están conectados y no murieron */
    
for(new 0numi++)
    {
        if(
is_user_connected(i) && !g_dead[i])
        {
            
showDamageTaken(i);
            
showDamageGiven(i);
        }
    }
}

public 
Ham_PlayerSpawn_Post(id)
{
    if(
is_user_alive(id))
    {
        
// Cuando spawnean les seteo la variable 'g_dead' en falso.
        
g_dead[id] = false;
    }
}

public 
client_death(killervictimwpnindexhitplaceTK)
{
    if(
killer != victim// Si no se suicida
    
{
        
// Al morir le muestro el daño que recibió y causó (a la victima).
        
showDamageTaken(victim);
        
showDamageGiven(victim);
    }

    
g_dead[victim] = true;
}

public 
onDamage(victim)
{    
    static 
attackerattacker get_user_attacker(victim);
    static 
damagedamage read_data(2);
    
    if(
is_user_connected(attacker))
    {    
        static 
bool:exists;
        
        
/* Busco si el atacante y la victima coinciden, de ser así,
           acumulo el daño y agrego 1 al contador de hits,
           y seteo la variable exists en verdadero (o sea, que hay coincidencia) */
        
for(new 0ArraySize(g_aAttackers); i++)
        {
            if(
ArrayGetCell(g_aAttackersi) == attacker && ArrayGetCell(g_aVictimsi) == victim)
            {
                
ArraySetCell(g_aDamagesiArrayGetCell(g_aDamagesi) + _:damage);
                
ArraySetCell(g_aHitsiArrayGetCell(g_aHitsi) + 1);
                
exists true;
                break;
            }
        }
        
        if(!
exists// Si no existe simplemente los agrego a los array.
        
{
            
ArrayPushCell(g_aAttackersattacker);
            
ArrayPushCell(g_aVictimsvictim);
            
ArrayPushCell(g_aDamages_:damage);
            
ArrayPushCell(g_aHits1);
        }
    }
}

public 
showDamageTaken(id)
{    
    
// Defino nuevas array para guardar la info y que sea mas simple mostrarla.
    
new Array: a_attackersa_attackers ArrayCreate(1);
    new Array: 
a_damagesa_damages ArrayCreate(1);
    new Array: 
a_hitsa_hits ArrayCreate(1);
    
    
/* Busco si dentro de mi array de victimas aparece el id (quien murió)
       y guardo los datos de los atacantes (id, daño, hits) en mis array secundarias.*/
    
for(new 0ArraySize(g_aVictims); i++)
    {
        if(
ArrayGetCell(g_aVictimsi) == id)
        {
            
ArrayPushCell(a_attackersArrayGetCell(g_aAttackersi));
            
ArrayPushCell(a_damagesArrayGetCell(g_aDamagesi));
            
ArrayPushCell(a_hitsArrayGetCell(g_aHitsi));
        }
    }
    
    
// Obtengo el name del player (en este caso la victima)
    
new playerName[32]; get_user_name(idplayerNamesizeof(playerName));
    
    
console_print(id"");
    
console_print(id"%s - Daño recibido"playerName);
    
console_print(id"------------------------------");
        
    
// Recorro todos los atacantes y los muestro en la consola de la victima
    
for(new 0ArraySize(a_attackers); i++)
    {
        new 
attackerName[32], damagehits;
        
        
get_user_name(ArrayGetCell(a_attackersi), attackerNamesizeof(attackerName));
        
damage ArrayGetCell(a_damagesi);
        
hits ArrayGetCell(a_hitsi);
        
        
console_print(id"Daño recibido de ^"%s^" - %d en %d hit(s)"attackerNamedamagehits);
    }
}

public 
showDamageGiven(id)
{    
    
// Defino nuevas array para guardar la info y que sea mas simple mostrarla.
    
new Array: a_victimsa_victims ArrayCreate(1);
    new Array: 
a_damagesa_damages ArrayCreate(1);
    new Array: 
a_hitsa_hits ArrayCreate(1);
    
    
/* Busco si dentro de mi array de victimas aparece el id (quien murió)
       y guardo los datos de las victimas (id, daño, hits) en mis array secundarias.*/
    
for(new 0ArraySize(g_aAttackers); i++)
    {
        if(
ArrayGetCell(g_aAttackersi) == id)
        {
            
ArrayPushCell(a_victimsArrayGetCell(g_aVictimsi));
            
ArrayPushCell(a_damagesArrayGetCell(g_aDamagesi));
            
ArrayPushCell(a_hitsArrayGetCell(g_aHitsi));
        }
    }
    
    
// Obtengo el name del player (en este caso el atacante)
    
new playerName[32]; get_user_name(idplayerNamesizeof(playerName));
    
    
console_print(id"");
    
console_print(id"%s - Daño provocado"playerName);
    
console_print(id"------------------------------");
    
    
// Recorro todos las victimas y los muestro en la consola del atacante
    
for(new 0ArraySize(a_victims); i++)
    {
        new 
victimName[32], damagehits;
        
        
get_user_name(ArrayGetCell(a_victimsi), victimNamesizeof(victimName));
        
damage ArrayGetCell(a_damagesi);
        
hits ArrayGetCell(a_hitsi);
        
        
console_print(id"Daño provocado a ^"%s^" - %d en %d hit(s)"victimNamedamagehits);
    }


EDIT: Fixeado el client_death, lo setea muerto si se suicida o no.
EDIT2: Fixeado que solo reinicie la variable 'g_dead' cuando spawnea el player. 'g_dead' ahora es bool.
EDIT3: Agregué el plugin_end, donde destruye las array.
Responder
#2
Supongo que no estaría mal que uses static en funciones que se llaman repetidas veces cuando las variables no necesariamente inicializen a cero. Además, podrías usar una variable para guardar el valor de "ArraySize" en los bucle y no llamarla cada vez que chequee la condición.

No vi el resto del código pero a simple vista parece estar bien ^_^ Gj.

EDIT: Si mal no recuerdo, las arrays dinámicas hay que destruirlas cuando termine el plugin para liberar memoria, corríjanme si me equivoco.

Saludos.
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
#3
NAnana, un aplauso para este tipo Rainbow

OFF: Realmente estas siendo un usuario ejemplar en el foro, me estoy empezando a fascinar con vos, tengo fe en que en no mucho tiempo sepas muchísimo, vas en muy buen camino.

ON: Calculo que podrías ver que onda con los bitsums, para g_dead, y en caso de que no, pues setealo a boolean.

Si le seteas que no esta muerto al revivir, no hace falta que hookees el inicio de la ronda para setear que no esta muerto (y como no podes sacar ninguno de los 2 hooks, te conviene sacar eso que seteas que no esta muerto en el inicio de la ronda, solo consume cpu al pedo) y setear la variable g_dead como boolean como dije antes.

Y acá:

Código PHP:
public client_death(killervictimwpnindexhitplaceTK)
{
    if(
killer != victim// Si no se suicida
    
{
        
// Al morir le muestro el daño que recibió y causó (a la victima).
        
showDamageTaken(victim);
        
showDamageGiven(victim);
        
g_dead[victim] = true;
    }


Tenes que setearle que esta muerto, aun cuando se haya suicidado, por mas de que no le quieras mostrar el daño.

Mas no puedo decir porque yo no se usar la arrays dinámicas Oh god why

Animo, seguí así, buen plugin!
Responder
#4
(16/02/2015, 01:08 AM)sasske escribió: NAnana, un aplauso para este tipo Rainbow

OFF: Realmente estas siendo un usuario ejemplar en el foro, me estoy empezando a fascinar con vos, tengo fe en que en no mucho tiempo sepas muchísimo, vas en muy buen camino.

ON: Calculo que podrías ver que onda con los bitsums, para g_dead, y en caso de que no, pues setealo a boolean.

Si le seteas que no esta muerto al revivir, no hace falta que hookees el inicio de la ronda para setear que no esta muerto (y como no podes sacar ninguno de los 2 hooks, te conviene sacar eso que seteas que no esta muerto en el inicio de la ronda, solo consume cpu al pedo) y setear la variable g_dead como boolean como dije antes.

Y acá:

Código PHP:
public client_death(killervictimwpnindexhitplaceTK)
{
    if(
killer != victim// Si no se suicida
    
{
        
// Al morir le muestro el daño que recibió y causó (a la victima).
        
showDamageTaken(victim);
        
showDamageGiven(victim);
        
g_dead[victim] = true;
    }


Tenes que setearle que esta muerto, aun cuando se haya suicidado, por mas de que no le quieras mostrar el daño.

Mas no puedo decir porque yo no se usar la arrays dinámicas Oh god why

Animo, seguí así, buen plugin!

Buenísimo, ahí lo fixié, no me había dado cuenta.
Responder
#5
(16/02/2015, 01:20 AM)Ezq escribió: Buenísimo, ahí lo fixié, no me había dado cuenta.

Y lo del g_death? Oh god why
Responder
#6
(16/02/2015, 01:21 AM)sasske escribió:
(16/02/2015, 01:20 AM)Ezq escribió: Buenísimo, ahí lo fixié, no me había dado cuenta.

Y lo del g_death? Oh god why

No entendí, si podrías explicarlo un poco mejor, tal vez jaja.
Lo que hago es no mostrarlo 2 veces, si no muere, lo muestro al final de la ronda, por eso la variable y cuando vuelve a empezar la ronda, la reinicio.
Responder
#7
(16/02/2015, 01:25 AM)Ezq escribió:
(16/02/2015, 01:21 AM)sasske escribió:
(16/02/2015, 01:20 AM)Ezq escribió: Buenísimo, ahí lo fixié, no me había dado cuenta.

Y lo del g_death? Oh god why

No entendí, si podrías explicarlo un poco mejor, tal vez jaja.
Lo que hago es no mostrarlo 2 veces, si no muere, lo muestro al final de la ronda, por eso la variable y cuando vuelve a empezar la ronda, la reinicio.

Si pasa que la reinicias cuando inicia la ronda y la reinicias cuando el cliente revive, osea la reinicias 2 veces al pedo Roflmao

No la reinicies cuando empieza la ronda, reiniciala solo cuando el cliente revive.

Y pone a la variable como boolean

new bool:g_dead[33] ya que solo la usas como verdadero/falso

Si tenes ganas de aprender y de optimizar hasta el ultimo bit tipo los #pandas podes leerte este tuto:

https://amxmodx-es.com/Thread-Bitsums
Responder
#8
(16/02/2015, 01:27 AM)sasske escribió:
(16/02/2015, 01:25 AM)Ezq escribió:
(16/02/2015, 01:21 AM)sasske escribió:
(16/02/2015, 01:20 AM)Ezq escribió: Buenísimo, ahí lo fixié, no me había dado cuenta.

Y lo del g_death? Oh god why

No entendí, si podrías explicarlo un poco mejor, tal vez jaja.
Lo que hago es no mostrarlo 2 veces, si no muere, lo muestro al final de la ronda, por eso la variable y cuando vuelve a empezar la ronda, la reinicio.

Si pasa que la reinicias cuando inicia la ronda y la reinicias cuando el cliente revive, osea la reinicias 2 veces al pedo Roflmao

No la reinicies cuando empieza la ronda, reiniciala solo cuando el cliente revive.

Y pone a la variable como boolean

new bool:g_dead[33] ya que solo la usas como verdadero/falso

Si tenes ganas de aprender y de optimizar hasta el ultimo bit tipo los #pandas podes leerte este tuto:

https://amxmodx-es.com/Thread-Bitsums

Buenísimo, no me dí cuenta! Ahí lo fixié, gracias.
Responder
#9
No es por tirarte el tut abajo es mas ni lo lei pero el cs creo q ya traia por default un plugin q hacia esto de mostrar el daño aunque hace mucho q no juego al cs y puedo equivocarme y capaz q era algun otro plugin externo

bueno con respecto al lo que hiciste no lo lei pero podrias destruir los array en plugin_end para liberar memoria
[TUT] Carnage

Fight

"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"

Anónimo
Responder
#10
(16/02/2015, 02:19 AM)mongito100 escribió: No es por tirarte el tut abajo es mas ni lo lei pero el cs creo q ya traia por default un plugin q hacia esto de mostrar el daño aunque hace mucho q no juego al cs y puedo equivocarme y capaz q era algun otro plugin externo

bueno con respecto al lo que hiciste no lo lei pero podrias destruir los array en plugin_end para liberar memoria

De hecho, es el miscstats, pero quise hacer algo sencillo, similar sí, y que tenga una única función.
Y no es un tutorial!, es un aporte Sonrisa

Por cierto, gracias por el consejo, ahí añadí el plugin_end y destruyo las array.
Responder
#11
Hola! De donde me puedo bajar ese plugin?
Me gustaría que cuando te maten, te diga cuantos tiros te dieron cada uno y cuantos tiros hiciste daño.

Mil gracias!
Alan
Responder
#12
Lo estaba buscando, lo voy a probar!
+10 Mario
Responder
#13
gente consulta

lo probe con un amigo pero en la consola me aparece asi:

Tu nombre - Daño recibido
--------------------------------
Tu nombre - Daño provocado
-----------------------------------
Responder
#14
Buen aporte
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#15
buen aporte una pregunta como puedo unir daño recibido y daño provocado en un solo say
Responder
#16
[/quote]
por que reviven un tema viejo? Trolleyes Trolleyes
Tengo un problema con los emotes  Whatdone 

Ayuda  Whatdone 
Responder
#17
por que reviven un tema viejo?  Trolleyes  Trolleyes
[/quote]

y para que abrir un tema nuevo si puede preguntar en el mismo post?
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)