[Tutorial]Uso de Dini - Update 1
#1

Hola gente!
Bueno, en el tutorial anterior explique las funciones de dini, para que servian y como usarlas.

Ahora, voy a explicarles como cargar y guardar datos.

Les dejo el codigo, explicado con comments.

pawn Код:
new Float:pX[MAX_PLAYERS], Float:pY[MAX_PLAYERS], Float:pZ[MAX_PLAYERS], NoPos[MAX_PLAYERS];
public OnPlayerConnect(playerid) //callback OnPlayerConnect, aqui se definen las cosas que pasaran cuando el player se conecte.
{
    new archivo[256], pname[MAX_PLAYER_NAME]; //Creamos "archivo" y "pname"
    GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador
    format(archivo, sizeof(archivo), "%s.ini", pname); //Le damos formato a "archivo".
   
    if(dini_Exists(archivo)) //En caso de que el archivo exista:
    {
        SendClientMessage(playerid, 0xFFFFFFFF, "Cuando spawnees se cargara la ultima posicion en la que estuviste!"); //Enviamos un mensaje al jugador
    }
    else //En caso de que el archivo NO exista:
    {
        SendClientMessage(playerid, 0xFFFFFFFF, "De ahora en mas, cuando spawnees se cargara la ultima posicion en la que estuviste!"); //Enviamos otro mensaje al jugador
    }
    return 1; // Cerramos el callback OnPlayerConnect.
}

public OnPlayerDisconnect(playerid, reason) //callback OnPlayerDisconnect, aqui se definen las cosas que pasaran cuando el player se desconecte.
{
    new archivo[256], pname[MAX_PLAYER_NAME]; //Creamos "archivo" y "pname"
    GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador
    format(archivo, sizeof(archivo), "%s.ini", pname); //Le damos formato a "archivo".

    if(dini_Exists(archivo)) //En caso de que el archivo exista:
    {
        GetPlayerPos(playerid, pX[playerid], pY[playerid], pZ[playerid]); //Obtenemos las coordenadas del jugador.
        dini_IntSet(archivo, "X", pX[playerid]); //Seteamos que "X" es igual a "pX[playerid]"
        dini_IntSet(archivo, "Y", pY[playerid]); //Seteamos que "Y" es igual a "pY[playerid]"
        dini_IntSet(archivo, "Z", pZ[playerid]); //Seteamos que "Z" es igual a "pZ[playerid]"
    }
    else //En caso de que el archivo NO exista:
    {
        dini_Create(archivo); //Creamos el archivo.
        GetPlayerPos(playerid, pX[playerid], pY[playerid], pZ[playerid]); //Obtenemos las coordenadas del jugador.
        dini_IntSet(archivo, "X", pX[playerid]); //Seteamos que "X" es igual a "pX[playerid]"
        dini_IntSet(archivo, "Y", pY[playerid]); //Seteamos que "Y" es igual a "pY[playerid]"
        dini_IntSet(archivo, "Z", pZ[playerid]); //Seteamos que "Z" es igual a "pZ[playerid]"
    }
    return 1; // Cerramos el callback OnPlayerConnect.
}

public OnPlayerSpawn(playerid)
{
    new archivo[256], pname[MAX_PLAYER_NAME]; //Creamos "archivo" y "pname"
    GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador
    format(archivo, sizeof(archivo), "%s.ini", pname); //Le damos formato a "archivo".
    if(NoPos[playerid] == 0) // Nos aseguramos de que el jugador solo tome sus pos viejas cuando spawnea por primera vez.
    {
        if(dini_Exists(archivo)) // En caso de que el archivo exista,
        {
            pX[playerid] = dini_Int(archivo, "X"); //Obtenemos el valor de "X" y lo guardamos en "pX"
            pY[playerid] = dini_Int(archivo, "Y"); //Obtenemos el valor de "Y" y lo guardamos en "pY"
            pZ[playerid] = dini_Int(archivo, "Z"); //Obtenemos el valor de "Z" y lo guardamos en "pZ"
            SetPlayerPos(playerid, pX[playerid], pY[playerid], pZ[playerid]); //Seteamos las coordenadas del jugador
        }
        else return 0; // Y en caso de que no exista, no se produce ninguna accion
    }
    else return 0; // Y en caso de que sea cualquier valor distinto a 0, no pasa nada.
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    if(NoPos[playerid] == 0)
    {
        NoPos[playerid] = 1;
    }
    return 1;
}

Esta todo en el codigo, no hay mucho que explicar acб.

Si tienen alguna duda, consulten.
Reply
#2

Porquй no editбs el mismo? Porque si vas a crear un tema para cada uno, va a quedar todo separado y cuando alguien lo quiera buscar no lo va a encontrar.


Por cierto, cada vez que muera irб donde se conectу. Tenes que hacer que en On..Death setee una variable a 1, y si esa variable es 1, se saltee lo del cargado de datos.
Un saludo!
Reply
#3

Tenйs razon con lo de OnPlayerDeath,no me di cuenta.

Y con respecto a lo de que juntos, los pongo por separado porque sino va a quedar un post todo feo, y ademas luego Chaoz los agregarб a la lista de tutoriales, y seran mas faciles de buscar.
Agregando lo de OnPlayerDeath.
Reply
#4

