Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <a_samp>
- #undef MAX_PLAYERS
- #define MAX_PLAYERS 31
- #define BLEED_OUT_TIME 15 // Bleed out time in seconds
- #define REVIVE_HEALTH 5 // How much health to add on revival timer
- #define REVIVE_TIMER 333 // Time in MS for revival timer (to add health defined above)
- #define FLOAT_INFINITY (Float:0x7F800000)
- new PlayerText:BleedOutTD[MAX_PLAYERS];
- new Text:BleedOutReviveTD[MAX_PLAYERS];
- new BleedOutTime[MAX_PLAYERS];
- new BleedOutTimer[MAX_PLAYERS];
- new RevivalTimer[MAX_PLAYERS];
- new BleedingPlayers[MAX_PLAYERS];
- new BleedingPlayerCount;
- new pRevive[MAX_PLAYERS] = {-1, ...};
- public OnPlayerGiveDamage(playerid, damagedid, Float:amount)
- {
- SendClientMessageToAll(-1, "DAMAGE");
- if((GetPlayerVirtualWorld(playerid) == 0 || GetPVarInt(playerid, "pTeam") == GetPVarInt(damagedid, "pTeam")) || GetPVarInt(damagedid, "godmode") == 1 || GetPVarInt(damagedid, "godmode") == 3) return 1; // No damage
- new Float:health, Float:armour;
- GetPlayerHealth(damagedid, health);
- GetPlayerArmour(damagedid, armour);
- if(armour == 0.0) // No armour, just take health
- {
- health -= amount;
- if(health < 0.0) health = 0;
- }
- else // There is armour, take what is needed
- {
- if(armour-amount < 0.0) // Health needs to be taken
- {
- health -= (amount - armour);
- armour = 0;
- }
- else armour -= amount;
- }
- SetPlayerArmour(damagedid, armour);
- if(health < 1)
- {
- if(BleedOutTime[damagedid] == 0)
- {
- ApplyAnimation(damagedid, "CRACK", "crckidle1",4.1,1,0,0,1,0);
- SetPlayerHealth(damagedid, 1);
- SendClientMessage(damagedid, 0xFF0000FF, "YOU ARE BLEEDING OUT.");
- SendClientMessage(damagedid, 0xFF0000FF, "Type {FFFFFF}/die or /kill{FF0000} for the coward's way out.");
- BleedOutTimer[damagedid] = SetTimerEx("bleed_out", 900, true, "i", damagedid);
- BleedOutTime[damagedid] = BLEED_OUT_TIME;
- // Create textdraw
- BleedOutTD[damagedid] = CreatePlayerTextDraw(damagedid, 320.000000, 200.000000, "~N~~R~BLEEDING OUT..~N~"#BLEED_OUT_TIME"~N~");
- PlayerTextDrawAlignment(damagedid, BleedOutTD[damagedid], 2);
- PlayerTextDrawBackgroundColor(damagedid, BleedOutTD[damagedid], 1768516095);
- PlayerTextDrawFont(damagedid, BleedOutTD[damagedid], 2);
- PlayerTextDrawLetterSize(damagedid, BleedOutTD[damagedid], 0.519999, 2.000000);
- PlayerTextDrawColor(damagedid, BleedOutTD[damagedid], -1);
- PlayerTextDrawSetOutline(damagedid, BleedOutTD[damagedid], 0);
- PlayerTextDrawSetProportional(damagedid, BleedOutTD[damagedid], 1);
- PlayerTextDrawSetShadow(damagedid, BleedOutTD[damagedid], 0);
- PlayerTextDrawUseBox(damagedid, BleedOutTD[damagedid], 1);
- PlayerTextDrawBoxColor(damagedid, BleedOutTD[damagedid], 255);
- PlayerTextDrawTextSize(damagedid, BleedOutTD[damagedid], 0.000000, 180.000000);
- PlayerTextDrawShow(damagedid, BleedOutTD[damagedid]);
- SetPlayerChatBubble(damagedid, "BLEEDING OUT", 0xFF0000FF, 100, 2000);
- // Create revival prompt
- new tdstring[64], pname[MAX_PLAYER_NAME];
- GetPlayerName(damagedid, pname, MAX_PLAYER_NAME);
- format(tdstring, sizeof(tdstring), "Hold ~Y~~k~~PED_SPRINT~ ~W~to revive ~P~%s", pname);
- BleedOutReviveTD[damagedid] = TextDrawCreate(320.000000, 354.000000, tdstring);
- TextDrawAlignment(BleedOutReviveTD[damagedid], 2);
- TextDrawBackgroundColor(BleedOutReviveTD[damagedid], 255);
- TextDrawFont(BleedOutReviveTD[damagedid], 1);
- TextDrawLetterSize(BleedOutReviveTD[damagedid], 0.400000, 1.399999);
- TextDrawColor(BleedOutReviveTD[damagedid], -1);
- TextDrawSetOutline(BleedOutReviveTD[damagedid], 1);
- TextDrawSetProportional(BleedOutReviveTD[damagedid], 1);
- BleedingPlayers[BleedingPlayerCount] = damagedid;
- BleedingPlayerCount++;
- }
- return 1;
- }
- SetPlayerHealth(damagedid, health);
- return 1;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- if(BleedOutTime[playerid] != 0)
- {
- BleedingPlayerCount--;
- KillTimer(BleedOutTimer[playerid]);
- PlayerTextDrawDestroy(playerid, BleedOutTD[playerid]);
- TextDrawDestroy(BleedOutReviveTD[playerid]);
- }
- return 1;
- }
- public OnPlayerSpawn(playerid)
- {
- BleedOutTime[playerid] = 0;
- pRevive[playerid] = -1;
- return 1;
- }
- public OnPlayerUpdate(playerid)
- {
- if(BleedOutTime[playerid] != 0 || pRevive[playerid] != -1) return 1;
- new Float:x, Float:y, Float:z;
- for(new i=0; i<BleedingPlayerCount; i++)
- {
- GetPlayerPos(BleedingPlayers[i], x, y, z);
- if(IsPlayerInRangeOfPoint(playerid, 5, x, y, z))
- {
- TextDrawShowForPlayer(playerid, BleedOutReviveTD[BleedingPlayers[i]]);
- }
- else
- {
- TextDrawHideForPlayer(playerid, BleedOutReviveTD[BleedingPlayers[i]]);
- }
- }
- return 1;
- }
- public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
- {
- if(newkeys & KEY_SPRINT && !(oldkeys & KEY_SPRINT) && pRevive[playerid] == -1)
- {
- new Float:x, Float:y, Float:z;
- new Float:dist = FLOAT_INFINITY, closest = -1, Float:this_dist;
- for(new i=0; i<BleedingPlayerCount; i++)
- {
- GetPlayerPos(BleedingPlayers[i], x, y, z);
- this_dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
- if(this_dist < dist && this_dist < 5)
- {
- dist = this_dist;
- closest = BleedingPlayers[i];
- }
- }
- if(closest == -1) return 1;
- pRevive[playerid] = closest;
- KillTimer(BleedOutTimer[closest]);
- RevivalTimer[closest] = SetTimerEx("revival_progress", REVIVE_TIMER, true, "ii", playerid, closest);
- TextDrawHideForAll(BleedOutReviveTD[closest]);
- PlayerTextDrawDestroy(closest, BleedOutTD[closest]);
- TextDrawDestroy(BleedOutReviveTD[closest]);
- }
- if(!(newkeys & KEY_SPRINT) && pRevive[playerid] != -1) // Cancel revive
- {
- KillTimer(RevivalTimer[pRevive[playerid]]);
- BleedOutTimer[pRevive[playerid]] = SetTimerEx("bleed_out", 900, true, "i", pRevive[playerid]);
- SendClientMessage(playerid, 0xFF0000FF, "REVIVE CANCELLED.");
- SendClientMessage(pRevive[playerid], 0xFF0000FF, "REVIVE CANCELLED.");
- // Create textdraw
- new tdstring[32];
- format(tdstring, sizeof(tdstring), "~N~~R~BLEEDING OUT..~N~%i~N~", BleedOutTime[pRevive[playerid]]);
- BleedOutTD[pRevive[playerid]] = CreatePlayerTextDraw(pRevive[playerid], 320.000000, 200.000000, tdstring);
- PlayerTextDrawAlignment(pRevive[playerid], BleedOutTD[pRevive[playerid]], 2);
- PlayerTextDrawBackgroundColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1768516095);
- PlayerTextDrawFont(pRevive[playerid], BleedOutTD[pRevive[playerid]], 2);
- PlayerTextDrawLetterSize(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0.519999, 2.000000);
- PlayerTextDrawColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], -1);
- PlayerTextDrawSetOutline(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0);
- PlayerTextDrawSetProportional(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1);
- PlayerTextDrawSetShadow(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0);
- PlayerTextDrawUseBox(pRevive[playerid], BleedOutTD[pRevive[playerid]], 1);
- PlayerTextDrawBoxColor(pRevive[playerid], BleedOutTD[pRevive[playerid]], 255);
- PlayerTextDrawTextSize(pRevive[playerid], BleedOutTD[pRevive[playerid]], 0.000000, 180.000000);
- PlayerTextDrawShow(pRevive[playerid], BleedOutTD[pRevive[playerid]]);
- SetPlayerChatBubble(pRevive[playerid], "BLEEDING OUT", 0xFF0000FF, 100, 2000);
- // Create revival prompt
- new pname[MAX_PLAYER_NAME];
- GetPlayerName(pRevive[playerid], pname, MAX_PLAYER_NAME);
- format(tdstring, sizeof(tdstring), "Hold ~Y~~k~~PED_SPRINT~ ~W~to revive ~P~%s", pname);
- BleedOutReviveTD[pRevive[playerid]] = TextDrawCreate(320.000000, 354.000000, tdstring);
- TextDrawAlignment(BleedOutReviveTD[pRevive[playerid]], 2);
- TextDrawBackgroundColor(BleedOutReviveTD[pRevive[playerid]], 255);
- TextDrawFont(BleedOutReviveTD[pRevive[playerid]], 1);
- TextDrawLetterSize(BleedOutReviveTD[pRevive[playerid]], 0.400000, 1.399999);
- TextDrawColor(BleedOutReviveTD[pRevive[playerid]], -1);
- TextDrawSetOutline(BleedOutReviveTD[pRevive[playerid]], 1);
- TextDrawSetProportional(BleedOutReviveTD[pRevive[playerid]], 1);
- pRevive[playerid] = -1;
- }
- return 1;
- }
- forward bleed_out(playerid);
- public bleed_out(playerid)
- {
- BleedOutTime[playerid]--;
- if(BleedOutTime[playerid] == 0)
- {
- SetPlayerHealth(playerid, 0);
- SendClientMessage(playerid, 0xFF0000FF, "* You bled out.");
- KillTimer(BleedOutTimer[playerid]);
- PlayerTextDrawDestroy(playerid, BleedOutTD[playerid]);
- TextDrawDestroy(BleedOutReviveTD[playerid]);
- BleedingPlayerCount--;
- }
- else
- {
- new tdstring[32];
- format(tdstring, sizeof(tdstring), "~N~~R~BLEEDING OUT..~N~%i~N~", BleedOutTime[playerid]);
- PlayerTextDrawSetString(playerid, BleedOutTD[playerid], tdstring);
- SetPlayerChatBubble(playerid, "BLEEDING OUT", 0xFF0000FF, 100, 2000);
- }
- return 1;
- }
- forward revival_progress(playerid, reviveid);
- public revival_progress(playerid, reviveid)
- {
- new Float:x, Float:y, Float:z;
- if(GetPlayerDistanceFromPoint(playerid, x, y, z) < 5)
- {
- SendClientMessage(playerid, 0xFF0000FF, "REVIVE CANCELLED");
- KillTimer(RevivalTimer[reviveid]);
- }
- else
- {
- new Float:pHealth;
- GetPlayerHealth(reviveid, pHealth);
- if(pHealth+REVIVE_HEALTH > 99)
- {
- SetPlayerHealth(reviveid, 100);
- GameTextForPlayer(reviveid, "~G~REVIVED", 3000, 3);
- new string[64], pname[MAX_PLAYER_NAME];
- GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
- format(string, sizeof(string), "Revived by %s", pname);
- SendClientMessage(reviveid, 0x00FF00FF, string);
- GetPlayerName(reviveid, pname, MAX_PLAYER_NAME);
- format(string, sizeof(string), "Revived %s", pname);
- SendClientMessage(playerid, 0x00FF00FF, string);
- KillTimer(BleedOutTimer[reviveid]);
- PlayerTextDrawDestroy(reviveid, BleedOutTD[reviveid]);
- TextDrawDestroy(BleedOutReviveTD[reviveid]);
- BleedingPlayerCount--;
- BleedOutTime[reviveid] = 0;
- ClearAnimations(reviveid);
- KillTimer(RevivalTimer[reviveid]);
- pRevive[playerid] = -1;
- return 1;
- }
- SetPlayerHealth(reviveid, pHealth+REVIVE_HEALTH);
- }
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement