[Ajuda] Preciso de alguйm TOP para este problema
#1

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
PHP код:
SetTimerEx("tLaser"20true"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 
l11l++)
    {
        
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;

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
Reply
#2

eu acredito que vc deveria usar "((floatabs(Px-Sx)<4.0)&&(floatabs(Py-Sy)<4.0)&&(floatabs(Pz-Sz)<4.0))"
adequando as suas cord ai |:
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)