[Tutorial] Impedir Friendly Fire

9 de jan. de 2013.
Sabe aquele gamemode de Team Deathmatch que você criou, e sempre tinha que dar punições administrativas para certos jogadores que não respeitavam a regra de não matar companheiros de equipe? Existe uma função nativa do SAMP para que você consiga impedir o famoso team kill.
Utilização
Se você já possui um sistema de times em seu gamemode, ficará mais fácil o uso da função, caso ainda não tenha um, o tutorial do nosso amigo arakuta poderá lhe ajudar.
[Ver tutorial]

A utilização é bem simples, temos duas funções básicas SetPlayerTeam e GetPlayerTeam.
Code:
SetPlayerTeam(playerid, teamid)
Playerid = ID do jogador no qual o time será definido.
Teamid = ID do time.
Code:
GetPlayerTeam(playerid)
Playerid = ID do jogador no qual o time será definido.
A função irá retornar a id do atual time do player, se não houver, irá retornar NO_TEAM ou 255.

Você deve começar setando o time do jogador depois do último momento em que o time é setado, provavelmente será no OnPlayerSpawn, exemplo:

Lembrando que não irei criar as classes abaixo, é apenas um exemplo do uso básico da função.
Code:
// Topo do GM
#define TEAM_GROVE 0
#define TEAM_BALLAS 1

enum pInfo
{
     Kills,
     Deaths,
     pTeam
}
new PlayerInfo[MAX_PLAYERS][pInfo];

// OnPlayerRequestClass
public OnPlayerRequestClass(playerid, classid)
{
     if(classid == 0) PlayerInfo[playerid][pTeam] = TEAM_GROVE;
     else if(classid == 1) PlayerInfo[playerid][pTeam] = TEAM_BALLAS;
}

// OnPlayerSpawn
public OnPlayerSpawn(playerid)
{
     if(PlayerInfo[playerid][pTeam] == TEAM_GROVE) SetPlayerTeam(playerid, TEAM_GROVE);
     else if(PlayerInfo[playerid][pTeam] == TEAM_BALLAS) SetPlayerTeam(playerid, TEAM_BALLAS);
}
Se ainda houver algum problema com team kills, pode ser que os jogadores estejam desincronizados com o time, então na callback OnPlayerStreamIn defina novamente os times, que tudo funcionará normalmente.
pawn Code:
public OnPlayerStreamIn(playerid, forplayerid) {     SetPlayerTeam(playerid, PlayerInfo[playerid][pTeam]);     SetPlayerTeam(forplayerid, PlayerInfo[forplayerid][pTeam]);     return 1; }
Obrigado ao CyNic pela informação.

Nota: Não é recomendado que se utilize SetPlayerTeam na callback OnPlayerRequestClass, considerando que o player irá passar entre os times para escolher o desejado.


Creditos: Linow

0 comentários:

Postar um comentário