Advertisement
Guest User

bleed.pwn

a guest
May 20th, 2016
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 5.48 KB | None | 0 0
  1. /*  bleed.pwn
  2.  *
  3.  *  (c) Copyright 2016, Emilijo "Correlli" Lovrich
  4.  *
  5.  *  Credits: - Incognito for streamer plugin,
  6.  *           - Y_Less for foreach/iterator and GetXYInFrontOfPlayer,
  7.  *           - ZeeX for ZCMD command processor.
  8. */
  9.  
  10. #include "a_samp"
  11. #include "foreach"
  12. #include "streamer"
  13. #include "zcmd"
  14.  
  15. #define MAX_PLAYER_BLEEDS                                                       (3)
  16. #define PLAYER_BLEEDING_RANGE                                                   (1.5)
  17.  
  18. enum DataPlayer
  19. {
  20.     Bleeding,
  21.     BleedObject[MAX_PLAYER_BLEEDS]
  22. }
  23.  
  24. new
  25.         PlayerData[MAX_PLAYERS][DataPlayer], g_Timer;
  26.  
  27. command(bstart, playerid, params[])
  28. {
  29.     SetPlayerBleeding(playerid, strval(params));
  30.     return true;
  31. }
  32.  
  33. command(bstop, playerid, params[])
  34. {
  35.     StopPlayerBleeding(playerid);
  36.     return true;
  37. }
  38.  
  39. forward Bleed_MainTimer();
  40. public Bleed_MainTimer()
  41. {
  42.     foreach(Player, u)
  43.     {
  44.         if(GetPlayerState(u) == PLAYER_STATE_ONFOOT)
  45.         {
  46.             if(IsPlayerBleeding(u))
  47.                 UpdatePlayerBleeds(u);
  48.         }
  49.     }
  50.     return true;
  51. }
  52.  
  53. stock SetPlayerBleeding(playerid, bleeds = MAX_PLAYER_BLEEDS)
  54. {
  55.     if(IsPlayerBleeding(playerid))
  56.         return false;
  57.     if(bleeds < 1)                  bleeds  =                   1;
  58.     if(bleeds > MAX_PLAYER_BLEEDS)  bleeds  =   MAX_PLAYER_BLEEDS;
  59.     PlayerData[playerid][Bleeding] = bleeds;
  60.     new
  61.             Float:pos[3];
  62.     GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  63.     for(new a = 0; a < bleeds; a++)
  64.     {
  65.         GetXYInFrontOfPlayer(playerid, pos[0], pos[1], -(PLAYER_BLEEDING_RANGE * a));
  66.         PlayerData[playerid][BleedObject][a] = CreateDynamicObject(
  67.             19836,
  68.             pos[0],
  69.             pos[1],
  70.             (pos[2] - 0.99),
  71.             0.0,
  72.             0.0,
  73.             0.0,
  74.             GetPlayerVirtualWorld(playerid),
  75.             GetPlayerInterior(playerid),
  76.             -1,
  77.             50.0
  78.         );
  79.     }
  80.     return true;
  81. }
  82.  
  83. stock UpdatePlayerBleeds(playerid)
  84. {
  85.     if(IsPlayerFalling(playerid) || IsPlayerJumping(playerid) || IsPlayerInWater(playerid))
  86.         return false;
  87.     new
  88.             Float:pos[3];
  89.     GetDynamicObjectPos(PlayerData[playerid][BleedObject][0], pos[0], pos[1], pos[2]);
  90.     if(!IsPlayerInRangeOfPoint(playerid, PLAYER_BLEEDING_RANGE, pos[0], pos[1], (pos[2] + 0.99)))
  91.     {
  92.         new
  93.                 a = (PlayerData[playerid][Bleeding] - 1);
  94.         while(a >= 0)
  95.         {
  96.             if((a - 1) == -1)
  97.             {
  98.                 GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
  99.                 pos[2] -= 0.99;
  100.             }
  101.             else
  102.                 GetDynamicObjectPos(PlayerData[playerid][BleedObject][a - 1], pos[0], pos[1], pos[2]);
  103.             SetDynamicObjectPos(PlayerData[playerid][BleedObject][a], pos[0], pos[1], pos[2]);
  104.             if(GetPlayerInterior(playerid) != Streamer_GetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_INTERIOR_ID))
  105.                 Streamer_SetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_INTERIOR_ID, GetPlayerInterior(playerid));
  106.             if(GetPlayerVirtualWorld(playerid) != Streamer_GetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_WORLD_ID))
  107.                 Streamer_SetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_WORLD_ID, GetPlayerVirtualWorld(playerid));
  108.             a--;
  109.         }
  110.     }
  111.     return true;
  112. }
  113.  
  114. stock StopPlayerBleeding(playerid)
  115. {
  116.     if(!IsPlayerBleeding(playerid))
  117.         return false;
  118.     for(new a = 0; a < PlayerData[playerid][Bleeding]; a++)
  119.     {
  120.         if(IsValidDynamicObject(PlayerData[playerid][BleedObject][a]))
  121.         {
  122.             DestroyDynamicObject(PlayerData[playerid][BleedObject][a]);
  123.             PlayerData[playerid][BleedObject][a] = INVALID_OBJECT_ID;
  124.         }
  125.     }
  126.     PlayerData[playerid][Bleeding] = 0;
  127.     return true;
  128. }
  129.  
  130. stock IsPlayerBleeding(playerid)
  131.     return PlayerData[playerid][Bleeding];
  132.  
  133. stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
  134. {
  135.     new
  136.             Float:angle;
  137.     GetPlayerPos(playerid, x, y, angle);
  138.     GetPlayerFacingAngle(playerid, angle);
  139.     if(GetPlayerVehicleID(playerid))
  140.         GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
  141.     x += (distance * floatsin(-angle, degrees));
  142.     y += (distance * floatcos(-angle, degrees));
  143. }
  144.  
  145. stock IsPlayerFalling(playerid)
  146. {
  147.     new
  148.             animation[32];
  149.     GetAnimationName(
  150.         GetPlayerAnimationIndex(playerid),
  151.         animation,
  152.         0,
  153.         animation,
  154.         32
  155.     );
  156.     if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT
  157.     && (!strcmp(animation, "FALL_FALL", true) || !strcmp(animation, "FALL_GLIDE", true)))
  158.         return true;
  159.     return false;
  160. }
  161.  
  162. stock IsPlayerJumping(playerid)
  163. {
  164.     new
  165.             animation[32];
  166.     GetAnimationName(
  167.         GetPlayerAnimationIndex(playerid),
  168.         animation,
  169.         0,
  170.         animation,
  171.         32
  172.     );
  173.     if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT
  174.     && (!strcmp(animation, "JUMP_LAUNCH", true) || !strcmp(animation, "JUMP_GLIDE", true)))
  175.         return true;
  176.     return false;
  177. }
  178.  
  179. stock IsPlayerInWater(playerid)
  180. {
  181.     if(GetPlayerInterior(playerid) || GetPlayerVirtualWorld(playerid))
  182.         return false;
  183.     new
  184.             Float:pos;
  185.     GetPlayerPos(playerid, pos, pos, pos);
  186.     if(!(pos < 1.0))
  187.         return false;
  188.     return true;
  189. }
  190.  
  191. public OnFilterScriptInit()
  192. {
  193.     g_Timer = SetTimer("Bleed_MainTimer", 1000, true);
  194.  
  195.     foreach(Player, u)
  196.     {
  197.         for(new a = 0; a < MAX_PLAYER_BLEEDS; a++)
  198.             PlayerData[u][BleedObject][a] = INVALID_OBJECT_ID;
  199.     }
  200.     return true;
  201. }
  202.  
  203. public OnFilterScriptExit()
  204. {
  205.     KillTimer(g_Timer);
  206.  
  207.     foreach(Player, u)
  208.     {
  209.         if(IsPlayerBleeding(u))
  210.             StopPlayerBleeding(u);
  211.     }
  212.     return true;
  213. }
  214.  
  215. public OnPlayerConnect(playerid)
  216. {
  217.     for(new a = 0; a < MAX_PLAYER_BLEEDS; a++)
  218.         PlayerData[playerid][BleedObject][a] = INVALID_OBJECT_ID;
  219.     return true;
  220. }
  221.  
  222. public OnPlayerDisconnect(playerid, reason)
  223. {
  224.     if(IsPlayerBleeding(playerid))
  225.         StopPlayerBleeding(playerid);
  226.     return true;
  227. }
  228.  
  229. public OnPlayerDeath(playerid, killerid, reason)
  230. {
  231.     if(IsPlayerBleeding(playerid))
  232.         StopPlayerBleeding(playerid);
  233.     return true;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement