Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* bleed.pwn
- *
- * (c) Copyright 2016, Emilijo "Correlli" Lovrich
- *
- * Credits: - Incognito for streamer plugin,
- * - Y_Less for foreach/iterator and GetXYInFrontOfPlayer,
- * - ZeeX for ZCMD command processor.
- */
- #include "a_samp"
- #include "foreach"
- #include "streamer"
- #include "zcmd"
- #define MAX_PLAYER_BLEEDS (3)
- #define PLAYER_BLEEDING_RANGE (1.5)
- enum DataPlayer
- {
- Bleeding,
- BleedObject[MAX_PLAYER_BLEEDS]
- }
- new
- PlayerData[MAX_PLAYERS][DataPlayer], g_Timer;
- command(bstart, playerid, params[])
- {
- SetPlayerBleeding(playerid, strval(params));
- return true;
- }
- command(bstop, playerid, params[])
- {
- StopPlayerBleeding(playerid);
- return true;
- }
- forward Bleed_MainTimer();
- public Bleed_MainTimer()
- {
- foreach(Player, u)
- {
- if(GetPlayerState(u) == PLAYER_STATE_ONFOOT)
- {
- if(IsPlayerBleeding(u))
- UpdatePlayerBleeds(u);
- }
- }
- return true;
- }
- stock SetPlayerBleeding(playerid, bleeds = MAX_PLAYER_BLEEDS)
- {
- if(IsPlayerBleeding(playerid))
- return false;
- if(bleeds < 1) bleeds = 1;
- if(bleeds > MAX_PLAYER_BLEEDS) bleeds = MAX_PLAYER_BLEEDS;
- PlayerData[playerid][Bleeding] = bleeds;
- new
- Float:pos[3];
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- for(new a = 0; a < bleeds; a++)
- {
- GetXYInFrontOfPlayer(playerid, pos[0], pos[1], -(PLAYER_BLEEDING_RANGE * a));
- PlayerData[playerid][BleedObject][a] = CreateDynamicObject(
- 19836,
- pos[0],
- pos[1],
- (pos[2] - 0.99),
- 0.0,
- 0.0,
- 0.0,
- GetPlayerVirtualWorld(playerid),
- GetPlayerInterior(playerid),
- -1,
- 50.0
- );
- }
- return true;
- }
- stock UpdatePlayerBleeds(playerid)
- {
- if(IsPlayerFalling(playerid) || IsPlayerJumping(playerid) || IsPlayerInWater(playerid))
- return false;
- new
- Float:pos[3];
- GetDynamicObjectPos(PlayerData[playerid][BleedObject][0], pos[0], pos[1], pos[2]);
- if(!IsPlayerInRangeOfPoint(playerid, PLAYER_BLEEDING_RANGE, pos[0], pos[1], (pos[2] + 0.99)))
- {
- new
- a = (PlayerData[playerid][Bleeding] - 1);
- while(a >= 0)
- {
- if((a - 1) == -1)
- {
- GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
- pos[2] -= 0.99;
- }
- else
- GetDynamicObjectPos(PlayerData[playerid][BleedObject][a - 1], pos[0], pos[1], pos[2]);
- SetDynamicObjectPos(PlayerData[playerid][BleedObject][a], pos[0], pos[1], pos[2]);
- if(GetPlayerInterior(playerid) != Streamer_GetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_INTERIOR_ID))
- Streamer_SetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_INTERIOR_ID, GetPlayerInterior(playerid));
- if(GetPlayerVirtualWorld(playerid) != Streamer_GetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_WORLD_ID))
- Streamer_SetIntData(STREAMER_TYPE_OBJECT, PlayerData[playerid][BleedObject][a], E_STREAMER_WORLD_ID, GetPlayerVirtualWorld(playerid));
- a--;
- }
- }
- return true;
- }
- stock StopPlayerBleeding(playerid)
- {
- if(!IsPlayerBleeding(playerid))
- return false;
- for(new a = 0; a < PlayerData[playerid][Bleeding]; a++)
- {
- if(IsValidDynamicObject(PlayerData[playerid][BleedObject][a]))
- {
- DestroyDynamicObject(PlayerData[playerid][BleedObject][a]);
- PlayerData[playerid][BleedObject][a] = INVALID_OBJECT_ID;
- }
- }
- PlayerData[playerid][Bleeding] = 0;
- return true;
- }
- stock IsPlayerBleeding(playerid)
- return PlayerData[playerid][Bleeding];
- stock GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
- {
- new
- Float:angle;
- GetPlayerPos(playerid, x, y, angle);
- GetPlayerFacingAngle(playerid, angle);
- if(GetPlayerVehicleID(playerid))
- GetVehicleZAngle(GetPlayerVehicleID(playerid), angle);
- x += (distance * floatsin(-angle, degrees));
- y += (distance * floatcos(-angle, degrees));
- }
- stock IsPlayerFalling(playerid)
- {
- new
- animation[32];
- GetAnimationName(
- GetPlayerAnimationIndex(playerid),
- animation,
- 0,
- animation,
- 32
- );
- if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT
- && (!strcmp(animation, "FALL_FALL", true) || !strcmp(animation, "FALL_GLIDE", true)))
- return true;
- return false;
- }
- stock IsPlayerJumping(playerid)
- {
- new
- animation[32];
- GetAnimationName(
- GetPlayerAnimationIndex(playerid),
- animation,
- 0,
- animation,
- 32
- );
- if(GetPlayerState(playerid) == PLAYER_STATE_ONFOOT
- && (!strcmp(animation, "JUMP_LAUNCH", true) || !strcmp(animation, "JUMP_GLIDE", true)))
- return true;
- return false;
- }
- stock IsPlayerInWater(playerid)
- {
- if(GetPlayerInterior(playerid) || GetPlayerVirtualWorld(playerid))
- return false;
- new
- Float:pos;
- GetPlayerPos(playerid, pos, pos, pos);
- if(!(pos < 1.0))
- return false;
- return true;
- }
- public OnFilterScriptInit()
- {
- g_Timer = SetTimer("Bleed_MainTimer", 1000, true);
- foreach(Player, u)
- {
- for(new a = 0; a < MAX_PLAYER_BLEEDS; a++)
- PlayerData[u][BleedObject][a] = INVALID_OBJECT_ID;
- }
- return true;
- }
- public OnFilterScriptExit()
- {
- KillTimer(g_Timer);
- foreach(Player, u)
- {
- if(IsPlayerBleeding(u))
- StopPlayerBleeding(u);
- }
- return true;
- }
- public OnPlayerConnect(playerid)
- {
- for(new a = 0; a < MAX_PLAYER_BLEEDS; a++)
- PlayerData[playerid][BleedObject][a] = INVALID_OBJECT_ID;
- return true;
- }
- public OnPlayerDisconnect(playerid, reason)
- {
- if(IsPlayerBleeding(playerid))
- StopPlayerBleeding(playerid);
- return true;
- }
- public OnPlayerDeath(playerid, killerid, reason)
- {
- if(IsPlayerBleeding(playerid))
- StopPlayerBleeding(playerid);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement