Cuadro de muertes
#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


Messages In This Thread
Cuadro de muertes - by CeKiT - 20.01.2013, 00:20
Respuesta: Cuadro de muertes - by [J]ulian - 20.01.2013, 00:50
Respuesta: Cuadro de muertes - by Adoniiz - 20.01.2013, 00:51
Re: Cuadro de muertes - by CeKiT - 20.01.2013, 03:33
Respuesta: Cuadro de muertes - by [DOG]irinel1996 - 20.01.2013, 12:32
Re: Cuadro de muertes - by CeKiT - 20.01.2013, 21:56
Respuesta: Cuadro de muertes - by TheChaoz - 21.01.2013, 03:33
Re: Cuadro de muertes - by CeKiT - 21.01.2013, 03:41

Forum Jump:


Users browsing this thread: 2 Guest(s)