Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Body Part Detection - Detect a player's body part
- By Seif
- */
- /*x---------------------------------Important-------------------------------------x*/
- //**INCLUDES**//
- #include <a_samp>
- #if !defined function
- #define function%0(%1) forward %0(%1); public %0(%1)
- #endif
- /*x---------------------------------Defining-------------------------------------x*/
- #define MAX_DISTANCE_UNIT 100.0 // maximum distance a player can shoot from
- //**BODY PARTS**//
- #define BODY_PART_HEAD 1
- #define BODY_PART_TORSO 2
- #define BODY_PART_LEGS 3
- //#define SCRIPT_DEBUG
- /*x---------------------------------CallBacks-------------------------------------x*/
- /*/
- native IsPlayerAimingBodyPart(playerid, bodypart);
- native IsPlayerAimingTargetBodyPart(playerid, targetid, bodypart);
- */
- /*
- ---[IsPlayerAimingBodyPart]---
- »playerid: the player
- »bodypart: the body part you want to check
- *Return: 1 if true, 0 if false
- *-------------------------------------------------------------------*
- | Checks if the player is aiming at any player's certain body part. |
- *-------------------------------------------------------------------*
- */
- #if defined SCRIPT_DEBUG
- new shootpick[100];
- #endif
- function IsPlayerAimingBodyPart(playerid, bodypart)
- {
- #if defined SCRIPT_DEBUG
- new c;
- #endif
- // Get the camera's positions
- new Float:x, Float:y, Float:z, Float:a;
- new Float:vx, Float:vy, Float:vz;
- new Float:cx, Float:cy, Float:cz;
- new Float:offset;
- new Float:radius;
- GetPlayerCameraFrontVector(playerid, vx, vy, vz);
- GetPlayerCameraPos(playerid, cx, cy, cz);
- GetPlayerFacingAngle(playerid, a);
- // Check if the player is aiming in a certain distance
- for(new Float:d; d < MAX_DISTANCE_UNIT; d += 0.5)
- {
- switch (GetPlayerWeapon(playerid))
- {
- case 24, 29, 22, 23, 25, 26, 27, 28, 32: offset = 0.11;
- case 30, 31: offset = 0.07;
- case 33: offset = 0.045;
- default: offset = 0.0;
- }
- switch (GetPlayerWeapon(playerid))
- {
- case 22, 26, 28, 32:
- {
- // duals, where you don't need to change your angle to change aim direction -- Not very accurate, but considering they spray, it should be good
- x = vx*d+cx;
- y = vy*d+cy;
- }
- default:
- {
- // this is for weapons where your angle moves when you change your aim(deagle, sdpistol, m4, etc)
- x = cx + (d * floatsin(-a, degrees));
- y = cy + (d * floatcos(-a, degrees));
- }
- }
- z = (vz+offset)*d+cz;
- switch (bodypart)
- {
- case BODY_PART_HEAD: z -= 0.0, radius = 0.3; // the offsets are made for head shots
- case BODY_PART_TORSO: z += 0.6, radius = 0.5;
- case BODY_PART_LEGS: z += 1.2, radius = 0.4;
- }
- #if defined SCRIPT_DEBUG
- if (IsValidObject(shootpick[c])) DestroyObject(shootpick[c]);
- shootpick[c] = CreateObject(1274, x, y, z, 0.0, 0.0, 0.0);
- c++;
- #endif
- for(new i, m = GetMaxPlayers(); i < m; i++)
- {
- if (!IsPlayerConnected(i)) continue;
- if (playerid == i) continue;
- if (GetPlayerSpecialAction(i) == SPECIAL_ACTION_DUCK)
- {
- if (IsPlayerInRangeOfPoint(i, radius+0.2, x, y, z+1.2-1.3-(bodypart==BODY_PART_TORSO?0.42:0.0)))
- {
- return i;
- }
- }
- else if (IsPlayerInRangeOfPoint(i, radius, x, y, z-0.8))
- {
- return i;
- }
- }
- }
- return INVALID_PLAYER_ID;
- }
- /*
- ---[IsPlayerAimingTargetBodyPart]---
- »playerid: the player
- »targetid: the target
- »bodypart: the body part you want to check
- *Return: 1 if true, 0 if false
- *-------------------------------------------------------------------*
- | Checks if the player is aiming at target's specific body part. |
- *-------------------------------------------------------------------*
- */
- function IsPlayerAimingTargetBodyPart(playerid, targetid, bodypart)
- {
- #if defined SCRIPT_DEBUG
- new c;
- #endif
- // Get the camera's positions
- if(!IsPlayerLookingAtPlayer(playerid, targetid)) return 1;
- new Float:x, Float:y, Float:z, Float:a;
- new Float:vx, Float:vy, Float:vz;
- new Float:cx, Float:cy, Float:cz;
- new Float:offset;
- new Float:radius;
- GetPlayerCameraFrontVector(playerid, vx, vy, vz);
- GetPlayerCameraPos(playerid, cx, cy, cz);
- GetPlayerFacingAngle(playerid, a);
- // Check if the player is aiming in a certain distance
- for(new Float:d; d < MAX_DISTANCE_UNIT; d += 0.5)
- {
- switch (GetPlayerWeapon(playerid))
- {
- case 24, 29, 22, 23, 25, 26, 27, 28, 32: offset = 0.11;
- case 30, 31: offset = 0.07;
- case 33, 34: offset = 0.0;
- }
- switch (GetPlayerWeapon(playerid))
- {
- case 22, 26, 28, 32:
- {
- // duals, where you don't need to change your angle to change aim direction -- Not very accurate, but considering they spray, it should be good
- x = vx*d+cx;
- y = vy*d+cy;
- }
- default:
- {
- // this is for weapons where your angle moves when you change your aim(deagle, sdpistol, m4, etc)
- x = cx + (d * floatsin(-a, degrees));
- y = cy + (d * floatcos(-a, degrees));
- }
- }
- z = (vz+offset)*d+cz;
- switch (bodypart)
- {
- case BODY_PART_HEAD: z -= 0.0, radius = 0.3; // the offsets are made for head shots
- case BODY_PART_TORSO: z += 0.6, radius = 0.5;
- case BODY_PART_LEGS: z += 1.2, radius = 0.4;
- }
- #if defined SCRIPT_DEBUG
- if (IsValidObject(shootpick[c])) DestroyObject(shootpick[c]);
- shootpick[c] = CreateObject(1274, x, y, z, 0.0, 0.0, 0.0);
- c++;
- #endif
- if (GetPlayerSpecialAction(targetid) == SPECIAL_ACTION_DUCK)
- {
- if (IsPlayerInRangeOfPoint(targetid, radius+0.2, x, y, z+1.2-1.3-(bodypart==BODY_PART_TORSO?0.42:0.0)))
- {
- return 1;
- }
- }
- else if (IsPlayerInRangeOfPoint(targetid, radius, x, y, z-0.8))
- {
- return 1;
- }
- }
- return 0;
- }
- stock IsPlayerLookingAtPlayer(player1, player2) { // Simon edited by Carlton
- if (!IsPlayerConnected(player1) || !IsPlayerConnected(player2)) return 0;
- if(player1 == player2) return 0;
- new
- Float: distance,
- Float: vectorX,
- Float: vectorY,
- Float: vectorZ,
- Float: plyrPos[2][3],
- Float: projPos[3];
- GetPlayerCameraFrontVector(player1, vectorX, vectorY, vectorZ);
- GetPlayerCameraPos(player1, plyrPos[0][0], plyrPos[0][1], plyrPos[0][2]);
- GetPlayerPos(player2, plyrPos[1][0], plyrPos[1][1], plyrPos[1][2]);
- #define SQUARE(%1) ((%1)*(%1))
- distance = floatsqroot(
- SQUARE(plyrPos[1][0]-plyrPos[0][0]) + SQUARE(plyrPos[1][1]-plyrPos[0][1]) + SQUARE(plyrPos[1][2]-plyrPos[0][2]));
- projPos[0] = plyrPos[0][0] + vectorX * distance;
- projPos[1] = plyrPos[0][1] + vectorY * distance;
- projPos[2] = plyrPos[0][2] + vectorZ * distance;
- return ((SQUARE(plyrPos[1][0]-projPos[0]) + SQUARE(plyrPos[1][1]-projPos[1]) + SQUARE(plyrPos[1][2]-projPos[2])) <= SQUARE(distance / 6));
- #undef SQUARE
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement