public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ) { new szString[144]; format(szString, sizeof(szString), "Weapon %i fired. hittype: %i hitid: %i pos: %f, %f, %f", weaponid, hittype, hitid, fX, fY, fZ); SendClientMessage(playerid, -1, szString); return 1; }
#if !defined PRESSED
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
#endif
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_FIRE) && !IsPlayerInAnyVehicle(playerid) && GetPlayerWeapon(playerid) != 0)
{
SendClientMessage(playerid, -1, "[Debug] Should have shot a bullet.");
SetTimerEx("DebugBulletInfo", 500, false, "i", playerid);
}
return 1;
}
forward DebugBulletInfo(playerid);
public DebugBulletInfo(playerid) {
new lsString[128],
Float:fOriginX, Float:fOriginY, Float:fOriginZ,
Float:fHitPosX, Float:fHitPosY, Float:fHitPosZ;
GetPlayerLastShotVectors(playerid, fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ);
format(lsString, 128, "Bullet info. launch pos: %f, %f, %f - hit pos: %f, %f, %f", fOriginX, fOriginY, fOriginZ, fHitPosX, fHitPosY, fHitPosZ);
SendClientMessage(playerid, -1, lsString);
}
If no bullet is actually shot (which is the case when you shoot the sky or a target that is too far for the collision to be loaded), the callback won't be called. Simple as that.
The cause is a lack of a bullet. Note: this is for the Sniper (since Sniper works a bit different from other guns). Take other weapons and it works (although the hit point retrieved by GetPlayerLastShotVector will be wrong - 23.040445, 0.0, 0.0 mostly). |
Yes, I just find that out myself.
And I also found out that OnPlayerWeaponShot is not called if a bullet connects with a dynamic object. If you shoot object created with CreateObject it works fine, but if you shoot at dynmic object OnPlayerWeaponShot doesn't react |