[Tutorial] Como evitar muertes en ciertos interiores
#1

Introducciуn

Hola, este tutorial es realmente simple, aunque lo que voy a explicar aquн todavнa no lo he intentado. En la mayorнa de los servidores de duelos, peleas, tiroteos o como quieran llamarlos, se busca que en algunos interiores no se pueda matar. El problema viene al buscar una forma de que las personas no se maten, casi siempre hay que buscar un sistema muy complicado que por ejemplo, le quite las armas al jugador, lo vuelva invulnerable, etc.

Sin embargo, hay una soluciуn muy simple a este problema, no necesitamos usar timers, chequeo de бreas; nada de eso, solamente una funciуn, con ayuda de un callback y uno o dos definiciones constantes para no tener que recordar valores en nuestra mente.

їQuй funciуn evita que un jugador mate a otro?

Muy fбcil, solo basta jugar en un servidor de guerra en equipo para saberlo. Si, es SetPlayerTeam, la cual cambia el equipo del jugador al que nosotros decidamos. Pero, їcuбl es el truco? El truco es, poner en el mismo equipo a todos los jugadores que entren a un interior. Es necesario usar un equipo que no sea utilizado por el servidor en ningъn otro caso, para evitar errores.

Pero, їcуmo se cuando el jugador entra a un interior? Muy fбcil, con el callback OnPlayerInteriorChange, el cual tiene dos parбmetros los cuales nos indican en que interior pasу el jugador, y en que interior estaba antes de cambiar al actual.

Eres un idiota, Ўno entendн nada!

Eso significa que es hora de ver un ejemplo de nuestro sistema. Lo primero que necesitamos es una constante que nos quite el trabajo de tener que recordar el nъmero del equipo. Yo la llamarй “EQUIPO_PARA_INTERIORES”.
pawn Код:
// Generalmente esto se pone donde estбn las otras definiciones.
#define EQUIPO_PARA_INTERIORES 64
// Nъmero 64 porque nunca voy a usar ese equipo para otra cosa.
Esa constante la vamos a usar para aplicarle el equipo 64 al jugador, en vez de tener que recordar que el nъmero es 64, simplemente pongo la constante en lugar del nъmero. Ademбs si me da la gana de cambiar el nъmero, simplemente lo hago en la constante, y no donde la utilicй.

Ahora tenemos que hacer que cuando el jugador cambie de interior, entre en el equipo de los perdedores.
pawn Код:
public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    // newinteriorid es el interior al que el jugador acaba de entrar.
    // oldinteriorid es el interior donde estaba el jugador antes de entrar al actual.
    if(newinteriorid != 0)
        SetPlayerTeam(playerid, EQUIPO_PARA_INTERIORES); // Esta es la bendita funciуn.
    else SetPlayerTeam(playerid, 255);
    // 255 es el equipo en el que estб el jugador por defecto, en el SI se pueden matar.
    return 1;
}
Como podemos ver, no solo hay que cambiar su equipo cuando entra en un interior, sino tambiйn cuando su interior cambia al del mundo externo (nъmero 0). Asн de simple es lograr que no haya muertes en los interiores. Para que las muertes se permitan en algunos interiores y otros no, usen las condiciones (if, else if, else, switch, etc).

ЎPor favor, limitarse a hacer preguntas o corregir algo!
ЎNo respondas simplemente con un "buen tutorial" o algo parecido!
Reply
#2

Entonces para que haces el post si no quieres que hagan preguntas ni corrigan
PD:
No matar en un cierto interior
  • pawn Код:
    public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
    {  
    if(newinteriorid == 10)
    SetPlayerTeam(playerid, EQUIPO_PARA_INTERIORES);
    else SetPlayerTeam(playerid, 255);
    return 1;
    }
Reply
#3

Claramente dije LIMITARSE A HACER PREGUNTAS Y CORREGIR, eso significa (o por lo menos yo lo entiendo asн) que si hay un error o tienes alguna pregunta, puedes comentar, pero si no tienes nada que decir, simplemente no digas nada. їPara que esto? Evitar spam y mantenernos en el tema.
Reply
#4

ese no te permite armas en ningun interior

pawn Код:
public OnPlayerUpdate(playerid)
{
    if(GetPlayerInterior(playerid) != 0)
    {
         SetPlayerArmedWeapon(playerid, 0);
         return 0;
    }
}
Reply
#5

Me parece a mi, o en ningъn momento esta la funciуn para que no pueda morir?
Reply
#6

Quote:
Originally Posted by josta
Посмотреть сообщение
Entonces para que haces el post si no quieres que hagan preguntas ni corrigan
PD:
No matar en un cierto interior
  • pawn Код:
    public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
    {  
    if(newinteriorid == 10)
    SetPlayerTeam(playerid, EQUIPO_PARA_INTERIORES);
    else SetPlayerTeam(playerid, 255);
    return 1;
    }
ese codigo admite bugs para jugadores experimentados.
Reply
#7

dime uno :P
Reply
#8

cambias de arma y podes disparar
tenes q saber hacerlo pero se puede
Reply
#9

Yo, siendo buen jugador de DM, se que lo que dice the_chaoz es verdad; cambiar el arma del jugador cuando se estй en un interior no es efectivo. Por medio del retraso (lag) puedes hacer creer al servidor que has disparado. El ejemplo mбs comъn es el bug con la Desert Eagle y la tecla para agacharce, si tienes dos PCs, en la otra verбs que nunca disparas las mismas veces que en tu propio cliente.

Quote:
Originally Posted by murdoxix
Посмотреть сообщение
Me parece a mi, o en ningъn momento esta la funciуn para que no pueda morir?
Si lees el tutorial bien, vas a encontrar la respuesta a tu duda/crнtica. Reciйn dejй unas pistas en el callback y la funciуn que utilicй en todo el tutorial.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)