Quote:
Originally Posted by leaNN!
Посмотреть сообщение
Tenйs razon con lo de OnPlayerDeath,no me di cuenta.

Y con respecto a lo de que juntos, los pongo por separado porque sino va a quedar un post todo feo, y ademas luego Chaoz los agregarб a la lista de tutoriales, y seran mas faciles de buscar.
Agregando lo de OnPlayerDeath.
ah raton me haces trabajar mas a mi
Reply
#5

Quote:
Originally Posted by the_chaoz
Посмотреть сообщение
ah raton me haces trabajar mas a mi
Jajajajajaja!
Muy bueno el tutorial !

EDIT: SOY HUGE CLUCKER
Reply
#6

Gracias murdox, ahora dentro de poco hago el update 2.
OFF:
Quote:
Originally Posted by Chaozman
ah raton me haces trabajar mas a mi
Exaaacto JAJAJAJAJAJAJAJA.
No desvirtuemos xD.
Reply
#7

Una pregunta de un novato XD
Es Necesario el return y el else, osea se podria usar menos lineas asi o no??
pawn Код:
public OnPlayerSpawn(playerid)
{
    new archivo[256], pname[MAX_PLAYER_NAME]; //Creamos "archivo" y "pname"
    GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador
    format(archivo, sizeof(archivo), "%s.ini", pname); //Le damos formato a "archivo".
    if(NoPos[playerid] == 0) // Nos aseguramos de que el jugador solo tome sus pos viejas cuando spawnea por primera vez.
    {
        if(dini_Exists(archivo)) // En caso de que el archivo exista,
        {
            pX[playerid] = dini_Int(archivo, "X"); //Obtenemos el valor de "X" y lo guardamos en "pX"
            pY[playerid] = dini_Int(archivo, "Y"); //Obtenemos el valor de "Y" y lo guardamos en "pY"
            pZ[playerid] = dini_Int(archivo, "Z"); //Obtenemos el valor de "Z" y lo guardamos en "pZ"
            SetPlayerPos(playerid, pX[playerid], pY[playerid], pZ[playerid]); //Seteamos las coordenadas del jugador
        }// SIMPLEMENTE SE PUEDE SACAR EL ELSE?
    } // AQUI TAMBIEN.... O NO???
    return 1;
}
creo q el else es innecesario o me equivoco, corriganme please.
Y aprovechando el muy buen post de leann (siempre paro aprovechando XD), xq el dini o ****** o djson o etc de inc q sirven para manejar archivos son mas rapidos, yo que sepa los tres usan el fwrite o fread, etc del mismo samp? entoncs como son mas rapidos??, yo pienso que deberian ser mas lentos x la redundancia...
y Otra pregunta el Dini es + rapido que el fwrite, etc del samp?
GRACIAS X RESOLVER MIS DUDAD. Saludos
Reply
#8

Quote:
Originally Posted by superpol1
Посмотреть сообщение
Una pregunta de un novato XD
Es Necesario el return y el else, osea se podria usar menos lineas asi o no??
pawn Код:
public OnPlayerSpawn(playerid)
{
    new archivo[256], pname[MAX_PLAYER_NAME]; //Creamos "archivo" y "pname"
    GetPlayerName(playerid, pname, sizeof(pname)); //Obtenemos el nombre del jugador
    format(archivo, sizeof(archivo), "%s.ini", pname); //Le damos formato a "archivo".
    if(NoPos[playerid] == 0) // Nos aseguramos de que el jugador solo tome sus pos viejas cuando spawnea por primera vez.
    {
        if(dini_Exists(archivo)) // En caso de que el archivo exista,
        {
            pX[playerid] = dini_Int(archivo, "X"); //Obtenemos el valor de "X" y lo guardamos en "pX"
            pY[playerid] = dini_Int(archivo, "Y"); //Obtenemos el valor de "Y" y lo guardamos en "pY"
            pZ[playerid] = dini_Int(archivo, "Z"); //Obtenemos el valor de "Z" y lo guardamos en "pZ"
            SetPlayerPos(playerid, pX[playerid], pY[playerid], pZ[playerid]); //Seteamos las coordenadas del jugador
        }// SIMPLEMENTE SE PUEDE SACAR EL ELSE?
    } // AQUI TAMBIEN.... O NO???
    return 1;
}
creo q el else es innecesario o me equivoco, corriganme please.
Y aprovechando el muy buen post de leann (siempre paro aprovechando XD), xq el dini o ****** o djson o etc de inc q sirven para manejar archivos son mas rapidos, yo que sepa los tres usan el fwrite o fread, etc del mismo samp? entoncs como son mas rapidos??, yo pienso que deberian ser mas lentos x la redundancia...
y Otra pregunta el Dini es + rapido que el fwrite, etc del samp?
GRACIAS X RESOLVER MIS DUDAD. Saludos
Bueno vamos de a pasos

si el else y esos return en este caso se pueden obiar.

la diferencia entre djson y_ini y los demas parsers de archivos es que dini x cada valor q escribe/lee abre y cierra el archivo mientras q los otros no, lo cual hace q sea mucho mas lento.

en realidad no, solo facilita el guardado de los datos y su posterior lectura.
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)