Problemilla con codigo. -
xblade2k10 - 11.01.2013
Hola buenas tardes compaсeros, llevo visitando el foro bastante tiempo pero no como registrado si no como visitante y es un foro extraordinario, hace unos dias decidi iniciarme en esto de samp para montar un servidor en el cual podamos jugar los amigos o quien quiera jugar
El problema esta en el codigo de las puertas automaticas por proximidad, voy a intentar explicarlo correctamente para que me entiendan.
El codigo en cuestion es el siguiente:
Timer en OnGameModeInit;
Код:
SetTimer("PuertaJefe_LSPD", 1500, true);
Код:
forward PuertaJefe_LSPD();
public PuertaJefe_LSPD()
{
new estado_puerta;
for(new i;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)) continue;
if(PlayerInfo[i][pLeader] == 1 && PlayerInfo[i][pRank] == 6)
{
if(IsPlayerInRangeOfPoint(i, 1.5, 222.5448, 69.8252, 1004.3806))estado_puerta=1;
else estado_puerta=0;
}
if(estado_puerta == 1)
{
MoveDynamicObject(puertajefelspd, 222.2207, 66.8460, 1004.8606, 1.5);
}
else
{
MoveDynamicObject(puertajefelspd, 222.2207, 68.6660, 1004.8606, 1.5); //cierra la puerta
}
}
return 1;
}
Bien el codigo como pueden ver es de la oficina del jefe de la faccion LSPD el cual tiene acceso a esa zona, el resto que no tenga rango 6 no podra abrir dicha puerta ahora llega el problema si por ejemplo entro yo al server (digo yo por poner un ejemplo pero puede a ver alguien ya antes que yo dentro) y voy a la puerta se abre perfectamente, pero si despues conecta otro jugador que tiene el mismo rango y lider que yo de la misma faccion automaticamente a mi ya no me abre la puerta y a el si... ese es el problema no se a que es debido es como si al conectarse despues perdieras el acceso a esa funcion... si alguien puede iluminarme se lo agradeceria muchisimo.
saludos
Respuesta: Problemilla con codigo. -
[DOG]irinel1996 - 11.01.2013
Estб mal porque la variable
estado_puerta no es global. La forma correcta serнa esta:
pawn Код:
new
bool:estado_puertaLSPD
;
//---OnGameModeInit
SetTimer("VerificarPuertas", 1500, true);
//---Nueva callback.
forward ActualizarPuertas();
public ActualizarPuertas() {
for (new i; i < MAX_PLAYERS; i++) {
if (!IsPlayerConnected(i)) continue;
//---Puerta LSPD
if (IsPlayerInRangeOfPoint(i, 1.5, 222.5448, 69.8252, 1004.3806)) {
if (PlayerInfo[i][pLeader] != 1 && PlayerInfo[i][pRank] != 6) continue;
switch(estado_puertaLSPD) {
case false: {
//Abrimos
estado_puertaLSPD = true;
SetTimerEx("CerrarPuerta", 5000, false, "i", 1); //El 1 digamos que es el ID de la puerta.
/*
Y ahora deberнas poner un SetTimerEx para cerrarla
ya que si el jugador se queda cerca de la puerta,
entrarнa en un bucle infinito de abrirse/cerrarse.
Y si usamos tu tйcnica solo funcionarнa UNA vez correctamente,
ya luego no se abrirб mбs.
*/
}
}
}
//---Otra puerta (1)
if (IsPlayerInRangeOfPoint(.........)) {
/*
Esto es un ejemplo para otra puerta de facciуn, y solo usamos un timer.
*/
}
//---Otra puerta (2)
if (IsPlayerInRangeOfPoint(.........)) {
}
}
return 1;
}
forward CerrarPuerta(id);
public CerrarPuerta(id) {
switch(id) {
case 1: {
/*
case 1, el 1 es la ID que mencionamos en SetTimerEx,
cada puerta debe tener una ID diferente.
*/
//Cerramos con MoveDynamicObject o la funcion que tu uses.
//Y reseteamos variable:
estado_puertaLSPD = false;
}
}
return 1;
}
Respuesta: Problemilla con codigo. -
xblade2k10 - 11.01.2013
ok es un poco mas confuso de entender pero aun asi voy a intentarlo, en cuanto lo pruebe te verifico como a ido.
saludos
PD: Lo he probado tio y funciona a las mil maravillas, te lo agradezco muchisimo tio me has librado de un buen dolor de cabeza. Un saludo y gracias nuevamente.