- Se agregaron nuevos chequeos para el reporte de la muerte de un vehiculo. |
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.
|
#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;
}