04/09/2023 20:03
(Esta mensagem foi modificada pela última vez a: 04/09/2023 20:57 por MateGPlay.)
Analisei seu codigo e respondendo sua duvida, para impedir que o jogador inicie a missão varias vezes sem termina-la, ira precisar armazenar uma variável contendo pelo menos o ponto atual que o jogador esta recolhendo o lixo, ou então se esta sob alguma missão no momento, refiz seu codigo de outra forma para melhor explicação:
repare que no codigo acima, armazenei na variavel:
a contagem de cada lixeiro que ele passa, ou seja caso ele tenha iniciado a missão, ele deixara de ser -1, pois o valor -1 é atribuido quando a missão não esta ocorrendo.
tambem criei um vetor com nome:
que é responsável por armazenar as posições do lixeiros, ele é dinamico, por tanto você pode colocar mais posições no vetor que a missão irá funcionar normalmente.
analisei outros pontos em seu codigos a serem vistos tambem:
Não é necessario criar multiplas variaveis com a mesma finalidade, tendo em vista que o objetivo é saber qual o checkpoint deverá ser ativado.
Outro Ponto:
Não é necessario criar a mesma variavel e salvar o id do veiculo em cada caso, você pode fazer isso de forma local dentro da função:
Em geral são esses pontos a serem vistos por agora.
Vale ressaltar que eu costumo a usar as condições negativas primeiro, prefiro fazer dessa forma, faço bom uso do codigo e adapte como quiser, não testei o codigo, por tanto pode ocorrer erros.
Sei que você ainda esta aprendendo, estou aqui para tirar suas duvidas e te ajudar, com o tempo você aprende tudo, caso precise de ajuda, sinta-se a vontade para me contatar.
Código PHP:
new g_PlayerMission[MAX_PLAYERS];
new g_LixeiroCounter[MAX_PLAYERS];
new m_PontosColeta[][3] = {
{1828.5288,-1926.8643,13.3837},
{1856.5773,-1268.8737,13.3906},
{1973.9496,-1054.9626,24.3984},
{2363.1702,-1159.0892,27.4513},
{2714.9253,-1188.3448,69.2288},
{2718.3643,-1520.4124,30.0480},
{2338.2581,-1576.3217,23.8032},
{2220.6677,-1761.7015,13.3650},
{2213.1135,-2053.4668,14.0966},
{2199.1770,-1970.4202,13.7841}
};
public OnPlayerConnect(playerid) //ou OnPlayerLogin
{
g_PlayerMission[playerid] = -1;
m_PontoAtual[MAX_PLAYERS] = -1;
}
forward ValidMissionCP(playerid, const Float:points[][3]);
public ValidMissionCP(playerid, const Float:points[][3]) //verifica se o jogador esta proximo ao Checkpoint da missão
{
new Float:playerPos[3];
GetPlayerPos(playerid, playerPos[0], playerPos[1], playerPos[2]);
for(new i = 0; i < sizeof(points); i++)
if(GetPlayerDistanceFromPoint(playerid, points[i][0], points[i][1], points[i][2]) < 5.0)
return true;
return false;
}
CMD:lixeiro(playerid)
{
if(g_PlayerMission[playerid] == 1 && m_PontoAtual != -1) //se o jogador estiver com a missão de lixeiro e não estiver trabalhando
return SendClientMessage(playerid,vermelho, "{FFFF00}[trabalho]:{FFFFFF} conclua a missao primeiro antes de pegar outras missoes");
if(GetVehicleModel(GetPlayerVehicleID(playerid)) != 408)//se não estiver no caminhao id 408
return SendClientMessage(playerid,vermelho, "{FFFF00}[trabalho]:{FFFFFF}voce nao esta em um caminhao de lixo id 408!");
m_PontoAtual[playerid] = 0; //id do ponto de coleta atual do jogador
SetPlayerCheckpoint(playerid, 2171.8494, -1979.3674, 13.5547, 2.0);
SendClientMessage(playerid,verde, "{FFFF00}[Trabalho]:{FFFFFF}Agora você e um Lixeiro.");
return 1;
}
public OnPlayerEnterCheckpoint(playerid)
{
//------------------------------------------------------------------------------
new vehicleid = GetPlayerVehicleID(playerid);
new str[64];
if(g_PlayerMission[playerid] == 1 && ValidMissionCP(playerid, m_PontosColeta)) //verifica se o jogador esta na missão id 1 | lixeiro
{
if(m_PontoAtual[playerid] == -1) //ponto invalido
m_PontoAtual[playerid] = 0; //reseta a missão
new remaining_Points = (sizeof(m_PontosColeta) - m_PontoAtual[playerid]);
if(remaining_Points == 0) //não resta passar sob nenhum ponto
{
DisablePlayerCheckpoint(playerid);
m_PontoAtual = -1; //fora de missão
SendClientMessage(playerid, -1, "Você conseguiu {FFFFFF}$200 pelo trabalho.");
GameTextForPlayer(playerid,"~h~~g~+200$", 5000, 5);
GivePlayerMoney(playerid, 200);
}
if(GetVehicleModel(vehicleid) != 408) //se o id não for 408
return SendClientMessage(playerid, -1, "Você precisa do caminhão para coletar o lixo.");
m_PontoAtual[playerid]++; //adiciona 1 ao ponto atual
TogglePlayerControllable(playerid, 0);
SetTimerEx("tempu", 10000, false, "i", playerid);
format(str, sizeof(str), "Recolhendo Lixo %d/%d ...", m_PontoAtual[playerid], sizeof(m_PontosColeta));
GameTextForPlayer(playerid, str, 10000, 4);
DisablePlayerCheckpoint(playerid);
SetPlayerCheckpoint(playerid, m_PontosColeta[m_PontoAtual[playerid]][0], m_PontosColeta[m_PontoAtual[playerid]][1], m_PontosColeta[m_PontoAtual[playerid]][2], 4.0);
format(str, sizeof(str), "[Trabalho] {FFFFFF}Há ainda %d pontos de coleta.", remaining_Points);
SendClientMessage(playerid, 0xFFFF00, str);
if(remaining_Points == 2)
return SendClientMessage(playerid, 0xFFFF00, "[Trabalho] {FFFFFF}Leve os lixo até o deposito.");
if(remaining_Points == 1)
return SendClientMessage(playerid, 0x00FF00, "[Trabalho] {FFFFFF}Agora vá receber o Dinheiro.");
}
return 1;
}
repare que no codigo acima, armazenei na variavel:
Código PHP:
m_PontoAtual[playerid]
tambem criei um vetor com nome:
Código PHP:
m_PontosColeta[][3]
analisei outros pontos em seu codigos a serem vistos tambem:
Código PHP:
new lixeiro1[MAX_PLAYERS];
new lixeiro2[MAX_PLAYERS];
new lixeiro3[MAX_PLAYERS];
...
Outro Ponto:
Código PHP:
public OnPlayerEnterCheckpoint(playerid)
{
//------------------------------------------------------------------------------
if(lixeiro1[playerid] == 1)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 408)//se estiver no caminhao
{
//....
}
}
if(lixeiro2[playerid] == 1)
{
new vehicleid = GetPlayerVehicleID(playerid);
if(GetVehicleModel(vehicleid) == 408)//se estiver no caminhao
{
//....
}
}
}
Código PHP:
public OnPlayerEnterCheckpoint(playerid)
Em geral são esses pontos a serem vistos por agora.
Vale ressaltar que eu costumo a usar as condições negativas primeiro, prefiro fazer dessa forma, faço bom uso do codigo e adapte como quiser, não testei o codigo, por tanto pode ocorrer erros.
Sei que você ainda esta aprendendo, estou aqui para tirar suas duvidas e te ajudar, com o tempo você aprende tudo, caso precise de ajuda, sinta-se a vontade para me contatar.