Cuadro de muertes
#1

Hola a todos.

Vieron que cuando uno esta en hunter o rhino y le dispara a otro que este en hunter o rhino, en el cuadro de muertes solo aparece que el jugador se suicido. Lo que yo quiero saber si se puede es que si por ejemplo:

Pepito 1: Esta en hunter y mata a Pepito 2 que tambien este en hunter. Detecte que Pepito 1 mato al 2. y que me lo envie al cuadro de muertes.


Se podra?


Gracias-
Reply
#2

En la ъltima versiуn aсadieron el killerid (que representarнa a quien lo explotу, si no leн mal) a OnVehicleDea, si ahн pones que se envнe al cuadro supongo que saldrб bien.
Reply
#3

Creo que no.. porque como dices que aparece el jugador se suicidio, si sale asн, no se podra verificar..

Creo que en la 0.3x RC2 arreglaron ese problema, tengo entendido:

Quote:

- Se agregaron nuevos chequeos para el reporte de la muerte de un vehiculo.

Pruebalo en 0.3x RC2..

PD: me adelantaron
Reply
#4

Aun no probe el 0.3x con esto del hunter. Ustedes dicen que ahora funciona? Osea que al matar a x jugador con el hunter aparezca en el cuadro de muertes. Lo demas despues lo hago yo.
Reply
#5

En la 0.3x no se arreglo este fallo, lo que hicieron fue aсadir un parбmetro mбs para OnVehicleDeath, el killerid, pero tampoco es preciso. Lo que hace es mandar al servidor un mensaje con la ID del jugador que "vio" que el coche fue destruido, por lo tanto no significa que si lo disparas y explota sea tu ID la que mande el servidor como causante de eso.
Quote:
Originally Posted by Kalcor
In 0.3x, the final parameter of OnVehicleDeath (killerid) will be the player who reported the vehicle dead. This should be renamed at some point, although, in the interest of keeping the callback compatible with old scripts, the name won't be changed for 0.3x.
Dice que el jugador que reportу el vehнculo explotado, por lo tanto creo que se trata de algo con un streaming, y puede que esa ID sea hasta el conductor sin que el lo haya destruido. Tambiйn dice que este parбmetro debe ser renombrado en algъn momento, por lo tanto no hace exactamente lo que indica.

Respecto a tu problema, creo que eso no es posible, ya que cuando disparas golpeas el vehнculo del otro jugador y lo que realmente lo hace morir es la explosiуn. Ahora el problema es que SA-MP no tiene algo preciso para saber quien disparo ese vehнculo. En mi opiniуn, de momento no lo puedes hacer usando simplemente lo que trae SA-MP.
Reply
#6

que mal. Moriria por hacer eso. Probare igual onvehicledead pero no creo que funciones.
Reply
#7

Lo que tu pides se puede hacer pero no de una forma "simple".

Hice un mini-script para arreglar en cierta medida este bug, pero no lo pude testear ya que no tengo con quien (agradeceria si alguien puede testearlo por mi y si tiene errores intento corregirlos).

Requisitos:
  • foreach (ultima version)
  • YSI (3.1)
pawn Код:
#include <a_samp>
#include <foreach>

enum pData
{
    Killer,
    LastShot
};

new Iterator:OnVehicle<MAX_PLAYERS>, pInfo[MAX_PLAYERS][pData];

