Advertisement
Guest User

Untitled

a guest
Apr 25th, 2012
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.13 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. #undef MAX_PLAYERS
  4. #define MAX_PLAYERS 31
  5.  
  6. #define BLEED_OUT_TIME 15 // Bleed out time in seconds
  7. #define REVIVE_HEALTH 5 // How much health to add on revival timer
  8. #define REVIVE_TIMER 333 // Time in MS for revival timer (to add health defined above)
  9.  
  10. #define FLOAT_INFINITY      (Float:0x7F800000)
  11.  
  12. new PlayerText:BleedOutTD[MAX_PLAYERS];
  13.  
  14. new Text:BleedOutReviveTD[MAX_PLAYERS];
  15.  
  16. new BleedOutTime[MAX_PLAYERS];
  17. new BleedOutTimer[MAX_PLAYERS];
  18. new RevivalTimer[MAX_PLAYERS];
  19.  
  20. new BleedingPlayers[MAX_PLAYERS];
  21. new BleedingPlayerCount;
  22.  
  23. new pRevive[MAX_PLAYERS] = {-1, ...};
  24.  
  25. public OnPlayerGiveDamage(playerid, damagedid, Float:amount)
  26. {
  27.     SendClientMessageToAll(-1, "DAMAGE");
  28.     if((GetPlayerVirtualWorld(playerid) == 0 || GetPVarInt(playerid, "pTeam") == GetPVarInt(damagedid, "pTeam")) || GetPVarInt(damagedid, "godmode") == 1 || GetPVarInt(damagedid, "godmode") == 3) return 1; // No damage
  29.  
  30.     new Float:health, Float:armour;
  31.     GetPlayerHealth(damagedid, health);
  32.     GetPlayerArmour(damagedid, armour);
  33.    
  34.     if(armour == 0.0) // No armour, just take health
  35.     {
  36.         health -= amount;
  37.         if(health < 0.0) health = 0;
  38.     }
  39.     else // There is armour, take what is needed
  40.     {
  41.         if(armour-amount < 0.0) // Health needs to be taken
  42.         {
  43.             health -= (amount - armour);
  44.             armour = 0;
  45.         }
  46.         else armour -= amount;
  47.     }
  48.    
  49.     SetPlayerArmour(damagedid, armour);
  50.    
  51.     if(health < 1)
  52.     {
  53.         if(BleedOutTime[damagedid] == 0)
  54.         {
  55.             ApplyAnimation(damagedid, "CRACK", "crckidle1",4.1,1,0,0,1,0);
  56.             SetPlayerHealth(damagedid, 1);
  57.             SendClientMessage(damagedid, 0xFF0000FF, "YOU ARE BLEEDING OUT.");
  58.             SendClientMessage(damagedid, 0xFF0000FF, "Type {FFFFFF}/die or /kill{FF0000} for the coward's way out.");
  59.             BleedOutTimer[damagedid] = SetTimerEx("bleed_out", 900, true, "i", damagedid);
  60.             BleedOutTime[damagedid] = BLEED_OUT_TIME;
  61.        
  62.             // Create textdraw
  63.             BleedOutTD[damagedid] = CreatePlayerTextDraw(damagedid, 320.000000, 200.000000, "~N~~R~BLEEDING OUT..~N~"#BLEED_OUT_TIME"~N~");
  64.             PlayerTextDrawAlignment(damagedid, BleedOutTD[damagedid], 2);
  65.             PlayerTextDrawBackgroundColor(damagedid, BleedOutTD[damagedid], 1768516095);
  66.             PlayerTextDrawFont(damagedid, BleedOutTD[damagedid], 2);
  67.             PlayerTextDrawLetterSize(damagedid, BleedOutTD[damagedid], 0.519999, 2.000000);
  68.             PlayerTextDrawColor(damagedid, BleedOutTD[damagedid], -1);
  69.             PlayerTextDrawSetOutline(damagedid, BleedOutTD[damagedid], 0);
  70.             PlayerTextDrawSetProportional(damagedid, BleedOutTD[damagedid], 1);
  71.             PlayerTextDrawSetShadow(damagedid, BleedOutTD[damagedid], 0);
  72.             PlayerTextDrawUseBox(damagedid, BleedOutTD[damagedid], 1);
  73.             PlayerTextDrawBoxColor(damagedid, BleedOutTD[damagedid], 255);
  74.             PlayerTextDrawTextSize(damagedid, BleedOutTD[damagedid], 0.000000, 180.000000);
  75.             PlayerTextDrawShow(damagedid, BleedOutTD[damagedid]);
  76.             SetPlayerChatBubble(damagedid, "BLEEDING OUT", 0xFF0000FF, 100, 2000);
  77.  
  78.             // Create revival prompt
  79.             new tdstring[64], pname[MAX_PLAYER_NAME];
  80.             GetPlayerName(damagedid, pname, MAX_PLAYER_NAME);
  81.             format(tdstring, sizeof(tdstring), "Hold ~Y~~k~~PED_SPRINT~ ~W~to revive ~P~%s", pname);
  82.             BleedOutReviveTD[damagedid] = TextDrawCreate(320.000000, 354.000000, tdstring);
  83.             TextDrawAlignment(BleedOutReviveTD[damagedid], 2);
  84.             TextDrawBackgroundColor(BleedOutReviveTD[damagedid], 255);
  85.             TextDrawFont(BleedOutReviveTD[damagedid], 1);
  86.             TextDrawLetterSize(BleedOutReviveTD[damagedid], 0.400000, 1.399999);
  87.             TextDrawColor(BleedOutReviveTD[damagedid], -1);
  88.             TextDrawSetOutline(BleedOutReviveTD[damagedid], 1);
  89.             TextDrawSetProportional(BleedOutReviveTD[damagedid], 1);
  90.            
  91.             BleedingPlayers[BleedingPlayerCount] = damagedid;
  92.             BleedingPlayerCount++;
  93.         }
  94.         return 1;
  95.     }
  96.    
  97.     SetPlayerHealth(damagedid, health);
  98.     return 1;
  99. }
  100.  
  101. public OnPlayerDeath(playerid, killerid, reason)
  102. {
  103.     if(BleedOutTime[playerid] != 0)
  104.     {
  105.         BleedingPlayerCount--;
  106.         KillTimer(BleedOutTimer[playerid]);
  107.         PlayerTextDrawDestroy(playerid, BleedOutTD[playerid]);
  108.         TextDrawDestroy(BleedOutReviveTD[playerid]);
  109.     }
  110.     return 1;
  111. }
  112.  
  113. public OnPlayerSpawn(playerid)
  114. {
  115.     BleedOutTime[playerid] = 0;
  116.     pRevive[playerid] = -1;
  117.     return 1;
  118. }
  119.  
  120. public OnPlayerUpdate(playerid)
  121. {
  122.     if(BleedOutTime[playerid] != 0 || pRevive[playerid] != -1) return 1;
  123.     new Float:x, Float:y, Float:z;
  124.     for(new i=0; i<BleedingPlayerCount; i++)
  125.     {
  126.         GetPlayerPos(BleedingPlayers[i], x, y, z);
  127.         if(IsPlayerInRangeOfPoint(playerid, 5, x, y, z))
  128.         {
  129.             TextDrawShowForPlayer(playerid, BleedOutReviveTD[BleedingPlayers[i]]);
  130.         }
  131.         else
  132.         {
  133.             TextDrawHideForPlayer(playerid, BleedOutReviveTD[BleedingPlayers[i]]);
  134.         }
  135.     }
  136.     return 1;
  137. }
  138.  
  139. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  140. {
  141.     if(newkeys & KEY_SPRINT && !(oldkeys & KEY_SPRINT) && pRevive[playerid] == -1)
  142.     {
  143.         new Float:x, Float:y, Float:z;
  144.         new Float:dist = FLOAT_INFINITY, closest = -1, Float:this_dist;
  145.         for(new i=0; i<BleedingPlayerCount; i++)
  146.         {
  147.             GetPlayerPos(BleedingPlayers[i], x, y, z);
  148.             this_dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
  149.             if(this_dist < dist && this_dist < 5)
  150.             {
  151.                 dist = this_dist;
  152.                 closest = BleedingPlayers[i];
  153.             }
  154.         }
  155.        
  156.         if(closest == -1) return 1;
  157.        
  158.         pRevive[playerid] = closest;
  159.         KillTimer(BleedOutTimer[closest]);
  160.         RevivalTimer[closest] = SetTimerEx("revival_progress", REVIVE_TIMER, true, "ii", playerid, closest);
  161.         TextDrawHideForAll(BleedOutReviveTD[closest]);
  162.         PlayerTextDrawDestroy(closest, BleedOutTD[closest]);
  163.         TextDrawDestroy(BleedOutReviveTD[closest]);
  164.     }
  165.     if(!(newkeys & KEY_SPRINT) && pRevive[playerid] != -1) // Cancel revive
  166.     {
  167.         KillTimer(RevivalTimer[pRevive[playerid]]);
  168.         BleedOutTimer[pRevive[playerid]] = SetTimerEx("bleed_out", 900, true, "i", pRevive[playerid]);
  169.  
  170.         SendClientMessage(playerid, 0xFF0000FF, "REVIVE CANCELLED.");
  171.         SendClientMessage(pRevive[playerid], 0xFF0000FF, "REVIVE CANCELLED.");
  172.        
  173.         // Create textdraw
  174.         new tdstring[32];
  175.         format(tdstring, sizeof(tdstring), "~N~~R~BLEEDING OUT..~N~%i~N~", BleedOutTime[pRevive[playerid]]);
  176.         BleedOutTD[pRevive[playerid]] = CreatePlayerTextDraw(pRevive[playerid], 320.000000, 200.000000, tdstring);
  177.         PlayerTextDrawAlignment(pRevive[playerid], BleedOutTD[pRevive[playerid]], 2);
  178.         PlayerTextDrawBackgroundColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1768516095);
  179.         PlayerTextDrawFont(pRevive[playerid], BleedOutTD[pRevive[playerid]], 2);
  180.         PlayerTextDrawLetterSize(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0.519999, 2.000000);
  181.         PlayerTextDrawColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], -1);
  182.         PlayerTextDrawSetOutline(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0);
  183.         PlayerTextDrawSetProportional(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1);
  184.         PlayerTextDrawSetShadow(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0);
  185.         PlayerTextDrawUseBox(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1);
  186.         PlayerTextDrawBoxColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], 255);
  187.         PlayerTextDrawTextSize(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0.000000, 180.000000);
  188.         PlayerTextDrawShow(pRevive[playerid], BleedOutTD[pRevive[playerid]]);
  189.         SetPlayerChatBubble(pRevive[playerid], "BLEEDING OUT", 0xFF0000FF, 100, 2000);
  190.  
  191.         // Create revival prompt
  192.         new pname[MAX_PLAYER_NAME];
  193.         GetPlayerName(pRevive[playerid], pname, MAX_PLAYER_NAME);
  194.         format(tdstring, sizeof(tdstring), "Hold ~Y~~k~~PED_SPRINT~ ~W~to revive ~P~%s", pname);
  195.         BleedOutReviveTD[pRevive[playerid]] = TextDrawCreate(320.000000, 354.000000, tdstring);
  196.         TextDrawAlignment(BleedOutReviveTD[pRevive[playerid]], 2);
  197.         TextDrawBackgroundColor(BleedOutReviveTD[pRevive[playerid]], 255);
  198.         TextDrawFont(BleedOutReviveTD[pRevive[playerid]], 1);
  199.         TextDrawLetterSize(BleedOutReviveTD[pRevive[playerid]], 0.400000, 1.399999);
  200.         TextDrawColor(BleedOutReviveTD[pRevive[playerid]], -1);
  201.         TextDrawSetOutline(BleedOutReviveTD[pRevive[playerid]], 1);
  202.         TextDrawSetProportional(BleedOutReviveTD[pRevive[playerid]], 1);
  203.        
  204.         pRevive[playerid] = -1;
  205.     }
  206.     return 1;
  207. }
  208.  
  209.  
  210. forward bleed_out(playerid);
  211. public bleed_out(playerid)
  212. {
  213.     BleedOutTime[playerid]--;
  214.     if(BleedOutTime[playerid] == 0)
  215.     {
  216.         SetPlayerHealth(playerid, 0);
  217.         SendClientMessage(playerid, 0xFF0000FF, "* You bled out.");
  218.         KillTimer(BleedOutTimer[playerid]);
  219.         PlayerTextDrawDestroy(playerid, BleedOutTD[playerid]);
  220.         TextDrawDestroy(BleedOutReviveTD[playerid]);
  221.         BleedingPlayerCount--;
  222.     }
  223.     else
  224.     {
  225.         new tdstring[32];
  226.         format(tdstring, sizeof(tdstring), "~N~~R~BLEEDING OUT..~N~%i~N~", BleedOutTime[playerid]);
  227.         PlayerTextDrawSetString(playerid, BleedOutTD[playerid], tdstring);
  228.         SetPlayerChatBubble(playerid, "BLEEDING OUT", 0xFF0000FF, 100, 2000);
  229.     }
  230.     return 1;
  231. }
  232.  
  233. forward revival_progress(playerid, reviveid);
  234. public revival_progress(playerid, reviveid)
  235. {
  236.     new Float:x, Float:y, Float:z;
  237.     if(GetPlayerDistanceFromPoint(playerid, x, y, z) < 5)
  238.     {
  239.         SendClientMessage(playerid, 0xFF0000FF, "REVIVE CANCELLED");
  240.         KillTimer(RevivalTimer[reviveid]);
  241.     }
  242.     else
  243.     {
  244.         new Float:pHealth;
  245.         GetPlayerHealth(reviveid, pHealth);
  246.        
  247.         if(pHealth+REVIVE_HEALTH > 99)
  248.         {
  249.             SetPlayerHealth(reviveid, 100);
  250.  
  251.             GameTextForPlayer(reviveid, "~G~REVIVED", 3000, 3);
  252.  
  253.             new string[64], pname[MAX_PLAYER_NAME];
  254.  
  255.             GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
  256.             format(string, sizeof(string), "Revived by %s", pname);
  257.             SendClientMessage(reviveid, 0x00FF00FF, string);
  258.  
  259.             GetPlayerName(reviveid, pname, MAX_PLAYER_NAME);
  260.             format(string, sizeof(string), "Revived %s", pname);
  261.             SendClientMessage(playerid, 0x00FF00FF, string);
  262.  
  263.             KillTimer(BleedOutTimer[reviveid]);
  264.             PlayerTextDrawDestroy(reviveid, BleedOutTD[reviveid]);
  265.             TextDrawDestroy(BleedOutReviveTD[reviveid]);
  266.             BleedingPlayerCount--;
  267.             BleedOutTime[reviveid] = 0;
  268.  
  269.             ClearAnimations(reviveid);
  270.            
  271.             KillTimer(RevivalTimer[reviveid]);
  272.            
  273.             pRevive[playerid] = -1;
  274.             return 1;
  275.         }
  276.        
  277.         SetPlayerHealth(reviveid, pHealth+REVIVE_HEALTH);
  278.     }
  279.     return 1;
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement