Dropear balas al morir
#1
Dropeo de balas al morir


Descripción del plugin
Como dice el título, al morir un jugador dropea un pack de balas que puede ser pickeado por cualquier otro jugador que disponga de un arma primaria o secundaria en su inventario y que no tenga al máximo la munición de la misma.


Cvar
drop_porcentaje (default: 10.0)
- Valores menores o iguales a 0 desactivan el plugin el funcionamiento del plugin.
- Valores entre 0 y 100 serán el porcentaje de posibilidades de que se dropee el pack de balas.
- Valores mayores o iguales a 100 hará que se dropeen balas siempre.

drop_por_tipo (default: 1)
- En 0, permite pickear cualquier pack de balas.
- Valores distintos de 0, solo permite pickear balas si son del mismo tipo que usa alguna de las armas del inventario.

drop_max_cajas (default: 50)
- Valores menores o iguales a 0 desactivan el spawn de cajas.
- Valores mayores que 0 definen la máxima cantidad de cajas a spawnear.


Utilidad
Para cualquier modalidad de juego donde se deba sobrevivir suficiente tiempo y no se disponga de munición infinita o buyzones en todo el mapa.


Requerimientos del plugin
Los dos models usados por el plugin son del half life, y el sonido viene por defecto con el CS, por lo que no es necesario instalarlos. Sin embargo, están adjuntos en caso de que alguien los requiera.


Capturas
   
   


Cosas para hacer
* Guardado de balas por tipo.
* Permitir guardado de más de un tipo de ammo en la misma caja de balas.
* Esperar más sugerencias.


Créditos
* meTaLiCroSS (compresión de dígitos)
* Nanox (testing Gran sonrisa)


Código:
Changelog:

    v 1.0
    - Primer release.

    v 1.1
    - Removido el model T.
    - Removido los bitsum innecesarios.
    - Se cambio el deathmessage por ham_killed para checkear que tenga balas para dropear.

    v 1.2
    - Removidas las funciones de fakemeta.
    - Ajustado el size de la entidad al del model.

    v 1.3
    - Agregada cvar para configurar si las balas pickeadas son por tipo o no.
    - Removidas las funciones de fun.
    - Cambiado el stock de checkeo.
    - Agregado el sound del pickup.

    v 1.4
    - Disminuido el size de la entidad para evitar posibles stuck en muros.
    - Agregado guardado de múltiples tipos de bala en una sola caja.
    - Agregado limite de cajas spawneadas.


Si bien el plugin es muy simple, se aceptan sugerencias y críticas constructivas Sonrojado


Archivos adjuntos
.sma   Descargar AMXX / dropear_balas_v1.3.sma (Tamaño: 5.61 KB / Descargas: 158)
.sma   Descargar AMXX / dropear_balas_v1.2.sma (Tamaño: 4.56 KB / Descargas: 139)
.zip   recursos.zip (Tamaño: 38.57 KB / Descargas: 67)
.sma   Descargar AMXX / dropear_balas_v1.4.sma (Tamaño: 9.7 KB / Descargas: 253)
Whatdone
Responder
#2
que no ya existía un plugin con la misma función?
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#3
(17/09/2014, 03:12 PM)kikizon2 escribió: que no ya existía un plugin con la misma función?

Pues si existe estará escondido en algún oscuro rincón de algún foro porqe no fui capaz de encontrarlo
Whatdone
Responder
#4
Buen plugin.
Cuando tenga tiempo, leo el código.

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#5
(17/09/2014, 03:41 PM)alan_el_more escribió: Buen plugin.
Cuando tenga tiempo, leo el código.

Gracias Gran sonrisa estaré esperando las críticas!
Whatdone
Responder
#6

  1. Estas botando balas que no son ni tuyas, practicamente es un regalo jaja
  2. Nunca ha sido obligacion precachear un model T, menos si todos lo tienen por defecto en su juego

