Entrada/Salida con checkpoints
#1

Hola amigos, me encuentro haciendo un sistema de entradas/salidas con Checkpoints pero tengo un problema y es que crea un loop infinito de entrar y salir, asi le ponga restrcciones con variables.

E intentado de muchas formas y nada.. Me echan una mano?

El codigo me a llegado a funcionar a veces (solo a veces) solo la primera vez que entro en el checkpoint luego de prender el servidor es decir voy entro en el checkpoint y funciona bien pero al volver a usarlo empieza el loop.

Tambien me a funcionado como debe un par de veces o sea entro al checkpoint funciona todo bien salgo vuelto a probarlo todo bien y como a la 4ta vez empieza el loop de nuevo

Код:
public OnPlayerEnterDynamicCP(playerid,checkpointid)
{
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
{
for(new id = 1;id < sizeof(EInfo);id++)
{
if(eDentro[playerid] == 0)
{
if(checkpointid == EInfo[id][eEntrada])
{
eDentro[playerid]=1;
SetPlayerInterior(playerid,EInfo[id][eInsideInt]);
SetPlayerPos(playerid,EInfo[id][eSalidaX], EInfo[id][eSalidaY], EInfo[id][eSalidaZ]);
SetPlayerVirtualWorld(playerid,EInfo[id][eInsideWorld]);
SetCameraBehindPlayer(playerid);
}
else if(checkpointid == EInfo[id][eSalida])
{
eDentro[playerid]= 1;
SetPlayerPos(playerid,EInfo[id][eEntradaX], EInfo[id][eEntradaY], EInfo[id][eEntradaZ]);
SetPlayerInterior(playerid,EInfo[id][eInt]);
SetPlayerVirtualWorld(playerid,EInfo[id][eWorld]);
SetCameraBehindPlayer(playerid);
}
}
}
}
return 1;
}

public OnPlayerLeaveDynamicCP(playerid, checkpointid)
{
if(eDentro[playerid] == 1)
{
eDentro[playerid]=0;
}
return 1;
}
Reply
#2

їPor quй no usas pick-ups en vez de checkpoints?

Por otra parte, creo que pasa porque estбs seteando la posiciуn del jugador encima del checkpoint de salida recien entrando, por lo que se activa el de salida y cae encima del de entrada otra vez, creando el loop. Ya que se activan automaticamente, la mejor soluciуn serнa setear la misma posiciуn pero cambiando ligeramente alguna coordenada que te convenga, por ejemplo:

Код:
SetPlayerPos(playerid,EInfo[id][eSalidaX], EInfo[id][eSalidaY]+2, EInfo[id][eSalidaZ]);
Asн no queda exactamente encima del checkpoint de salida si no a 2 metros de distancia con respecto al eje Y.
Reply
#3

pawn Код:
public OnPlayerEnterDynamicCP(playerid,checkpointid)
{
    if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
    {
        for(new id = 1; id < sizeof(EInfo); id ++)
        {
            if(checkpointid == EInfo[id][eEntrada])
            {
                SetPlayerVirtualWorld(playerid, EInfo[id][eInsideWorld]);
                SetPlayerInterior(playerid, EInfo[id][eInsideInt]);

                SetPlayerPos(playerid, EInfo[id][eSalidaX], EInfo[id][eSalidaY] + 2.0, EInfo[id][eSalidaZ]);
                SetCameraBehindPlayer(playerid);
                break;
            }
            else if(checkpointid == EInfo[id][eSalida])
            {
                SetPlayerVirtualWorld(playerid, EInfo[id][eWorld]);
                SetPlayerInterior(playerid, EInfo[id][eInt]);

                SetPlayerPos(playerid, EInfo[id][eEntradaX], EInfo[id][eEntradaY] + 2.0, EInfo[id][eEntradaZ]);
                SetCameraBehindPlayer(playerid);
                break;
            }
        }
    }
    return 1;
}

public OnPlayerLeaveDynamicCP(playerid, checkpointid)
{
    return 1;
}
Reply
#4

Graciaspor sus respuestas.

Lo resolvi de esta forma:

Код:
public OnPlayerEnterDynamicCP(playerid,checkpointid)
{
if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT)
{
for(new id = 1;id < sizeof(EInfo);id++)
{
if((gettime()- eDentro[playerid]) < 2)
{
break;
}
if(checkpointid == EInfo[id][eEntrada])
{
 eDentro[playerid]=gettime();
SetPlayerInterior(playerid,EInfo[id][eInsideInt]);
SetPlayerPos(playerid,EInfo[id][eSalidaX], EInfo[id][eSalidaY], EInfo[id][eSalidaZ]);
SetPlayerVirtualWorld(playerid,EInfo[id][eInsideWorld]);
SetCameraBehindPlayer(playerid);
}
else if(checkpointid == EInfo[id][eSalida])
{
 eDentro[playerid]=gettime();
SetPlayerPos(playerid,EInfo[id][eEntradaX], EInfo[id][eEntradaY], EInfo[id][eEntradaZ]);
SetPlayerInterior(playerid,EInfo[id][eInt]);
SetPlayerVirtualWorld(playerid,EInfo[id][eWorld]);
SetCameraBehindPlayer(playerid);
}
}
}
return 1;
}
Reply
#5

  1. Utiliza "break;" cuando se ha detectado el ID de la entrada/salida.
  2. Cuando tu juego se congela por un momento, te seguira pasando el problema (suele pasar).
  3. Utiliza un boolean en vez de un temporizador. O pon el jugador afuera del checkpoint de entrada/salida.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)