[Ayuda] VirtualWorlds
#1

holaaa...
queria saber si existe alguna funcion para determinar si un jugador entra a X virtual world..
la necesito xq quiero hacer para que cuando X jugador entre a X world, guarde sus armas y cuando vuelva al world normal se las devuelva, se hacer lo de las armas pero nose como definir cuando entre a otro world distinto..
seria como la funcion del streamer de incognito para definir cuando entra a X area o X checkpoint
me pueden ayudar

desde ya gracias
Reply
#2

No, pero hay formas muy faciles de hacer un callback que haga exactamente los mismo. Por ejemplo, yo voy a crear una funciуn personalizada, en ella cambio el mundo virtual y de una vez llamo el callback personalizado.

pawn Код:
forward OnPlayerVirtualWorldChange(playerid, newvwid, oldvwid); // newvwid y oldvwid significan "new virtual world id y old virtual world id".
public OnPlayerVirtualWorldChange(playerid, newvwid, oldvwid)
{
    return 1;
}

stock SetPlayerVirtualWorldEx(playerid, worldid)
{
    OnPlayerVirtualWorldChange(playerid, worldid, GetPlayerVirtualWorld(playerid));
    SetPlayerVirtualWorld(playerid, worldid);
    return 1;
}
Lo ъnico que tendrнa que hacer ahora serнa usar la funciуn SetPlayerVirtualWorldEx, en vez de la normal.
Reply
#3

mmm entonces como seria para colocar cuando salga de un world y entre en otro?
osea como utilizar los newvwid y oldvwid
perdon x mi ignorancia :S
Reply
#4

Quote:
Originally Posted by JoseDeLaVilla
Посмотреть сообщение
mmm entonces como seria para colocar cuando salga de un world y entre en otro?
osea como utilizar los newvwid y oldvwid
perdon x mi ignorancia :S
lo que podes hacer es usar las funciones que te dio miguel y agregarle arrays como:
pawn Код:
#define VWUsados 50
new Jugador_VW[MAX_PLAYERS][2];
new Jugador_ArmasPorVW[MAX_PLAYERS][VWUsados][13][2]; // puse VWUsados por la cantidad de VW que vas a usar... no pongo el maximo xq es 2,147,483,647...
                   // modificalo del #define que puse arriba
y lo que deberias hacer dentro del callback de miguel es:

pawn Код:
public OnPlayerVirtualWorldChange(playerid, newvwid, oldvwid)
{
    for(new i = 0; i < 13; i++)
    {
        GetPlayerWeaponData(playerid, i, Jugador_ArmasPorVW[playerid][oldvwid][i][0], Jugador_ArmasPorVW[playerid][oldvwid][i][1]);
    }
    ResetPlayerWeapons(playerid);
    for(new i = 0; i < 13; i++)
    {
        GivePlayerWeapon(playerid, Jugador_ArmasPorVW[playerid][newvwid][i][0], Jugador_ArmasPorVW[playerid][newvwid][i][1]);
    }
    return 1;
}
eso si... no te olvides de reiniciar las armas al conectarse un nuevo jugador, ya que sino puede que el id 0 consiga buenas armas en un vw , y despues entre otra persona con el mismo id al mismo vw y le caigan de yapa las armas.

pawn Код:
public OnPlayerConnect(playerid)
{
 //...
    for(new i1 = 0; i1 < VWUsados; i1++)
    {
        for(new i2 = 0; i2 < 13; i2++)
        {
            Jugador_ArmasPorVW[playerid][i1][i2][0] = 0;
            Jugador_ArmasPorVW[playerid][i1][i2][1] = 0;
        }
    }
 //...
}
...
agrego que acabo de crearlo aca mismo... asique es probable que le falte algun ";" o algo ... fijate si te va...
Reply
#5

ya me perdi, sinceramente me mareaste demasiado xd
Reply
#6

El uso del callback es muy simple, si has usado alguna vez "OnPlayerStateChange" sabrбs como hacerlo.

Sino:
pawn Код:
public OnPlayerVirtualWorldChange(playerid, newvwid, oldvwid)
{
    // Aqui se pone el codigo para cuando el jugador simplemente cambia de mundo.
    // Sin revisar a que mundo virtual cambiу.
    if(newvwid == NUEVO_MUNDO// NUEVO_MUNDO se tiene que cambiar al mundo virtual deseado.
    {
         // Esto es lo que pasa cuando el jugador entra al mundo especificado (NUEVO_MUNDO).
    }
    if(oldvwid == VIEJO_MUNDO) // Cambiar VIEJO_MUNDO para el virtual world deseado.
    {
        // Aquн se pone lo que va a pasar cuando el jugador cambie de mundo y...
        // Su mundo anterior fuй el valor que has puesto en NUEVO_MUNDO.
    }
    if(newvwid == x && oldvwid == x) // Sustituir x por el mundo nuevo y viejo
    {
         // Lo que pasa cuando entras a al mundo especificado "x" y a la vez estas dejando el viejo "x".
    }
    return 1;
}
Ejemplo:
pawn Код:
public OnPlayerVirtualWorldChange(playerid, newvwid, oldvwid)
{
    new
        string[86];
       
    format(string, sizeof(string), "El jugador %d ha cambiado al mundo virtual %d.", playerid, newvwid);
    SendClientMessageToAll(0xFFFFFFFF, string);
   
    if(newvwid == 50)
    {
        format(string, sizeof(string), "El jugador %d ha cambiado al mundo virtual 50.", playerid);
        SendClientMessageToAll(0xFFFFFFFF, string);
    }
    if(oldvwid == 0)
    {
        format(string, sizeof(string), "El jugador %d ha cambiado de mundo virtual, pero antes estaba en el mundo virtual 0.", playerid);
        SendClientMessageToAll(0xFFFFFFFF, string);
    }
    if(oldvwid == 0 && newvwid == 10)
    {
        format(string, sizeof(string), "El jugador %d ha cambiado del mundo virtual 0 al 10.", playerid);
        SendClientMessageToAll(0xFFFFFFFF, string);
    }
    return 1;
}
Reply
#7

mmm gracias miguel por tus respuestas pero esto me da un problema, ya que el guardado de armas y todo eso, lo tengo en el fs de administracion, y los cambios de worlds, estan en el gm, osea que en el gm tengo q usar SetPlayerVirtualWorld nose si me entiendes...
Reply
#8

Okay, lo que vas a tener que hacer es:
  • Modificar el cуdigo de SetPlayerVirtualWorldEx:
    pawn Код:
    stock SetPlayerVirtualWorldEx(playerid, worldid)
    {
        CallRemoteFunction("OnPlayerVirtualWorldChange", "iii", playerid, worldid, GetPlayerVirtualWorld(playerid));
        SetPlayerVirtualWorld(playerid, worldid);
        return 1;
    }
  • Agregar el stock (que acabamos de modificar) en ambos, gamemode y filterscript.
  • Colocar el callback (que comienza con "public") en el gamemode (script principal).
Ahora CREO que lo vas a poder utilizar en los dos.
Reply
#9

gracias a todas sus respuestas y en especial a ti Miguel, me ayudaron mucho, pueden cerrar...
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)