Yank out the monster's out of the codebase. Use entityDefs instead.

This commit is contained in:
Marco Cawthorne 2023-06-20 21:23:15 -07:00
parent 67d2f03a26
commit dde42e481c
Signed by: eukara
GPG key ID: CE2032F0A2882A22
55 changed files with 1150 additions and 1010 deletions

View file

@ -46,6 +46,18 @@ ClientGame_EventParse(float fHeader)
float flForce = readfloat(); float flForce = readfloat();
FX_GibHuman(vGibPos, vDir, flForce); FX_GibHuman(vGibPos, vDir, flForce);
break; break;
case EV_GIBALIEN:
vector vGibPos2;
vGibPos[0] = readcoord();
vGibPos[1] = readcoord();
vGibPos[2] = readcoord();
vector vDir2;
vDir[0] = readcoord();
vDir[1] = readcoord();
vDir[2] = readcoord();
float flForce2 = readfloat();
FX_GibAlien(vGibPos2, vDir2, flForce2);
break;
case EV_BLOOD: case EV_BLOOD:
vector vBloodPos; vector vBloodPos;
vector vBloodColor; vector vBloodColor;

View file

@ -455,6 +455,18 @@ HUD_DrawDamageIndicator(void)
pSeatLocal->m_flDamageIndicator -= clframetime; pSeatLocal->m_flDamageIndicator -= clframetime;
} }
void
HUD_TimeRemaining(void)
{
vector iconPos = g_hudmins + [16, g_hudres[1] - 64];
/* display time if timelimit is being hit */
if (serverkeyfloat("timelimit")) {
string tempstr = strcat("Time Remaining: ", Util_GetTime());
Font_DrawText_RGB(iconPos, tempstr, g_hud_color, FONT_20);
}
}
/* main entry */ /* main entry */
void void
HUD_Draw(void) HUD_Draw(void)
@ -462,7 +474,16 @@ HUD_Draw(void)
player pl = (player)pSeat->m_ePlayer; player pl = (player)pSeat->m_ePlayer;
#ifndef TFC #ifndef TFC
#ifndef GEARBOX
g_hud_color = autocvar_con_color * (1 / 255); g_hud_color = autocvar_con_color * (1 / 255);
#else
if (getplayerkeyfloat(pl.entnum-1, "*team") == 1)
g_hud_color = [255, 150, 0] / 255;
else if (getplayerkeyfloat(pl.entnum-1, "*team") == 2)
g_hud_color = [0, 1, 0];
else
g_hud_color = autocvar_con_color * (1 / 255);
#endif
#endif #endif
/* little point in not drawing these, even if you don't have a suit */ /* little point in not drawing these, even if you don't have a suit */
@ -472,6 +493,8 @@ HUD_Draw(void)
Obituary_Draw(); Obituary_Draw();
Textmenu_Draw(); Textmenu_Draw();
HUD_TimeRemaining();
if (!(pl.g_items & ITEM_SUIT)) { if (!(pl.g_items & ITEM_SUIT)) {
return; return;
} }

136
src/client/hud_sprite.qc Normal file
View file

@ -0,0 +1,136 @@
/*
* Copyright (c) 2023 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
typedef struct
{
string m_strImage;
vector m_vecSize;
vector m_vecCanvasSize;
vector m_vecCanvasPos;
} hlsprite_t;
hlsprite_t *g_hlsprites;
var hashtable g_hashhlsprite;
void
HLSprite_Init(void)
{
filestream hudFile;
vector imgSize;
int spriteCount = 0i;
int i = 0i;
string line;
hudFile = fopen("sprites/hud.txt", FILE_READ);
if (hudFile < 0) {
error("hud.txt was not found.");
return;
}
/* count valid entries */
while ((line = fgets(hudFile))) {
int c = tokenize_console(line);
if (c != 7)
continue;
if (argv(1) != "640")
continue;
spriteCount++;
}
/* if we couldn't find anything, don't bother */
if (spriteCount <= 0i)
return;
/* allocate our hashtable */
if (!g_hashhlsprite) {
g_hashhlsprite = hash_createtab(2, HASH_ADD);
}
/* to the beginning we go. */
fseek(hudFile, 0);
/* allocate valid entries */
g_hlsprites = memalloc(sizeof(hlsprite_t) * spriteCount);
/* read the data into our banks */
while ((line = fgets(hudFile))) {
int c = tokenize_console(line);
if (c != 7)
continue;
if (argv(1) != "640")
continue;
g_hlsprites[i].m_strImage = spriteframe(sprintf("sprites/%s.spr", argv(2)), 0, 0.0f);
g_hlsprites[i].m_vecSize[0] = stof(argv(5));
g_hlsprites[i].m_vecSize[1] = stof(argv(6));
imgSize = drawgetimagesize(g_hlsprites[i].m_strImage);
g_hlsprites[i].m_vecCanvasPos[0] = stof(argv(3)) / imgSize[0];
g_hlsprites[i].m_vecCanvasPos[1] = stof(argv(4)) / imgSize[1];
g_hlsprites[i].m_vecCanvasSize[0] = g_hlsprites[i].m_vecSize[0] / imgSize[0];
g_hlsprites[i].m_vecCanvasSize[1] = g_hlsprites[i].m_vecSize[1] / imgSize[1];
hash_add(g_hashhlsprite, argv(0), (int)i);
i++;
}
print(sprintf("initialized %i HL sprites.\n", spriteCount));
}
void
HLSprite_Draw_RGBA(string spriteName, vector spritePos, vector spriteColor, float spriteAlpha, bool isAdditive)
{
int spriteNum = -1i;
spriteNum = (int)hash_get(g_hashhlsprite, spriteName, -1i);
if (spriteNum == -1i) {
print(sprintf("cannot draw sprite %S!\n", spriteName));
return;
}
drawsubpic(
spritePos,
g_hlsprites[spriteNum].m_vecSize,
g_hlsprites[spriteNum].m_strImage,
g_hlsprites[spriteNum].m_vecCanvasPos,
g_hlsprites[spriteNum].m_vecCanvasSize,
spriteColor,
spriteAlpha,
isAdditive ? DRAWFLAG_ADDITIVE : 0
);
}
void
HLSprite_Draw(string spriteName, vector spritePos, bool isAdditive)
{
HLSprite_Draw_RGBA(spriteName, spritePos, [1,1,1], 1.0f, isAdditive);
}
void
HLSprite_Draw_A(string spriteName, vector spritePos, float spriteAlpha, bool isAdditive)
{
HLSprite_Draw_RGBA(spriteName, spritePos, [1,1,1], spriteAlpha, isAdditive);
}
void
HLSprite_Draw_RGB(string spriteName, vector spritePos, vector spriteColor, bool isAdditive)
{
HLSprite_Draw_RGBA(spriteName, spritePos, spriteColor, 1.0f, isAdditive);
}

View file

@ -53,6 +53,7 @@ ClientGame_RendererRestart(string rstr)
FX_Blood_Init(); FX_Blood_Init();
FX_BreakModel_Init(); FX_BreakModel_Init();
FX_Explosion_Init(); FX_Explosion_Init();
FX_GibAlien_Init();
FX_GibHuman_Init(); FX_GibHuman_Init();
FX_Spark_Init(); FX_Spark_Init();
FX_Impact_Init(); FX_Impact_Init();

View file

@ -31,6 +31,7 @@ game_event.qc
../../../valve/src/client/viewmodel.qc ../../../valve/src/client/viewmodel.qc
view.qc view.qc
obituary.qc obituary.qc
hud_sprite.qc
hud_itemnotify.qc hud_itemnotify.qc
hud_dmgnotify.qc hud_dmgnotify.qc
hud_ammonotify.qc hud_ammonotify.qc

View file

@ -19,11 +19,13 @@
var int autocvar_cl_centerscores = FALSE; var int autocvar_cl_centerscores = FALSE;
var int g_scores_teamplay = 0; var int g_scores_teamplay = 0;
var bool g_scores_scorepoints = false;
void void
Scores_Init(void) Scores_Init(void)
{ {
g_scores_teamplay = (int)serverkeyfloat("teamplay"); g_scores_teamplay = (int)serverkeyfloat("teamplay");
g_scores_scorepoints = (bool)serverkeyfloat("scorepoints");
} }
void void
@ -33,7 +35,12 @@ Scores_DrawTeam(player pl, vector pos)
drawfont = Font_GetID(FONT_20); drawfont = Font_GetID(FONT_20);
drawstring(pos + [0,-18], "Teams", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE); drawstring(pos + [0,-18], "Teams", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
drawstring(pos + [124,-18], "kills / deaths", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
if (g_scores_scorepoints)
drawstring(pos + [124-32,-18], "kills / deaths / score", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
else
drawstring(pos + [124,-18], "kills / deaths", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
drawstring(pos + [240,-18], "latency", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE); drawstring(pos + [240,-18], "latency", [20,20], SCORE_HEADER_C, 1.0f, DRAWFLAG_ADDITIVE);
pos[1] += 12; pos[1] += 12;
@ -63,34 +70,61 @@ Scores_DrawTeam(player pl, vector pos)
} }
drawstring(pos + [24,0], getplayerkeyvalue(i, "name"), [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE); drawstring(pos + [24,0], getplayerkeyvalue(i, "name"), [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
drawstring(pos + [154,0], "/", [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Get the kills and align them left to right */ if (g_scores_scorepoints) {
temp = getplayerkeyvalue(i, "frags"); drawstring(pos + [154-32,0], "/", [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
l = stringwidth(temp, FALSE, [20,20]);
drawstring(pos + [150 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Deaths are right to left aligned */ /* Get the kills and align them left to right */
temp = getplayerkeyvalue(i, "*deaths"); temp = getplayerkeyvalue(i, "frags");
drawstring(pos + [165,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE); l = stringwidth(temp, FALSE, [20,20]);
drawstring(pos + [150 - 32 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
drawstring(pos + [154+26,0], "/", [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Deaths are right to left aligned */
temp = getplayerkeyvalue(i, "*deaths");
if (!temp) temp = "0";
l = stringwidth(temp, FALSE, [20,20]);
drawstring(pos + [165 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Deaths are right to left aligned */
temp = getplayerkeyvalue(i, "*score");
if (!temp) temp = "0";
drawstring(pos + [165+32,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
} else {
drawstring(pos + [154,0], "/", [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Get the kills and align them left to right */
temp = getplayerkeyvalue(i, "frags");
l = stringwidth(temp, FALSE, [20,20]);
drawstring(pos + [150 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
/* Deaths are right to left aligned */
temp = getplayerkeyvalue(i, "*deaths");
drawstring(pos + [165,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
}
vector tmpColor;
temp = getplayerkeyvalue(i, "*icon1");
if (temp) {
tmpColor[0] = getplayerkeyfloat(i, "*icon1_r");
tmpColor[1] = getplayerkeyfloat(i, "*icon1_g");
tmpColor[2] = getplayerkeyfloat(i, "*icon1_b");
HLSprite_Draw_RGB(temp, pos - [8, 0], tmpColor, true);
}
temp = getplayerkeyvalue(i, "*icon2");
if (temp) {
tmpColor[0] = getplayerkeyfloat(i, "*icon2_r");
tmpColor[1] = getplayerkeyfloat(i, "*icon2_g");
tmpColor[2] = getplayerkeyfloat(i, "*icon2_b");
HLSprite_Draw_RGB(temp, pos + [8, 0], tmpColor, true);
}
/* Get the latency and align it left to right */ /* Get the latency and align it left to right */
temp = getplayerkeyvalue(i, "ping"); temp = getplayerkeyvalue(i, "ping");
l = stringwidth(temp, FALSE, [20,20]); l = stringwidth(temp, FALSE, [20,20]);
if (getplayerkeyfloat(i, "*dead") == 1) {
drawsubpic(
pos - [8,0],
[32,16],
g_hud1_spr,
[224/256, 240/256],
[32/256, 16/256],
[1,0,0],
1.0f,
DRAWFLAG_ADDITIVE
);
}
drawstring(pos + [290 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE); drawstring(pos + [290 - l,0], temp, [20,20], [1,1,1], 1.0f, DRAWFLAG_ADDITIVE);
pos[1] += 20; pos[1] += 20;
} }

View file

@ -44,6 +44,8 @@ void
HLMultiplayerRules::InitPostEnts(void) HLMultiplayerRules::InitPostEnts(void)
{ {
MOTD_LoadDefault(); MOTD_LoadDefault();
forceinfokey(world, "scorepoints", "0");
if (IsTeamplay() == true) { if (IsTeamplay() == true) {
int c; int c;

View file

@ -45,24 +45,22 @@ enum
CON_DIE CON_DIE
}; };
class monster_alien_controller:NSMonster class monster_alien_controller:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;
float m_flPainTime; float m_flPainTime;
void(void) monster_alien_controller; void(void) monster_alien_controller;
virtual void(void) Pain; virtual void(void) HasBeenHit;
virtual void(void) Death; virtual void(void) HasBeenKilled;
virtual void(void) IdleNoise; virtual void(void) IdleNoise;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void void
monster_alien_controller::Pain(void) monster_alien_controller::HasBeenHit(void)
{ {
super::Pain();
if (m_flPainTime > time) { if (m_flPainTime > time) {
return; return;
} }
@ -77,16 +75,11 @@ monster_alien_controller::Pain(void)
} }
void void
monster_alien_controller::Death(void) monster_alien_controller::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */ /* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) { SetFrame(CON_DIE);
SetFrame(CON_DIE); Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die");
Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die");
}
/* set the functional differences */
super::Death();
} }
void void
@ -124,4 +117,5 @@ monster_alien_controller::monster_alien_controller(void)
model = "models/controller.mdl"; model = "models/controller.mdl";
base_mins = [-16,-16,0]; base_mins = [-16,-16,0];
base_maxs = [16,16,72]; base_maxs = [16,16,72];
m_iAlliance = MAL_ALIEN;
} }

View file

@ -58,24 +58,22 @@ enum
AG_LAND AG_LAND
}; };
class monster_alien_grunt:NSMonster class monster_alien_grunt:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;
float m_flPainTime; float m_flPainTime;
void(void) monster_alien_grunt; void(void) monster_alien_grunt;
virtual void(void) Pain; virtual void(void) HasBeenHit;
virtual void(void) Death; virtual void(void) HasBeenKilled;
virtual void(void) IdleNoise; virtual void(void) IdleNoise;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
void void
monster_alien_grunt::Pain(void) monster_alien_grunt::HasBeenHit(void)
{ {
super::Pain();
if (m_flPainTime > time) { if (m_flPainTime > time) {
return; return;
} }
@ -90,26 +88,21 @@ monster_alien_grunt::Pain(void)
} }
void void
monster_alien_grunt::Death(void) monster_alien_grunt::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
/* headshots == different animation */
if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) {
SetFrame(AG_DIEHS);
} else {
SetFrame(AG_DIEFORWARD);
}
} else {
SetFrame(AG_DIE + floor(random(0, 2)));
}
Sound_Play(this, CHAN_VOICE, "monster_alien_grunt.die"); /* headshots == different animation */
if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) {
SetFrame(AG_DIEHS);
} else {
SetFrame(AG_DIEFORWARD);
}
} else {
SetFrame(AG_DIE + floor(random(0, 2)));
} }
/* set the functional differences */ Sound_Play(this, CHAN_VOICE, "monster_alien_grunt.die");
super::Death();
} }
void void
@ -149,4 +142,5 @@ monster_alien_grunt::monster_alien_grunt(void)
base_mins = [-32,-32,0]; base_mins = [-32,-32,0];
base_maxs = [32,32,64]; base_maxs = [32,32,64];
base_health = Skill_GetValue("agrunt_health", 90); base_health = Skill_GetValue("agrunt_health", 90);
m_iAlliance = MAL_ALIEN;
} }

View file

@ -56,15 +56,15 @@ enum
SLV_JABBER SLV_JABBER
}; };
class monster_alien_slave:NSTalkMonster class monster_alien_slave:HLXenTalkMonster
{ {
float m_flIdleTime; float m_flIdleTime;
float m_flPainTime; float m_flPainTime;
void(void) monster_alien_slave; void(void) monster_alien_slave;
virtual void(void) Death; virtual void(void) HasBeenKilled;
virtual void(void) Pain; virtual void(void) HasBeenHit;
virtual void(void) IdleChat; virtual void(void) IdleChat;
virtual void(void) Respawn; virtual void(void) Respawn;
@ -167,10 +167,8 @@ monster_alien_slave::IdleChat(void)
} }
void void
monster_alien_slave::Pain(void) monster_alien_slave::HasBeenHit(void)
{ {
super::Pain();
if (m_flPainTime > time) { if (m_flPainTime > time) {
return; return;
} }
@ -185,10 +183,8 @@ monster_alien_slave::Pain(void)
} }
void void
monster_alien_slave::Death(void) monster_alien_slave::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
/* headshots == different animation */ /* headshots == different animation */
if (g_dmg_iHitBody == BODY_HEAD) { if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) { if (random() < 0.5) {
@ -201,10 +197,7 @@ monster_alien_slave::Death(void)
} }
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.die"); Sound_Play(this, CHAN_VOICE, "monster_alien_slave.die");
}
/* set the functional differences */
super::Death();
} }
void void
@ -227,7 +220,7 @@ monster_alien_slave::monster_alien_slave(void)
m_talkAnswer = ""; m_talkAnswer = "";
m_talkAsk = ""; m_talkAsk = "";
m_talkAllyShot = ""; m_talkAllyShot = "";
m_talkGreet = "SLV_ALERT"; m_talkGreet = "!SLV_ALERT";
m_talkIdle = "!SLV_IDLE"; m_talkIdle = "!SLV_IDLE";
m_talkSmelling = ""; m_talkSmelling = "";
m_talkStare = ""; m_talkStare = "";

View file

@ -37,7 +37,8 @@ class monster_barnacle:NSMonster
{ {
void(void) monster_barnacle; void(void) monster_barnacle;
virtual void(void) Death; /* overrides */
virtual void(void) HasBeenKilled;
virtual void(void) Respawn; virtual void(void) Respawn;
virtual void(void) Physics; virtual void(void) Physics;
}; };
@ -49,16 +50,10 @@ monster_barnacle::Physics(void)
} }
void void
monster_barnacle::Death(void) monster_barnacle::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */ SetFrame(BCL_DIE);
if (IsAlive() == true) { StartSoundDef("monster_barnacle.die", CHAN_VOICE, true);
SetFrame(BCL_DIE);
Sound_Play(this, CHAN_VOICE, "monster_barnacle.die");
}
/* set the functional differences */
super::Death();
} }
void void

View file

@ -44,6 +44,7 @@ enum
BA_FLINCH_SML BA_FLINCH_SML
}; };
#if 0
class monster_barney:NSTalkMonster class monster_barney:NSTalkMonster
{ {
void(void) monster_barney; void(void) monster_barney;
@ -232,4 +233,5 @@ monster_barney::Spawned(void)
void void
monster_barney::monster_barney(void) monster_barney::monster_barney(void)
{ {
} }
#endif

View file

@ -46,7 +46,7 @@ enum
GON_FALLDIE GON_FALLDIE
}; };
class monster_bigmomma:NSMonster class monster_bigmomma:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;

View file

@ -22,7 +22,7 @@ Flocking Floater
*/ */
class monster_bloater:NSMonster class monster_bloater:HLXenMonster
{ {
void(void) monster_bloater; void(void) monster_bloater;
}; };

View file

@ -54,7 +54,7 @@ enum
* for close range attacks * for close range attacks
*/ */
class monster_bullchicken:NSMonster class monster_bullchicken:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;

View file

@ -22,7 +22,7 @@ Boid
*/ */
class monster_flyer_flock:NSMonster class monster_flyer_flock:HLXenMonster
{ {
void(void) monster_flyer_flock; void(void) monster_flyer_flock;
}; };

View file

@ -48,15 +48,15 @@ enum
GARG_BUST GARG_BUST
}; };
class monster_gargantua:NSMonster class monster_gargantua:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;
void(void) monster_gargantua; void(void) monster_gargantua;
virtual void(void) Spawned; virtual void(void) Spawned;
virtual void(void) Death; virtual void(void) HasBeenKilled;
virtual void(void) Pain; virtual void(void) HasBeenHit;
virtual void(void) IdleNoise; virtual void(void) IdleNoise;
virtual void(void) Respawn; virtual void(void) Respawn;
}; };
@ -79,10 +79,8 @@ monster_gargantua::IdleNoise(void)
} }
void void
monster_gargantua::Pain(void) monster_gargantua::HasBeenHit(void)
{ {
super::Pain();
if (m_flAnimTime > time) { if (m_flAnimTime > time) {
return; return;
} }
@ -97,16 +95,10 @@ monster_gargantua::Pain(void)
} }
void void
monster_gargantua::Death(void) monster_gargantua::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */ SetFrame(GARG_DIE);
if (IsAlive() == true) { Sound_Play(this, CHAN_VOICE, "monster_gargantua.die");
SetFrame(GARG_DIE);
Sound_Play(this, CHAN_VOICE, "monster_gargantua.die");
}
/* set the functional differences */
super::Death();
} }
void void

View file

@ -47,43 +47,30 @@ enum
HC_STRUGGLE HC_STRUGGLE
}; };
class monster_headcrab:NSMonster class monster_headcrab:HLXenMonster
{ {
bool m_bBiting;
float m_flIdleTime; float m_flIdleTime;
void(void) monster_headcrab; void monster_headcrab(void);
virtual void(void) Spawned; virtual void Spawned(void);
virtual void(void) Pain; virtual void HasBeenHit(void);
virtual void(void) Death; virtual void HasBeenKilled(void);
virtual void(void) IdleNoise; virtual void IdleNoise(void);
virtual int(void) AnimIdle; virtual int AttackMelee(void);
virtual int(void) AnimWalk; virtual void Touch(entity);
virtual int(void) AnimRun; virtual float MeleeMaxDistance(void);
virtual int(void) AttackRanged;
virtual void(entity) Touch;
}; };
int float
monster_headcrab::AnimIdle(void) monster_headcrab:: MeleeMaxDistance(void)
{ {
return HC_IDLE1; return 256;
} }
int int
monster_headcrab::AnimWalk(void) monster_headcrab::AttackMelee(void)
{
return HC_WALK;
}
int
monster_headcrab::AnimRun(void)
{
return HC_RUN;
}
int
monster_headcrab::AttackRanged(void)
{ {
/* visual */ /* visual */
if (random() < 0.5) if (random() < 0.5)
@ -91,28 +78,33 @@ monster_headcrab::AttackRanged(void)
else else
AnimPlay(HC_JUMP_VARIATION1); AnimPlay(HC_JUMP_VARIATION1);
m_flAttackThink = m_flAnimTime; m_flAttackThink = m_flAnimTime + 0.25;
Sound_Play(this, CHAN_VOICE, "monster_headcrab.attack"); Sound_Play(this, CHAN_VOICE, "monster_headcrab.attack");
/* functional */ /* functional */
vector jumpVelocity;
makevectors(vectoangles(m_eEnemy.origin - origin)); makevectors(vectoangles(m_eEnemy.origin - origin));
velocity = v_forward * 512 + [0,0,250]; jumpVelocity = (v_forward * 512) + [0, 0, 250];
SetVelocity(jumpVelocity);
m_bBiting = true;
return (1); return (1);
} }
void void
monster_headcrab::Touch(entity eToucher) monster_headcrab::Touch(entity eToucher)
{ {
if (m_bBiting)
if (eToucher.takedamage == DAMAGE_YES) if (eToucher.takedamage == DAMAGE_YES)
if (frame == HC_JUMP || frame == HC_JUMP_VARIATION1) if (frame == HC_JUMP || frame == HC_JUMP_VARIATION1) {
Damage_Apply(eToucher, this, 500, 0, 0); Damage_Apply(eToucher, this, Skill_GetValue("headcrab_dmg_bite", 10), 0, 0);
StartSoundDef("monster_headcrab.attackhit", CHAN_VOICE, true);
m_bBiting = false;
}
} }
void void
monster_headcrab::Pain(void) monster_headcrab::HasBeenHit(void)
{ {
super::Pain();
if (m_flAnimTime > time) { if (m_flAnimTime > time) {
return; return;
} }
@ -127,16 +119,10 @@ monster_headcrab::Pain(void)
} }
void void
monster_headcrab::Death(void) monster_headcrab::HasBeenKilled(void)
{ {
/* if we're already dead (corpse) don't change animations */ SetFrame(HC_DIE);
if (IsAlive() == true) { Sound_Play(this, CHAN_VOICE, "monster_headcrab.die");
SetFrame(HC_DIE);
Sound_Play(this, CHAN_VOICE, "monster_headcrab.die");
}
/* set the functional differences */
super::Death();
} }
void void
@ -152,7 +138,7 @@ monster_headcrab::IdleNoise(void)
} }
m_flIdleTime = time + random(2,10); m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_headcrab.idle"); StartSoundDef("monster_headcrab.idle", CHAN_VOICE, true);
} }
void void

