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).
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;
}