diff --git a/src/client/game_event.qc b/src/client/game_event.qc index 36e62cb..5c4c775 100644 --- a/src/client/game_event.qc +++ b/src/client/game_event.qc @@ -46,6 +46,18 @@ ClientGame_EventParse(float fHeader) float flForce = readfloat(); FX_GibHuman(vGibPos, vDir, flForce); 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: vector vBloodPos; vector vBloodColor; diff --git a/src/client/hud.qc b/src/client/hud.qc index 2c37af5..89fdd42 100644 --- a/src/client/hud.qc +++ b/src/client/hud.qc @@ -455,6 +455,18 @@ HUD_DrawDamageIndicator(void) 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 */ void HUD_Draw(void) @@ -462,7 +474,16 @@ HUD_Draw(void) player pl = (player)pSeat->m_ePlayer; #ifndef TFC + #ifndef GEARBOX 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 /* little point in not drawing these, even if you don't have a suit */ @@ -472,6 +493,8 @@ HUD_Draw(void) Obituary_Draw(); Textmenu_Draw(); + HUD_TimeRemaining(); + if (!(pl.g_items & ITEM_SUIT)) { return; } diff --git a/src/client/hud_sprite.qc b/src/client/hud_sprite.qc new file mode 100644 index 0000000..b1a331d --- /dev/null +++ b/src/client/hud_sprite.qc @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2023 Marco Cawthorne + * + * 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); +} \ No newline at end of file diff --git a/src/client/init.qc b/src/client/init.qc index 68d9680..45b105c 100644 --- a/src/client/init.qc +++ b/src/client/init.qc @@ -53,6 +53,7 @@ ClientGame_RendererRestart(string rstr) FX_Blood_Init(); FX_BreakModel_Init(); FX_Explosion_Init(); + FX_GibAlien_Init(); FX_GibHuman_Init(); FX_Spark_Init(); FX_Impact_Init(); diff --git a/src/client/progs.src b/src/client/progs.src index 08ca613..373c37b 100644 --- a/src/client/progs.src +++ b/src/client/progs.src @@ -31,6 +31,7 @@ game_event.qc ../../../valve/src/client/viewmodel.qc view.qc obituary.qc +hud_sprite.qc hud_itemnotify.qc hud_dmgnotify.qc hud_ammonotify.qc diff --git a/src/client/scoreboard.qc b/src/client/scoreboard.qc index 4473468..b020b56 100644 --- a/src/client/scoreboard.qc +++ b/src/client/scoreboard.qc @@ -19,11 +19,13 @@ var int autocvar_cl_centerscores = FALSE; var int g_scores_teamplay = 0; +var bool g_scores_scorepoints = false; void Scores_Init(void) { g_scores_teamplay = (int)serverkeyfloat("teamplay"); + g_scores_scorepoints = (bool)serverkeyfloat("scorepoints"); } void @@ -33,7 +35,12 @@ Scores_DrawTeam(player pl, vector pos) drawfont = Font_GetID(FONT_20); 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); 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 + [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); + if (g_scores_scorepoints) { + drawstring(pos + [154-32,0], "/", [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); + /* Get the kills and align them left to right */ + temp = getplayerkeyvalue(i, "frags"); + 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 */ temp = getplayerkeyvalue(i, "ping"); 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); pos[1] += 20; } diff --git a/src/server/gamerules_multiplayer.qc b/src/server/gamerules_multiplayer.qc index 86873ef..44d158f 100644 --- a/src/server/gamerules_multiplayer.qc +++ b/src/server/gamerules_multiplayer.qc @@ -44,6 +44,8 @@ void HLMultiplayerRules::InitPostEnts(void) { MOTD_LoadDefault(); + + forceinfokey(world, "scorepoints", "0"); if (IsTeamplay() == true) { int c; diff --git a/src/server/monster_alien_controller.qc b/src/server/monster_alien_controller.qc index c1cbee3..942381a 100644 --- a/src/server/monster_alien_controller.qc +++ b/src/server/monster_alien_controller.qc @@ -45,24 +45,22 @@ enum CON_DIE }; -class monster_alien_controller:NSMonster +class monster_alien_controller:HLXenMonster { float m_flIdleTime; float m_flPainTime; void(void) monster_alien_controller; - virtual void(void) Pain; - virtual void(void) Death; + virtual void(void) HasBeenHit; + virtual void(void) HasBeenKilled; virtual void(void) IdleNoise; virtual void(void) Respawn; }; void -monster_alien_controller::Pain(void) +monster_alien_controller::HasBeenHit(void) { - super::Pain(); - if (m_flPainTime > time) { return; } @@ -77,16 +75,11 @@ monster_alien_controller::Pain(void) } void -monster_alien_controller::Death(void) +monster_alien_controller::HasBeenKilled(void) { /* if we're already dead (corpse) don't change animations */ - if (IsAlive() == true) { - SetFrame(CON_DIE); - Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die"); - } - - /* set the functional differences */ - super::Death(); + SetFrame(CON_DIE); + Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die"); } void @@ -124,4 +117,5 @@ monster_alien_controller::monster_alien_controller(void) model = "models/controller.mdl"; base_mins = [-16,-16,0]; base_maxs = [16,16,72]; + m_iAlliance = MAL_ALIEN; } diff --git a/src/server/monster_alien_grunt.qc b/src/server/monster_alien_grunt.qc index 1d78819..393b9dc 100644 --- a/src/server/monster_alien_grunt.qc +++ b/src/server/monster_alien_grunt.qc @@ -58,24 +58,22 @@ enum AG_LAND }; -class monster_alien_grunt:NSMonster +class monster_alien_grunt:HLXenMonster { float m_flIdleTime; float m_flPainTime; void(void) monster_alien_grunt; - virtual void(void) Pain; - virtual void(void) Death; + virtual void(void) HasBeenHit; + virtual void(void) HasBeenKilled; virtual void(void) IdleNoise; virtual void(void) Respawn; }; void -monster_alien_grunt::Pain(void) +monster_alien_grunt::HasBeenHit(void) { - super::Pain(); - if (m_flPainTime > time) { return; } @@ -90,26 +88,21 @@ monster_alien_grunt::Pain(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 */ - super::Death(); + Sound_Play(this, CHAN_VOICE, "monster_alien_grunt.die"); } void @@ -149,4 +142,5 @@ monster_alien_grunt::monster_alien_grunt(void) base_mins = [-32,-32,0]; base_maxs = [32,32,64]; base_health = Skill_GetValue("agrunt_health", 90); + m_iAlliance = MAL_ALIEN; } diff --git a/src/server/monster_alien_slave.qc b/src/server/monster_alien_slave.qc index f315323..26fd640 100644 --- a/src/server/monster_alien_slave.qc +++ b/src/server/monster_alien_slave.qc @@ -56,15 +56,15 @@ enum SLV_JABBER }; -class monster_alien_slave:NSTalkMonster +class monster_alien_slave:HLXenTalkMonster { float m_flIdleTime; float m_flPainTime; void(void) monster_alien_slave; - virtual void(void) Death; - virtual void(void) Pain; + virtual void(void) HasBeenKilled; + virtual void(void) HasBeenHit; virtual void(void) IdleChat; virtual void(void) Respawn; @@ -167,10 +167,8 @@ monster_alien_slave::IdleChat(void) } void -monster_alien_slave::Pain(void) +monster_alien_slave::HasBeenHit(void) { - super::Pain(); - if (m_flPainTime > time) { return; } @@ -185,10 +183,8 @@ monster_alien_slave::Pain(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 */ if (g_dmg_iHitBody == BODY_HEAD) { if (random() < 0.5) { @@ -201,10 +197,7 @@ monster_alien_slave::Death(void) } Sound_Play(this, CHAN_VOICE, "monster_alien_slave.die"); - } - /* set the functional differences */ - super::Death(); } void @@ -227,7 +220,7 @@ monster_alien_slave::monster_alien_slave(void) m_talkAnswer = ""; m_talkAsk = ""; m_talkAllyShot = ""; - m_talkGreet = "SLV_ALERT"; + m_talkGreet = "!SLV_ALERT"; m_talkIdle = "!SLV_IDLE"; m_talkSmelling = ""; m_talkStare = ""; diff --git a/src/server/monster_barnacle.qc b/src/server/monster_barnacle.qc index 604a366..74aa4b6 100644 --- a/src/server/monster_barnacle.qc +++ b/src/server/monster_barnacle.qc @@ -37,7 +37,8 @@ class monster_barnacle:NSMonster { void(void) monster_barnacle; - virtual void(void) Death; + /* overrides */ + virtual void(void) HasBeenKilled; virtual void(void) Respawn; virtual void(void) Physics; }; @@ -49,16 +50,10 @@ monster_barnacle::Physics(void) } void -monster_barnacle::Death(void) +monster_barnacle::HasBeenKilled(void) { - /* if we're already dead (corpse) don't change animations */ - if (IsAlive() == true) { - SetFrame(BCL_DIE); - Sound_Play(this, CHAN_VOICE, "monster_barnacle.die"); - } - - /* set the functional differences */ - super::Death(); + SetFrame(BCL_DIE); + StartSoundDef("monster_barnacle.die", CHAN_VOICE, true); } void diff --git a/src/server/monster_barney.qc b/src/server/monster_barney.qc index 62bdb48..48673cb 100644 --- a/src/server/monster_barney.qc +++ b/src/server/monster_barney.qc @@ -44,6 +44,7 @@ enum BA_FLINCH_SML }; +#if 0 class monster_barney:NSTalkMonster { void(void) monster_barney; @@ -232,4 +233,5 @@ monster_barney::Spawned(void) void monster_barney::monster_barney(void) { -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/server/monster_bigmomma.qc b/src/server/monster_bigmomma.qc index 65b43e0..7f8b657 100644 --- a/src/server/monster_bigmomma.qc +++ b/src/server/monster_bigmomma.qc @@ -46,7 +46,7 @@ enum GON_FALLDIE }; -class monster_bigmomma:NSMonster +class monster_bigmomma:HLXenMonster { float m_flIdleTime; diff --git a/src/server/monster_bloater.qc b/src/server/monster_bloater.qc index c9ccc50..37455a7 100644 --- a/src/server/monster_bloater.qc +++ b/src/server/monster_bloater.qc @@ -22,7 +22,7 @@ Flocking Floater */ -class monster_bloater:NSMonster +class monster_bloater:HLXenMonster { void(void) monster_bloater; }; diff --git a/src/server/monster_bullchicken.qc b/src/server/monster_bullchicken.qc index d34ba6d..f576721 100644 --- a/src/server/monster_bullchicken.qc +++ b/src/server/monster_bullchicken.qc @@ -54,7 +54,7 @@ enum * for close range attacks */ -class monster_bullchicken:NSMonster +class monster_bullchicken:HLXenMonster { float m_flIdleTime; diff --git a/src/server/monster_flyer_flock.qc b/src/server/monster_flyer_flock.qc index 1f2c6b6..693a4ba 100644 --- a/src/server/monster_flyer_flock.qc +++ b/src/server/monster_flyer_flock.qc @@ -22,7 +22,7 @@ Boid */ -class monster_flyer_flock:NSMonster +class monster_flyer_flock:HLXenMonster { void(void) monster_flyer_flock; }; diff --git a/src/server/monster_gargantua.qc b/src/server/monster_gargantua.qc index 9355137..0a1832b 100644 --- a/src/server/monster_gargantua.qc +++ b/src/server/monster_gargantua.qc @@ -48,15 +48,15 @@ enum GARG_BUST }; -class monster_gargantua:NSMonster +class monster_gargantua:HLXenMonster { float m_flIdleTime; void(void) monster_gargantua; virtual void(void) Spawned; - virtual void(void) Death; - virtual void(void) Pain; + virtual void(void) HasBeenKilled; + virtual void(void) HasBeenHit; virtual void(void) IdleNoise; virtual void(void) Respawn; }; @@ -79,10 +79,8 @@ monster_gargantua::IdleNoise(void) } void -monster_gargantua::Pain(void) +monster_gargantua::HasBeenHit(void) { - super::Pain(); - if (m_flAnimTime > time) { return; } @@ -97,16 +95,10 @@ monster_gargantua::Pain(void) } void -monster_gargantua::Death(void) +monster_gargantua::HasBeenKilled(void) { - /* if we're already dead (corpse) don't change animations */ - if (IsAlive() == true) { - SetFrame(GARG_DIE); - Sound_Play(this, CHAN_VOICE, "monster_gargantua.die"); - } - - /* set the functional differences */ - super::Death(); + SetFrame(GARG_DIE); + Sound_Play(this, CHAN_VOICE, "monster_gargantua.die"); } void diff --git a/src/server/monster_headcrab.qc b/src/server/monster_headcrab.qc index 2aa63bd..ae473b6 100644 --- a/src/server/monster_headcrab.qc +++ b/src/server/monster_headcrab.qc @@ -47,43 +47,30 @@ enum HC_STRUGGLE }; -class monster_headcrab:NSMonster +class monster_headcrab:HLXenMonster { + bool m_bBiting; float m_flIdleTime; - void(void) monster_headcrab; + void monster_headcrab(void); - virtual void(void) Spawned; - virtual void(void) Pain; - virtual void(void) Death; - virtual void(void) IdleNoise; - virtual int(void) AnimIdle; - virtual int(void) AnimWalk; - virtual int(void) AnimRun; - virtual int(void) AttackRanged; - virtual void(entity) Touch; + virtual void Spawned(void); + virtual void HasBeenHit(void); + virtual void HasBeenKilled(void); + virtual void IdleNoise(void); + virtual int AttackMelee(void); + virtual void Touch(entity); + virtual float MeleeMaxDistance(void); }; -int -monster_headcrab::AnimIdle(void) +float +monster_headcrab:: MeleeMaxDistance(void) { - return HC_IDLE1; + return 256; } int -monster_headcrab::AnimWalk(void) -{ - return HC_WALK; -} - -int -monster_headcrab::AnimRun(void) -{ - return HC_RUN; -} - -int -monster_headcrab::AttackRanged(void) +monster_headcrab::AttackMelee(void) { /* visual */ if (random() < 0.5) @@ -91,28 +78,33 @@ monster_headcrab::AttackRanged(void) else AnimPlay(HC_JUMP_VARIATION1); - m_flAttackThink = m_flAnimTime; + m_flAttackThink = m_flAnimTime + 0.25; Sound_Play(this, CHAN_VOICE, "monster_headcrab.attack"); /* functional */ + vector jumpVelocity; 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); } void monster_headcrab::Touch(entity eToucher) { + if (m_bBiting) if (eToucher.takedamage == DAMAGE_YES) - if (frame == HC_JUMP || frame == HC_JUMP_VARIATION1) - Damage_Apply(eToucher, this, 500, 0, 0); + if (frame == HC_JUMP || frame == HC_JUMP_VARIATION1) { + Damage_Apply(eToucher, this, Skill_GetValue("headcrab_dmg_bite", 10), 0, 0); + StartSoundDef("monster_headcrab.attackhit", CHAN_VOICE, true); + m_bBiting = false; + } } void -monster_headcrab::Pain(void) +monster_headcrab::HasBeenHit(void) { - super::Pain(); - if (m_flAnimTime > time) { return; } @@ -127,16 +119,10 @@ monster_headcrab::Pain(void) } void -monster_headcrab::Death(void) +monster_headcrab::HasBeenKilled(void) { - /* if we're already dead (corpse) don't change animations */ - if (IsAlive() == true) { - SetFrame(HC_DIE); - Sound_Play(this, CHAN_VOICE, "monster_headcrab.die"); - } - - /* set the functional differences */ - super::Death(); + SetFrame(HC_DIE); + Sound_Play(this, CHAN_VOICE, "monster_headcrab.die"); } void @@ -152,7 +138,7 @@ monster_headcrab::IdleNoise(void) } m_flIdleTime = time + random(2,10); - Sound_Play(this, CHAN_VOICE, "monster_headcrab.idle"); + StartSoundDef("monster_headcrab.idle", CHAN_VOICE, true); } void diff --git a/src/server/monster_houndeye.qc b/src/server/monster_houndeye.qc index 3152b6c..30859dd 100644 --- a/src/server/monster_houndeye.qc +++ b/src/server/monster_houndeye.qc @@ -59,7 +59,7 @@ enum HE_JUMPWINDOW }; -class monster_houndeye:NSMonster +class monster_houndeye:HLXenMonster { float m_flIdleTime; diff --git a/src/server/monster_human_grunt.qc b/src/server/monster_human_grunt.qc deleted file mode 100644 index 8206657..0000000 --- a/src/server/monster_human_grunt.qc +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * 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) -{ -} diff --git a/src/server/monster_nihilanth.qc b/src/server/monster_nihilanth.qc index 6cb55ff..0040c08 100644 --- a/src/server/monster_nihilanth.qc +++ b/src/server/monster_nihilanth.qc @@ -47,7 +47,7 @@ enum NIL_SHOOT }; -class monster_nihilanth:NSMonster +class monster_nihilanth:HLXenMonster { float m_flIdleTime; diff --git a/src/server/monster_tentacle.qc b/src/server/monster_tentacle.qc index bb2c11a..f9cab02 100644 --- a/src/server/monster_tentacle.qc +++ b/src/server/monster_tentacle.qc @@ -80,7 +80,7 @@ enum TE_GRAB }; -class monster_tentacle:NSMonster +class monster_tentacle:HLXenMonster { float m_flIdleTime; diff --git a/src/server/monster_zombie.qc b/src/server/monster_zombie.qc deleted file mode 100644 index dd5c82e..0000000 --- a/src/server/monster_zombie.qc +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (c) 2016-2020 Marco Cawthorne - * - * 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) -{ -} diff --git a/src/server/progs.src b/src/server/progs.src index a656296..8445f11 100644 --- a/src/server/progs.src +++ b/src/server/progs.src @@ -19,41 +19,6 @@ defs.h ../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 items.qc item_longjump.qc diff --git a/src/shared/events.h b/src/shared/events.h index e4e4cdc..b33a7f8 100644 --- a/src/shared/events.h +++ b/src/shared/events.h @@ -16,5 +16,6 @@ enum { - EV_GAUSSBEAM = EV_SEPARATOR + EV_GAUSSBEAM = EV_SEPARATOR, + EV_GIBALIEN }; diff --git a/src/shared/fx_blood.qc b/src/shared/fx_blood.qc index 0d44912..904b109 100644 --- a/src/shared/fx_blood.qc +++ b/src/shared/fx_blood.qc @@ -57,6 +57,20 @@ FX_Blood(vector pos, vector color) self.think = NSEntity::Destroy; 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) { return; @@ -89,7 +103,10 @@ FX_Blood(vector pos, vector color) ePart.SetSolid(SOLID_BBOX); 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 */ ePart.dimension_solid = 1; diff --git a/src/shared/fx_gibalien.qc b/src/shared/fx_gibalien.qc new file mode 100644 index 0000000..c9cb041 --- /dev/null +++ b/src/shared/fx_gibalien.qc @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2016-2020 Marco Cawthorne + * + * 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 +} diff --git a/src/shared/fx_gibhuman.qc b/src/shared/fx_gibhuman.qc index cfee905..c6c9062 100644 --- a/src/shared/fx_gibhuman.qc +++ b/src/shared/fx_gibhuman.qc @@ -26,11 +26,9 @@ string g_hgibs[] = { void FX_GibHuman_Init(void) { - precache_model("models/gib_b_bone.mdl"); - precache_model("models/gib_legbone.mdl"); - precache_model("models/gib_lung.mdl"); - precache_model("models/gib_skull.mdl"); - precache_model("models/gib_b_gib.mdl"); + for (int i = 0; i < g_hgibs.length; i++) + precache_model(g_hgibs[i]); + precache_sound("common/bodysplat.wav"); } #endif diff --git a/src/shared/include.src b/src/shared/include.src index 85afb85..6b42b48 100644 --- a/src/shared/include.src +++ b/src/shared/include.src @@ -12,6 +12,7 @@ fx_blood.qc fx_gaussbeam.qc fx_breakmodel.qc fx_explosion.qc +fx_gibalien.qc fx_gibhuman.qc fx_spark.qc fx_corpse.qc diff --git a/src/shared/w_rpg.qc b/src/shared/w_rpg.qc index 09d4d5b..7dccd59 100644 --- a/src/shared/w_rpg.qc +++ b/src/shared/w_rpg.qc @@ -120,8 +120,9 @@ void w_rpg_primary(player pl) static void Rocket_BuildSpeed(void){ /* Calculate new direction */ if (self.weapon) { + vector ownerTarget = self.owner.origin + self.owner.view_ofs; 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); } diff --git a/zpak001.pk3dir/def/monsters.def b/zpak001.pk3dir/def/monsters.def new file mode 100644 index 0000000..5c49b45 --- /dev/null +++ b/zpak001.pk3dir/def/monsters.def @@ -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" \ No newline at end of file diff --git a/zpak001.pk3dir/def/monsters/monster_alien_grunt.def b/zpak001.pk3dir/def/monsters/monster_alien_grunt.def new file mode 100644 index 0000000..a3bfa08 --- /dev/null +++ b/zpak001.pk3dir/def/monsters/monster_alien_grunt.def @@ -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" +} \ No newline at end of file diff --git a/zpak001.pk3dir/def/monsters/monster_barney.def b/zpak001.pk3dir/def/monsters/monster_barney.def new file mode 100644 index 0000000..09b54f8 --- /dev/null +++ b/zpak001.pk3dir/def/monsters/monster_barney.def @@ -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" +} + diff --git a/zpak001.pk3dir/def/monsters/monster_human_grunt.def b/zpak001.pk3dir/def/monsters/monster_human_grunt.def new file mode 100644 index 0000000..9cecc2e --- /dev/null +++ b/zpak001.pk3dir/def/monsters/monster_human_grunt.def @@ -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" +} + diff --git a/zpak001.pk3dir/def/monsters/monster_scientist.def b/zpak001.pk3dir/def/monsters/monster_scientist.def new file mode 100644 index 0000000..ff47d9d --- /dev/null +++ b/zpak001.pk3dir/def/monsters/monster_scientist.def @@ -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" + } +} \ No newline at end of file diff --git a/zpak001.pk3dir/def/monsters/monster_zombie.def b/zpak001.pk3dir/def/monsters/monster_zombie.def new file mode 100644 index 0000000..b90fb18 --- /dev/null +++ b/zpak001.pk3dir/def/monsters/monster_zombie.def @@ -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" +} diff --git a/zpak001.pk3dir/def/weapon_357.def b/zpak001.pk3dir/def/weapon_357.def deleted file mode 100644 index 1009f45..0000000 --- a/zpak001.pk3dir/def/weapon_357.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_9mmAR.def b/zpak001.pk3dir/def/weapon_9mmAR.def deleted file mode 100644 index 19b3c8e..0000000 --- a/zpak001.pk3dir/def/weapon_9mmAR.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_9mmhandgun.def b/zpak001.pk3dir/def/weapon_9mmhandgun.def deleted file mode 100644 index 38a4fb1..0000000 --- a/zpak001.pk3dir/def/weapon_9mmhandgun.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_crossbow.def b/zpak001.pk3dir/def/weapon_crossbow.def deleted file mode 100644 index 5ccfe6c..0000000 --- a/zpak001.pk3dir/def/weapon_crossbow.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_crowbar.def b/zpak001.pk3dir/def/weapon_crowbar.def deleted file mode 100644 index da1188b..0000000 --- a/zpak001.pk3dir/def/weapon_crowbar.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_egon.def b/zpak001.pk3dir/def/weapon_egon.def deleted file mode 100644 index 4d23748..0000000 --- a/zpak001.pk3dir/def/weapon_egon.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_gauss.def b/zpak001.pk3dir/def/weapon_gauss.def deleted file mode 100644 index 78edc13..0000000 --- a/zpak001.pk3dir/def/weapon_gauss.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_handgrenade.def b/zpak001.pk3dir/def/weapon_handgrenade.def deleted file mode 100644 index 7f8f43c..0000000 --- a/zpak001.pk3dir/def/weapon_handgrenade.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_hornetgun.def b/zpak001.pk3dir/def/weapon_hornetgun.def deleted file mode 100644 index 7ba2915..0000000 --- a/zpak001.pk3dir/def/weapon_hornetgun.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_rpg.def b/zpak001.pk3dir/def/weapon_rpg.def deleted file mode 100644 index 0676b40..0000000 --- a/zpak001.pk3dir/def/weapon_rpg.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_satchel.def b/zpak001.pk3dir/def/weapon_satchel.def deleted file mode 100644 index aec5c1b..0000000 --- a/zpak001.pk3dir/def/weapon_satchel.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_shotgun.def b/zpak001.pk3dir/def/weapon_shotgun.def deleted file mode 100644 index 98fc4b3..0000000 --- a/zpak001.pk3dir/def/weapon_shotgun.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_snark.def b/zpak001.pk3dir/def/weapon_snark.def deleted file mode 100644 index 408825e..0000000 --- a/zpak001.pk3dir/def/weapon_snark.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapon_tripmine.def b/zpak001.pk3dir/def/weapon_tripmine.def deleted file mode 100644 index be9867b..0000000 --- a/zpak001.pk3dir/def/weapon_tripmine.def +++ /dev/null @@ -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" -} \ No newline at end of file diff --git a/zpak001.pk3dir/def/weapons.def b/zpak001.pk3dir/def/weapons.def new file mode 100644 index 0000000..363787c --- /dev/null +++ b/zpak001.pk3dir/def/weapons.def @@ -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" +} \ No newline at end of file diff --git a/zpak001.pk3dir/particles/fx_explosion.cfg b/zpak001.pk3dir/particles/fx_explosion.cfg index 8519d57..79145f1 100644 --- a/zpak001.pk3dir/particles/fx_explosion.cfg +++ b/zpak001.pk3dir/particles/fx_explosion.cfg @@ -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 texture "particles/fteparticlefont.tga" @@ -21,7 +35,18 @@ r_part ember 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 texture "particles/fteparticlefont.tga" @@ -37,22 +62,7 @@ r_part expgib spawnmode circle } -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 +r_part +main { texture "particles/fteparticlefont.tga" tcoords 97 97 191 191 256 @@ -64,5 +74,4 @@ r_part blacksmoke rgb 0 0 0 spawnmode ball gravity -25 - veladd -20 } diff --git a/zpak001.pk3dir/scripts/propdata.txt b/zpak001.pk3dir/scripts/propdata.txt index 540e3e4..9965cf9 100644 --- a/zpak001.pk3dir/scripts/propdata.txt +++ b/zpak001.pk3dir/scripts/propdata.txt @@ -36,6 +36,14 @@ { "breakable_model" "gibs_rock" } + "actor_alien" + { + "breakable_model" "gibs_alien" + } + "actor_human" + { + "breakable_model" "gibs_human" + } "BreakableModels" @@ -72,5 +80,21 @@ { "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" + } } } diff --git a/zpak001.pk3dir/sound/monsters_valve.sndshd b/zpak001.pk3dir/sound/monsters_valve.sndshd index ac95038..9a12c4d 100644 --- a/zpak001.pk3dir/sound/monsters_valve.sndshd +++ b/zpak001.pk3dir/sound/monsters_valve.sndshd @@ -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 { sample agrunt/ag_alert1.wav @@ -41,6 +49,20 @@ monster_alien_grunt.pain 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 { sample controller/con_alert1.wav @@ -392,6 +414,13 @@ monster_houndeye.pain 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 { sample hgrunt/gr_die1.wav @@ -408,6 +437,16 @@ monster_human_grunt.pain 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 { sample ichy/ichy_alert1.wav diff --git a/zpak001.pk3dir/sound/weapons_valve.sndshd b/zpak001.pk3dir/sound/weapons_valve.sndshd index 499a54c..6467321 100644 --- a/zpak001.pk3dir/sound/weapons_valve.sndshd +++ b/zpak001.pk3dir/sound/weapons_valve.sndshd @@ -83,6 +83,13 @@ weapon_handgrenade.bounce sample weapons/grenade_hit3.wav } +weapon_handgrenade.explode +{ + sample weapons/explode3.wav + sample weapons/explode4.wav + sample weapons/explode5.wav +} + weapon_hornetgun.fire { alerts