View file

@ -59,7 +59,7 @@ enum
HE_JUMPWINDOW HE_JUMPWINDOW
}; };
class monster_houndeye:NSMonster class monster_houndeye:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;

View file

@ -1,334 +0,0 @@
/*
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*QUAKED monster_human_grunt (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
HECU - Human Grunt
*/
enum
{
GR_WALK,
GR_RUN,
GR_VICTORYDANCE,
GR_COWER,
GR_FLINCH,
GR_LEFTLEGFLINCH,
GR_RIGHTLEGFLINCH,
GR_RIGHTARMFLINCH,
GR_LEFTARMFLINCH,
GR_LAUNCHNADE,
GR_THROWNADE,
GR_IDLE,
GR_IDLE2,
GR_COMBATIDLE,
GR_FRONTKICK,
GR_CROUCHIDLE,
GR_CROUCHWAIT,
GR_CROUCHSHOOTMP5,
GR_STANDSHOOTMP5,
GR_RELOADMP5,
GR_CROUCHSHOOTSG,
GR_STANDSHOOTSG,
GR_RELOADSG,
GR_SIGNALADV,
GR_SIGNALFLANK,
GR_SIGNALRETREAT,
GR_DROPNADE,
GR_LIMPWALK,
GR_LIMPRUN,
GR_TURNLEFT,
GR_TURNRIGHT,
GR_STRAFELEFT,
GR_STRAFERIGHT,
GR_DIEBACK,
GR_DIEFORWARD,
GR_DIE,
GR_DIEBACK2,
GR_DIEHS,
GR_DIEGUT,
GR_BARNACLE1,
GR_BARNACLE2,
GR_BARNACLE3,
GR_BARNACLE4,
GR_DEADSTOMACH,
GR_DEADSTOMACH2,
GR_DEADSIDE,
GR_DEADSITTING,
GR_REPELJUMP,
GR_REPEL,
GR_REPELSHOOT,
GR_REPELLAND,
GR_REPELDIE,
GR_DRAGHOLEIDLE,
GR_DRAGHOLE,
GR_BUSTWALL,
GR_HOPRAIL,
GR_CONVERSE1,
GR_CONVERSE2,
GR_STARTLELEFT,
GR_STRRTLERIGHT,
GR_DIVE,
GR_DEFUSE,
GR_CORNER1,
GR_CORNER2,
GR_STONETOSS,
GR_CLIFFDIE,
GR_DIVESIDEIDLE,
GR_DIVESIDE,
GR_DIVEKNEELIDLE,
GR_DIVEKNEEL,
GR_WMBUTTON,
GR_WM,
GR_WMJUMP,
GR_BUSTWINDOW,
GR_DRAGLEFT,
GR_DRAGRIGHT,
GR_TRACKWAVE,
GR_TRACKDIVE,
GR_FLYBACK,
GR_IMPALED,
GR_JUMPTRACKS,
GR_THROWPIPE,
GR_PLUNGER
};
class monster_human_grunt:NSTalkMonster
{
float m_flIdleTime;
int m_iMP5Burst;
float m_flAlertNoiseTime;
void monster_human_grunt(void);
virtual void Scream(void);
virtual void IdleChat(void);
virtual void Respawn(void);
virtual void Spawned(void);
virtual void Pain(void);
virtual void Death(void);
virtual int AnimIdle(void);
virtual int AnimWalk(void);
virtual int AnimRun(void);
virtual int AttackRanged(void);
virtual int AttackMelee(void);
virtual void AttackKick(void);
virtual void AlertNoise(void);
};
int
monster_human_grunt::AnimIdle(void)
{
return GR_IDLE;
}
int
monster_human_grunt::AnimWalk(void)
{
return GR_WALK;
}
int
monster_human_grunt::AnimRun(void)
{
return GR_RUN;
}
void
monster_human_grunt::AlertNoise(void)
{
if (m_flAlertNoiseTime > time)
return;
Sentence("!HG_CHECK");
m_flAlertNoiseTime = time + 15.0f;
}
int
monster_human_grunt::AttackMelee(void)
{
/* visual */
AnimPlay(GR_FRONTKICK);
m_flAttackThink = m_flAnimTime;
Sound_Play(this, CHAN_VOICE, "monster_zombie.attack");
/* functional */
think = AttackKick;
nextthink = time + 0.25f;
return (1);
}
void
monster_human_grunt::AttackKick(void)
{
traceline(origin, m_eEnemy.origin, FALSE, this);
if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) {
//Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackmiss");
return;
}
Damage_Apply(trace_ent, this, 25, 0, 0);
//Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackhit");
}
int
monster_human_grunt::AttackRanged(void)
{
/* visual */
AnimPlay(GR_STANDSHOOTMP5);
Sound_Play(this, CHAN_WEAPON, "weapon_mp5.shoot");
if (m_iMP5Burst >= 2) {
m_iMP5Burst = 0;
m_flAttackThink = time + 0.4f;
} else {
m_iMP5Burst++;
m_flAttackThink = time + 0.1f;
}
/* functional */
TraceAttack_FireBullets(1, origin + [0,0,16], 8, [0.01,0.01], 2);
return (1);
}
void monster_human_grunt::Scream(void)
{
if (m_flIdleTime > time) {
return;
}
Sentence(m_talkAllyShot);
m_flIdleTime = time + 5.0f;
}
void monster_human_grunt::IdleChat(void)
{
if (m_flIdleTime > time) {
return;
}
Sentence(m_talkIdle);
/* Sentence(m_talkPlayerIdle); */
/* come up with logic to make them repsone to questions
* Sentence(m_talkAsk);
* Sentence(m_talkAnswer);
*/
m_flIdleTime = time + 5.0f + random(0,20);
}
void
monster_human_grunt::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_human_grunt.pain");
SetFrame(GR_FLINCH);
m_flAnimTime = time + 0.25f;
}
void
monster_human_grunt::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
/* headshots == different animation */
/* this animation may not have been used, but it looks cool */
if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) {
SetFrame(GR_DIEHS);
} else {
SetFrame(GR_DIEBACK);
}
} else {
SetFrame(GR_DIE);
}
}
Sound_Play(this, CHAN_VOICE, "monster_human_grunt.die");
/* set the functional differences */
super::Death();
}
void
monster_human_grunt::Respawn(void)
{
super::Respawn();
SetFrame(GR_IDLE);
}
void
monster_human_grunt::Spawned(void)
{
/* Adding some into other slots in hopes it feels right
* listed below are other setences that might need their own:
* !HG_MONST - Monster HG_ALERT
* !HG_GREN - Grenade toss
* !HG_CHECK - Sector check question
* !HG_CLEAR - Sector clear response */
m_talkAnswer = "!HG_ANSWER";
m_talkAsk = "!HG_QUEST";
m_talkAllyShot = "!HG_COVER";
m_talkGreet = "";
m_talkIdle = "!HG_IDLE";
m_talkSmelling = "";
m_talkStare = "";
m_talkSurvived = "!HG_CLEAR";
m_talkWounded = "!HG_CHECK";
m_talkPlayerAsk = "";
m_talkPlayerGreet = "!HG_ALERT";
m_talkPlayerIdle = "!HG_CHARGE";
m_talkPlayerWounded1 = "";
m_talkPlayerWounded2 = "";
m_talkPlayerWounded3 = "";
m_talkUnfollow = "";
m_talkFollow = "";
m_talkStopFollow = "";
netname = "Grunt";
model = "models/hgrunt.mdl";
base_health = Skill_GetValue("hgrunt_health", 50);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_ENEMY;
super::Spawned();
Sound_Precache("monster_human_grunt.die");
Sound_Precache("monster_human_grunt.pain");
}
void monster_human_grunt::monster_human_grunt(void)
{
}

