Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- GetPlayerAimedBodyPart include (v1.01) by Dinnozor
- Detects if you shoot the head/arm/leg/torso of a player !
- Feel free to share but please don't remove credits.
- v1.01:
- -made it easier to shoot the arm, which was almost impossible in the 1.0
- -kind of found a solution about the widescreen on/off problem (thanks to Nanory on Samp Forums for reporting) : the script checks if the player has an "overcorrection" with the GetPlayerCameraFrontVector Z-coord (which was the case when the player used Widescreen). If so, it will put the player in a "Widescreen" mode.
- Also (since all the values were got experimentally), it will make the inverse check with angle correction (still about the GetPlayerCameraFrontVector inaccuracy with other weapons than sniper rifle) to check if the player lacks of correction. So basically, if the player is not in Widescreen but the script detected so (because of any bug or a wrong calculation), the script will automatically put the player back in non-Widescreen mode.
- Added some calculation to do that, and a PVar "Widescreen".
- Moreover, please note the script will be more accurate without Widescreen.
- More info here : http://forum.sa-mp.com/showthread.php?t=403713
- Video here : http://www.youtube.com/watch?v=2Y4ngd_wpzY
- */
- #include <a_samp>
- #define BP_HEAD 1
- #define BP_BODY 0
- #define BP_ARM 3
- #define BP_LEG 2
- forward Float:Distance(Float:xA,Float:yA,Float:zA,Float:xB,Float:yB,Float:zB);
- forward OnPlayerHeadshot(playerid,targetid,weaponid);
- forward OnPlayerLegshot(playerid,targetid,weaponid);
- forward OnPlayerArmshot(playerid,targetid,weaponid);
- static
- bool:GPABP_OPC,
- bool:GPABP_OPTD;
- public OnGameModeInit()
- {
- GPABP_OPC=(funcidx("GPABP_OnPlayerConnect")!=-1);
- GPABP_OPTD=(funcidx("GPABP_OnPlayerTakeDamage")!=-1);
- return (funcidx("GPABP_OnGameModeInit")!=-1)?CallLocalFunction("GPABP_OnGameModeInit",""):1;
- }
- #if defined _ALS_OnGameModeInit
- #undef OnGameModeInit
- #else
- #define _ALS_OnGameModeInit
- #endif
- #define OnGameModeInit GPABP_OnGameModeInit
- forward GPABP_OnGameModeInit();
- public OnPlayerConnect(playerid)
- {
- SetPVarInt(playerid,"Widescreen",0);//Assuming most of the people don't use Widescreen
- return (GPABP_OPC)?CallLocalFunction("GTABP_OnPlayerConnect","i",playerid):1;
- }
- #if defined _ALS_OnPlayerConnect
- #undef OnPlayerConnect
- #else
- #define _ALS_OnPlayerConnect
- #endif
- #define OnPlayerConnect GPABP_OnPlayerConnect
- forward GPABP_OnPlayerConnect(playerid);
- public Float:Distance(Float:xA,Float:yA,Float:zA,Float:xB,Float:yB,Float:zB)
- {
- new Float:Dist=floatsqroot((xB-xA)*(xB-xA)+(yB-yA)*(yB-yA)+(zB-zA)*(zB-zA));
- return Dist;
- }
- stock GetPlayerAimedBodyPart(playerid, targetid, Float:range,weapon)
- {
- new Float:AngleD, Float:xv,Float:yv,Float:zv,Float:xc,Float:yc,Float:zc,Float:xt,Float:yt,Float:zt,Float:X2,Float:Y2,Float:Z2;
- new Float:AngleP,Float:Zdif,Float:xP,Float:yP,Float:zP,Float:zTest;
- GetPlayerPos(targetid,X2,Y2,Z2);
- GetPlayerPos(playerid,xP,yP,zP);
- GetPlayerCameraPos(playerid,xc,yc,zc);
- GetPlayerCameraFrontVector(playerid,xv,yv,zv);
- GetPlayerFacingAngle(targetid,AngleP);
- xt=range*xv+xc;
- yt=range*yv+yc;
- zt=range*zv+zc;
- if(GetPVarInt(playerid,"Widescreen")==0)
- {
- zTest=zv-(Z2-zP)/Distance(X2,Y2,Z2,xP,yP,zP);
- if(GetPlayerSpecialAction(playerid)==1)
- {
- switch(weapon)
- {
- case 34:AngleD=0;
- case 33:
- {
- AngleD=3;
- Zdif=-0.033;
- }
- case 30,31:
- {
- AngleD=4;
- Zdif=-0.045;
- }
- case 22..24:
- {
- AngleD=6;
- Zdif=-0.1;
- }
- case 25..27:
- {
- AngleD=4;
- Zdif=-0.07;
- }
- case 28,29,32:
- {
- Zdif=-0.07;
- AngleD=6;
- }
- default:
- {
- AngleD=2;
- Zdif=-0.1;
- }
- }
- }
- else
- {
- switch(weapon)
- {
- case 34:AngleD=0;
- case 33:
- {
- AngleD=3;
- Zdif=-0.045;
- }
- case 30,31:
- {
- AngleD=4;
- Zdif=-0.065;
- }
- case 22..24:
- {
- AngleD=6;
- Zdif=-0.095;
- }
- case 25..27:
- {
- AngleD=4;
- Zdif=-0.07;
- }
- case 28,29,32:
- {
- Zdif=-0.085;
- AngleD=6;
- }
- default:
- {
- AngleD=2;
- Zdif=-0.1;
- }
- }
- }
- if(zTest>Zdif&&weapon!=34)
- {
- SetPVarInt(playerid,"Widescreen",1);
- }
- }
- else
- {
- zTest=asin(zt/range);
- switch(weapon)
- {
- case 34:
- {
- AngleD=0;
- Zdif=0;
- }
- case 33:
- {
- AngleD=2;
- Zdif=1.5;
- }
- case 30,31:
- {
- AngleD=3;
- Zdif=3;
- }
- case 22..24:
- {
- AngleD=4;
- Zdif=4;
- }
- case 25..27:
- {
- AngleD=3;
- Zdif=3;
- }
- default:
- {
- AngleD=4.5;
- Zdif=3;
- }
- }
- if(zTest>Zdif&&weapon!=34)
- {
- SetPVarInt(playerid,"Widescreen",0);
- }
- }
- if(GetPlayerSpecialAction(targetid)==1)
- {
- if(Z2-0.1<=range*floattan(AngleD,degrees)+zt) return BP_HEAD;
- else if((Z2-0.55<=zt+range*floattan(AngleD,degrees))&&floatabs(0.5*floatcos(-AngleP,degrees)+X2-xt)<=0.5&&floatabs(-0.5*floatsin(-AngleP,degrees)+Y2-yt)<=0.5) return BP_ARM;
- }
- else if(GetPlayerState(playerid)!=1)
- {
- if(Z2+0.4<=range*floattan(AngleD,degrees)+zt) return BP_HEAD;
- }
- else
- {
- if((Z2-0.2<=zt+range*floattan(AngleD,degrees))&&(floatabs(0.27*floatcos(-AngleP,degrees)+X2-xt)<=0.15)&&(floatabs(0.27*floatsin(-AngleP,degrees)+Y2-yt)<=0.2)) return BP_ARM;
- else if(Z2+0.5<=range*floattan(AngleD,degrees)+zt) return BP_HEAD;
- else if(Z2-0.3>=zt+range*floattan(AngleD,degrees)) return BP_LEG;
- }
- return BP_BODY;
- }
- public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid)
- {
- new Float:Xt,Float:Yt,Float:Zt;
- GetPlayerPos(playerid,Xt,Yt,Zt);
- if(issuerid!=INVALID_PLAYER_ID)
- {
- new Float:xc,Float:yc,Float:zc,Float:DistC;
- GetPlayerCameraPos(issuerid,xc,yc,zc);
- DistC=Distance(xc,yc,zc,Xt,Yt,Zt);
- switch(GetPlayerAimedBodyPart(issuerid,playerid,DistC,weaponid))
- {
- case 1:CallLocalFunction("OnPlayerHeadshot", "ddd", issuerid,playerid,weaponid);
- case 2:CallLocalFunction("OnPlayerLegshot", "ddd", issuerid,playerid,weaponid);
- case 3:CallLocalFunction("OnPlayerArmshot", "ddd", issuerid,playerid,weaponid);
- //Create a call back for torso shots if you want : use default here
- }
- }
- return (GPABP_OPTD)?CallLocalFunction("GPABP_OnPlayerTakeDamage","iifi",playerid,issuerid,amount,weaponid):1;
- }
- #if defined _ALS_OnPlayerTakeDamage
- #undef OnPlayerTakeDamage
- #else
- #define _ALS_OnPlayerTakeDamage
- #endif
- #define OnPlayerTakeDamage GPABP_OnPlayerTakeDamage
- forward GPABP_OnPlayerTakeDamage(playerid,issuerid,Float:amount,weaponid);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement