Batalla de Cuchillos 2.1 [Knife Fight]
#1
Batalla de Cuchillos 2.1


[Knife Fight]



Breve descripción:

Con este plugin, vamos a poder iniciar batallas de cuchillos entre todos los jugadores del servidor



Comando:

say[_team] /bc - Activa o desactiva una Batalla de Cuchillos



Cvars (Números en comillas son los valores por defecto):

bc_habilitado "1"

0/1 - [Des]Habilita a que los admins puedan iniciar batallas de cuchillos

bc_msj_modo "2"

Modo por el cual se muestran los mensajes

1 - Chat | 2 - Centro | Otro número - HUD

bc_off_sin_admin "1"

Desactivar 'Batalla de Cuchillos' cuando no hay admins en el inicio de una ronda?

0 - Dejar activo | 1 - Desactivar



Agradecimientos a gladius



Aclaraciones:

- Si la Batalla de Cuchillos está activada y establecemos la cvar 'bc_habilitado' a 0, en la próxima ronda se desactivará

- Los nombres de las variables, funciones, etc, las deje en inglés para no desacostumbrarme a él y los que lean el código, tampoco

- Este plugin lo tengo aprobado en Alliedmodders desde 2009 con el nombre de 'Knife Fight', solo que ahora decidí actualizarlo y postearlo en este foro. Plugin en Alliedmodders: http://forums.alliedmods.net/showthread.php?p=803913



Servidores usando este plugin



Errores y/o sugerencias:

Posteala por favor


Archivos adjuntos
.sma   Descargar AMXX / Batalla_Cuchillos21.sma (Tamaño: 5.6 KB / Descargas: 704)

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#2
Registro de cambios

Cita:Versión 2.1:
  • Mejoras en el código:
    • Las funciones de ham se deshabilitarán cuando no son necesarias (gladius)

    • Forward infochanged mejorada (Evitar que compruebe si es admin cuando no es necesario)


  • engclient_cmd --> client_cmd ("Stack error" arreglado)

  • Arreglo del hud (No se mostraba en algunas ocasiones)



Gracias a gladius por ayudarme a mejorar 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
#3
Algunas sugerencias:
  • Puedes usar EnableHamForward/DisableHamForward solo usas el evento para una determinada ocación no es necesario que se llamen siempre las funciones.
  • Para que el spam al entrar al mapa Gran sonrisa.
  • El szTextmsg no necesita ser global si lo usas solo en una función.
  • client_infochanged para qué?.
  • No necesitas el módulo fun.
  • client_disconnect no es necesario porque haces lo mismo en client_putinserver.
  • Estoy seguro que puedes encontrar un mejor método para la prohibir la compra.

Algo así lo dejaría, lo edité en block de notas no sé como se ve Gran sonrisa

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

#define ADMIN_FLAG ADMIN_KICK
#define VERSION "2.0"

#define ValidPlayer(%1) (1 <= %1 <= gMaxPlayers)

#define SetAdminBit(%1)     gAdmin |=  (1 << (%1 & 31))
#define ClearAdminBit(%1) gAdmin &= ~(1 << (%1 & 31))

const m_pPlayer 41
const XO_WEAPON 4

new gEnabledBCgMsgSyncgMaxPlayersgAdmin
new gCvarEnablegCvarMsgModegCvarNoAdm

new HamHook:gHamItemDeploy[CSW_P90 1]
new 
HamHook:gHamTouch[3]