View file

@ -47,7 +47,7 @@ enum
NIL_SHOOT NIL_SHOOT
}; };
class monster_nihilanth:NSMonster class monster_nihilanth:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;

View file

@ -80,7 +80,7 @@ enum
TE_GRAB TE_GRAB
}; };
class monster_tentacle:NSMonster class monster_tentacle:HLXenMonster
{ {
float m_flIdleTime; float m_flIdleTime;

View file

@ -1,252 +0,0 @@
/*
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*QUAKED monster_zombie (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Zombie
*/
enum
{
ZO_IDLE,
ZO_TURNLEFT,
ZO_TURNRIGHT,
ZO_FLINCHSM,
ZO_FLINCH,
ZO_FLINCHBIG,
ZO_RISE,
ZO_FALLING,
ZO_ATTACK1,
ZO_ATTACK2,
ZO_WALK,
ZO_FLINCHLA,
ZO_FLINCHRA,
ZO_FLINCHLEFT,
ZO_FLINCHRIGHT,
ZO_DIEHS,
ZO_DIEHS2,
ZO_DIE,
ZO_DIE2,
ZO_DIE3,
ZO_PAUSE,
ZO_WALLBUST,
ZO_WALLKICK,
ZO_WINDOWBUST,
ZO_SODA,
ZO_SLIDEIDLE,
ZO_SLIDE,
ZO_VENTIDLE,
ZO_VENT,
ZO_DEADIDLE,
ZO_DEAD,
ZO_FREAKDIE,
ZO_FREAK,
ZO_EATTABLE,
ZO_EAT,
ZO_EATSTAND,
ZO_DOORIP,
ZO_PULLSCI,
ZO_EAT2,
ZO_EAT2STAND,
ZO_VENT2IDLE,
ZO_VENT2,
ZO_HAUL,
ZO_RISESNACK
};
class monster_zombie:NSMonster
{
float m_flIdleTime;
void(void) monster_zombie;
virtual void(void) Spawned;
virtual void(void) Pain;
virtual void(void) Death;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
virtual int(void) AnimIdle;
virtual int(void) AnimWalk;
virtual int(void) AnimRun;
virtual int(void) AttackMelee;
virtual void(void) AttackFlail;
virtual float GetWalkSpeed(void);
virtual float GetChaseSpeed(void);
virtual float GetRunSpeed(void);
};
float
monster_zombie::GetWalkSpeed(void)
{
return 64;
}
float
monster_zombie::GetChaseSpeed(void)
{
return 64;
}
float
monster_zombie::GetRunSpeed(void)
{
return 64;
}
int
monster_zombie::AnimIdle(void)
{
return ZO_IDLE;
}
int
monster_zombie::AnimWalk(void)
{
return ZO_WALK;
}
int
monster_zombie::AnimRun(void)
{
return ZO_WALK;
}
int
monster_zombie::AttackMelee(void)
{
/* visual */
if (random() < 0.5)
AnimPlay(ZO_ATTACK1);
else
AnimPlay(ZO_ATTACK2);
m_flAttackThink = m_flAnimTime;
Sound_Play(this, CHAN_VOICE, "monster_zombie.attack");
/* functional */
think = AttackFlail;
nextthink = time + 0.25f;
return (1);
}
void
monster_zombie::AttackFlail(void)
{
traceline(origin, m_eEnemy.origin, FALSE, this);
if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) {
Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackmiss");
return;
}
Damage_Apply(trace_ent, this, 25, 0, 0);
Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackhit");
}
void
monster_zombie::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_zombie.pain");
SetFrame(ZO_FLINCH + floor(random(0, 2)));
m_flAnimTime = time + 0.25f;
}
void
monster_zombie::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
/* headshots == different animation */
if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) {
SetFrame(ZO_DIEHS);
} else {
SetFrame(ZO_DIEHS2);
}
} else {
SetFrame(ZO_DIE + floor(random(0, 3)));
}
Sound_Play(this, CHAN_VOICE, "monster_zombie.pain");
}
/* set the functional differences */
super::Death();
}
void
monster_zombie::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_zombie.idle");
}
void
monster_zombie::Respawn(void)
{
super::Respawn();
SetFrame(ZO_IDLE);
}
void
monster_zombie::Spawned(void)
{
Sound_Precache("monster_zombie.alert");
Sound_Precache("monster_zombie.attack");
Sound_Precache("monster_zombie.attackhit");
Sound_Precache("monster_zombie.attackmiss");
Sound_Precache("monster_zombie.idle");
Sound_Precache("monster_zombie.pain");
netname = "Zombie";
model = "models/zombie.mdl";
base_health = Skill_GetValue("zombie_health", 50);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_ALIEN;
super::Spawned();
}
void
monster_zombie::monster_zombie(void)
{
}

View file

@ -19,41 +19,6 @@ defs.h
../shared/include.src ../shared/include.src
monster_apache.qc
monster_alien_controller.qc
monster_alien_grunt.qc
monster_alien_slave.qc
monster_barnacle.qc
monster_barney.qc
monster_barney_dead.qc
monster_bigmomma.qc
monster_bloater.qc
monster_bullchicken.qc
monster_cockroach.qc
monster_flyer_flock.qc
monster_gargantua.qc
monster_gman.qc
monster_headcrab.qc
monster_babycrab.qc
monster_hevsuit_dead.qc
monster_houndeye.qc
monster_human_grunt.qc
monster_hgrunt_dead.qc
monster_human_assassin.qc
monster_ichthyosaur.qc
monster_leech.qc
monster_miniturret.qc
monster_nihilanth.qc
monster_osprey.qc
monster_rat.qc
monster_scientist_dead.qc
monster_sitting_scientist.qc
monster_scientist.qc
monster_sentry.qc
monster_tentacle.qc
monster_turret.qc
monster_zombie.qc
player.qc player.qc
items.qc items.qc
item_longjump.qc item_longjump.qc

View file

@ -16,5 +16,6 @@
enum enum
{ {
EV_GAUSSBEAM = EV_SEPARATOR EV_GAUSSBEAM = EV_SEPARATOR,
EV_GIBALIEN
}; };

View file

@ -57,6 +57,20 @@ FX_Blood(vector pos, vector color)
self.think = NSEntity::Destroy; self.think = NSEntity::Destroy;
self.nextthink = time + 5.0f; self.nextthink = time + 5.0f;
} }
static void ABlood_Touch(void)
{
if (self.think != NSEntity::Destroy) {
if (serverkeyfloat("*bspversion") == BSPVER_HL)
Decals_Place(self.origin, sprintf("{yblood%d", floor(random(1,9))));
else {
decal_pickwall(self, self.origin);
pointparticles(DECAL_BLOOD, g_tracedDecal.endpos, g_tracedDecal.normal, 1);
}
}
self.think = NSEntity::Destroy;
self.nextthink = time + 5.0f;
}
if (cvar("violence_hblood") <= 0) { if (cvar("violence_hblood") <= 0) {
return; return;
@ -89,7 +103,10 @@ FX_Blood(vector pos, vector color)
ePart.SetSolid(SOLID_BBOX); ePart.SetSolid(SOLID_BBOX);
ePart.SetSize([0,0,0], [0,0,0]); ePart.SetSize([0,0,0], [0,0,0]);
ePart.touch = Blood_Touch; if (color[1] != 0 && color[2] != 0)
ePart.touch = ABlood_Touch;
else
ePart.touch = Blood_Touch;
/* ignore player physics */ /* ignore player physics */
ePart.dimension_solid = 1; ePart.dimension_solid = 1;

94
src/shared/fx_gibalien.qc Normal file
View file

@ -0,0 +1,94 @@
/*
* Copyright (c) 2016-2020 Marco Cawthorne <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifdef CLIENT
string g_agibs[] = {
"models/agibs.mdl",
"models/agibs.mdl",
"models/agibs.mdl",
"models/agibs.mdl",
"models/agibs.mdl"
};
void
FX_GibAlien_Init(void)
{
for (int i = 0; i < g_agibs.length; i++)
precache_model(g_agibs[i]);
precache_sound("common/bodysplat.wav");
}
#endif
void
FX_GibAlien(vector vecOrigin, vector vecDir, float flForce)
{
#ifdef SERVER
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_GIBALIEN);
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(vecOrigin, MULTICAST_PVS);
#else
static void Gib_Remove(void) {
remove(self);
}
static void Gib_Touch(void)
{
if (serverkeyfloat("*bspversion") == BSPVER_HL)
Decals_Place(self.origin, sprintf("{yblood%d", floor(random(1,7))));
else {
decal_pickwall(self, self.origin);
pointparticles(DECAL_BLOOD, g_tracedDecal.endpos, g_tracedDecal.normal, 1);
}
}
if (cvar("violence_agibs") <= 0) {
return;
}
makevectors(vecDir);
vecDir = v_forward;
for (int i = 0; i < 5; i++) {
vector vel = vecDir;
vel += random(-1,1) * v_right;
vel += random(-1,1) * v_up;
vel *= flForce;
vel += [0,0,80];
entity gibb = spawn();
setmodel(gibb, g_agibs[i]);
setorigin(gibb, vecOrigin);
gibb.movetype = MOVETYPE_BOUNCE;
gibb.solid = SOLID_BBOX;
setsize(gibb, [0,0,0], [0,0,0]);
gibb.velocity = vel;
gibb.avelocity = vectoangles(gibb.velocity);
gibb.think = Gib_Remove;
gibb.touch = Gib_Touch;
gibb.nextthink = time + 5.0f;
gibb.drawmask = MASK_ENGINE;
}
pointsound(vecOrigin, "common/bodysplat.wav", 1, ATTN_NORM);
#endif
}

View file

@ -26,11 +26,9 @@ string g_hgibs[] = {
void void
FX_GibHuman_Init(void) FX_GibHuman_Init(void)
{ {
precache_model("models/gib_b_bone.mdl"); for (int i = 0; i < g_hgibs.length; i++)
precache_model("models/gib_legbone.mdl"); precache_model(g_hgibs[i]);
precache_model("models/gib_lung.mdl");
precache_model("models/gib_skull.mdl");
precache_model("models/gib_b_gib.mdl");
precache_sound("common/bodysplat.wav"); precache_sound("common/bodysplat.wav");
} }
#endif #endif

View file

@ -12,6 +12,7 @@ fx_blood.qc
fx_gaussbeam.qc fx_gaussbeam.qc
fx_breakmodel.qc fx_breakmodel.qc
fx_explosion.qc fx_explosion.qc
fx_gibalien.qc
fx_gibhuman.qc fx_gibhuman.qc
fx_spark.qc fx_spark.qc
fx_corpse.qc fx_corpse.qc

View file

@ -120,8 +120,9 @@ void w_rpg_primary(player pl)
static void Rocket_BuildSpeed(void){ static void Rocket_BuildSpeed(void){
/* Calculate new direction */ /* Calculate new direction */
if (self.weapon) { if (self.weapon) {
vector ownerTarget = self.owner.origin + self.owner.view_ofs;
makevectors(self.owner.v_angle); makevectors(self.owner.v_angle);
traceline(self.owner.origin, self.owner.origin + v_forward * 8096, FALSE, self.owner); traceline(ownerTarget, ownerTarget + v_forward * 8096, FALSE, self.owner);
self.angles = vectoangles(trace_endpos - self.origin); self.angles = vectoangles(trace_endpos - self.origin);
} }

View file

@ -0,0 +1,5 @@
include "monsters/monster_barney.def"
include "monsters/monster_human_grunt.def"
include "monsters/monster_zombie.def"
include "monsters/monster_scientist.def"
include "monsters/monster_alien_grunt.def"

View file

@ -0,0 +1,77 @@
entityDef monster_alien_grunt
{
"spawnclass" "NSMonster"
"model" "models/agrunt.mdl"
"netname" "Zombie"
"health" "skill:zombie_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"
"team" "2"
"propdata" "actor_alien"
"speed_walk" "46"
"speed_run" "292"
"def_attack_melee" "melee_agrunt_punch"
"attack_melee_range" "96"
"attack_ranged_range" "512"
"snd_idle" "monster_alien_grunt.idle"
"snd_pain" "monster_alien_grunt.pain"
"snd_death" "monster_alien_grunt.pain"
"snd_melee_attack" "monster_alien_grunt.attack"
"snd_melee_attack_hit" "monster_zombie.attackhit"
"snd_melee_attack_miss" "monster_zombie.attackmiss"
"snd_thud" "monster_generic.thud"
// animation event callbacks
events {
1 "SpawnProjectileDef" "ranged_agrunt_shot"
1 "StartSoundDef" "weapon_hornetgun.fire"
2 "SpawnProjectileDef" "ranged_agrunt_shot"
2 "StartSoundDef" "weapon_hornetgun.fire"
3 "SpawnProjectileDef" "ranged_agrunt_shot"
3 "StartSoundDef" "weapon_hornetgun.fire"
4 "SpawnProjectileDef" "ranged_agrunt_shot"
4 "StartSoundDef" "weapon_hornetgun.fire"
5 "SpawnProjectileDef" "ranged_agrunt_shot"
5 "StartSoundDef" "weapon_hornetgun.fire"
10 "StartSoundDef" "monster_alien_grunt.step_left"
11 "StartSoundDef" "monster_alien_grunt.step_right"
}
}
entityDef melee_agrunt_punch
{
"damage" "skill:agrunt_dmg_punch"
"delay" "0.25f"
}
entityDef ranged_agrunt_shot
{
"spawnclass" "NSProjectile"
"model" "models/hornet.mdl"
"def_damage" "damage_hornetDirect"
"health" "0"
"velocity" "300"
"fuse" "10"
"detonate_on_fuse" "0"
"detonate_on_death" "0"
"detonate_on_world" "0"
"detonate_on_actor" "1"
"impact_damage_effect" "1"
"impact_gib" "0"
}
entityDef damage_hornetDirect
{
damage "skill:hornet_dmg"
}

View file

@ -0,0 +1,58 @@
entityDef monster_barney
{
"spawnclass" "NSTalkMonster"
"model" "models/barney.mdl"
"netname" "Barney"
"health" "skill:barney_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"
"team" "0"
"propdata" "actor_human"
"def_attack_ranged" "ranged_barney_shot"
"reload_count" "18"
"follow_on_use" "1"
"weapon_drawn" "0"
"body_on_draw" "2"
"speed_walk" "64"
"speed_run" "364"
"snd_pain" "monster_barney.pain"
"snd_death" "monster_barney.die"
"snd_ranged_attack" "weapon_glock.fire"
"snd_reload" "monster_human_grunt.reload"
"snd_thud" "monster_generic.thud"
"talk_answer" "!BA_ANSWER"
"talk_ask" "!BA_QUESTION"
"talk_ally_shoot" "!BA_SHOOT"
"talk_idle" "!BA_IDLE"
"talk_hearing" "!BA_HEAR"
"talk_smelling" "!BA_SMELL"
"talk_stare" "!BA_STARE"
"talk_survived" "!BA_WOUND"
"talk_wounded" "!BA_WOUND"
"talk_player_ask" "!BA_QUESTION"
"talk_player_greet" "!BA_HELLO"
"talk_player_idle" "!BA_IDLE"
"talk_player_wounded1" "!BA_CUREA"
"talk_player_wounded2" "!BA_CUREB"
"talk_player_wounded3" "!BA_CUREC"
"talk_unfollow" "!BA_WAIT"
"talk_follow" "!BA_OK"
"talk_stop_follow" "!BA_STOP"
"talk_deny_follow" "!BA_POK"
// pre-disaster
when "spawnflags" equals "256" {
"follow_on_use" "0"
}
}
entityDef ranged_barney_shot
{
"damage" "skill:hgrunt_pellets"
"delay" "0.5"
}

View file

@ -0,0 +1,149 @@
entityDef monster_human_grunt
{
"spawnclass" "NSSquadMonster"
"model" "models/hgrunt.mdl"
"netname" "Grunt"
"health" "skill:hgrunt_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"
"team" "1"
"propdata" "actor_human"
"speed_walk" "41"
"speed_run" "304"
// melee attack
"def_attack_melee" "melee_hgrunt_kick"
"attack_melee_range" "96"
"snd_melee_attack" "monster_human_grunt.kick"
// primary ranged attack
"def_attack_ranged" "ranged_hgrunt_mp5"
"snd_ranged_attack" "weapon_mp5.shoot"
"attack_ranged_range" "1024"
"reload_count" "30"
// special attack
"def_attack_special_1" "projectile_hgrunt_grenade"
"attack_special_range" "1024"
"projectile_delay" "1.0"
"snd_idle" "monster_human_grunt.idle"
"snd_pain" "monster_human_grunt.pain"
"snd_death" "monster_human_grunt.die"
"snd_reload" "monster_human_grunt.reload"
"snd_thud" "monster_generic.thud"
"weapons" "3"
"squad_leader_body" "2"
// grenade launcher
when "weapons" contains 4 {
"body" "4"
"def_attack_special_1" "projectile_hgrunt_ARgrenade"
skin 1
}
// shotgun grunt
when "weapons" contains 8 {
"body" "35"
"reload_count" "8"
"snd_ranged_attack" "weapon_shotgun.single"
"def_attack_ranged" "ranged_hgrunt_shot"
}
when "spawnflags" contains 32 {
"squad_leader" "1"
}
}
entityDef melee_hgrunt_kick
{
"damage" "skill:hgrunt_kick"
"delay" "0.25"
}
entityDef ranged_hgrunt_mp5
{
"damage" "skill:hgrunt_pellets"
"burst" "3"
"burst_delay" "0.5"
"delay" "0.1"
}
entityDef ranged_hgrunt_shot
{
"damage" "skill:hgrunt_pellets"
"delay" "1.0"
}
entityDef projectile_hgrunt_ARgrenade
{
"spawnclass" "NSProjectile"
"model" "models/grenade.mdl"
"def_splash_damage" "damage_grenadeSplash"
"health" "0"
"velocity" "800 0 400"
"angular_velocity" "300 300 300"
"fuse" "4"
"bounce" "1"
"detonate_on_fuse" "1"
"detonate_on_death" "0"
"detonate_on_world" "1"
"detonate_on_actor" "1"
"impact_damage_effect" "1"
"impact_gib" "1"
"model_detonate" "fx_explosion.main"
"light_color" "1 0.8 0.4"
"light_radius" "160"
"light_offset" "0 0 0"
"explode_light_color" "2 1.6 0.8"
"explode_light_radius" "320"
"explode_light_fadetime" "0.5"
"snd_explode" "weapon_handgrenade.explode"
"snd_bounce" "weapon_handgrenade.bounce"
}
entityDef projectile_hgrunt_grenade
{
"spawnclass" "NSProjectile"
"model" "models/w_grenade.mdl"
"def_splash_damage" "damage_grenadeSplash"
"health" "0"
"velocity" "600 0 200"
"angular_velocity" "300 300 300"
"fuse" "4"
"bounce" "1"
"detonate_on_fuse" "1"
"detonate_on_death" "0"
"detonate_on_world" "0"
"detonate_on_actor" "0"
"impact_damage_effect" "1"
"impact_gib" "1"
"model_detonate" "fx_explosion.main"
"light_color" "1 0.8 0.4"
"light_radius" "160"
"light_offset" "0 0 0"
"explode_light_color" "2 1.6 0.8"
"explode_light_radius" "320"
"explode_light_fadetime" "0.5"
"snd_explode" "weapon_handgrenade.explode"
"snd_bounce" "weapon_handgrenade.bounce"
}
entityDef damage_grenadeSplash
{
"damage" "150"
"radius" "160"
}

View file

@ -0,0 +1,70 @@
entityDef monster_scientist
{
"spawnclass" "NSTalkMonster"
"model" "models/scientist.mdl"
"netname" "Scientist"
"health" "skill:scientist_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"
"team" "0"
"propdata" "actor_human"
"follow_on_use" "1"
"speed_walk" "64"
"speed_run" "364"
"snd_pain" "monster_scientist.pain"
"snd_death" "monster_scientist.die"
"snd_thud" "monster_scientist.thud"
"talk_answer" "!SC_ANSWER"
"talk_ask" "!SC_QUESTION"
"talk_ally_shoot" "!SC_PLFEAR"
"talk_idle" "!SC_IDLE"
"talk_hearing" "!SC_HEAR"
"talk_smelling" "!SC_SMELL"
"talk_stare" "!SC_STARE"
"talk_survived" "!SC_WOUND"
"talk_wounded" "!SC_MORTAL"
"talk_player_ask" "!SC_QUESTION"
"talk_player_greet" "!SC_HELLO"
"talk_player_idle" "!SC_PIDLE"
"talk_player_wounded1" "!SC_CUREA"
"talk_player_wounded2" "!SC_CUREB"
"talk_player_wounded3" "!SC_CUREC"
"talk_unfollow" "!SC_WAIT"
"talk_follow" "!SC_OK"
"talk_stop_follow" "!SC_STOP"
"talk_deny_follow" "!SC_POK"
when "body" equals "1" {
"pitch" "105"
"netname" "Walter"
}
when "body" equals "2" {
"pitch" "100"
"netname" "Einstein"
}
when "body" equals "3" {
"pitch" "95"
"netname" "Luther"
"skin" "1"
}
when "body" equals "4" {
"pitch" "105"
"netname" "Slick"
}
// pre-disaster
when "spawnflags" equals "256" {
"talk_ask" ""
"talk_player_ask" "!SC_PQUEST"
"talk_player_greet" "!SC_PHELLO"
"talk_player_idle" "!SC_PIDLE"
"follow_on_use" "0"
}
}

View file

@ -0,0 +1,33 @@
entityDef monster_zombie
{
"spawnclass" "NSMonster"
"model" "models/zombie.mdl"
"netname" "Zombie"
"health" "skill:zombie_health"
"mins" "-16 -16 0"
"maxs" "16 16 72"
"eye_height" "64"
"team" "2"
"propdata" "actor_alien"
"speed_walk" "72"
"speed_run" "72"
"def_attack_melee" "melee_zombie_stab"
"melee_range" "96"
"snd_idle" "monster_zombie.idle"
"snd_pain" "monster_zombie.pain"
"snd_death" "monster_zombie.pain"
"snd_melee_attack" "monster_zombie.attack"
"snd_melee_attack_hit" "monster_zombie.attackhit"
"snd_melee_attack_miss" "monster_zombie.attackmiss"
"snd_thud" "monster_generic.thud"
}
entityDef melee_zombie_stab
{
"damage" "skill:zombie_dmg_one_slash"
"delay" "0.25f"
"wait" "0.5"
"attempts" "2"
}

View file

@ -1,19 +0,0 @@
entityDef weapon_357
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" ".367 Revolver"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_357.mdl"
"inv_item" "3"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_python
{
"spawnclass" "weapon_357"
}

View file

@ -1,19 +0,0 @@
entityDef weapon_9mmAR
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "9mm AR"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmAR.mdl"
"inv_item" "4"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_mp5
{
"spawnclass" "weapon_9mmAR"
}

View file

@ -1,19 +0,0 @@
entityDef weapon_9mmhandgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "9mm Handgun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmhandgun.mdl"
"inv_item" "2"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_glock
{
"spawnclass" "weapon_9mmhandgun"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_crossbow
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Crossbow"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crossbow.mdl"
"inv_item" "6"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_crowbar
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Crowbar"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crowbar.mdl"
"inv_item" "1"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_egon
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Gluon Gun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_egon.mdl"
"inv_item" "9"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_gauss
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Tau Cannon"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_gauss.mdl"
"inv_item" "8"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_handgrenade
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Hand Grenade"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_grenade.mdl"
"inv_item" "11"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_hornetgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Hornet Gun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_hgun.mdl"
"inv_item" "10"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_rpg
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Rocket Launcher"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_rpg.mdl"
"inv_item" "7"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_satchel
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Satchel"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_satchel.mdl"
"inv_item" "12"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,14 +0,0 @@
entityDef weapon_shotgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Shotgun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_shotgun.mdl"
"inv_item" "5"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,15 +0,0 @@
entityDef weapon_snark
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Snark"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_sqknest.mdl"
"frame" "1"
"inv_item" "14"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,16 +0,0 @@
entityDef weapon_tripmine
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Tripmine"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/v_tripmine.mdl"
"body" "2"
"frame" "8"
"inv_item" "13"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -0,0 +1,227 @@
entityDef weapon_357
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" ".367 Revolver"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_357.mdl"
"inv_item" "3"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_python
{
"spawnclass" "weapon_357"
}
entityDef weapon_9mmAR
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "9mm AR"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmAR.mdl"
"inv_item" "4"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_mp5
{
"spawnclass" "weapon_9mmAR"
}
entityDef weapon_9mmhandgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "9mm Handgun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmhandgun.mdl"
"inv_item" "2"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_glock
{
"spawnclass" "weapon_9mmhandgun"
}
entityDef weapon_crossbow
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Crossbow"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crossbow.mdl"
"inv_item" "6"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_crowbar
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Crowbar"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crowbar.mdl"
"inv_item" "1"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_egon
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Gluon Gun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_egon.mdl"
"inv_item" "9"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_gauss
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Tau Cannon"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_gauss.mdl"
"inv_item" "8"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_handgrenade
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Hand Grenade"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_grenade.mdl"
"inv_item" "11"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_hornetgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Hornet Gun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_hgun.mdl"
"inv_item" "10"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_rpg
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Rocket Launcher"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_rpg.mdl"
"inv_item" "7"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_satchel
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Satchel"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_satchel.mdl"
"inv_item" "12"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_shotgun
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Shotgun"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_shotgun.mdl"
"inv_item" "5"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_snark
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Snark"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_sqknest.mdl"
"frame" "1"
"inv_item" "14"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
entityDef weapon_tripmine
{
"editor_color" ".3 .3 1"
"editor_mins" "-16 -16 -16"
"editor_maxs" "16 16 16"
"editor_usage" "Tripmine"
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/v_tripmine.mdl"
"body" "2"
"frame" "8"
"inv_item" "13"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View file

@ -1,4 +1,18 @@
r_part ember r_part main
{
texture "particles/fteparticlefont.tga"
tcoords 97 97 191 191 256
count 1
scale 200
scalefactor 1
die 1
rgb 255 128 76
rgbdelta 0 -32 -32
friction 1
blend add
}
r_part +ember
{ {
count 1 count 1
texture "particles/fteparticlefont.tga" texture "particles/fteparticlefont.tga"
@ -21,7 +35,18 @@ r_part ember
ramp 0 0 0 0.1 0 ramp 0 0 0 0.1 0
} }
r_part expgib r_part +main
{
lighttime 1
lightradius 350
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
count 1
model "sprites/fexplo.spr" framestart=0 framecount=29 framerate=20 additive scalemin=32 scalemax=32 orient
}
r_part +main
{ {
cliptype expgib cliptype expgib
texture "particles/fteparticlefont.tga" texture "particles/fteparticlefont.tga"
@ -37,22 +62,7 @@ r_part expgib
spawnmode circle spawnmode circle
} }
r_part main r_part +main
{
texture "particles/fteparticlefont.tga"
tcoords 97 97 191 191 256
count 1
scale 200
scalefactor 1
die 1
rgb 255 128 76
rgbdelta 0 -32 -32
friction 1
blend add
assoc expgib
}
r_part blacksmoke
{ {
texture "particles/fteparticlefont.tga" texture "particles/fteparticlefont.tga"
tcoords 97 97 191 191 256 tcoords 97 97 191 191 256
@ -64,5 +74,4 @@ r_part blacksmoke
rgb 0 0 0 rgb 0 0 0
spawnmode ball spawnmode ball
gravity -25 gravity -25
veladd -20
} }

View file

@ -36,6 +36,14 @@
{ {
"breakable_model" "gibs_rock" "breakable_model" "gibs_rock"
} }
"actor_alien"
{
"breakable_model" "gibs_alien"
}
"actor_human"
{
"breakable_model" "gibs_human"
}
"BreakableModels" "BreakableModels"
@ -72,5 +80,21 @@
{ {
"models/cindergibs.mdl#submodels=9" "5.0" "models/cindergibs.mdl#submodels=9" "5.0"
} }
"gibs_alien"
{
"models/agibs.mdl#submodels=4" "5.0"
"models/agibs.mdl#submodels=4" "5.0"
"models/agibs.mdl#submodels=4" "5.0"
"models/agibs.mdl#submodels=4" "5.0"
"models/agibs.mdl#submodels=4" "5.0"
}
"gibs_human"
{
"models/gib_b_bone.mdl" "5.0"
"models/gib_legbone.mdl" "5.0"
"models/gib_lung.mdl" "5.0"
"models/gib_skull.mdl" "5.0"
"models/gib_b_gib.mdl" "5.0"
}
} }
} }

