26/04/2014, 11:09 PM
(Última modificación: 06/05/2014, 11:31 AM por mongito100.)
Hola gente de AM aca les traigo un tuto de como hacer un trade por q vi hace rato q muchos querian uno, espero q les sirva ante cualquier bug y/o agregado interesante o explicacion faltante que vean no duden en comentarlo
PD:No he tenido tiempo de probarlo
Código PHP:
#include <amxmodx>
#define PLUGIN "Tutorial Trade"
#define VERSION "1.0"
#define AUTHOR "mongito100"
#define SLOTS 32
new g_maxplayers //Varible q nos dira el maximo numero de jugadores del sv
new g_tipotrade[SLOTS+1]//varible para saber q vamos a canjear si oro por diamantes o viceversa
new g_intrade[SLOTS+1]//variable para saber si esta en trade
new g_oros[SLOTS+1]//variable que gurada datos a intercambiar
new g_diamantes[SLOTS+1]//variable que gurada datos a intercambiar
new g_levels[SLOTS+1] //varible q restringira el intercambio en caso de estar habilitada la cvar
new CvarRestringir//Aqui se almacenara la cvar para saber si se restringe el cambio de acuerdo al level
new CvarMinLevel//Aqui se almacenara la cvar para saber cual es el nivel minimo para poder hacer el trueque
new CvarTimeAcept//Aqui se almacenara la cvar para decidir el tiempo en cual desaparece la opcion de trade
new g_jugadorselec[SLOTS+1]//Variable para saber el jugador seleccionado
new g_jugadormaster[SLOTS+1]//Variable para saber el jugador que empieza el trade
new menu_aceptar//menu de trueque
enum
{
OROS,
DIAMANTES
}
new g_cambio[SLOTS+1][2]//Varible para saber q estoy camiando
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /canje" , "cmd_canje")//Registramos cuando digan /cange
register_clcmd( "DAR", "cmd_dar" )
register_clcmd( "RECIBIR", "cmd_recibir" )
CvarRestringir = register_cvar("trade_level", "1")
/*
Si esta en 0 el intercambio pude darse entre cualquier jugador
Si esta en 1 el que inicia el trueque debe tener un lvl mayor al definido por la cvar
Si esta en 2 tanto el que inicia el trueque como el que lo recibe deben tener un lvl mayor al definido por la cvar
*/
CvarMinLevel = register_cvar("trade_minlevel", "30")
CvarTimeAcept = register_cvar("trade_timeacept", "10.0")
g_maxplayers = get_maxplayers( )
}
public client_disconnect(id)
if(task_exists(id+100))
remove_task(id+100)
public cmd_canje(id)
{
new menu_canje =menu_create("Menu intercambios","handle_canje")
if(get_pcvar_num(CvarRestringir) && g_levels[id]< get_pcvar_num(CvarMinLevel))//Si trueque es por nivel y el jugador no tiene lvl necesario...
{
new item[20]
formatex(item,charsmax(item),"\d No puedes realizar trueques hasta el nivel: %d",get_pcvar_num(CvarMinLevel))
menu_additem(menu_canje,item,"0")
}
else//Si no...
{
menu_additem(menu_canje,"Cambiar oros por diamantes","0")
menu_additem(menu_canje,"Cambiar diamantes por oros","1")
}
menu_setprop(menu_canje, MPROP_EXITNAME, "Salir")
menu_display(id,menu_canje,0)
}
public handle_canje(id, menu, item)
{
if(item == MENU_EXIT || (get_pcvar_num(CvarRestringir) && g_levels[id]< get_pcvar_num(CvarMinLevel)))
{//Si trueque es por nivel y el jugador no tiene lvl necesario o si seleccione el item de salir...
menu_destroy(menu)//Destruimos el menu
return PLUGIN_CONTINUE//retornamos
}
g_tipotrade[id] = item//Guardamos en la variable el tipo de canje(monedas por diamantes o alreves)
cmd_menujugadores(id)//Mostramos el menu de jugadores
return PLUGIN_HANDLED
}
public cmd_menujugadores(id)
{
new menu = menu_create("\rHacer truque con:","handle_jugador")
new temp2[2],player[32], item_player[55],item_num = 0
for (new i = 1; i <= g_maxplayers; i++)
{
if(!is_user_connected(i) || (get_pcvar_num(CvarRestringir) == 2 && g_levels[i]< get_pcvar_num(CvarMinLevel)) || i == id)
//Si no esta conectado o si la cvar no nos permite q este en trade por su lvl o si es el mismo...
continue//No lo agregamos al menu
get_user_name(i,player,charsmax(player))//Obtennemos el nombre
formatex(item_player,charsmax(item_player),"%s%s",g_intrade[i] ? "\d[En trade]":"",player)//Si esta en trade lo aclaramos en el menu
num_to_str(item_num,temp2,1)//Convertimos a string item_num en la variable temp2
menu_additem(menu,item_player,temp2)//Agregamos al jugador al menu
item_num++//incrementamos el item del menu
}
menu_setprop(menu, MPROP_EXITNAME, "Volver")
menu_display(id,menu,0)
}
public handle_jugador(id,menu,item)
{
if(item == MENU_EXIT)//Si selecciono volver...
{
menu_destroy(menu) //Destruimos el menu y mostramos el anterior
cmd_canje(id)
return PLUGIN_CONTINUE
}
static ac, cb, accion[15], name[33], i, id2,szname[33]
menu_item_getinfo(menu, item, ac, accion, charsmax(accion), name, charsmax(name), cb)
for (i = 1; i <= g_maxplayers; i++)
{
if (!is_user_connected(i) ) continue
get_user_name(i,szname,charsmax(szname))
if (equal(name, szname))//Si es igual el nombre en el menu y el nombre del id terminamos con el bucle
{
id2 = i
break
}
else id2 = 0
}
if (!id2)//Si no se encontraron coincidencias en el bucle anterior...
{
client_print(id,print_chat, "No se encontro el jugador seleccionado")
cmd_menujugadores(id)
return PLUGIN_CONTINUE
}
if(g_intrade[id2])//Si el usuario esta en trade
{
client_print(id,print_chat, "El jugador se encuentra en trade")
cmd_menujugadores(id)
}
else//Si el usuario puede recibir el trade
{
g_jugadorselec[id]=id2
g_jugadormaster[id2]=id
g_intrade[id]=1
client_cmd( id, "messagemode DAR" )//Preguntamos la cantidad
}
return PLUGIN_HANDLED
}
public cmd_dar(id)
{
new cantidad[12]
read_args(cantidad, charsmax(cantidad))//Leemos lo que escribio
remove_quotes(cantidad)//Le quitamos los ""
trim(cantidad)//Le quitamos los espacios
if(!is_str_num(cantidad))//Comprobamos si es un numero
{
client_print(id,print_chat, "La caracteristica marcada no pertenece a un numero telefonico xD")
client_cmd( id, "messagemode DAR" )//Preguntamos la cantidad denuevo
return
}
if(str_to_num(cantidad) < 1)
{
client_print(id,print_chat, "La cantidad no puede ser menor a 0")
client_cmd( id, "messagemode DAR" )//Preguntamos la cantidad denuevo
return
}
if((!g_tipotrade[id] && str_to_num(cantidad) > g_oros[id]) || (g_tipotrade[id] && str_to_num(cantidad) > g_diamantes[id]))
{//Si no tiene la cantidad de oros o dimantes q puso
client_print(id,print_chat, "No tienes fondos")
client_cmd( id, "messagemode DAR" )//Preguntamos la cantidad denuevo
return
}
if(g_tipotrade[id])
g_cambio[id][DIAMANTES]=str_to_num(cantidad)
else
g_cambio[id][OROS]=str_to_num(cantidad)
client_cmd( id, "messagemode RECIBIR" )
}
public cmd_recibir(id)
{
new cantidad[12]
remove_quotes(cantidad)//Le quitamos los ""
trim(cantidad)//Le quitamos los espacios
trim(cantidad)
if(!is_str_num(cantidad))//Comprobamos si es un numero
{
client_print(id,print_chat, "La caracteristica marcada no pertenece a un numero telefonico xD")
client_cmd( id, "messagemode RECIBIR" )//Preguntamos la cantidad denuevo
}
if(str_to_num(cantidad) < 1)//Si la cifra q escribio es menor q 1
{
client_print(id,print_chat, "La cantidad no puede ser menor a 0")
client_cmd( id, "messagemode RECIBIR" )//Preguntamos la cantidad denuevo
}
if((g_tipotrade[id] && str_to_num(cantidad) > g_oros[g_jugadorselec[id]]) || (!g_tipotrade[id] && str_to_num(cantidad) > g_diamantes[g_jugadorselec[id]]))
{//Si el otro jugador no tiene la cantidad de oros o dimantes q puso
client_print(id,print_chat, "El otro jugador no dispone de los fondos")
client_cmd( id, "messagemode RECIBIR" )//Preguntamos la cantidad denuevo
}
if(!g_tipotrade[id])
g_cambio[id][DIAMANTES]=str_to_num(cantidad)
else
g_cambio[id][OROS]=str_to_num(cantidad)
g_intrade[g_jugadorselec[id]]=1
cmd_aceptartrade(g_jugadorselec[id])//Le mostramos el menu al otro jugador
}
public cmd_aceptartrade(id)
{
new trade[70],namemaster[33]
get_user_name(g_jugadormaster[id],namemaster,charsmax(namemaster))
formatex(trade,charsmax(trade),"El juador %s ^nquiere hacer un trueque de:^n \r%d %s \wsuyos por \r%d %s \wtuyos"
,namemaster,g_tipotrade[g_jugadormaster[id]] ? g_cambio[g_jugadormaster[id]][DIAMANTES]:g_cambio[g_jugadormaster[id]][OROS],g_tipotrade[g_jugadormaster[id]] ? "Diamantes":"Oros"
,!g_tipotrade[g_jugadormaster[id]] ? g_cambio[g_jugadormaster[id]][DIAMANTES]:g_cambio[g_jugadormaster[id]][OROS],!g_tipotrade[g_jugadormaster[id]] ? "Diamantes":"Oros")
if(g_tipotrade[g_jugadormaster[id]])
formatex(trade,charsmax(trade),"%s^nQuiere hacer un trueque de:^nr%d \woros por \r%d\wdiamantes",namemaster,g_cambio[g_jugadormaster[id]][OROS],g_cambio[g_jugadormaster[id]][DIAMANTES])
else
formatex(trade,charsmax(trade),"%s^nQuiere hacer un trueque de:^nr%d \wdiamantes por \r%d\woros",namemaster,g_cambio[g_jugadormaster[id]][DIAMANTES],g_cambio[g_jugadormaster[id]][OROS])
menu_aceptar = menu_create(trade,"handle_aceptartrade")
menu_additem(menu_aceptar,"Aceptar","0")
menu_additem(menu_aceptar,"Rechazar","1")
menu_setprop(menu_aceptar, MPROP_EXIT, MEXIT_NEVER)//No hay boton de salir
menu_display(id,menu_aceptar,0)
set_task(get_pcvar_float(CvarTimeAcept),"remover_menu",id+100)//task en caso de q no se seleccione nada en "x" segundos
}
public handle_aceptartrade(id,menu,item)
{
if(task_exists(id+100))
remove_task(id+100)//Si existe el task lo removemos ya q se selecciono un item
g_intrade[id]= 0
g_intrade[g_jugadormaster[id]] = 0
if(item)//Si rechazo el trueque
{
client_print(g_jugadormaster[id],print_chat,"El jugador ha rechazado tu trueque, y dice q eres feo xD")
return PLUGIN_CONTINUE
}
if(g_tipotrade[g_jugadormaster[id]])//Si no...
{
g_oros[g_jugadormaster[id]]-=g_cambio[g_jugadormaster[id]][OROS]
g_diamantes[g_jugadormaster[id]]+=g_cambio[g_jugadormaster[id]][DIAMANTES]
g_oros[id]+=g_cambio[id][OROS]
g_diamantes[id]-=g_cambio[id][DIAMANTES]
}
else//Si no...
{
g_oros[g_jugadormaster[id]]+=g_cambio[g_jugadormaster[id]][OROS]
g_diamantes[g_jugadormaster[id]]-=g_cambio[g_jugadormaster[id]][DIAMANTES]
g_oros[id]-=g_cambio[id][OROS]
g_diamantes[id]+=g_cambio[id][DIAMANTES]
}
client_print(id,print_chat,"El trueque se realizo corectamente sin asesinatos")
client_print(g_jugadormaster[id],print_chat,"El trueque se realizo corectamente sin asesinatos")
return PLUGIN_HANDLED
}
public remover_menu(id)
menu_destroy(menu_aceptar)
PD:No he tenido tiempo de probarlo
[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"
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