[Tutorial] Aprende a usar MSelection [Sistema de Construccion]
#1

ЎHola!, esta guнa la hago porque este es un sistema muy tonto, que toma funciones muy raras, que no se usan a menudo y cuestan aprenderlas, ahora, te enseсarй como crear este sistema, y como guardar los datos y cargarlos.
Para empezar, el menъ donde pondrй las construcciones serб un sistema de mSelection por lo tanto usare el include(Sirve mucho, les recomiendo usarlo), otra forma es usar textdraws pero, no es muy bueno, ya que genera lag y se necesita mucho tiempo para hacerlos, mSelection ahorra todo ese tiempo.
Entonces, para este tutorial/guнa usaremos mSelection, en la parte de arriba de su pawn escriban:

Код:
#include <mSelection>
Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Pasamos a hacer el enum donde guardamos los datos del mueble para moverlos de una funciуn a otra.
Код:
enum pMueble
{
//Aquн si necesitan mбs opciones, por ejemplo, si quita algo, deberбs poner la variable en este 
//enum para poder usarlo y guardarlo fбcilmente(Ej: pValor,).
    pTieneMueble,//Si el jugador tiene un mueble
    pObjetoID//La ID del mueble que crearб.
};
Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 7
Ahora creamos una variable para referirnos al enum, luego, posiciones, бngulo, etc.
Muebles es la lista que usarб el mselection.

Код:
new PlayerInfo[MAX_PLAYERS][pMueble];
new Float:X,Float:Y,Float:Z, Float:fAngle,Objeto_Por_Jugador[MAX_PLAYERS];
new muebles = mS_INVALID_LISTID;
new bool:guardando[MAX_PLAYERS];
Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 4
En OngamemodeInit, ponemos esto, para que cargue los modelos que definiremos proximamente, y carga si hay un archivo llamado mueblesguardado, que es donde se guardan los objetos para crearlos cuando se quitea el .bat del server, si no hay, lo crea.

