[TUT]Trade-Trueque [MANTENIMIENTO]
#1
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
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(PLUGINVERSIONAUTHOR)
    
    
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_canjeMPROP_EXITNAME"Salir")
    
menu_display(id,menu_canje,0)
}

public 
handle_canje(idmenuitem)
{
    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 1<= g_maxplayersi++)
    {
        if(!
is_user_connected(i) || (get_pcvar_num(CvarRestringir) == && g_levels[i]< get_pcvar_num(CvarMinLevel)) || == 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(menuMPROP_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 
accbaccion[15], name[33], iid2,szname[33]
    
menu_item_getinfo(menuitemacaccioncharsmax(accion), namecharsmax(name), cb)
    
    for (
1<= g_maxplayersi++)
    {
        if (!
is_user_connected(i) ) continue
        
        
get_user_name(i,szname,charsmax(szname))
        if (
equal(nameszname))//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(cantidadcharsmax(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_cmdid"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_cmdid"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_cmdid"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_cmdid"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_cmdid"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_cmdid"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_cmdid"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_aceptarMPROP_EXITMEXIT_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"

Anónimo
Responder
#2
GJ, Posiblemente lo use,
Responder
#3
Que es un trade
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
#4
(27/04/2014, 12:03 AM)Metrikcz escribió: Que es un trade

Un truque,un intercambio tipo cambiar 10 ammopacks por 5 puntos humanos, en este caso a modo d ejemplo lo hice con diamantes y oros
[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"

Anónimo
Responder
#5
creditos a [Anti] por algoritmo?
Responder
#6
(27/04/2014, 12:56 AM)[Anti] escribió: creditos a [Anti] por algoritmo?

De hecho no este lo hice desde 0 vos me habías pasado 1 pero ni lo vi xD
[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"

Anónimo
Responder
#7
Míralo bien hay varios errores Lengua y mejores formas de hacerlo n.n

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#8
(01/05/2014, 04:28 PM)cLAANS escribió: Míralo bien hay varios errores Lengua y mejores formas de hacerlo n.n

Saludos,
cLAANS.-

Ya que hay varios errores significa q los vistes y por tanto puedes indicarmelos y si siempre hay mejoras q se puenden hacer esto puede servir como base
[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"

Anónimo
Responder
#9
lo adapte a un modo y cuando pongo lo que quiero recibir me sale en say esto

"La caracteristica marcada no pertenece a un numero telefonico xD" Y "La cantidad no puede ser menor a 0"

Saludos :$
Responder
#10
(01/05/2014, 04:40 PM)mongito100 escribió: Ya que hay varios errores significa q los vistes y por tanto puedes indicarmelos

(01/05/2014, 07:54 PM)GusstiiDg escribió: lo adapte a un modo y cuando pongo lo que quiero recibir me sale en say esto

"La caracteristica marcada no pertenece a un numero telefonico xD" Y "La cantidad no puede ser menor a 0"

Saludos :$

Código PHP:
read_args(cantidadcharsmax(cantidad)) 

(01/05/2014, 04:40 PM)mongito100 escribió: si siempre hay mejoras q se puenden hacer esto puede servir como base

Cuando haces una casa no haces una base de puras piedras y luego cuando tenes las paredes echas le pones cemento.

Si queres dejar una base déjala bien echa y con mucho hierro así no se te viene abajo.

Ademas si dejas algo bien echo muchos pueden aprender cosas nuevas ...

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#11
(01/05/2014, 08:09 PM)cLAANS escribió:
(01/05/2014, 04:40 PM)mongito100 escribió: Ya que hay varios errores significa q los vistes y por tanto puedes indicarmelos

(01/05/2014, 07:54 PM)GusstiiDg escribió: lo adapte a un modo y cuando pongo lo que quiero recibir me sale en say esto

"La caracteristica marcada no pertenece a un numero telefonico xD" Y "La cantidad no puede ser menor a 0"

Saludos :$

Código PHP:
read_args(cantidadcharsmax(cantidad)) 

(01/05/2014, 04:40 PM)mongito100 escribió: si siempre hay mejoras q se puenden hacer esto puede servir como base

Cuando haces una casa no haces una base de puras piedras y luego cuando tenes las paredes echas le pones cemento.

Si queres dejar una base déjala bien echa y con mucho hierro así no se te viene abajo.

Ademas si dejas algo bien echo muchos pueden aprender cosas nuevas ...

Saludos,
cLAANS.-

Perdón señor constructor, ahora lo fixeo el tut lo habia empesado hace mucho
[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"

Anónimo
Responder
#12
5mentarios ...

Fíjate, hay mas cosas, aunque sea yo vi 2 errores lindos ..

y como te dije, si vas a dejar algo echo dejalo con las columnas de hierro de 2 pulgadas

Saludos,
cLAANS.-
Mi unico plugin.
Tutorial de niveles.

Ayudo, pero no de la manera que quieren, si quieren aprender les servirá lo mio, para pedir el codigo en bandeja tienen la sección 'Pedidos'

(09/11/2017, 09:30 PM)SoundBlaster escribió: Espera y llamo a los power rangers para que me digan la linea de error
Responder
#13
(01/05/2014, 09:44 PM)cLAANS escribió: 5mentarios ...

Fíjate, hay mas cosas, aunque sea yo vi 2 errores lindos ..

y como te dije, si vas a dejar algo echo dejalo con las columnas de hierro de 2 pulgadas

Saludos,
cLAANS.-

Ya que podes hacer una base mejor simplemente armala, es decir hacete un tut mejor al mio simplemente lo borro o coregime en lo que vos creas que estoy mal
[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"

Anónimo
Responder
#14
Interesante , buen trabajo.

saludos
NUEVO ZOMBIE PLAGUE + LVLS!! UNETE A LA COMUNIDAD
[Imagen: b_350_20_ffad41_e98100_000000_591f11.png]


Responder
#15
me podrias explicar esto ?

si quiero hacer un shop por diamantes , en este caso la variable cual seria ?
(10/10/2014, 06:38 PM)RauliTop escribió:
(10/10/2014, 04:40 PM)ivan escribió: no sabía que se podia poner los iconos gestuales cuando das reputacion negativa/positiva.
ui, peligro...
pronto habrán reputaciones de ivan:
hace muy muy muii DafuqYao mingGenius buenos Thats what she saidtutoriales Proud me encataan Whatever
Responder
#16
(19/05/2014, 09:36 PM)K.- escribió: me podrias explicar esto ?

si quiero hacer un shop por diamantes , en este caso la variable cual seria ?

g_diamantes
Igualmente el tut esta en mantenimiento dsp de q terminen los parciales voy a ver si mejoro el code además de q no he tenido tiempo de probarlo
Enviando desde android
[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"

Anónimo
Responder
#17
Off :Enviado desde android ? Wtf ?

lo haces vos ?

On :por que esta en mantenimiento ? esta mal el code ? :B
(10/10/2014, 06:38 PM)RauliTop escribió:
(10/10/2014, 04:40 PM)ivan escribió: no sabía que se podia poner los iconos gestuales cuando das reputacion negativa/positiva.
ui, peligro...
pronto habrán reputaciones de ivan:
hace muy muy muii DafuqYao mingGenius buenos Thats what she saidtutoriales Proud me encataan Whatever
Responder
#18
(19/05/2014, 10:26 PM)K.- escribió: Off :Enviado desde android ? Wtf ?

lo haces vos ?

On :por que esta en mantenimiento ? esta mal el code ? :B

Como te dije arriba no tuve ni tengo por el momento tiempo para probarlo y como dijo clanss hay cosas q se pueden mejorar
[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"

Anónimo
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)