Es sencillo, limpiaria un poco más el codigo de todas maneras
Responder
#7
Código PHP:
public death_msg_function()
{
    new 
attacker read_data(1)
    new 
victim read_data(2)

    if(
is_user_connected(attacker) && is_user_connected(victim) && random_float(1.0100.0) <= get_pcvar_float(cvar_porcentaje))
        
spawn_ammopack(victim)

Aca en mi opinion no hace falta chekear que el atacante este conectado por si se suicida.

Código PHP:
public fw_touch(ammopackid)
{
    if(!
pev_valid(ammopack) || !is_user_alive(id))
        return

    new 
weapons[32], num
    get_user_weapons
(idweaponsnum)
    for(new 
0numi++)
    {
        if(
bitsum_armas_primarias & (1<<weapons[i]) || bitsum_armas_secundarias & (1<<weapons[i]))
        {
            if(
cs_get_user_bpammo(idweapons[i]) < weaponsdata[weapons[i]][weapon_ammo])
            {
                
give_item(idweaponsdata[weapons[i]][ammo_name])
                
engfunc(EngFunc_RemoveEntityammopack)
                break
            }
        }
    }
    return

Lei en AM que es mas conveniente re-indexar la variable del loop, asi:
Código PHP:
public fw_touch(ammopackid)
{
    if (!
pev_valid(ammopack) || !is_user_alive(id))
        return;
    
    new 
weapons[32], numweapon_num
    get_user_weapons
(idweaponsnum)
    for (new 
0numi++)
    {
        
weapon_num weapons[i]
        
        if (
bitsum_armas_primarias & (1<<weapon_num) || bitsum_armas_secundarias & (1<<weapon_num))
        {
            if (
cs_get_user_bpammo(idweapon_num) < weaponsdata[weapon_num][weapon_ammo])
            {
                
give_item(idweaponsdata[weapon_num][ammo_name])
                
engfunc(EngFunc_RemoveEntityammopack)
                break;
            }
        }
    }
    
    return;

y podrias usar hamsandwich para facilitar algunas cosas.
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#8
Gracias meTaLiCroSS y Kane!

Adjunto nuevo sma. Post actualizado ^^
Whatdone
Responder
#9
Hitbox más exacto
Código PHP:
entity_set_size(ammoFloat:{-16.95, -0.43, -5.76}, Float:{10.0714.1812.77}) 

Sacado con el HLMV
Código:
Hitbox 1 Bounding Box Min: -16.950001 -5.760000 -0.430000
Hitbox 1 Bounding Box Max: 10.070000 12.770000 14.180000

O con éste stock -> https://amxmodx-es.com/Thread-Obtener-mi...-un-modelo

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#10
Gracias alan!

Actualizado el sma.
Whatdone
Responder
#11
RainbowRainbow
Buen plugin Proud
[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
#12
(18/09/2014, 07:38 PM)totopizza escribió: RainbowRainbow
Buen plugin Proud

Gracias! Tímido
Sigo aceptando críticas y sugerencias
Whatdone
Responder
#13
Esta bien el plugin pero ya lo dijo metal mejor en el classname el tipo de ammo para que en el touch si el usuario que la toco tiene una arma con el mismo ammo le des el ammo y tambien guarda en iuser o lo que sea cuantas balas tenia y el sonidito al comprar balas ponerselo en el touch no estaria mal
Todos los MODS VHL totalmente gratuitos  Descarga Aqui

Mis plugins:
STEAM: https://steamcommunity.com/id/Metrikcz/
FB: fb.com/rwoong
Venta plugins a pedido en México mándame MP
Responder
#14
(18/09/2014, 09:36 PM)Metrikcz escribió: Esta bien el plugin pero ya lo dijo metal mejor en el classname el tipo de ammo para que en el touch si el usuario que la toco tiene una arma con el mismo ammo le des el ammo y tambien guarda en iuser o lo que sea cuantas balas tenia y el sonidito al comprar balas ponerselo en el touch no estaria mal

Gracias Metrikcz!
Ahora discrimina por tipo de ammo; guarda y setea la cantidad exacta de bpammo que tenia el arma. Y como tuve que remover el fun, agregué el sonido Gran sonrisa

Nueva versión adjunta!
Whatdone
Responder
#15
Con el cambio del tamaño de la entidad, revisaste si la caja se buguea si mueres pegado a una muralla?
Responder
#16
(20/09/2014, 12:59 AM)meTaLiCroSS escribió: Con el cambio del tamaño de la entidad, revisaste si la caja se buguea si mueres pegado a una muralla?

Estuve testeando con los bot por lo menos una hora y no vi qe suceda eso ( y ellos suelen estar campeando en los rincones D: ). Igual planeo cambiar el tipo de solid en la proxima versión.
Whatdone
Responder
#17
(20/09/2014, 01:23 AM)NikKOo31 escribió:
(20/09/2014, 12:59 AM)meTaLiCroSS escribió: Con el cambio del tamaño de la entidad, revisaste si la caja se buguea si mueres pegado a una muralla?

Estuve testeando con los bot por lo menos una hora y no vi qe suceda eso ( y ellos suelen estar campeando en los rincones D: ). Igual planeo cambiar el tipo de solid en la proxima versión.

Sea trigger o bbox puede buguearse. Si fuera yo, le pondria trigger y los tamaños x e y los reduciria a la mitad. No influira en nada, de todas maneras los jugadores deberian pasar por arriba de la cajita.
Responder
#18
(20/09/2014, 01:29 AM)meTaLiCroSS escribió: Sea trigger o bbox puede buguearse. Si fuera yo, le pondria trigger y los tamaños x e y los reduciria a la mitad. No influira en nada, de todas maneras los jugadores deberian pasar por arriba de la cajita.

Roger that! Había usado trigger en la primer versión, no recuerdo porqué lo cambie a bbox.
Todavía estoy buscando la forma de poder guardar los 10 tipos distinto de ammo en una sola caja. Apenas tenga nueva versión, actualizo el post.
Whatdone
Responder
#19
(20/09/2014, 01:43 AM)NikKOo31 escribió:
(20/09/2014, 01:29 AM)meTaLiCroSS escribió: Sea trigger o bbox puede buguearse. Si fuera yo, le pondria trigger y los tamaños x e y los reduciria a la mitad. No influira en nada, de todas maneras los jugadores deberian pasar por arriba de la cajita.

Roger that! Había usado trigger en la primer versión, no recuerdo porqué lo cambie a bbox.
Todavía estoy buscando la forma de poder guardar los 10 tipos distinto de ammo en una sola caja. Apenas tenga nueva versión, actualizo el post.

https://amxmodx-es.com/Thread-TUT-Compre...de-digitos

Creo que ya lo leiste. Ya que la maxima cantidad de ammo que puede tener un arma es la M249 con 200 balas, seria 1 byte por ammotype, 8*10 = 80, con 3 entvars puedes almacenar todo. Si se me quita el hambre te doy un code.
Responder
#20
(20/09/2014, 01:55 AM)meTaLiCroSS escribió: https://amxmodx-es.com/Thread-TUT-Compre...de-digitos

Creo que ya lo leiste. Ya que la maxima cantidad de ammo que puede tener un arma es la M249 con 200 balas, seria 1 byte por ammotype, 8*10 = 80, con 3 entvars puedes almacenar todo. Si se me quita el hambre te doy un code.

Sos el primer chileno que entra a mi lista de gente favorita (?)
Lo leí muy por arriba y no se me ocurrió darle uso xD
Ahora me pongo a probar :3

Te daría un :bacon: pero no sé si esta en este foro
Edit* No, no esta el bacon Triste
Whatdone
Responder
#21
La pensé bastante diria yo

Código PHP:
const AMMO_BITS // 8 bits = 1 byte, máximo 255
const BIT_MASK = (1<<AMMO_BITS) - // 256 - 1 = 255 = 0b11111111
new const EV_INT_AMMOVARS[] = { EV_INT_weaponanimEV_INT_bInDuckEV_INT_flTimeStepSound };

#define INT_BYTES 4

StoreAmmo(const iEntity, const iAmmoIdiAmount)
{
    new 
iPos GetAmmoIdPosition(iAmmoId)
    
    if(
iPos == -1// ocurriria en casos que iAmmoId sea mayor a 12, que no deberia suceder...
        
return 0;
        
    
// algo complicado este algoritmo
    // aqui obtengo cuantos bits a la izquierda debo mover
    // es por eso que saco el total de bits ((iAmmoId-1)*AMMO_BITS)
    // y dependiendo de iPos (0,1,2)
    // es la cantidad de veces que le restare 32 (iPos*INT_BYTES*8)
    // (el iAmmoId-1 va ahi porque el primero corre 0 bits a la izquierda
    
new iLeftBits = ( (iAmmoId-1) * AMMO_BITS ) - ( iPos INT_BYTES*);
    new 
iCurrentAmmoValue entity_get_int(iEntityEV_INT_AMMOVARS[iPos]);
    
    
entity_set_int(iEntityEV_INT_AMMOVARS[iPos], (iAmount<<iLeftBits) | iCurrentAmmoValue);
    return 
1;
}

GetPackedAmmo(const iEntityiOutammo[], iMaxAmmoId 10)
{
    new 
iRightBitsiPosiPacked[sizeof EV_INT_AMMOVARS];
    for(
iPos 0iPos sizeof EV_INT_AMMOVARSiPos++)
    {
        
iPacked[iPos] = entity_get_int(iEntityEV_INT_AMMOVARS[iPos])
        
entity_set_int(iEntityEV_INT_AMMOVARS[iPos], 0)
    }
    
    for(new 
iAmmoId 1iAmmoId <= iMaxAmmoIdiAmmoId++)
    {
        
iOutammo[iAmmoId] = (iPacked[iPos] >> iRightBits) & BIT_MASK
        iRightBits 
+= AMMO_BITS
        
        
if(iRightBits > ((INT_BYTES*8) - AMMO_BITS)) 
        
// en teoria estoy preguntando
        // si la cantidad de bits que muevo a la derecha
        // es suficiente para obtener a lo mas 8 bits
        
{
            
iRightBits 0;
            
iPos++
            
            if(
iPos >= sizeof EV_INT_AMMOVARS)
                break;
        }
    }
}

GetAmmoIdPosition(iAmmoId)
{
    new 
iPos floatroundfloat(iAmmoId*AMMO_BITS) / float(INT_BYTES /*32*/), floatround_ceil ) - 1
    
    
if(iPos >= sizeof EV_INT_AMMOVARS)
        return -
1
        
    
return iPos
}

/*
// Un code en PHP, http://writecodeonline.com/php/
for($i = 1; $i <= 10; $i++)
{
    echo ceil( ($i*8) / 32 ) - 1;
}

// Output: 0000111122
*/ 

Lo que si, cuando llenes la caja de balas, verifica que no repita el seteo de ammo. Un ejemplo muy claro, es cuando un user tiene una MP5 y unas Elites. Ambas son del mismo tipo de ammo.

Con StoreAmmo guardas en la caja el monto de ammo segun su ID, y con GetPackedAmmo obtienes en un array de tamaño 10+1 el monto de balas guardado, en la casilla respectiva a su ammoID.

Ahora, ingeniatelas para adaptarlo. Proud
Responder
#22
(20/09/2014, 03:13 AM)meTaLiCroSS escribió: Con StoreAmmo guardas en la caja el monto de ammo segun su ID, y con GetPackedAmmo obtienes en un array de tamaño 10+1 el monto de balas guardado, en la casilla respectiva a su ammoID.

Ahora, ingeniatelas para adaptarlo. Proud

Gracias totales!

Ya tenia armada la compresión pero me estaba quemando la cabeza con el inverso Oh god why

Código PHP:
    new Var[3], i
    
for(04i++)
    {
        Var[
0] |= (total[i] << (i))
        Var[
1] |= (total[4] << (i))

        if(
2)
            Var[
2] |= (total[8] << (i))
    }

    for(
03i++)
    {
        
entity_set_int(ammoEV_INT_AMMOVARS[i], Var[i])
    } 
Si se ve horrible el code es porqe son casi las 4 am aquí Yao ming
Whatdone
Responder
#23
Ni yo entendi que hiciste ahi jajajaj
Responder
#24
(20/09/2014, 03:51 AM)meTaLiCroSS escribió: Ni yo entendi que hiciste ahi jajajaj

Pero :c es muy simple
Código PHP:
    new Var[3], i
    
for(04i++)
    {
        Var[
0] |= (balas[i] << (i))
        
//balas[0] (<< 8*0 = 0bits)
        //balas[1] (<< 8*1 = 8bits)
        //balas[2] (<< 8*2 = 16bits)
        //balas[3] (<< 8*3 = 24bits)
        
Var[1] |= (balas[4] << (i))    //balas[4] [5] [6] y [7]

        
if(2)
            Var[
2] |= (balas[8] << (i))    //balas[8] y [9]
    


Asi guardo todas las balas más rápido y de una sola vez.
Con tu stock tenia que crear la entidad primero y luego ir agregando la cantidad de balas una por una (y si no tenia balas para dropear, luego remover la entidad)

Y respecto al GetPackedAmmo me comí la cabeza
Código PHP:
if(iRightBits > ((INT_BYTES*8) - AMMO_BITS)) 
->
Código PHP:
if(iRightBits >= ((INT_BYTES*8) - AMMO_BITS)) 
Oh god why

Hice un stock basado en el tuyo (Yao ming) que descomprime, guarda el número que me interesa, y luego comprime de nuevo.

Ya subí la nueva versión. Gracias por la ayudita Gran sonrisa
Whatdone
Responder
#25
(20/09/2014, 02:38 PM)NikKOo31 escribió:
(20/09/2014, 03:51 AM)meTaLiCroSS escribió: Ni yo entendi que hiciste ahi jajajaj

Pero :c es muy simple
Código PHP:
    new Var[3], i
    
for(04i++)
    {
        Var[
0] |= (balas[i] << (i))
        
//balas[0] (<< 8*0 = 0bits)
        //balas[1] (<< 8*1 = 8bits)
        //balas[2] (<< 8*2 = 16bits)
        //balas[3] (<< 8*3 = 24bits)
        
Var[1] |= (balas[4] << (i))    //balas[4] [5] [6] y [7]

        
if(2)
            Var[
2] |= (balas[8] << (i))    //balas[8] y [9]
    


Asi guardo todas las balas más rápido y de una sola vez.
Con tu stock tenia que crear la entidad primero y luego ir agregando la cantidad de balas una por una (y si no tenia balas para dropear, luego remover la entidad)

Y respecto al GetPackedAmmo me comí la cabeza
Código PHP:
if(iRightBits > ((INT_BYTES*8) - AMMO_BITS)) 
->
Código PHP:
if(iRightBits >= ((INT_BYTES*8) - AMMO_BITS)) 
Oh god why

Hice un stock basado en el tuyo (Yao ming) que descomprime, guarda el número que me interesa, y luego comprime de nuevo.

Ya subí la nueva versión. Gracias por la ayudita Gran sonrisa

  1. Estas usando mal el loop, haces 4 iteraciones cuando solo necesitas 3 lol
  2. La redaccion que hiciste de tu code es más chino que los tutoriales que he hecho Whatever
  3. El chequeo de GetPackedAmmo está bien. En el caso de iRightBits cuando valga 24, el chequeo "segun tu" seria
    Código PHP:
    if(24 >= 24) {  /* resetear */ 
    Lo cual no tiene sentido, y creo que ni lo ruteaste

Y si te doy un stock con constantes es para que lo uses tal cual, para que lo hardcodeas si al final es la misma mierda Dafuq y no tiene nada de malo crear la entidad antes, se quemara el PC?

Se un poco más flexible.

EDIT: Sabes que un player no solo tiene el ammo de las balas que actualmente lleva? Puede contener mas, de armas anteriores que haya recogido.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)