diff --git a/src/client/game_event.qc b/src/client/game_event.qc index c555072..2038bb4 100644 --- a/src/client/game_event.qc +++ b/src/client/game_event.qc @@ -36,7 +36,12 @@ ClientGame_EventParse(float fHeader) vGibPos[0] = readcoord(); vGibPos[1] = readcoord(); vGibPos[2] = readcoord(); - FX_GibHuman(vGibPos); + vector vDir; + vDir[0] = readcoord(); + vDir[1] = readcoord(); + vDir[2] = readcoord(); + float flForce = readfloat(); + FX_GibHuman(vGibPos, vDir, flForce); break; case EV_BLOOD: vector vBloodPos; diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 723783f..bff998e 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -71,7 +71,7 @@ HLMultiplayerRules::PlayerDeath(base_player pl) /* either gib, or make a corpse */ if (pl.health < -50) { - FX_GibHuman(pl.origin); + FX_GibHuman(pl.origin, vectoangles(pl.origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); } else { FX_Corpse_Spawn((player)pl, ANIM_DIESIMPLE); } diff --git a/src/server/gamerules_singleplayer.qc b/src/server/gamerules_singleplayer.qc index 5785277..1fdf6a0 100644 --- a/src/server/gamerules_singleplayer.qc +++ b/src/server/gamerules_singleplayer.qc @@ -31,7 +31,7 @@ HLSingleplayerRules::PlayerDeath(base_player pl) } if (pl.health < -50) { - FX_GibHuman(pl.origin); + FX_GibHuman(pl.origin, vectoangles(pl.origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); } /* Let's handle corpses on the clientside */ diff --git a/src/server/monster_barney_dead.qc b/src/server/monster_barney_dead.qc index 2d8a29a..d4678ed 100644 --- a/src/server/monster_barney_dead.qc +++ b/src/server/monster_barney_dead.qc @@ -37,7 +37,7 @@ void monster_barney_dead::Gib(void) { takedamage = DAMAGE_NO; - FX_GibHuman(this.origin); + FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); Hide(); } diff --git a/src/server/monster_hevsuit_dead.qc b/src/server/monster_hevsuit_dead.qc index bb118be..1bcbe22 100644 --- a/src/server/monster_hevsuit_dead.qc +++ b/src/server/monster_hevsuit_dead.qc @@ -37,7 +37,7 @@ void monster_hevsuit_dead::Gib(void) { takedamage = DAMAGE_NO; - FX_GibHuman(this.origin); + FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); Hide(); } diff --git a/src/server/monster_hgrunt_dead.qc b/src/server/monster_hgrunt_dead.qc index 0020988..bdb38a9 100644 --- a/src/server/monster_hgrunt_dead.qc +++ b/src/server/monster_hgrunt_dead.qc @@ -37,7 +37,7 @@ void monster_hgrunt_dead::Gib(void) { takedamage = DAMAGE_NO; - FX_GibHuman(this.origin); + FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); Hide(); } diff --git a/src/server/monster_scientist_dead.qc b/src/server/monster_scientist_dead.qc index f8658ea..ec38738 100644 --- a/src/server/monster_scientist_dead.qc +++ b/src/server/monster_scientist_dead.qc @@ -48,7 +48,7 @@ void monster_scientist_dead::Gib(void) { takedamage = DAMAGE_NO; - FX_GibHuman(this.origin); + FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); Hide(); } diff --git a/src/server/monster_sitting_scientist.qc b/src/server/monster_sitting_scientist.qc index 9584a7f..d853c89 100644 --- a/src/server/monster_sitting_scientist.qc +++ b/src/server/monster_sitting_scientist.qc @@ -49,7 +49,7 @@ void monster_sitting_scientist::Gib(void) { takedamage = DAMAGE_NO; - FX_GibHuman(this.origin); + FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f); Hide(); } diff --git a/src/shared/fx_gibhuman.qc b/src/shared/fx_gibhuman.qc index aa30799..fff2d34 100644 --- a/src/shared/fx_gibhuman.qc +++ b/src/shared/fx_gibhuman.qc @@ -36,16 +36,20 @@ FX_GibHuman_Init(void) #endif void -FX_GibHuman(vector pos) +FX_GibHuman(vector vecOrigin, vector vecDir, float flForce) { #ifdef SERVER WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_GIBHUMAN); - WriteCoord(MSG_MULTICAST, pos[0]); - WriteCoord(MSG_MULTICAST, pos[1]); - WriteCoord(MSG_MULTICAST, pos[2]); + WriteCoord(MSG_MULTICAST, vecOrigin[0]); + WriteCoord(MSG_MULTICAST, vecOrigin[1]); + WriteCoord(MSG_MULTICAST, vecOrigin[2]); + WriteCoord(MSG_MULTICAST, vecDir[0]); + WriteCoord(MSG_MULTICAST, vecDir[1]); + WriteCoord(MSG_MULTICAST, vecDir[2]); + WriteFloat(MSG_MULTICAST, flForce); msg_entity = __NULL__; - multicast(pos, MULTICAST_PVS); + multicast(vecOrigin, MULTICAST_PVS); #else static void Gib_Remove(void) { remove(self); @@ -64,15 +68,19 @@ FX_GibHuman(vector pos) return; } + + makevectors(vecDir); + vecDir = v_forward; + for (int i = 0; i < 5; i++) { - vector vel; - vel[0] = random(-128,128); - vel[1] = random(-128,128); - vel[2] = (300 + random() * 64); + vector vel = vecDir; + vel += random(-1,1) * v_right; + vel += random(-1,1) * v_up; + vel *= flForce + [0,0,80]; entity gibb = spawn(); setmodel(gibb, g_hgibs[i]); - setorigin(gibb, pos); + setorigin(gibb, vecOrigin); gibb.movetype = MOVETYPE_BOUNCE; gibb.solid = SOLID_BBOX; setsize(gibb, [0,0,0], [0,0,0]); @@ -83,6 +91,6 @@ FX_GibHuman(vector pos) gibb.nextthink = time + 5.0f; gibb.drawmask = MASK_ENGINE; } - pointsound(pos, "common/bodysplat.wav", 1, ATTN_NORM); + pointsound(vecOrigin, "common/bodysplat.wav", 1, ATTN_NORM); #endif }