Tiempo para borrar entidad
#1
Buenas chicos. Aquí les traigo otro plugin para que me ayuden a modificar. El plugin se basa en tirar dinero al suelo mientras tienes el cuchillo en la mano y le das a la letra G o cuando mueres. Bueno, quiero agregarle ahora un "despawn" o mejor dicho un removedor de estos mismos models o billetes (entidades) pasada una cantidad de segundos y que sea una CVAR configurable.

Explico de manera más técnica. Quiero que cada vez que un billete caiga al suelo sea por muerte o por voluntad propia, este tenga un temporizador de X segundos (CVAR configurable) para desaparecer del mapa. Esto lo necesito porque he puesto este plugin en un CTF y como tienen bots que no les importa si tienen dinero o no, entonces dejan muchos billetes tirados al suelo y eso laguea el servidor. Si pueden ayudarme con eso estaría muy agradecido Gran sonrisa


Archivos adjuntos
.sma   Descargar AMXX / pdm.sma (Tamaño: 7.44 KB / Descargas: 30)
Responder
#2
Código PHP:
timedrop register_cvar("amx_time_drop_money""5.0"

Código PHP:
#include <amxmodx>
#include <fakemeta>

#define PLUGIN    "Players Drop Money"
#define AUTHOR    "Sh!nE*"
#define VERSION    "1.7"

#if cellbits == 32
#define OFFSET_CSMONEY  115
#else
#define OFFSET_CSMONEY  140
#endif

#define OFFSET_LINUX      5

#define MAXENTS 1000

new moneybox[MAXENTS]
new 
model[] = "models/w_money_new.mdl"
new money_sound1[] = "cxs-ctf/money_sound2.wav"

new methodisonm_amountran_moneyrandom_numsmoney_dropmoney_drop_afadeonmoney_sounddivideforcetimedrop
//new method6
new g_msgScreenFade
new bool:can_pickup[33]

public 
plugin_init()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
ison register_cvar("amx_dropmoney","1")
    
method register_cvar("amx_dropmethod","2")
    
divide register_cvar("amx_moneydivide","4")
    
m_amount register_cvar("amx_dropamount","300")
    
ran_money register_cvar("amx_droprandom","300 500 700")
    
random_nums register_cvar("amx_droprandomnums","300 7500")
    
money_drop register_cvar("amx_playerdrop","1")
    
money_drop_a register_cvar("amx_playerdropamount","500")
    
timedrop register_cvar("amx_time_drop_money""5.0")
    
fadeon register_cvar("amx_moneyfade","1")
    
money_sound register_cvar("amx_moneysound","1")
    
force register_cvar("amx_dropforce","15")
    
g_msgScreenFade get_user_msgid("ScreenFade")
    
    
register_clcmd("drop","hook_drop")
    
    
register_event("DeathMsg""deatha""a")
    
register_forward(FM_Touch,"player_Touch")
    
register_logevent("round_start"2"1=Round_Start")
}

public 
client_connect(id)    can_pickup[id]=true
public client_disconnect(id)    can_pickup[id]=false

public plugin_precache() {
    
precache_model(model)
    
precache_sound(money_sound1)
}

public 
hook_drop(id) {
    if(!
get_pcvar_num(ison) || !get_pcvar_num(money_drop))    return PLUGIN_CONTINUE
    
new weapon,clip,ammo,money,Float:velo[3]
    
weapon get_user_weapon(id,clip,ammo)
    if(
weapon == CSW_KNIFE) {
        if(
fm_get_user_money(id) < get_pcvar_num(money_drop_a))
            
money fm_get_user_money(id)
        else
            
money get_pcvar_num(money_drop_a)
        
        
fm_set_user_money(id,fm_get_user_money(id) - money)
        
can_pickup[id] = false
        set_task
(0.3,"reset_pick",id)
        new 
start_velo get_pcvar_num(force) * 15
        
new end_velo get_pcvar_num(force) * 50
        velocity_by_aim
(id,random_num(start_velo,end_velo),velo)
        
make_money(id,money,velo)
        return 
PLUGIN_HANDLED
    
}
    return 
PLUGIN_CONTINUE
}