Код:
    muebles = LoadModelSelectionMenu("obmuebles.txt");
    new File:hFile = fopen("mueblesguardados.inc", io_readwrite);
    if(!hFile)
    {
        print("CMUEBLES: Archivo msaved.inc no ha sido encontrado. Por ende ha sido creado en la carpeta scriptfiles.");
        print(" - - - - - - Gracias por bajar el FS y conservar los creditos. - - - - - - - - -");
        fwrite(hFile, "/* Si quieres convertir este cуdigo en el tipo de xStreamer o otro ve a www.convertffs.com\r\nRecuerda que el script fue por JustBored */\r\n");
        fclose(hFile);
    }
    if(hFile)
    {
        print("CMUEBLES: Archivo mueblesguardados.inc cargado en la carpeta scriptfiles");
        return 1;
    }
    return 1;
}
Cantidad de llaves: Abiertas(2)-Cerradas(3) | Lineas Totales: 16
Bien, ahora creamos el mйtodo para usar este sistema, podemos hacer un comando, podemos hacerlo clickeando una tecla y SelectTextDraw, etc.
Код:
zcmd(cmueble, playerid, params[])
{
    ShowModelSelectionMenu(playerid, muebles, "Muebles", 0x4A5A6BBB, 0x88888899, 0xFAFAFA);//Mostramos el model muebles
    return 1;
}
Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 5
Ahora creamos un comando, el cual, tomarб la posiciуn del jugador y creara un objeto con ID en esa posiciуn(Si el mueble es id 13000, creara un createObject con un objetoID 13000.
Luego de crearlo, ponemos el modo EditObject, para editar el objeto y su posiciуn a la deseada.

Код:
zcmd(colocarm, playerid, params[])
{
    if(PlayerInfo[playerid][pTieneMueble] == 1)
    {
        GetPlayerPos(playerid, X,Y,Z);
        GetPlayerFacingAngle(playerid, fAngle);
        Objeto_Por_Jugador[playerid] = CreateObject(PlayerInfo[playerid][pObjetoID], X + 1,Y,Z, 0,0,fAngle,100.0);//Sumamos a X 1 porque si no aparecerнa encima de nosotros generando bugs los cuales se aprovechan.
        EditObject(playerid, Objeto_Por_Jugador[playerid]);
        SendClientMessage(playerid, 0xFF000FF, "Ahora, cuando termines de posicionar el objeto utiliza /guardarob y clickea en el objeto.");
    }
    return 1;
}
Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 12
En OnPlayerModelSelection, que es el public llamado al usar ShowModelSelectionMenu, pondremos que si estamos hablando de la lista id muebles, la cual fuй llamada antes, y estб siendo llamada y no presiona escape o sale del cuadro, manda un mensaje al player diciendo que el objeto se creу y la variable del enum ptienemueble se activa, ahora ObjetoID es modelid, si presiona escape o sale del cuadro le dirб al player operaciуn cancelada.

Код:
public OnPlayerModelSelection(playerid, response, listid, modelid)
{
    if(listid == muebles)
    {
        if(response)
        {
            PlayerInfo[playerid][pTieneMueble] = 1;
            PlayerInfo[playerid][pObjetoID] = modelid;
            SendClientMessage(playerid, 0xFF0000FF, "Has creado el objeto.  ahora utiliza /colocarm para editar el objeto. ");
           }else SendClientMessage(playerid, 0xFF0000FF, "Operaciуn cancelada.");
    }
    return 1;
}
Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 13
Esta parte es para guardar el objeto, es decir, se nos muestra un sistema donde podemos seleccionar un objeto, una vez seleccionamos, podemos guardarlo.

Код:
zcmd(guardarob, playerid, params[])
{
    SelectObject(playerid);
    SendClientMessage(playerid, 0xFF0000FF, "Ahora clickea en el objeto.");
    guardando[playerid] = true;
    return 1;
}
Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 7
Esta parte es la que guarda las posiciones del editobject, guardando el objeto no solo en el juego, si no que en un bloc de notas.

Код:
public OnPlayerSelectObject(playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ)
{
    if(type == SELECT_OBJECT_GLOBAL_OBJECT)//Si el tipo es un objeto global
    {
        if(guardando[playerid] == true)//si la variable estб activada(Zcmd(guardarob))
        {
            SendClientMessage(playerid, 0xFF0000FF, "Posiciуn del objeto guardada.");//Le decimos al jugador que guardamos la posicion
            new File: hFile;// creamos un archivo
            hFile = fopen("mueblesguardados.inc", io_append);//lo abrimos
            if(hFile)
            {
                GetObjectPos(objectid, X,Y,Z);
                 new Float:rX,Float:rY,Float:rZ;
                  GetObjectRot(objectid,rX,rY,rZ);
                   new string2[256];
                format(string2, 256, "CreateObject(%d, %f,%f,%f,%f,%f,%f,100.0\r\n",PlayerInfo[playerid][pObjetoID], X,Y,Z,rX,rY,rZ);//guardamos el create en el .txt
                fwrite(hFile, string2);
            }
            fclose(hFile);
            CancelEdit(playerid);
        }
    }
    return 1;
}
Cantidad de llaves: Abiertas(4)-Cerradas(4) | Lineas Totales: 24
La ultima parte, super fбcil, tienen que ir /carpetadesuservidor/scriptfiles y crear un archivo .txt llamado muebles, adentro deberб tener los modelos de las construcciones que podrб crear el jugador.
Ejemplo:
ZomboTechRP/Scriptfiles/muebles.txt
_Abro el archivo
175
3482
2654
_Cierro archivo
Entonces cuando ese menъ se abra mostrara los objetos con esas ids, como 175 es un skin mostrarб un skin.
Bueno! espero que les haya servido, si necesitan alguna ayuda no olviden en comentar el tema, aclaro, el sistema lo usй solo para mostrar las funciones que utiliza y como lo hace. Creditos a su creador original. Atte ZomboTech RP. (PS - CorpZomboT | SF - MeScript).
Reply
#2

Se agaradece
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)