Tutorial: Commandos tipo "zp_ninja <name>"
Requerimientos: yo diria que fasil pero velo vos kiske
Explicacion: Este tutorial es para crear comandos con el cual podamos elegir a un player
y que ese player se transforme en un personaje , para ser mas claro dare un ejemplo: esto es para que podamos
elegir quien sera assassin , ninja o sniper, en su repectivo modo y cuado son de uno en especial.
Ejemplo con modo assassin.
Paso:
Code:
1. Registramos el comando
2. Creamos el public del comando
3. Crear la funcion "allowed_...."
4. Creamos el public con las funciones para que empiese el modo
5. Truco con el cual ara que funcione bien el comando
Empesemos abriendo el zombieplague40.sma:
1. Registramos el comando
Buscamos esto :
PHP Code:
register_concmd("zp_survivor", "cmd_survivor", ACCESS_FLAG, "<name> - Turn someone into a Survivor")
Bueno alli se esta creando el comando del survivor (eso lo saven de cualquier mod), debajo del mismo creamos el nuestro
y en este caso nos quedaria asi.
PHP Code:
register_concmd("zp_assassin", "cmd_assassin", ACCES_FLAG, "<name - Turn someone into a Assassin")
Nota: esta frace del final de la linea
"<name> - Turn someone into Assassin" no tiene nada que ver con el efecto
del comando solo es una breve explicacion que se ve al tocar "amx_help"
2. Creamos el public del comando
Buscamos este public
public cmd_survivor(id, level, cid) y encontraremos algo como esto
PHP Code:
public cmd_survivor(id, level, cid)
{
// Check for access flag
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED;
// Retrieve arguments
static arg[32], player
read_argv(1, arg, sizeof arg - 1)
player = cmd_target(id, arg, CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF)
// Invalid target
if (!player) return PLUGIN_HANDLED;
// Target not allowed to be survivor
if (!allowed_survivor(player))
{
client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
return PLUGIN_HANDLED;
}
command_survivor(id, player)
return PLUGIN_HANDLED;
}
Bueno debajo de eso crearemos el nuestro , es casi lo mismo pero tienes uno detalles cambiado
Primero agregamoes el public con sus parametros
PHP Code:
public cmd_assassin(id, level, cid)
{
Aqui le pondremos la condiciones es decir los accessos que debe tener,
si no los tiene no continua
PHP Code:
if (!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED;
Aqui guardamos en un array el argumento(nombre) cuando ejecutamos el cmd a alguien
Creamos el arrray y la variable "player"
PHP Code:
static arg[32], player
Esto lee los argumentos y los juarda en el array
PHP Code:
read_argv(1, arg, sizeof arg - 1)
Aca seteamos las condiciones que tiene que tener
el player, ejemplo que este vivo(no estoy muy seguro si me equivoque diganme plis)
PHP Code:
player = cmd_target(id, arg, CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF)
Si no es valido no continua
PHP Code:
if (!player) return PLUGIN_HANDLED;
Aqui se detecta si el player ya es assassin o si ya hay otro modo, ensi son mas condiciones(despues le explico como hacer esta funcion
de "allowed_assassin")
PHP Code:
if (!allowed_assassin(player))
{
client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
return PLUGIN_HANDLED;
}
Si pasa todas esas condiciones se ejecuta esta funcion al player elegido.
PHP Code:
command_assassin(id, player)
return PLUGIN_HANDLED
}
Bueno entonses nuestro public del comando y de condiciones nos quedaria asi:
PHP Code:
public cmd_assassin(id, level, cid)
{
if (!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED;
static arg[32], player
read_argv(1, arg, sizeof arg - 1)
player = cmd_target(id, arg, CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF)
if (!player) return PLUGIN_HANDLED;
if (!allowed_assassin(player))
{
client_print(id, print_console, "[ZP] %L", id, "CMD_NOT")
return PLUGIN_HANDLED;
}
command_assassin(id, player)
return PLUGIN_HANDLED
}
3. Crear la funcion "allowed_...."
En este caso seria
"allowed_assassin", esta funcion es simple solo son para usarlas de condicion,
esas son condiciones como que no aya otro modo, que no aya empesado el modo assassin ni que el player sea assassin
Buscamos
"allowed_survivor" (sin comillas) y encontraremos esto
PHP Code:
allowed_survivor(id)
{
if (g_endround || !g_newround || !is_user_alive(id) || !get_pcvar_num(cvar_surv) || task_exists(TASK_WELCOMEMSG) || fnGetAlive() < get_pcvar_num(cvar_survminplayers))
return false;
return true;
}
Debajo de ese aremos el nuestro
PHP Code:
allowed_assassin(id) // Nombre del public
{
// Si termina o empiesa un modo o el user esta muerto o el modo esta desactivado O existe el TASK_WELCOMEMSG que es antes del round , o la cantidad de user es menor a la requerida por el modo
if (g_endround || !g_newround || !is_user_alive(id) || !get_pcvar_num(cvar_assassin) || task_exists(TASK_WELCOMEMSG) || fnGetAlive() < get_pcvar_num(cvar_assassinminplayers))
return false;
// Si esas condiciones se cumple devuelve 0 o false es decir no continua
return true;
}
4. Creamos el public con las funciones para que empiese el modo
Bueno buscamos
"command_survivor(id, player)" (sin comillas) y encontraremos esto
PHP Code:
command_survivor(id, player)
{
static name1[32], name2[32]
get_user_name(id, name1, sizeof name1 - 1)
get_user_name(player, name2, sizeof name2 - 1)
// Show activity?
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - %s %L", name2, LANG_PLAYER, "CMD_SURVIVAL")
case 2: client_print(0, print_chat, "ADMIN %s - %s %L", name1, name2, LANG_PLAYER, "CMD_SURVIVAL")
}
// Log to Zombie Plague log file?
if (get_pcvar_num(cvar_logcommands))
{
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", name1, authid, ip, name2, LANG_SERVER,"CMD_SURVIVAL", fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
// Turn into a Survivor
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_SURVIVOR, player)
}
Como siempre debajo de el creamos el nuestro
Nombre del public
PHP Code:
command_assassin(id, player)
{
Aca tomamos el dos nombres , del adm que ejecuto la accion y el que sera comvertido
PHP Code:
static name1[32], name2[32]
get_user_name(id, name1, sizeof name1 - 1)
get_user_name(player, name2, sizeof name2 - 1)
Aqui toma el nuemero en que esta la cvar_showactivty y dara un mensaje dependiendo de ello
PHP Code:
switch (get_pcvar_num(cvar_showactivity))
{
// Si esta en uno dara este
case 1: client_print(0, print_chat, "ADMIN - %s %L", name2, LANG_PLAYER, "CMD_ASSASSIN")
// Si esta en dos dara este
case 2: client_print(0, print_chat, "ADMIN %s - %s %L", name1, name2, LANG_PLAYER, "CMD_ASSASSIN")
}
Aca toma la cvar_logcommands y si esta en 1 (activada) prosigue a lo de abajo
PHP Code:
if (get_pcvar_num(cvar_logcommands))
{
// Creamos estos arrays para useralso despues
static logdata[100], authid[32], ip[16]
// Tomamos el authid del adm y la ip del mismo
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
// Creamos el formatex , es decir el message que aparecera en el archivo zombieplague(en la carpeta "logs")
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", name1, authid, ip, name2, LANG_SERVER,"CMD_ASSASSIN", fnGetPlaying(), g_maxplayers)
// Aca seteamos donde se guardara todo
log_to_file("zombieplague.log", logdata)
} // Esto sirve para guardarlo en el arhivo log no cambia nada en el comando.
Aca removemos el task del makezombie es decir lo que nos impide empesar un modo(se activa cuando empiesa uno )
PHP Code:
remove_task(TASK_MAKEZOMBIE)
Esta esl a accion para que epiese el modo y asignarlo al player que se escribe en el cmd_assassin
PHP Code:
make_a_zombie(MODE_ASSASSIN, player)
}
Entonses el code nos quedaria asi:
PHP Code:
command_assassin(id, player)
{
static name1[32], name2[32]
get_user_name(id, name1, sizeof name1 - 1)
get_user_name(player, name2, sizeof name2 - 1)
switch (get_pcvar_num(cvar_showactivity))
{
case 1: client_print(0, print_chat, "ADMIN - %s %L", name2, LANG_PLAYER, "CMD_ASSASSIN")
case 2: client_print(0, print_chat, "ADMIN %s - %s %L", name1, name2, LANG_PLAYER, "CMD_ASSASSIN")
}
if (get_pcvar_num(cvar_logcommands))
{
static logdata[100], authid[32], ip[16]
get_user_authid(id, authid, sizeof authid - 1)
get_user_ip(id, ip, sizeof ip - 1, 1)
formatex(logdata, sizeof logdata - 1, "ADMIN %s <%s><%s> - %s %L (Players: %d/%d)", name1, authid, ip, name2, LANG_SERVER,"CMD_ASSASSIN", fnGetPlaying(), g_maxplayers)
log_to_file("zombieplague.log", logdata)
}
remove_task(TASK_MAKEZOMBIE)
make_a_zombie(MODE_ASSASSIN, player)
}
5. Truco con el cual ara que funcione bien el comando (ami no me andava bien antes de hacer esto)
Buscamos en el respectivo modo al cual le estemos creando el comando, en nuestro caso el
modo_assasin
osea que buscamos
PHP Code:
g_lastmode = MODE_ASSASSIN
y encotraremos esto
PHP Code:
g_lastmode = MODE_ASSASSIN
// Choose player randomly?
id = fnGetRandomAlive(random_num(1, iPlayersnum))
Ahora agregaremos esto
PHP Code:
if(mode == MODE_NONE)
y nos quedaria asi.
PHP Code:
g_lastmode = MODE_ASSASSIN
// Choose player randomly?
if(mode == MODE_NONE)
id = fnGetRandomAlive(random_num(1, iPlayersnum))
Aun no entendi porque pero ami me funciono bien el comando cuando ise esto.
Nota2: De esa manera yo ahroa tengo en el menu de admin la primer pag completa de comandos para comvertir a alguien
Espero que les funcione, cualquier consulta por MP en el foro o por mail
"
[email protected]"
PD: yo lo ise con el zp v4.1 no se si sirve para 4.2 o 4.3
__________________