public 
reset_pick(id)    can_pickup[id] = true

public deatha() {
    if(!
get_pcvar_num(ison))    return PLUGIN_CONTINUE
    
    
new moneyFloat:velo[3]
    new 
victim read_data(2)
    new 
killer read_data(1)
    
    if(
killer && killer != victim)
        
fm_set_user_money(killer,fm_get_user_money(killer) - 300)
    
    switch(
get_pcvar_num(method)) {
        case 
1:{
            
money get_pcvar_num(m_amount)
            if(
fm_get_user_money(victim) < money) {
                
money fm_get_user_money(victim)
                
fm_set_user_money(victim,0)
            }
            else    
fm_set_user_money(victim,fm_get_user_money(victim) - get_pcvar_num(m_amount))
            }
        case 
2:{
            new 
tempmoney fm_get_user_money(victim)
            if(
money != 1) {
                
money = (tempmoney get_pcvar_num(divide))
                
fm_set_user_money(victim,fm_get_user_money(victim) - money)
            }
            else {
                
fm_set_user_money(victim,0)
                
money 1
            
}
        }
        case 
3:{
            new 
maxmoney fm_get_user_money(victim)
            
money random_num(1,maxmoney)
            
fm_set_user_money(victim,fm_get_user_money(victim) - money)
        }
        case 
4:{
            new 
tempmoney2[32]
            
get_pcvar_string(ran_money,tempmoney2,31)
            new 
tempmoney[3][6]
            
parse(tempmoney2tempmoney[0], sizeof tempmoney[] - 1,tempmoney[1], sizeof tempmoney[] - 1,tempmoney[2], sizeof tempmoney[] - 1)
            new 
num random_num(1,3)
            switch(
num) {
                case 
1:{
                    
money str_to_num(tempmoney[0])
                }
                case 
2:{
                    
money str_to_num(tempmoney[1])
                }
                case 
3:{
                    
money str_to_num(tempmoney[2])
                }
            }
            if(
fm_get_user_money(victim) < money) {
                
fm_set_user_money(victim,0)
                
money fm_get_user_money(victim)
            }
            else    
fm_set_user_money(victim,fm_get_user_money(victim) - money)
            }
        case 
5:{
            new 
tempmoney22[32], num_fromnum_to
            get_pcvar_string
(random_nums,tempmoney22,31)
            new 
tempmoney1[2][6]
            
parse(tempmoney22tempmoney1[0], sizeof tempmoney1[] - 1,tempmoney1[1], sizeof tempmoney1[] - 1)
            
num_from str_to_num(tempmoney1[0])
            
num_to str_to_num(tempmoney1[1])
            if(
num_to 999999)    num_to 999999
            
if(num_from 0)    num_to 0
            money 
random_num(num_from,num_to)
            
            if(
fm_get_user_money(victim) < money) {
                
fm_set_user_money(victim,0)
                
money fm_get_user_money(victim)
            }
            else    
fm_set_user_money(victim,fm_get_user_money(victim) - money)
            }
    }
    
make_money(victim,money,velo)
    return 
PLUGIN_CONTINUE
}

public 
round_start() {
    new 
money_ent
    
while((money_ent=engfunc(EngFunc_FindEntityByString,money_ent,"classname","pdm_money")) != 0){
        
engfunc(EngFunc_RemoveEntity,money_ent)
    }
}


public 
make_money(id,money,Float:velo[]) {
    new 
moneybags money/1000
    
new moneyleft money
    
new Float:origin[3]
    new 
Float:angles[3]
    new 
Float:mins[3] = {-2.79, -0.0, -6.14}
    new 
Float:maxs[3] = {2.421.996.35}
    
    if((
moneybags 1000) < money)    moneybags++
    
    for(new 
0moneybags; ++i) {
        new 
newent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString,"info_target"))
        if(!
is_user_alive(id)) {
            
velo[0] = random_float(1.0,150.0)
            
velo[1] = random_float(1.0,150.0)
            
velo[2] = random_float(1.0,150.0)
        }
        else 
            
velo[2] += 100
        
        pev
(newent,pev_angles,angles)
        
angles[1] += random_num(1,360)
        
