08.02.2017, 22:41
(
Последний раз редактировалось biell; 09.02.2017 в 14:52.
)
Seguinte, estou a cerca de 3 dias tentando encontrar uma maneira de saber se um player estб em um laser
porem o seguinte codigo nao funciona
OS problemas sгo,
*embora as vezes detecte o player no laser, o loop parece parar momentaneamente.
*nao cai nunca no segundo if
*a logica parece estar correta
Caso alguйm tenha soluзгo melhor, espero sugestoes aqui
#edit Todos os lasers tem angulos retos, sejam 0,90,180,270 isso faz com que ele caia em algum if
#edit 2 floatabs na aproximaзгo? irei tentar
#edit 3 serб refeito, obrigado por ter tentado
porem o seguinte codigo nao funciona
PHP код:
SetTimerEx("tLaser", 20, true, "i", playerid);//quando o player entra no interior
public tLaser(playerid)
{
if(Player_No_Laser(playerid))
{
//por enquanto nao ocorre nada, pois estou a testar
}
return 1;
}
stock Player_No_Laser(playerid)
{
new Float:PlayerPos[3],Float:LaserPosInicial[3],Float:LaserPosFinal[3],Float:LaserRot[3],Float:Sen,Float:Cos;
for(new l; l < 11; l++)
{
GetPlayerPos(playerid,PlayerPos[0],PlayerPos[1],PlayerPos[2]);
GetObjectPos(Laser[l],LaserPosInicial[0],LaserPosInicial[1],LaserPosInicial[2]);
GetObjectRot(Laser[l],LaserRot[0],LaserRot[1],LaserRot[2]);
LaserPosFinal[0] = LaserPosInicial[0]; //iguala inicial com final, para acrescentar sen e cos na final e chgar ao ponto correto
LaserPosFinal[1] = LaserPosInicial[1];
Sen = floatsin(-LaserRot[2], degrees); //sen
Cos = floatcos(-LaserRot[2], degrees); //cos,
LaserPosFinal[0] += 20*Sen; // getando as posciзхes da outra ponta
LaserPosFinal[1] += 20*Cos;
LaserPosFinal[2] = LaserPosInicial[2];
if(LaserPosInicial[0] == LaserPosFinal[0] && Aproximacao(PlayerPos[0],LaserPosInicial[0]) && LaserPosInicial[1] <= PlayerPos[1] <= LaserPosFinal[1]) //se estiver linha X
{
print("1");
if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK)
{
print("agachado");
if(PlayerPos[2]+0.8 >= LaserPosInicial[2])
{
MensagemF(playerid,1,"Estб no laser %d com X",l);
return 1;
}
}
else
{
print("EM pй");
if(PlayerPos[2]+1.0 >= LaserPosInicial[2])
{
MensagemF(playerid,1,"Estб no laser %d com X",l);
return 1;
}
}
}
if(LaserPosInicial[1] == LaserPosFinal[1] && Aproximacao(PlayerPos[1],LaserPosInicial[1]) && LaserPosInicial[0] <= PlayerPos[0] <= LaserPosFinal[0]) //se estiver linha X
{
print("else");
print("1");
if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK)
{
print("agachado");
if(PlayerPos[2]+0.2>= LaserPosInicial[2])//caso esteja agachado
{
MensagemF(playerid,1,"Estб no laser %d com Y",l);
return 1;
}
}
else
{
print("em pй");
if(PlayerPos[2]+1.0 >= LaserPosInicial[2])//caso esteja em pй
{
MensagemF(playerid,1,"Estб no laser %d com Y",l);
return 1;
}
}
}
}
return 0;
}
stock Aproximacao(Float:Pos1,Float:Pos2)
{
new Float:variacao = Pos1-Pos2;
if(variacao < 0.0){variacao*=-1;}
if(variacao < 0.10000){
printf("%f",variacao);
return 1;}
return 0;
}
*embora as vezes detecte o player no laser, o loop parece parar momentaneamente.
*nao cai nunca no segundo if
*a logica parece estar correta
Caso alguйm tenha soluзгo melhor, espero sugestoes aqui
#edit Todos os lasers tem angulos retos, sejam 0,90,180,270 isso faz com que ele caia em algum if
#edit 2 floatabs na aproximaзгo? irei tentar
#edit 3 serб refeito, obrigado por ter tentado