Code:
/*
* AMXMOD script.
* (plugin_gore.sma)
* by mike_cao <[email protected]>
* This file is provided as is (no warranties).
*
* This plugin adds gore effects. It is configured
* with the cvar "amx_gore" using these flags:
*
* a - Headshot blood
* b - Extra blood effects
* c - Bleeding on low health
* d - Gib explosion (knife, HE, high damage only)
*
*/
#include <amxmodx>
#include <fun>
#define MAX_NAME_LENGTH 32
#define MAX_VAR_LENGTH 64
#define MAX_PLAYERS 32
#define MAX_TEXT_LENGTH 512
#define GORE_HEADSHOT (1<<0) // "a"
#define GORE_BLOOD (1<<1) // "b"
#define GORE_BLEEDING (1<<2) // "c"
#define GORE_GIB (1<<3) // "d"
#define TE_BLOODSPRITE 115
#define TE_BLOODSTREAM 101
#define TE_MODEL 106
#define TE_WORLDDECAL 116
/************************************************************
* MAIN
************************************************************/
new gHealthIndex
[MAX_PLAYERS
+1]
new mod_name
[32]
new blood_small
[7]
new blood_large
[2]
new mdl_gib_flesh
new mdl_gib_head
new mdl_gib_legbone
new mdl_gib_lung
new mdl_gib_meat
new mdl_gib_spine
new spr_blood_drop
new spr_blood_spray
public event_damage
()
{
new iFlags
= get_gore_flags
()
new iVictim
= read_data(0)
gHealthIndex
[iVictim
] = get_user_health(iVictim
)
if (iFlags
&GORE_BLOOD
) {
new iOrigin
[3]
get_user_origin(iVictim,iOrigin
)
fx_blood
(iOrigin
)
fx_blood_small
(iOrigin,
10)
}
return PLUGIN_CONTINUE
}
public event_death
()
{
new iFlags
= get_gore_flags
()
new iOrigin
[3]
new sWeapon
[MAX_NAME_LENGTH
]
new iVictim
= read_data(2)
new iHeadshot
= read_data(3)
read_data(4,sWeapon,MAX_NAME_LENGTH
-1)
if (iFlags
&GORE_HEADSHOT
&& iHeadshot
) {
get_user_origin(iVictim,iOrigin
)
fx_headshot
(iOrigin
)
}
//else if (iFlags&GORE_GIB && (equal(sWeapon,"knife") || equal(sWeapon,"grenade") || (gHealthIndex[iVictim] - get_user_health(iVictim)) > 100)) {
else if (iFlags
&GORE_GIB
&& equal(sWeapon,
"grenade")) {
get_user_origin(iVictim,iOrigin
)
// Effects
fx_trans
(iVictim,
0)
fx_gib_explode
(iOrigin,
5)
fx_blood_large
(iOrigin,
3)
fx_blood_small
(iOrigin,
20)
// Hide body
iOrigin
[2] = iOrigin
[2]-20
set_user_origin
(iVictim,iOrigin
)
}
}
public event_blood
()
{
new iFlags
= get_gore_flags
()
if (iFlags
&GORE_BLEEDING
) {
new iPlayer, iPlayers
[MAX_PLAYERS
], iNumPlayers, iOrigin
[3]
get_players(iPlayers,iNumPlayers,
"a")
for (new i
= 0; i < iNumPlayers; i
++) {
iPlayer
= iPlayers
[i
]
if (get_user_health(iPlayer
) <
20) {
get_user_origin(iPlayer,iOrigin
)
fx_bleed
(iOrigin
)
fx_blood_small
(iOrigin,
5)
}
}
}
}
public event_respawn
(id
)
{
gHealthIndex
[id
] = get_user_health(id
)
return PLUGIN_CONTINUE
}
public get_gore_flags
()
{
new sFlags
[24]
get_cvar_string("amx_gore",sFlags,
24)
return read_flags(sFlags
)
}
/************************************************************
* FX FUNCTIONS
************************************************************/
static fx_trans
(player,amount
)
{
set_user_rendering
(player,kRenderFxNone,
0,
0,
0,kRenderTransAlpha,amount
)
return PLUGIN_CONTINUE
}
public fx_blood
(origin
[3])
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_BLOODSPRITE
)
write_coord(origin
[0]+random_num(-20,
20))
write_coord(origin
[1]+random_num(-20,
20))
write_coord(origin
[2]+random_num(-20,
20))
write_short(spr_blood_spray
)
write_short(spr_blood_drop
)
write_byte(248) // color index
write_byte(10) // size
message_end()
}
public fx_bleed
(origin
[3])
{
// Blood spray
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_BLOODSTREAM
)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2]+10)
write_coord(random_num(-100,
100)) // x
write_coord(random_num(-100,
100)) // y
write_coord(random_num(-10,
10)) // z
write_byte(70) // color
write_byte(random_num(50,
100)) // speed
message_end()
}
static fx_blood_small
(origin
[3],num
)
{
// Blood decals
if(equal(mod_name,
"cstrike"))
blood_small
= {190,
191,
192,
193,
194,
195,
197}
else
blood_small
= {202,
203,
204,
205,
207,
208,
209}
// Small splash
for (new j
= 0; j < num; j
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_WORLDDECAL
)
write_coord(origin
[0]+random_num(-100,
100))
write_coord(origin
[1]+random_num(-100,
100))
write_coord(origin
[2]-36)
write_byte(blood_small
[random_num(0,
6)]) // index
message_end()
}
}
static fx_blood_large
(origin
[3],num
)
{
// Blood decals
if(equali(mod_name,
"cstrike"))
blood_large
= {204,
205}
else
blood_large
= {216,
217}
// Large splash
for (new i
= 0; i < num; i
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_WORLDDECAL
)
write_coord(origin
[0]+random_num(-50,
50))
write_coord(origin
[1]+random_num(-50,
50))
write_coord(origin
[2]-36)
write_byte(blood_large
[random_num(0,
1)]) // index
message_end()
}
}
static fx_gib_explode
(origin
[3],num
)
{
new flesh
[3], x, y, z
flesh
[0] = mdl_gib_flesh
flesh
[1] = mdl_gib_meat
flesh
[2] = mdl_gib_legbone
// Gib explosion
// Head
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_MODEL
)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2])
write_coord(random_num(-100,
100))
write_coord(random_num(-100,
100))
write_coord(random_num(100,
200))
write_angle(random_num(0,
360))
write_short(mdl_gib_head
)
write_byte(0) // bounce
write_byte(500) // life
message_end()
// Spine
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_MODEL
)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2])
write_coord(random_num(-100,
100))
write_coord(random_num(-100,
100))
write_coord(random_num(100,
200))
write_angle(random_num(0,
360))
write_short(mdl_gib_spine
)
write_byte(0) // bounce
write_byte(500) // life
message_end()
// Lung
for(new i
= 0; i <
random_num(1,
2); i
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_MODEL
)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2])
write_coord(random_num(-100,
100))
write_coord(random_num(-100,
100))
write_coord(random_num(100,
200))
write_angle(random_num(0,
360))
write_short(mdl_gib_lung
)
write_byte(0) // bounce
write_byte(500) // life
message_end()
}
// Parts, 5 times
for(new i
= 0; i <
5; i
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_MODEL
)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2])
write_coord(random_num(-100,
100))
write_coord(random_num(-100,
100))
write_coord(random_num(100,
200))
write_angle(random_num(0,
360))
write_short(flesh
[random_num(0,
2)])
write_byte(0) // bounce
write_byte(500) // life
message_end()
}
// Blood
for(new i
= 0; i < num; i
++) {
x
= random_num(-100,
100)
y
= random_num(-100,
100)
z
= random_num(0,
100)
for(new j
= 0; j <
5; j
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(TE_BLOODSPRITE
)
write_coord(origin
[0]+(x
*j
))
write_coord(origin
[1]+(y
*j
))
write_coord(origin
[2]+(z
*j
))
write_short(spr_blood_spray
)
write_short(spr_blood_drop
)
write_byte(248) // color index
write_byte(15) // size
message_end()
}
}
}
public fx_headshot
(origin
[3])
{
// Blood spray, 5 times
for (new i
= 0; i <
5; i
++) {
message_begin(MSG_BROADCAST,SVC_TEMPENTITY
)
write_byte(101)
write_coord(origin
[0])
write_coord(origin
[1])
write_coord(origin
[2]+30)
write_coord(random_num(-20,
20)) // x
write_coord(random_num(-20,
20)) // y
write_coord(random_num(50,
300)) // z
write_byte(70) // color
write_byte(random_num(100,
200)) // speed
message_end()
}
}
/************************************************************
* PLUGIN FUNCTIONS
************************************************************/
public plugin_precache
()
{
spr_blood_drop
= precache_model("sprites/blood.spr")
spr_blood_spray
= precache_model("sprites/bloodspray.spr")
mdl_gib_flesh
= precache_model("models/Fleshgibs.mdl")
mdl_gib_head
= precache_model("models/GIB_Skull.mdl")
mdl_gib_legbone
= precache_model("models/GIB_Legbone.mdl")
mdl_gib_lung
= precache_model("models/GIB_Lung.mdl")
mdl_gib_meat
= precache_model("models/GIB_B_Gib.mdl")
mdl_gib_spine
= precache_model("models/GIB_B_Bone.mdl")
}
public plugin_init
()
{
register_plugin("Plugin Gore",
"1.0",
"mike_cao")
register_event("DeathMsg",
"event_death",
"a")
register_event("Damage",
"event_damage",
"b",
"2!0",
"3=0",
"4!0")
register_event("ResetHUD",
"event_respawn",
"be",
"1=1")
register_cvar("amx_gore",
"ad")
set_task(1.0,
"event_blood",
0,
"",
0,
"b")
get_modname(mod_name,
31)
if( !( (equali(mod_name,
"cstrike")) ||
(equali(mod_name,
"czero")) ) )
pause("ae")
return PLUGIN_CONTINUE
}
It's the original gore plugin and I modified it a bit (only grenades make the gibbing gore effect, see event_death) but it has a strange bug, that if more than 1 players die from the grenade, it doesn't do the gore effect on neither of them (the bodies just disappear, no gore effect).