Enviar respuesta 
[TUT] Plugin API y subplugins.
Autor Mensaje
Mario AR. Sin conexión
Super Mario 64


Plugin developer Donador Medalla de aportes 1k
Mensajes: 1,235
Registro en: Feb 2014
Reputación: 61
Mensaje: #1
[TUT] Plugin API y subplugins.
Requerimientos previos:
- Dynamic Natives
- Arrays
- Manejo de menús
- Forwards (No encontré un buen tuto de esto así que lo explico aquí)

Opcional:
- Tries
- Bitsums

El objetivo de este tuto es poder crear un plugin que realice algunas funciones y se complemente con otros plugins que llamaremos "subplugins", a este plugin se le llamará Plugin API.
Tenemos 2 formas de comunicar plugins a través del entorno virtual: Forwards y Natives.

Explicaré lo que es una forward, con un ejemplo:
Código PHP:
public client_putinserver(id
Como vemos, esta es una función que se llama en todos los plugins que la tengan como "public" y la tengan registrada como una forward.

Si revisamos amxmodx.inc encontraremos esto:
Código PHP:
/* Called when client is entering to a game. */
forward client_putinserver(id); 
Es aquí donde se indica que es una forward.

Una forward es una función específica que se llama en todos los plugins que la contengan como una función pública y registrada como forward.
Otro ejemplo: zp_extra_item_selected (forward que se llama cuando se compra un extra item en ZP).

Para explicar mejor cómo hacer una API con forwards y natives, haré un ejemplo con una tienda, cuyos artículos se registran a través de subplugins.

1. Creando la tienda con hardcode.
Código PHP:
#include <amxmodx>
#include <cstrike>
#include <fun>

new g_callback;

public 
plugin_init()
{
    
register_plugin("Test Shop""0.1""Cajita De Leshe");
    
register_clcmd("say /shop""clcmd_shop");

    
g_callback menu_makecallback("menu_shop_cb");
}

public 
clcmd_shop(id)
{
    new 
menu menu_create("Tienda""menu_shop");
    
menu_additem(menu"Ak-47", .callback g_callback);
    
menu_additem(menu"M4a1", .callback g_callback);
    
menu_additem(menu"200 HP", .callback g_callback);

    
menu_display(idmenu);
}

public 
menu_shop_cb(idmenuitem)
{
    if (!
is_user_alive(id))
        return 
ITEM_DISABLED;

    return 
ITEM_ENABLED;
}

public 
menu_shop(idmenuitem)
{
    if (!
is_user_connected(id) || !is_user_alive(id))
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }

    switch (
item)
    {
        case 
0give_item(id"weapon_ak47");
        case 
1give_item(id"weapon_m4a1");
        case 
2set_user_health(id200);
    }

    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;

Es una tienda bastante simple, con los items hardcodeados.

2. Siguente paso: que se puedan editar los nombres de los ítems sin tocar el menú.
Código PHP:
#include <amxmodx>
#include <cstrike>
#include <fun>

new g_callback;

new const 
ITEMS[][] = { "AK47""M4A1""200 HP" }; // Ahora los items los tengo en una matriz constante.

public plugin_init()
{
    
register_plugin("Test Shop""0.1""Cajita De Leshe");
    
register_clcmd("say /shop""clcmd_shop");

    
g_callback menu_makecallback("menu_shop_cb");
}

public 
clcmd_shop(id)
{
    new 
menu menu_create("Tienda""menu_shop");

    for (new 
03i++)
        
menu_additem(menuITEMS[i], .callback g_callback);

    
menu_display(idmenu);
}

public 
menu_shop_cb(idmenuitem)
{
    if (!
is_user_alive(id))
        return 
ITEM_DISABLED;

    return 
ITEM_ENABLED;
}

public 
menu_shop(idmenuitem)
{
    if (!
is_user_connected(id) || !is_user_alive(id))
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }

    switch (
item)
    {
        case 
0give_item(id"weapon_ak47");
        case 
1give_item(id"weapon_m4a1");
        case 
2set_user_health(id200);
    }

    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;

Pero me dirán... y esto para qué sirve? Si aún hay hardcode en el handler del menú. Pues sí, no sirve de mucho, es aquí donde entra la utilidad de un plugin API.

3. Ahora haré que cada ítem se registre con una native, y cuando el ítem sea elegido se comunique al subplugin que registró el ítem a través de una forward. De esta forma el subplugin manejará lo que sea que se haya comprado.
Código PHP:
#include <amxmodx>
#include <cstrike>

new g_callback;
new 
g_items_count// Una variable para contar los ítems registrados
new Array:g_item_name, Array:g_item_cost// Arrays dinámicas para los nombres y costos de los ítems.
new forward_itemselected// Una variable para almacenar el id de la forward.

public plugin_natives()
{
    
// Una native para registrar ítems en la tienda.
    
register_native("tienda_registrar""native_register"0);
}

public 
plugin_init()
{
    
register_plugin("Test Shop""0.1""Cajita De Leshe");
    
register_clcmd("say /shop""clcmd_shop");

    
g_callback menu_makecallback("menu_shop_cb");
    
    
// Esta será la forward que se llamará cuando se seleccione un ítem.
    
forward_itemselected CreateMultiForward("tienda_item_seleccionado"ET_STOPFP_CELLFP_CELL);
    
// ET_STOP: Parámetro que indica detener la llamada si algún plugin retorna PLUGIN_HANDLED.
    // FP_CELL: Significa que se enviará una celda de dato. Ej, el índice de un jugador es una celda.
    // En este caso puse 2, 1 para el id del jugador, otra para el id del ítem seleccionado.

    // Arrays dinámicas
    
g_item_name ArrayCreate(32); // 32 celdas debe ser suficiente...
    
g_item_cost ArrayCreate();
}

// Aclaro: uso el estilo 0 de las natives porque me parece más cómodo
// Usar el estilo 0 o 1 es a gusto del cliente.
public native_register(pluginparams)
{
    
// La native tendrá esta estructura:
    // tienda_registrar(nombre[], precio)
    
new szNombre[32];
    
get_string(1szNombrecharsmax(szNombre));

    
ArrayPushString(g_item_nameszNombre); // Guardamos el nombre
    
ArrayPushCell(g_item_costget_param(2)); // Guardamos el costo

    
g_items_count++; // Incrementamos en 1 el contador de ítems.

    
return g_items_count// Retornamos el contador que servirá como un ID para el ítem. 
    // Un detalle: Al usar ArrayGetString/Cell, usaremos un número que es 1 menos que el ID del ítem.
    // ¿Por qué? Porque no es apropiado enviar un ID 0, por eso el primer ID será 1 y le corresponde el número 0 en las arrays dinámicas.
}

public 
clcmd_shop(id)
{
    new 
menu menu_create("Tienda""menu_shop");
    new 
szItem[50], lenbool:canbuycost;

    for (new 
0g_items_counti++)
    {
        
// Agregamos el costo
        
cost ArrayGetCell(g_item_costi);
        
canbuy = (cs_get_user_money(id) >= cost) ? true false;

        
len formatex(szItemcharsmax(szItem), "\%c[$%d]\%c "canbuy 'y' 'r'costcanbuy 'w' 'd');

        
// Ahora el nombre del item
        
ArrayGetString(g_item_nameiszItem[len], charsmax(szItem)-len);

        
menu_additem(menuszItem, .callback canbuy ? -g_callback/*Si no puede comprar, llamamos al callback para desactivar el ítem*/); 
    }

    
// Esto es solo estético
    
menu_setprop(menuMPROP_EXITNAME"\ySalir");
    
menu_setprop(menuMPROP_BACKNAME"Anterior");
    
menu_setprop(menuMPROP_NEXTNAME"Siguiente");

    
menu_display(idmenu);
}

public 
menu_shop_cb(idmenuitem)
{
    
// Este callback sólo se llama cuando no alcanza el dinero...
    
return ITEM_DISABLED;
}

public 
menu_shop(idmenuitem)
{
    if (!
is_user_connected(id) || !(<= item g_items_count))
    {
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }

    
// Primero comprobamos que el usuario tenga dinero suficiente.
    
new cost ArrayGetCell(g_item_costitem);
    new 
money cs_get_user_money(id);
    if (
money >= cost)
    {
        
// Estamos listos, ahora avisaremos al subplugin que se quiere comprar el ítem
        // Aquí entra el trabajo de las forwards.
        
new ret// Una variable para almacenar el valor de retorno
        
ExecuteForward(forward_itemselectedretiditem+1);
        
// Como explique anteriormente, el ID del ítem es 1 unidad más que el número en los arrays y el menú.


        // Supongamos que tengo un subplugin que da un arma, pero qué pasa si lo compro mientras estoy muerto (por imbécil o por accidente).
        // El subplugin debe comprobar si el jugador está en condición de comprar el ítem.
        // Para eso es el valor de retorno, si el subplugin comprueba que no puedo comprar, debe retornar PLUGIN_HANDLED.

        
if (ret == PLUGIN_HANDLED// No puede comprar
            
client_print(idprint_chat"No puedes comprarlo ahora.");
        else 
// Se ha entregado el ítem, a cobrar!
        
{
            new 
szItemName[32];
            
ArrayGetString(g_item_nameitemszItemNamecharsmax(szItemName));
            
client_print(idprint_chat"Has comprado: %s"szItemName);
            
cs_set_user_money(idmoney-cost);
        }
    }
    else
        
client_print(idprint_chat"No tienes el dinero suficiente.");

    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;

Listo! Ya está, una tienda API completamente funcional.

4. Ahora veremos los subplugins. Anteriormente expliqué que para que funcione una forward se debe indicar como tal (como se hace en amxmodx.inc con client_putinserver). Para esto, crearemos una librería (include) para nuestra API.
Código PHP:
#if defined _shop_api_included // Si ya se definio _shop_api_included
    #endinput // Aqui terminamos, lo que sigue en el .inc no se agregara al plugin.
#endif

#define _shop_api_included // Definimos _shop_api_included
// Lo de arriba sirve para evitar líos si pones #include <libreria> 2 veces o más.

// Bastante simple, registré una native y una forward
// Aquí indico su estructura a los plugins que tengan esta librería incluida

// La native para registrar un ítem.
native tienda_registrar(const nombre[], precio);

// La forward que se llama cuando un jugador elige un ítem.
forward tienda_item_seleccionado(iditem_id); 

5. Crearemos un subplugin. Asumiendo que guardamos la librería con el nombre "tienda.inc". Este subplugin será de un ítem: +100 HP.
Código PHP:
#include <amxmodx>
#include <fun>
#include <tienda> // La librería de nuestra API

new g_item// Variable para almacenar el id del ítem.

public plugin_init()
{
    
register_plugin("[Tienda] +100 HP""0.1""Cajita De Leshe");
    
    
// Recordemos la native: va el nombre y el costo, retorna el id del item.
    
g_item tienda_registrar("+100 HP"700);
}

// Esta es la forward que se va a llamar cuando un ítem es seleccionado.
public tienda_item_seleccionado(iditem_id)
{
    
// La forward nos pasa el ID del ítem seleccionado.
    // Si el ID no es el ID de este ítem, entonces este subplugin no tiene nada que hacer.
    
if (item_id != g_item)
        return 
PLUGIN_CONTINUE// Plugin continue: continua la forward.
    
    // Si llegamos aquí, entonces el ítem es el de este subplugin.
    // Cada subplugin pone sus reglas
    // En este caso, este ítem es sólo para vivos!

    
if (!is_user_alive(id))
        return 
PLUGIN_HANDLED// Como pusimos en el API: PLUGIN_HANDLED = No se compró.

    // Si llegamos aquí, felicidades! Has comprado un ítem!
    
set_user_health(idget_user_health(id)+100); // Aquí entregamos el ítem, en este caso +100 HP.
    
    
return PLUGIN_CONTINUE;


Y eso es todo! Consulten cualquier duda, estoy para responder.

(10/05/2019 08:23 PM)Niper.-. escribió:  Trap no son tus putas trap es mi equipo tumbando el foro de amxmodx hey tumbando el foro hey tumbando el foroooo ya saben todos nos llevamos todos los pluginsss..

(18/02/2019 03:08 PM)Neeeeeeeeeel.- escribió:  Shit

(28/02/2015 03:27 AM)sasske escribió:  Vete al diablo detallista de mierda Oh god why

(26/12/2018 02:45 PM)[R]ak escribió:  yo solo te veo en whatsapp agarrando culos.. nose..

(09/06/2017 12:59 AM)kikizon2 escribió:  Quiero que leas las reglas, y si fuese posible que saltaras de un 10mo piso, pls.

(21/04/2017 01:27 AM)Chamo. escribió:  Cuanto hay que pagar para estar en tu firma TrolleyesThats what she said?

(20/04/2017 11:56 PM)matrix123 escribió:  Patrocinas rehlds? Es de lo único que hablas, mañana seguro te llegan remeras de rehlds, mandame una Whatever

(26/04/2017 08:47 PM)Dieguito escribió:  al que me salga con latinservers le meto un sugisaki por el c***

(26/02/2017 08:02 PM)meTaLiCroSS escribió:  La misma aritmetica se aplica con los Strings falsos que inventé ("trivago" y "pajarussel").

(13/02/2017 07:41 PM)Heber[$]ource escribió:  es nuvpawn, nos esta ddoseando con su sega genesis

(06/01/2015 10:47 PM)meTaLiCroSS escribió:  
(06/01/2015 10:40 PM)wiD escribió:  este chileno culiau :whatever;
¿Que?

(29/04/2016 11:44 PM)wiD escribió:  Te juro que si te tengo enfrente primero te piso con el auto y despues te meo en la boca.

(16/07/2014 06:38 PM)wiD escribió:  Mongito dame su name que quiero un chip para pegar todo cocow

(18/03/2015 02:04 PM)ErikMav94 escribió:  
(18/03/2015 02:03 PM)mongito100 escribió:  Son todos putos
escribís como el orto :trolleyes;

[Anti] escribió:Olle tranquilo cerebrito

(03/04/2015 12:16 AM)Treki escribió:  
(03/04/2015 12:11 AM)Sugisaki escribió:  cual plug?, el arkshine o el de arkshine?

Fixed*

(09/03/2015 09:49 PM)Moroha escribió:  Suspendieron al abaricioso platero de kikizon :trolleyes;

(26/05/2014 08:31 PM)ivan escribió:  hola quiero hacer combo para el party uso el de rank

(22/08/2014 11:41 PM)Store.gh escribió:  Join team de jeropito? A vos t hace falta un pito..

(26/02/2015 01:01 AM)meTaLiCroSS escribió:  
(26/02/2015 12:54 AM)sasske escribió:  Salida del horno nueva versión, que obsesionado estoy :3
PD: Me olvide de darle los créditos a metal xD, pobre metal xd
Da igual, dejalo como una enseñanza jejej no te llorare por unos creditos ehhmm hud...

(18/01/2015 12:31 AM)[R]ak escribió:  no me critican.. solo dicen boludeces

(05/01/2015 12:43 AM)roccoxx escribió:  Sentado en dust pensando como fui tan gil ♪
Image
(Este mensaje fue modificado por última vez en: 05/01/2015 08:31 PM por Mario AR..)
05/01/2015 11:30 AM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
AaxShitans.- Sin conexión
Suspendido


Mensajes: 73
Registro en: Sep 2014
Mensaje: #2
RE: [TUT] Plugin API y subplugins.
Excelente Mario
05/01/2015 12:32 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
elpapimejor Sin conexión
Miembro Sr.


Trebol verde
Mensajes: 714
Registro en: Oct 2014
Reputación: 5
Mensaje: #3
[TUT] Plugin API y subplugins.
T.e a.m.o Mario gracias por este excelente tuto, este tuto lo hiciste por mi pregunta verdad?

(03/08/2018 03:13 PM)Skylar escribió:  Está bien que pidas ayudas, pero no para que crees 20 post todos los días mogolico de mierda, me tenes re podrido ya, contraté 10000 sicarios para que te busquen y te maten toda la familia, y a vos que te revienten con una bazooka.
05/01/2015 01:18 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
ErikMav94 Sin conexión
Miembro Sr.


Mensajes: 645
Registro en: Dec 2013
Reputación: 14
Mensaje: #4
RE: [TUT] Plugin API y subplugins.
excelente tutorial

podrías agregar en el tuto para que sirven las siguientes constantes de las forwards

Código PHP:
ET_IGNORE 
ET_STOP 
// este ya lo explicaste
ET_STOP2
ET_CONTINUE


FP_CELL 
// este ya lo explicaste , aunque los de abajo son un poco obvios 
FP_FLOAT
FP_STRING
FP_ARRAY 

solo para hacerlo mas completo pienso yo
(Este mensaje fue modificado por última vez en: 05/01/2015 02:03 PM por ErikMav94.)
05/01/2015 02:02 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
matrix123 Sin conexión
Miembro Destacado


1k
Mensajes: 1,441
Registro en: Oct 2014
Reputación: 16
Mensaje: #5
RE: [TUT] Plugin API y subplugins.
ET_IGNORE y ET_CONTINUE son bastante obvios, ET_STOP2 seria mejor preguntar para que sirve

05/01/2015 05:32 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
ErikMav94 Sin conexión
Miembro Sr.


Mensajes: 645
Registro en: Dec 2013
Reputación: 14
Mensaje: #6
RE: [TUT] Plugin API y subplugins.
(05/01/2015 05:32 PM)matrix123 escribió:  ET_IGNORE y ET_CONTINUE son bastante obvios, ET_STOP2 seria mejor preguntar para que sirve

me refería a que los agregue al tutorial para que la gente que lo lea sepa que existen otros aparte de ET_STOP y FP_CELL, por si se les ocurre hacer otra cosa en vez del menú que explica
05/01/2015 06:25 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Mario AR. Sin conexión
Super Mario 64


Plugin developer Donador Medalla de aportes 1k
Mensajes: 1,235
Registro en: Feb 2014
Reputación: 61
Mensaje: #7
RE: [TUT] Plugin API y subplugins.
(05/01/2015 01:18 PM)elpapimejor escribió:  T.e a.m.o Mario gracias por este excelente tuto, este tuto lo hiciste por mi pregunta verdad?

Por supuesto que no cómo se te ocurre e.e LolLolLol

(05/01/2015 02:02 PM)ErikMav94 escribió:  excelente tutorial

podrías agregar en el tuto para que sirven las siguientes constantes de las forwards

Código PHP:
ET_IGNORE 
ET_STOP 
// este ya lo explicaste
ET_STOP2
ET_CONTINUE


FP_CELL 
// este ya lo explicaste , aunque los de abajo son un poco obvios 
FP_FLOAT
FP_STRING
FP_ARRAY 

solo para hacerlo mas completo pienso yo
En otro momento hago un tutorial de forwards, para no desviarme del tema principal en este thread.

(10/05/2019 08:23 PM)Niper.-. escribió:  Trap no son tus putas trap es mi equipo tumbando el foro de amxmodx hey tumbando el foro hey tumbando el foroooo ya saben todos nos llevamos todos los pluginsss..

(18/02/2019 03:08 PM)Neeeeeeeeeel.- escribió:  Shit

(28/02/2015 03:27 AM)sasske escribió:  Vete al diablo detallista de mierda Oh god why

(26/12/2018 02:45 PM)[R]ak escribió:  yo solo te veo en whatsapp agarrando culos.. nose..

(09/06/2017 12:59 AM)kikizon2 escribió:  Quiero que leas las reglas, y si fuese posible que saltaras de un 10mo piso, pls.

(21/04/2017 01:27 AM)Chamo. escribió:  Cuanto hay que pagar para estar en tu firma TrolleyesThats what she said?

(20/04/2017 11:56 PM)matrix123 escribió:  Patrocinas rehlds? Es de lo único que hablas, mañana seguro te llegan remeras de rehlds, mandame una Whatever

(26/04/2017 08:47 PM)Dieguito escribió:  al que me salga con latinservers le meto un sugisaki por el c***

(26/02/2017 08:02 PM)meTaLiCroSS escribió:  La misma aritmetica se aplica con los Strings falsos que inventé ("trivago" y "pajarussel").

(13/02/2017 07:41 PM)Heber[$]ource escribió:  es nuvpawn, nos esta ddoseando con su sega genesis

(06/01/2015 10:47 PM)meTaLiCroSS escribió:  
(06/01/2015 10:40 PM)wiD escribió:  este chileno culiau :whatever;
¿Que?

(29/04/2016 11:44 PM)wiD escribió:  Te juro que si te tengo enfrente primero te piso con el auto y despues te meo en la boca.

(16/07/2014 06:38 PM)wiD escribió:  Mongito dame su name que quiero un chip para pegar todo cocow

(18/03/2015 02:04 PM)ErikMav94 escribió:  
(18/03/2015 02:03 PM)mongito100 escribió:  Son todos putos
escribís como el orto :trolleyes;

[Anti] escribió:Olle tranquilo cerebrito

(03/04/2015 12:16 AM)Treki escribió:  
(03/04/2015 12:11 AM)Sugisaki escribió:  cual plug?, el arkshine o el de arkshine?

Fixed*

(09/03/2015 09:49 PM)Moroha escribió:  Suspendieron al abaricioso platero de kikizon :trolleyes;

(26/05/2014 08:31 PM)ivan escribió:  hola quiero hacer combo para el party uso el de rank

(22/08/2014 11:41 PM)Store.gh escribió:  Join team de jeropito? A vos t hace falta un pito..

(26/02/2015 01:01 AM)meTaLiCroSS escribió:  
(26/02/2015 12:54 AM)sasske escribió:  Salida del horno nueva versión, que obsesionado estoy :3
PD: Me olvide de darle los créditos a metal xD, pobre metal xd
Da igual, dejalo como una enseñanza jejej no te llorare por unos creditos ehhmm hud...

(18/01/2015 12:31 AM)[R]ak escribió:  no me critican.. solo dicen boludeces

(05/01/2015 12:43 AM)roccoxx escribió:  Sentado en dust pensando como fui tan gil ♪
Image
05/01/2015 06:55 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
wicho Sin conexión
Miembro Destacado


Mensajes: 776
Registro en: Oct 2013
Reputación: 1
Mensaje: #8
RE: [TUT] Plugin API y subplugins.
Muy bueno y si estaria bien un tutorial de forwards..
05/01/2015 10:14 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
totopizza Sin conexión
http://www.MexicanServers.com


Donador Forum supporter Trebol verde Trebol de oro 1k
Mensajes: 2,094
Registro en: Mar 2014
Reputación: 40
Mensaje: #9
RE: [TUT] Plugin API y subplugins.
Oye Mario Trolleyes

Que buen tutorial!
Aprendi mucho :3

Image

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016 05:05 PM)meTaLiCroSS escribió:  Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019 05:32 PM)meTaLiCroSS escribió:  grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
06/01/2015 02:17 AM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
elpapimejor Sin conexión
Miembro Sr.


Trebol verde
Mensajes: 714
Registro en: Oct 2014
Reputación: 5
Mensaje: #10
[TUT] Plugin API y subplugins.
Nojoda Mario, y yo tratando de entender una tienda basebuilder rusa para hacer un tuto xD

Déjale oportunidad a los nuevos jajjajajaj

(03/08/2018 03:13 PM)Skylar escribió:  Está bien que pidas ayudas, pero no para que crees 20 post todos los días mogolico de mierda, me tenes re podrido ya, contraté 10000 sicarios para que te busquen y te maten toda la familia, y a vos que te revienten con una bazooka.
(Este mensaje fue modificado por última vez en: 06/01/2015 11:49 AM por elpapimejor.)
06/01/2015 11:48 AM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)

Contáctanos | Allied Modders en español | Volver arriba | Volver al contenido | Archivo (Modo simple) | Sindicación RSS