public 
plugin_init()
{
    
register_plugin("Batalla de Cuchillos"VERSION"alan_el_more")
    
    
register_cvar("bc_version"VERSIONFCVAR_SERVER|FCVAR_SPONLY)
    
    
// Batalla de Cuchillos habilitado?
    // 0 - Deshabilitado | 1 - Habilitado
    
gCvarEnable register_cvar("bc_habilitado""1")
    
    
// Modo por el cual se muestran los mensajes
    // 1 - Chat | 2 - Centro | Otro número - HUD
    
gCvarMsgMode register_cvar("bc_msj_modo""2")
    
    
// Desactivar 'Batalla de Cuchillos' cuando no hay admins en el inicio de una ronda?
    // 0 - Dejar activo | 1 - Desactivar
    
gCvarNoAdm register_cvar("bc_off_sin_admin""1"
    
    
gMaxPlayers get_maxplayers()
    
gMsgSync CreateHudSyncObj()
    
    
register_clcmd("say /bc""CmdBC"ADMIN_FLAG)
    
register_clcmd("say_team /bc""CmdBC"ADMIN_FLAG)
    
    
register_event("HLTV""EventRoundStart""a""1=0""2=0")
    
    new const 
gBuyCommands[][] = 
    {
        
"usp""glock""deagle""p228""elites""fn57""m3""xm1014""mp5""tmp""p90""mac10""ump45""ak47"
        
"galil""famas""sg552""m4a1""aug""scout""awp""g3sg1""sg550""m249""vest""vesthelm""flash""hegren",
        
"sgren""defuser""nvgs""shield""primammo""secammo""km45""9x19mm""nighthawk""228compact""12gauge",
        
"autoshotgun""smg""mp""c90""cv47""defender""clarion""krieg552""bullpup""magnum""d3au1""krieg550",
        
"buyammo1""buyammo2"
    
}
    
    for(new 
isizeof gBuyCommandsi++)
        
register_clcmd(gBuyCommands[i], "BlockBuyCommands")
}

public 
CmdBC(idlevelcid)
{
    if(!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED
        
    
if(!get_pcvar_num(gCvarEnable))
    {
        
client_print(idprint_chat"La Batalla de Cuchillos esta deshabilitado temporalmente")
        return 
PLUGIN_HANDLED
    
}
    
    new 
szPlName[32], Players[32], iNumindexi
    get_user_name
(idszPlName31)
    
    new 
szCmd[13] = "weapon_knife"
    
if(gEnabledBC)
        
copy(szCmdsizeof(szCmd) - 1"lastinv")

    
ShowMessage("%s ha %sactivado la Batalla de Cuchillos !"szPlNamegEnabledBC "des" "")
    
gEnabledBC = !gEnabledBC
    
    ToggleHamForwards
(gEnabledBC)

    
get_players(PlayersiNum"a")
    for(
0;iNum;i++)
    {
        
index Players[i]
        
engclient_cmd(indexszCmd)
    }
    
    return 
PLUGIN_HANDLED
}

public 
HamTouchWeapon(weaponid)
{
    if(!
ValidPlayer(id))
        return 
HAM_IGNORED
        
    
return HAM_SUPERCEDE
}

public 
HamWeapDeployPost(ent)
{
    
engclient_cmd(get_pdata_cbase(entm_pPlayerXO_WEAPON), "weapon_knife")
    return 
HAM_HANDLED
}

public 
EventRoundStart()
{
    if(
gEnabledBC)
    {
        if(!
get_pcvar_num(gCvarEnable))
            
gEnabledBC false
        
else if(get_pcvar_num(gCvarNoAdm) && !gAdmin)
        {
            
gEnabledBC false
            ShowMessage
("Batalla de Cuchillos desactivado por ausencia de admin !")
        }
        else
            
ShowMessage("Batalla de Cuchillos !")
    }    
    return 
PLUGIN_CONTINUE
}

public 
BlockBuyCommands(id)
    return 
gEnabledBC PLUGIN_HANDLED PLUGIN_CONTINUE

public client_putinserver(id)
    
CheckAdminFlag(id)

CheckAdminFlag(id)
{
    if(
get_user_flags(id) & ADMIN_FLAG)
        
SetAdminBit(id)
    else
        
ClearAdminBit(id)
}

ShowMessage(const msg[], any:...)
{
    new 
NumArgs numargs()
    new 
szTextMsg[192]
    
NumArgs vformat(szTextMsgcharsmax(szTextMsg), msg2) : formatex(szTextMsgcharsmax(szTextMsg), msg)
    
    switch(
get_pcvar_num(gCvarMsgMode))
    {
        case 
1:client_print(0print_chatszTextMsg)
        case 
2:client_print(0print_centerszTextMsg)
        default:
        {
            if(
NumArgs 1)
                
set_hudmessage(25525500.30.110.05.01.01.0, -1)
            else
                
set_hudmessage(25525500.410.110.05.01.01.0, -1)
            
            
ShowSyncHudMsg(0gMsgSyncszTextMsg)
        }
    }
}

ToggleHamForwards(enable true)
{
    if(
enable)
    {
        if(
gHamTouch[0])
            
gHamTouch[0] = RegisterHam(Ham_Touch"weaponbox""HamTouchWeapon")    
        else
            
EnableHamForward(gHamTouch[0])
            
        if(
gHamTouch[1])
            
gHamTouch[1] = RegisterHam(Ham_Touch"armoury_entity""HamTouchWeapon")    
        else
            
EnableHamForward(gHamTouch[1])
            
        if(
gHamTouch[2])    
            
gHamTouch[2] = RegisterHam(Ham_Touch"weapon_shield""HamTouchWeapon")    
        else
            
EnableHamForward(gHamTouch[2])
    }
    else
    {
        
DisableHamForward(gHamTouch[0])
        
DisableHamForward(gHamTouch[1])
        
DisableHamForward(gHamTouch[2])
    }
    
    new 
iNameWeap[20]
    for(
CSW_P228;<= CSW_P90;i++)
    {
        if(
== CSW_KNIFE)
            continue
        
        if(
get_weaponname(iNameWeap19))
        {
            if(
enable)
            {
                if(!
gHamItemDeploy[i])
                    
gHamItemDeploy[i] = RegisterHam(Ham_Item_DeployNameWeap"HamWeapDeployPost"1)
                else
                    
EnableHamForward(gHamItemDeploy[i])
            }
            else
                
DisableHamForward(gHamItemDeploy[i])
        }
    }

Búsqueda de la ecuación perfecta.
Responder
#4
Primero gracias por tomarte tu tiempo para leer y editar el plugin.

Después, de los items que me diste te quería decir/aclarar algunas cosas



- Habilitar y deshabilitar las funciones del hamsandich me tiraban el server en muchas ocasiones, espero que con tu código funcione bien



- Me gusta ayudar al foro :3



- Poner el szTextMsg me tiraba "stack error" en el servidor y leí en AM que lo tendría que hacer global para arreglar el error. Me pareció raro pero lo hice, seguramente leí mal con mi traductor mental



- client_infochanged es por si un usuario se cambia el nombre al de un admin o viceversa



- No pude encontrar mejor forma de prohibir la compra.



Nuevamente gracias

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#5
(15/10/2013, 04:43 PM)alan_el_more escribió: Primero gracias por tomarte tu tiempo para leer y editar el plugin.

Después, de los items que me diste te quería decir/aclarar algunas cosas

Siempre ayudar a la comunidad Sonrisa



(15/10/2013, 04:43 PM)alan_el_more escribió: - Habilitar y deshabilitar las funciones del hamsandich me tiraban el server en muchas ocasiones, espero que con tu código funcione bien



Quizás llamas a enablehamforward y no tenías el id correcto de la forward.



(15/10/2013, 04:43 PM)alan_el_more escribió: - Poner el szTextMsg me tiraba "stack error" en el servidor y leí en AM que lo tendría que hacer global para arreglar el error. Me pareció raro pero lo hice, seguramente leí mal con mi traductor mental



Pasa que creas [o se crean tantas veces las] variables que vas ocupando toda la memoria, puedes hacer 2 cosas o agrandar la memoria o haciendo la variable static.



(15/10/2013, 04:43 PM)alan_el_more escribió: - client_infochanged es por si un usuario se cambia el nombre al de un admin o viceversa



No sabía que era por nombre, pero ojo que infochanged se llama para otras cosas además de eso, busca pev_netname y usa get_user_name comparando si son iguales o si cambio etc etc o si realmente se llamó por el cambio de nombre, ahí ves tu.



(15/10/2013, 04:43 PM)alan_el_more escribió: - No pude encontrar mejor forma de prohibir la compra.

Nuevamente gracias



Si hay otras formas pero lo sacan de forma definitiva del mapa, para volver a abrirlo tendrías que volver a cargar el mapa
Búsqueda de la ecuación perfecta.
Responder
#6
(15/10/2013, 07:35 PM)gladius escribió:
(15/10/2013, 04:43 PM)alan_el_more escribió: - client_infochanged es por si un usuario se cambia el nombre al de un admin o viceversa



No sabía que era por nombre, pero ojo que infochanged se llama para otras cosas además de eso, busca pev_netname y usa get_user_name comparando si son iguales o si cambio etc etc o si realmente se llamó por el cambio de nombre, ahí ves tu.

Tenes razón, voy a usar el forward de fakemeta que guarda en el buffer el nombre viejo y lo voy a comparar

Pasa que antes no quería agregar fakemeta solo para un forward



(15/10/2013, 07:35 PM)gladius escribió:
(15/10/2013, 04:43 PM)alan_el_more escribió: - No pude encontrar mejor forma de prohibir la compra.

Nuevamente gracias



Si hay otras formas pero lo sacan de forma definitiva del mapa, para volver a abrirlo tendrías que volver a cargar el mapa



Por eso, si remuevo la entidad para comprar, después para agregarlo de nuevo, puede traer bugs

Por eso es la mejor opción que encontré.

Si encuentro otra manera mejor, lo voy a implementar

Encontre el 'Buyzone range' de Ven pero usa postthink para efectuar un fake touch o no de la zona de compra, me parece demasiado para este simple plugin

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#7
Actualizado a la versión 2.1 !

Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Responder
#8
EDIT: no dije nada xD
Búsqueda de la ecuación perfecta.
Responder
#9
Aprobado ^^
Responder
#10
Mataria que al terminar la ronda automaticamente la proxima ronda sea normal Gran sonrisa
Nadie nace sabiendo, todos estamos para aprender
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)