public OnPlayerDisconnect(playerid, reason)
{
    if(Iter_Contains(OnVehicle, playerid))
    {
        Iter_Remove(OnVehicle, playerid);
    }
    pInfo[playerid][Killer] = INVALID_PLAYER_ID;
    pInfo[playerid][LastShot] = -1;
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    if(killerid == INVALID_PLAYER_ID)
    {
        if(IsPlayerConnected(pInfo[playerid][Killer]))
        {
            if((gettime() - pInfo[pInfo[playerid][Killer]][LastShot]) < 1)
            {
                SendDeathMessage(pInfo[playerid][Killer], playerid, 51);
            }
        }
        pInfo[playerid][Killer] = INVALID_PLAYER_ID;
    }
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    pInfo[playerid][LastShot] = gettime();
    if(newkeys & KEY_FIRE)
    {
        new Float:P[3];
        if(IsPlayerInAnyVehicle(playerid))
        {
            switch(GetVehicleModel(GetPlayerVehicleID(playerid)))
            {
                case 425, 432, 447, 520:
                {
                    foreach(new i : OnVehicle)
                    {
                        GetVehiclePos(GetPlayerVehicleID(i), P[0], P[1], P[2]);
                        if(IsPointInPlayerScreen(playerid, P[0], P[1], P[2], 70.0))
                        {
                            pInfo[i][Killer] = playerid;
                        }
                    }
                }
                default:
                {
                    if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
                    {
                        foreach(new i : OnVehicle)
                        {
                            GetVehiclePos(GetPlayerVehicleID(i), P[0], P[1], P[2]);
                            if(IsPointInPlayerScreen(playerid, P[0], P[1], P[2], 20.0))
                            {
                                pInfo[i][Killer] = playerid;
                            }
                        }
                    }
                    else
                    {
                        new Float:Distance;
                        switch(GetPlayerWeapon(playerid))
                        {
                            case WEAPON_COLT45, WEAPON_SILENCED, WEAPON_DEAGLE:
                            {
                                Distance = 20.0;
                            }
                            case WEAPON_SHOTGUN, WEAPON_SAWEDOFF, WEAPON_SHOTGSPA, WEAPON_UZI, WEAPON_MP5, WEAPON_TEC9:
                            {
                                Distance = 30.0;
                            }
                            case WEAPON_AK47, WEAPON_M4:
                            {
                                Distance = 60.0;
                            }
                            default:
                            {
                                Distance = 20.0;
                            }
                        }
                       
                        foreach(new i : OnVehicle)
                        {
                            GetVehiclePos(GetPlayerVehicleID(i), P[0], P[1], P[2]);
                            if(IsPointInPlayerScreen(playerid, P[0], P[1], P[2], Distance))
                            {
                                pInfo[i][Killer] = playerid;
                            }
                        }
                    }
                }
            }
        }
        else
        {
            new Float:Distance;
            switch(GetPlayerWeapon(playerid))
            {
                case WEAPON_COLT45, WEAPON_SILENCED, WEAPON_DEAGLE:
                {
                    Distance = 20.0;
                }
                case WEAPON_SHOTGUN, WEAPON_SAWEDOFF, WEAPON_SHOTGSPA, WEAPON_UZI, WEAPON_MP5, WEAPON_TEC9:
                {
                    Distance = 30.0;
                }
                case WEAPON_AK47, WEAPON_M4:
                {
                    Distance = 60.0;
                }
                case WEAPON_RIFLE:
                {
                    Distance = 70.0;
                }
                case WEAPON_SNIPER:
                {
                    Distance = 85.0;
                }
                case WEAPON_ROCKETLAUNCHER, WEAPON_HEATSEEKER, WEAPON_MINIGUN:
                {
                    Distance = 70.0;
                }
                default:
                {
                    Distance = 20.0;
                }
            }
            foreach(new i : OnVehicle)
            {
                GetPlayerPos(i, P[0], P[1], P[2]);
                if(IsPointInPlayerScreen(playerid, P[0], P[1], P[2], Distance))
                {
                    pInfo[i][Killer] = playerid;
                }
            }
        }
    }
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    if(oldstate == PLAYER_STATE_ONFOOT && (newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER))
    {
        if(!Iter_Contains(OnVehicle, playerid))
        {
            Iter_Add(OnVehicle, playerid);
        }
    }
    else if(newstate == PLAYER_STATE_ONFOOT && (oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER))
    {
        if(Iter_Contains(OnVehicle, playerid))
        {
            Iter_Remove(OnVehicle, playerid);
        }
    }
    return 1;
}

stock IsPointInPlayerScreen(playerid, Float:x, Float:y, Float:z, Float:distance)
{
    new Float:P[3], Float:Dist;
    GetPlayerPos(playerid, P[0], P[1], P[2]);
    if(z-P[2]>15.0 || P[2]-z>15.0)return 0;
    Dist = floatsqroot(floatpower((P[0]-x), 2)+floatpower((P[1]-y), 2)+floatpower((P[2]-z), 2));
    if(Dist>distance)return 0;
    new Float:cV[3], Float:cP[3], Float:T[3], Float:Ar;
    GetPlayerCameraPos(playerid, cP[0], cP[1], cP[2]);
    GetPlayerCameraFrontVector(playerid, cV[0], cV[1], cV[2]);
    T[0] = cV[0]*Dist+cP[0];
    T[1] = cV[1]*Dist+cP[1];
    T[2] = cV[2]*Dist+cP[2];
    if(z-T[2]>10.5 || T[2]-z>10.5)return 0;
    if(Dist<7.0)return 1;
    Ar=atan2((P[1]-T[1]), (P[0]-T[0]));
    if(Ar-45.0<(atan2((P[1]-y), (P[0]-x)))<Ar+45.0)return 1;
    return 0;
}
Nota: Las distancias son arbitrarias.
Reply
#8

Maсana voy a ver si puedo probarlo con alguien. Si te veo conectado te aviso y lo probamos. Gracias chaoz
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)