Quantcast
Channel: SA-MP Forums
Viewing all articles
Browse latest Browse all 18226

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

$
0
0
¡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:

Code:

#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.
Code:

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.

Code:

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.

Code:

    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.
Code:

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.

Code:

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.

Code:

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.

Code:

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.

Code:

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).

Viewing all articles
Browse latest Browse all 18226

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>