pev(id,pev_origin,origin)
        
set_pev(newentpev_originorigin)
        
set_pev(newentpev_classname"pdm_money")
        
engfunc(EngFunc_SetModelnewentmodel)
        
engfunc(EngFunc_SetSize,newent,mins,maxs)
        
set_pev(newent,pev_angles,angles)
        
set_pev(newentpev_solidSOLID_TRIGGER)
        
set_pev(newent,pev_movetype,MOVETYPE_TOSS)
        
set_pev(newentpev_velocity,velo)
        
engfunc(EngFunc_DropToFloor,newent)
        
        if(
moneyleft == 0)    return FMRES_IGNORED
        
        
if(moneyleft 1000) {
            
moneybox[newent]=moneyleft
            moneyleft 
0
            
return FMRES_IGNORED
        
}
        
moneyleft -= 1000
        moneybox
[newent]=1000

        set_task
(get_pcvar_float(timedrop), "remove_money"newent)
    }
    return 
FMRES_IGNORED
}

public 
remove_money(ent) {
    if(
is_valid_ent(ent))
        
remove_entity(ent);
}

public 
player_Touch(touchedtoucher) { 
    
    if (!
pev_valid(touched) || !is_user_alive(toucher) ||  !get_pcvar_num(ison) || !can_pickup[toucher])
        return 
FMRES_IGNORED
    
    
new classname[32]
    
pev(touchedpev_classnameclassnamesizeof classname 1)
    
    if (
equali(classname"pdm_money")) {
        if(
fm_get_user_money(toucher) == 999999)    return FMRES_IGNORED
        
else if((fm_get_user_money(toucher)+moneybox[touched]) > 999999)        fm_set_user_money(toucher,999999)
        else    
fm_set_user_money(toucher,fm_get_user_money(toucher) + moneybox[touched])
            
        if(
get_pcvar_num(money_sound))    client_cmd(toucher,"spk %s",money_sound1)
        
        if(
pev_valid(touched))
            
engfunc(EngFunc_RemoveEntity,touched)
        
        if(
get_pcvar_num(fadeon))
            
screen_fade(toucher)
    }
    
    return 
FMRES_IGNORED
}