View file

@ -1,3 +1,11 @@
monster_generic.thud
{
sample common/bodydrop1.wav
sample common/bodydrop2.wav
sample common/bodydrop3.wav
sample common/bodydrop4.wav
}
monster_alien_grunt.alert monster_alien_grunt.alert
{ {
sample agrunt/ag_alert1.wav sample agrunt/ag_alert1.wav
@ -41,6 +49,20 @@ monster_alien_grunt.pain
sample agrunt/ag_pain5.wav sample agrunt/ag_pain5.wav
} }
monster_alien_grunt.step_left
{
pitch 0.7
sample player/pl_ladder2.wav
sample player/pl_ladder4.wav
}
monster_alien_grunt.step_right
{
pitch 0.7
sample player/pl_ladder1.wav
sample player/pl_ladder3.wav
}
monster_alien_controller.alert monster_alien_controller.alert
{ {
sample controller/con_alert1.wav sample controller/con_alert1.wav
@ -392,6 +414,13 @@ monster_houndeye.pain
sample houndeye/he_pain5.wav sample houndeye/he_pain5.wav
} }
monster_human_grunt.idle
{
sample hgrunt/gr_idle1.wav
sample hgrunt/gr_idle2.wav
sample hgrunt/gr_idle3.wav
}
monster_human_grunt.die monster_human_grunt.die
{ {
sample hgrunt/gr_die1.wav sample hgrunt/gr_die1.wav
@ -408,6 +437,16 @@ monster_human_grunt.pain
sample hgrunt/gr_pain5.wav sample hgrunt/gr_pain5.wav
} }
monster_human_grunt.kick
{
sample zombie/claw_miss2.wav
}
monster_human_grunt.reload
{
sample hgrunt/gr_reload1.wav
}
monster_ichthyosaur.alert monster_ichthyosaur.alert
{ {
sample ichy/ichy_alert1.wav sample ichy/ichy_alert1.wav

View file

@ -83,6 +83,13 @@ weapon_handgrenade.bounce
sample weapons/grenade_hit3.wav sample weapons/grenade_hit3.wav
} }
weapon_handgrenade.explode
{
sample weapons/explode3.wav
sample weapons/explode4.wav
sample weapons/explode5.wav
}
weapon_hornetgun.fire weapon_hornetgun.fire
{ {
alerts alerts