public 
screen_fade(id) {
    
message_begin(MSG_ONEg_msgScreenFade, {0,0,0}, id
    
write_short(1<<12)
    
write_short(1<<12)
    
write_short(1<<12)
    
write_byte(0)
    
write_byte(200)
    
write_byte(0)
    
write_byte(40)
    
message_end()
}


//XxAvalanchexX Stocks
stock fm_set_user_money(id,money,flash=0)
{
    
set_pdata_int(id,OFFSET_CSMONEY,money,OFFSET_LINUX);
    
    
message_begin(MSG_ONE,get_user_msgid("Money"),{0,0,0},id);
    
write_long(money);
    
write_byte(flash);
    
message_end();
}

stock fm_get_user_money(id)
{
    return 
get_pdata_int(id,OFFSET_CSMONEY,OFFSET_LINUX);


Responder
#3
(08/08/2021, 04:56 PM)Skylar escribió:
Código PHP:
timedrop register_cvar("amx_time_drop_money""5.0"

Código PHP:
#include <amxmodx>
#include <fakemeta>

#define PLUGIN "Players Drop Money"
#define AUTHOR "Sh!nE*"
#define VERSION "1.7"

#if cellbits == 32
#define OFFSET_CSMONEY  115
#else
#define OFFSET_CSMONEY  140
#endif

#define OFFSET_LINUX      5

#define MAXENTS 1000

new moneybox[MAXENTS]
new 
model[] = "models/w_money_new.mdl"
new money_sound1[] = "cxs-ctf/money_sound2.wav"

new methodisonm_amountran_moneyrandom_numsmoney_dropmoney_drop_afadeonmoney_sounddivideforcetimedrop
//new method6
new g_msgScreenFade
new bool:can_pickup[33]

public 
plugin_init()
{
 
register_plugin(PLUGINVERSIONAUTHOR)
 
 
ison register_cvar("amx_dropmoney","1")
 
method register_cvar("amx_dropmethod","2")
 
divide register_cvar("amx_moneydivide","4")
 
m_amount register_cvar("amx_dropamount","300")
 
ran_money register_cvar("amx_droprandom","300 500 700")
 
random_nums register_cvar("amx_droprandomnums","300 7500")
 
money_drop register_cvar("amx_playerdrop","1")
 
money_drop_a register_cvar("amx_playerdropamount","500")
 
timedrop register_cvar("amx_time_drop_money""5.0")
 
fadeon register_cvar("amx_moneyfade","1")
 
money_sound register_cvar("amx_moneysound","1")
 
force register_cvar("amx_dropforce","15")
 
g_msgScreenFade get_user_msgid("ScreenFade")
 
 
register_clcmd("drop","hook_drop")
 
 
register_event("DeathMsg""deatha""a")
 
register_forward(FM_Touch,"player_Touch")
 
register_logevent("round_start"2"1=Round_Start")
}

public 
client_connect(idcan_pickup[id]=true
public client_disconnect(idcan_pickup[id]=false

public plugin_precache() {
 
precache_model(model)
 
precache_sound(money_sound1)
}

public 
hook_drop(id) {
 if(!
get_pcvar_num(ison) || !get_pcvar_num(money_drop)) return PLUGIN_CONTINUE
 
new weapon,clip,ammo,money,Float:velo[3]
 
weapon get_user_weapon(id,clip,ammo)
 if(
weapon == CSW_KNIFE) {
 if(
fm_get_user_money(id) < get_pcvar_num(money_drop_a))
 
money fm_get_user_money(id)
 else
 
money get_pcvar_num(money_drop_a)
 
 
fm_set_user_money(id,fm_get_user_money(id) - money)
 
can_pickup[id] = false
 set_task
(0.3,"reset_pick",id)
 new 
start_velo get_pcvar_num(force) * 15
 
new end_velo get_pcvar_num(force) * 50
 velocity_by_aim
(id,random_num(start_velo,end_velo),velo)
 
make_money(id,money,velo)
 return 
PLUGIN_HANDLED
 
}
 return 
PLUGIN_CONTINUE
}

public 
reset_pick(idcan_pickup[id] = true

public deatha() {
 if(!
get_pcvar_num(ison)) return PLUGIN_CONTINUE
 
 
new moneyFloat:velo[3]
 new 
victim read_data(2)
 new 
killer read_data(1)
 
 if(
killer && killer != victim)
 
fm_set_user_money(killer,fm_get_user_money(killer) - 300)
 
 switch(
get_pcvar_num(method)) {
 case 
1:{
 
money get_pcvar_num(m_amount)
 if(
fm_get_user_money(victim) < money) {
 
money fm_get_user_money(victim)
 
fm_set_user_money(victim,0)
 }
 else 
fm_set_user_money(victim,fm_get_user_money(victim) - get_pcvar_num(m_amount))
 }
 case 
2:{
 new 
tempmoney fm_get_user_money(victim)
 if(
money != 1) {
 
money = (tempmoney get_pcvar_num(divide))
 
fm_set_user_money(victim,fm_get_user_money(victim) - money)
 }
 else {
 
fm_set_user_money(victim,0)
 
money 1
 
}
 }
 case 
3:{
 new 
maxmoney fm_get_user_money(victim)
 
money random_num(1,maxmoney)
 
fm_set_user_money(victim,fm_get_user_money(victim) - money)
 }
 case 
4:{
 new 
tempmoney2[32]
 
get_pcvar_string(ran_money,tempmoney2,31)
 new 
tempmoney[3][6]
 
parse(tempmoney2tempmoney[0], sizeof tempmoney[] - 1,tempmoney[1], sizeof tempmoney[] - 1,tempmoney[2], sizeof tempmoney[] - 1)
 new 
num random_num(1,3)
 switch(
num) {
 case 
1:{
 
money str_to_num(tempmoney[0])
 }
 case 
2:{
 
money str_to_num(tempmoney[1])
 }
 case 
3:{
 
money str_to_num(tempmoney[2])
 }
 }
 if(
fm_get_user_money(victim) < money) {
 
fm_set_user_money(victim,0)
 
money fm_get_user_money(victim)
 }
 else 
fm_set_user_money(victim,fm_get_user_money(victim) - money)
 }
 case 
5:{
 new 
tempmoney22[32], num_fromnum_to
 get_pcvar_string
(random_nums,tempmoney22,31)
 new 
tempmoney1[2][6]
 
parse(tempmoney22tempmoney1[0], sizeof tempmoney1[] - 1,tempmoney1[1], sizeof tempmoney1[] - 1)
 
num_from str_to_num(tempmoney1[0])
 
num_to str_to_num(tempmoney1[1])
 if(
num_to 999999num_to 999999
 
if(num_from 0num_to 0
 money 
random_num(num_from,num_to)
 
 if(
fm_get_user_money(victim) < money) {
 
fm_set_user_money(victim,0)
 
money fm_get_user_money(victim)
 }
 else 
fm_set_user_money(victim,fm_get_user_money(victim) - money)
 }
 }
 
make_money(victim,money,velo)
 return 
PLUGIN_CONTINUE
}

public 
round_start() {
 new 
money_ent
 
while((money_ent=engfunc(EngFunc_FindEntityByString,money_ent,"classname","pdm_money")) != 0){
 
engfunc(EngFunc_RemoveEntity,money_ent)
 }
}


public 
make_money(id,money,Float:velo[]) {
 new 
moneybags money/1000
 
new moneyleft money
 
new Float:origin[3]
 new 
Float:angles[3]
 new 
Float:mins[3] = {-2.79, -0.0, -6.14}
 new 
Float:maxs[3] = {2.421.996.35}
 
 if((
moneybags 1000) < moneymoneybags++
 
 for(new 
0moneybags; ++i) {
 new 
newent engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString,"info_target"))
 if(!
is_user_alive(id)) {
 
velo[0] = random_float(1.0,150.0)
 
velo[1] = random_float(1.0,150.0)
 
velo[2] = random_float(1.0,150.0)
 }
 else 
 
velo[2] += 100
 
 pev
(newent,pev_angles,angles)
 
angles[1] += random_num(1,360)
 
pev(id,pev_origin,origin)
 
set_pev(newentpev_originorigin)
 
set_pev(newentpev_classname"pdm_money")
 
engfunc(EngFunc_SetModelnewentmodel)
 
engfunc(EngFunc_SetSize,newent,mins,maxs)
 
set_pev(newent,pev_angles,angles)
 
set_pev(newentpev_solidSOLID_TRIGGER)
 
set_pev(newent,pev_movetype,MOVETYPE_TOSS)
 
set_pev(newentpev_velocity,velo)
 
engfunc(EngFunc_DropToFloor,newent)
 
 if(
moneyleft == 0) return FMRES_IGNORED
 
 
if(moneyleft 1000) {
 
moneybox[newent]=moneyleft
 moneyleft 
0
 
return FMRES_IGNORED
 
}
 
moneyleft -= 1000
 moneybox
[newent]=1000

 set_task
(get_pcvar_float(timedrop), "remove_money"newent)
 }
 return 
FMRES_IGNORED
}

public 
remove_money(ent) {
 if(
is_valid_ent(ent))
 
remove_entity(ent);
}

public 
player_Touch(touchedtoucher) { 
 
 if (!
pev_valid(touched) || !is_user_alive(toucher) ||  !get_pcvar_num(ison) || !can_pickup[toucher])
 return 
FMRES_IGNORED
 
 
new classname[32]
 
pev(touchedpev_classnameclassnamesizeof classname 1)
 
 if (
equali(classname"pdm_money")) {
 if(
fm_get_user_money(toucher) == 999999) return FMRES_IGNORED
 
else if((fm_get_user_money(toucher)+moneybox[touched]) > 999999fm_set_user_money(toucher,999999)
 else 
fm_set_user_money(toucher,fm_get_user_money(toucher) + moneybox[touched])
 
 if(
get_pcvar_num(money_sound)) client_cmd(toucher,"spk %s",money_sound1)
 
 if(
pev_valid(touched))
 
engfunc(EngFunc_RemoveEntity,touched)
 
 if(
get_pcvar_num(fadeon))
 
screen_fade(toucher)
 }
 
 return 
FMRES_IGNORED
}


public 
screen_fade(id) {
 
message_begin(MSG_ONEg_msgScreenFade, {0,0,0}, id
 
write_short(1<<12)
 
write_short(1<<12)
 
write_short(1<<12)
 
write_byte(0)
 
write_byte(200)
 
write_byte(0)
 
write_byte(40)
 
message_end()
}


//XxAvalanchexX Stocks
stock fm_set_user_money(id,money,flash=0)
{
 
set_pdata_int(id,OFFSET_CSMONEY,money,OFFSET_LINUX);
 
 
message_begin(MSG_ONE,get_user_msgid("Money"),{0,0,0},id);
 
write_long(money);
 
write_byte(flash);
 
message_end();
}

stock fm_get_user_money(id)
{
 return 
get_pdata_int(id,OFFSET_CSMONEY,OFFSET_LINUX);


Me tira un error en la linea 221:

public remove_money(ent) {
if(is_valid_ent(ent)) // Aquí me tira el error
remove_entity(ent);
}

El Error dice:

AMX Mod X Compiler 1.8.3-dev+5201
Copyright © 1997-2006 ITB CompuPhase
Copyright © 2004-2013 AMX Mod X Team

Error: Undefined symbol "is_valid_ent" on line 221
Error: Undefined symbol "remove_entity" on line 222

2 Errors.
Could not locate output file F:\Contratacion de Servidor CS 1.6\plugins\Player Drop Money\Editando\pdm.amx (compile failed).


Nota: Por cierto. Por si acaso, no especifiqué cómo se representaría el tiempo de desaparecer entidades. Quiero que sea en segundos para poder ser específico y poner algo como: timedrop = register_cvar("amx_time_drop_money", "120.0")
Responder
#4
(08/08/2021, 05:58 PM)XüberAxel escribió: Me tira un error en la linea 221:

public remove_money(ent) {
    if(is_valid_ent(ent))              // Aquí me tira el error
        remove_entity(ent);
}

El Error dice:

AMX Mod X Compiler 1.8.3-dev+5201
Copyright © 1997-2006 ITB CompuPhase
Copyright © 2004-2013 AMX Mod X Team

Error: Undefined symbol "is_valid_ent" on line 221
Error: Undefined symbol "remove_entity" on line 222

2 Errors.
Could not locate output file F:\Contratacion de Servidor CS 1.6\plugins\Player Drop Money\Editando\pdm.amx (compile failed).


Nota: Por cierto. Por si acaso, no especifiqué cómo se representaría el tiempo de desaparecer entidades. Quiero que sea en segundos para poder ser específico y poner algo como:  timedrop = register_cvar("amx_time_drop_money", "120.0")

Agrega #include <engine> y debería compilar y sobre lo otro, está hecho de esa forma

Responder
#5
(08/08/2021, 11:32 PM)Skylar escribió: Agrega #include <engine> y debería compilar y sobre lo otro, está hecho de esa forma

Muchas gracias amigo. Pero no desaparece el o los billetes tirados al suelo. D:
Responder
#6
(09/08/2021, 01:55 AM)XüberAxel escribió: Muchas gracias amigo. Pero no desaparece el o los billetes tirados al suelo. D:

Reemplaza esto:
Código PHP:
public remove_money(ent) {
    if(
is_valid_ent(ent))
        
remove_entity(ent);


Por esto:
Código PHP:
public remove_money(ent) {
    if(
is_valid_ent(ent))
        
entity_set_int(entEV_INT_flags, (entity_get_int(entEV_INT_flags) | FL_KILLME));


Responder
#7
(09/08/2021, 04:31 PM)Skylar escribió: Reemplaza esto:
Código PHP:
public remove_money(ent) {
 if(
is_valid_ent(ent))
 
remove_entity(ent);


Por esto:
Código PHP:
public remove_money(ent) {
 if(
is_valid_ent(ent))
 
entity_set_int(entEV_INT_flags, (entity_get_int(entEV_INT_flags) | FL_KILLME));


Ya lo substituí pero sigue sin funcionar amigo Triste
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)