Corpses: Ensure frame1time is reset whenever we inherit someones corpse.

Items: Ensure we re-adjust our position post-spawn so we don't fall through
yet-to-spawn geometry.
Delete a whole bunch of now unused code.
This commit is contained in:
Marco Cawthorne 2024-03-02 00:43:10 -08:00
parent c3975f5315
commit f3596f2aef
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
63 changed files with 217 additions and 3773 deletions

View File

@ -46,14 +46,14 @@ ClientGame_EventParse(float fHeader)
float fTeam = readbyte();
string sMessage = readstring();
CSQC_Parse_Print(sprintf("%s: %s", getplayerkeyvalue(fSender, "name"), sMessage), PRINT_CHAT);
CSQC_Parse_Print(Util_ChatFormat(fSender, 0, sMessage), PRINT_CHAT);
break;
case EV_CHAT_TEAM:
float fSender2 = readbyte();
float fTeam2 = readbyte();
string sMessage2 = readstring();
CSQC_Parse_Print(sprintf("[TEAM] %s: %s", getplayerkeyvalue(fSender2, "name"), sMessage2), PRINT_CHAT);
CSQC_Parse_Print(Util_ChatFormat(fSender2, fTeam2, sMessage2), PRINT_CHAT);
break;
case EV_VIEWMODEL:
View_PlayAnimation(readbyte());

View File

@ -38,7 +38,7 @@ HLSprite_Init(void)
hudFile = fopen("sprites/hud.txt", FILE_READ);
if (hudFile < 0) {
error("hud.txt was not found.");
NSError("Missing file sprites/hud.txt");
return;
}
@ -91,7 +91,7 @@ HLSprite_Init(void)
i++;
}
print(sprintf("initialized %i HL sprites.\n", spriteCount));
NSLog("...initialized %i HL sprites.", spriteCount);
}
void
@ -102,7 +102,7 @@ HLSprite_Draw_RGBA(string spriteName, vector spritePos, vector spriteColor, floa
spriteNum = (int)hash_get(g_hashhlsprite, spriteName, -1i);
if (spriteNum == -1i) {
print(sprintf("cannot draw sprite %S!\n", spriteName));
NSError("Cannot draw sprite %S!", spriteName);
return;
}

View File

@ -14,6 +14,8 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void View_ForceChange(player pl, int targetWeapon);
vector g_vecHUDNums[6] =
{
[168 / 256, 72 / 128],
@ -52,9 +54,10 @@ HUD_DrawWeaponSelect_Forward(void)
if (pSeat->m_flHUDWeaponSelectTime < time) {
pSeat->m_iHUDWeaponSelected = pl.activeweapon;
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionOpen");
pl.StartSoundDef("Player.WeaponSelectionOpen", CHAN_ITEM, false);
} else {
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionMoveSlot");
pl.StartSoundDef("Player.WeaponSelectionMoveSlot", CHAN_ITEM, false);
pSeat->m_iHUDWeaponSelected--;
if (pSeat->m_iHUDWeaponSelected <= 0) {
pSeat->m_iHUDWeaponSelected = g_weapons.length - 1;
@ -83,9 +86,10 @@ HUD_DrawWeaponSelect_Back(void)
if (pSeat->m_flHUDWeaponSelectTime < time) {
pSeat->m_iHUDWeaponSelected = pl.activeweapon;
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionOpen");
pl.StartSoundDef("Player.WeaponSelectionOpen", CHAN_ITEM, false);
} else {
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionMoveSlot");
pl.StartSoundDef("Player.WeaponSelectionMoveSlot", CHAN_ITEM, false);
pSeat->m_iHUDWeaponSelected++;
if (pSeat->m_iHUDWeaponSelected >= g_weapons.length) {
pSeat->m_iHUDWeaponSelected = 1;
@ -101,9 +105,6 @@ HUD_DrawWeaponSelect_Back(void)
HUD_DrawWeaponSelect_Back();
}
void
View_ForceChange(player pl, int targetWeapon);
void
HUD_DrawWeaponSelect_Trigger(void)
{
@ -166,9 +167,9 @@ HUD_SlotSelect(int slot)
}
if (pSeat->m_flHUDWeaponSelectTime < time) {
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionOpen");
pl.StartSoundDef("Player.WeaponSelectionOpen", CHAN_ITEM, false);
} else {
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionMoveSlot");
pl.StartSoundDef("Player WeaponSelectionMoveSlot", CHAN_ITEM, false);
}
/* weren't in that slot? select the first one then */
@ -211,7 +212,7 @@ HUD_DrawWeaponSelect(void)
}
if (pSeat->m_flHUDWeaponSelectTime < time) {
if (pSeat->m_iHUDWeaponSelected) {
Sound_Play(pSeat->m_ePlayer, CHAN_ITEM, "Player.WeaponSelectionClose");
pl.StartSoundDef("Player WeaponSelectionClose", CHAN_ITEM, false);
pSeat->m_iHUDWeaponSelected = 0;
}
return;

View File

@ -46,6 +46,13 @@ item_ammo::Touch(entity eToucher)
void
item_ammo::Respawn(void)
{
static void AdjustSpawnPos(void) {
RestoreAngles();
SetOrigin(GetSpawnOrigin());
DropToFloor();
SetMovetype(MOVETYPE_TOSS);
}
SetSolid(SOLID_TRIGGER);
SetMovetype(MOVETYPE_TOSS);
SetOrigin(GetSpawnOrigin());
@ -57,7 +64,7 @@ item_ammo::Respawn(void)
if (real_owner && time > 30.0f)
Sound_Play(this, CHAN_ITEM, "ammo.respawn");
droptofloor();
ScheduleThink(AdjustSpawnPos, 0.0f);
}
void

View File

@ -45,17 +45,19 @@ item_suit::Touch(entity eToucher)
}
player pl = (player)other;
if (pl.g_items & ITEM_SUIT) {
return;
}
Logging_Pickup(other, this, __NULL__);
sound(other, CHAN_ITEM, "fvox/bell.wav", 1, ATTN_NORM);
sound(other, CHAN_VOICE, "fvox/hev_logon.wav", 1, ATTN_NORM);
StartSound("fvox/bell.wav", CHAN_ITEM, 0, true);
StartSound("fvox/hev_logon.wav", CHAN_VOICE, 0, true);
pl.g_items |= ITEM_SUIT;
m_iValue = TRUE;
if (!target) {
if (HasTriggerTarget() == false) {
UseOutput(other, m_strOnPlayerTouch);
} else {
UseTargets(other, TRIG_TOGGLE, m_flDelay);
@ -72,36 +74,45 @@ item_suit::Touch(entity eToucher)
void
item_suit::Respawn(void)
{
/* we need to delay the DropToFloor() by at least a frame.
otherwise they may just fall through an entity (func_wall, func_train etc.)
that came after this entity in the lump. */
static void AdjustSpawnPos(void) {
RestoreAngles();
SetOrigin(GetSpawnOrigin());
DropToFloor();
SetMovetype(MOVETYPE_TOSS);
}
if (cvar_string("fs_game") == "bshift") {
Destroy();
return;
}
SetSolid(SOLID_TRIGGER);
SetMovetype(MOVETYPE_TOSS);
SetOrigin(GetSpawnOrigin());
SetMovetype(MOVETYPE_TOSS);
SetModel(GetSpawnModel());
SetSize(VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
m_iValue = FALSE;
ReleaseThink();
if (!real_owner && time > 30.0f) {
StartSoundDef("item.respawn", CHAN_ITEM, true);
}
if (!real_owner && time > 30.0f)
Sound_Play(this, CHAN_ITEM, "item.respawn");
DropToFloor();
ScheduleThink(AdjustSpawnPos, 0.0f);
}
void
item_suit::SpawnKey(string strKey, string strValue)
item_suit::SpawnKey(string keyName, string setValue)
{
switch (strKey) {
switch (keyName) {
case "OnPlayerTouch":
strValue = strreplace(",", ",_", strValue);
m_strOnPlayerTouch = strcat(m_strOnPlayerTouch, ",_", strValue);
setValue = strreplace(",", ",_", setValue);
m_strOnPlayerTouch = strcat(m_strOnPlayerTouch, ",_", setValue);
break;
default:
super::SpawnKey(strKey, strValue);
super::SpawnKey(keyName, setValue);
break;
}
}

View File

@ -1,121 +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_alien_controller (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Alien Controller
*/
enum
{
CON_ATTACK,
CON_ATTACK2,
CON_THROW,
CON_IDLE2,
CON_BLOCK,
CON_SHOOT,
CON_FLINCH,
CON_FLINCH2,
CON_FALL,
CON_FORWARD,
CON_BACKWARD,
CON_UP,
CON_DOWN,
CON_RIGHT,
CON_LEFT,
CON_IDLE,
CON_UNUSED,
CON_UNUSED2,
CON_DIE
};
class monster_alien_controller:HLXenMonster
{
float m_flIdleTime;
float m_flPainTime;
void(void) monster_alien_controller;
virtual void(void) HasBeenHit;
virtual void(void) HasBeenKilled;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_alien_controller::HasBeenHit(void)
{
if (m_flPainTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die");
SetFrame(CON_FLINCH + floor(random(0, 2)));
m_flPainTime = time + 0.25f;
}
void
monster_alien_controller::HasBeenKilled(void)
{
/* if we're already dead (corpse) don't change animations */
SetFrame(CON_DIE);
Sound_Play(this, CHAN_VOICE, "monster_alien_controller.die");
}
void
monster_alien_controller::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_alien_controller.idle");
}
void
monster_alien_controller::Respawn(void)
{
super::Respawn();
SetFrame(CON_IDLE);
}
void
monster_alien_controller::monster_alien_controller(void)
{
Sound_Precache("monster_alien_controller.alert");
Sound_Precache("monster_alien_controller.attack");
Sound_Precache("monster_alien_controller.die");
Sound_Precache("monster_alien_controller.idle");
Sound_Precache("monster_alien_controller.pain");
netname = "Alien Controller";
model = "models/controller.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_ALIEN;
}

View File

@ -1,146 +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_alien_grunt (0 0.8 0.8) (-32 -32 0) (32 32 64)
HALF-LIFE (1998) ENTITY
Alien Grunt
*/
enum
{
AG_IDLE,
AG_THREAT,
AG_WALK,
AG_RUN,
AG_LEFT,
AG_RIGHT,
AG_FLINCH,
AG_FLINCHBIG,
AG_ATTACK,
AG_ATTACK2,
AG_VICTORYSQUAT,
AG_VICTORYEAT,
AG_VICTORYSTAND,
AG_FLINCHARML,
AG_FLINCHLEGL,
AG_FLINCHARMR,
AG_FLINCHLEGR,
AG_SHOOTUP,
AG_SHOOTDOWN,
AG_SHOOT,
AG_SHOOTQUICK,
AG_SHOOTLONG,
AG_DIEHS,
AG_DIEGUT,
AG_DIEFORWARD,
AG_DIE,
AG_DIEBACK,
AG_FLOAT,
AG_SCARE,
AG_OPEN,
AG_SMASHRAIL,
AG_LAND
};
class monster_alien_grunt:HLXenMonster
{
float m_flIdleTime;
float m_flPainTime;
void(void) monster_alien_grunt;
virtual void(void) HasBeenHit;
virtual void(void) HasBeenKilled;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_alien_grunt::HasBeenHit(void)
{
if (m_flPainTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_alien_grunt.pain");
SetFrame(AG_FLINCH + floor(random(0, 2)));
m_flPainTime = time + 0.25f;
}
void
monster_alien_grunt::HasBeenKilled(void)
{
/* 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");
}
void
monster_alien_grunt::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_alien_grunt.idle");
}
void
monster_alien_grunt::Respawn(void)
{
super::Respawn();
SetFrame(AG_IDLE);
}
void
monster_alien_grunt::monster_alien_grunt(void)
{
Sound_Precache("monster_alien_grunt.alert");
Sound_Precache("monster_alien_grunt.attack");
Sound_Precache("monster_alien_grunt.die");
Sound_Precache("monster_alien_grunt.idle");
Sound_Precache("monster_alien_grunt.pain");
netname = "Alien Grunt";
model = "models/agrunt.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
base_health = Skill_GetValue("agrunt_health", 90);
m_iAlliance = MAL_ALIEN;
}

View File

@ -1,246 +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_alien_slave (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Alien Slave
*/
enum
{
SLV_IDLE,
SLV_IDLE2,
SLV_IDLE3,
SLV_CROUCH,
SLV_WALK,
SLV_WALK2,
SLV_RUN,
SLV_RIGHT,
SLV_LEFT,
SLV_JUMP,
SLV_STAIRUP,
SLV_ATTACK,
SLV_ATTACKZAP,
SLV_FLINCH,
SLV_FLINCHLA,
SLV_FLINCHRA,
SLV_FLINCHL,
SLV_FLINCHR,
SLV_DIEHS,
SLV_DIE,
SLV_DIEBACK,
SLV_DIEFORWARD,
SLV_COLLAR,
SLV_COLLAR2,
SLV_PUSHUP,
SLV_GRAB,
SLV_UPDOWN,
SLV_DOWNUP,
SLV_JIBBER,
SLV_JABBER
};
class monster_alien_slave:HLXenTalkMonster
{
float m_flIdleTime;
float m_flPainTime;
void(void) monster_alien_slave;
virtual void(void) HasBeenKilled;
virtual void(void) HasBeenHit;
virtual void(void) IdleChat;
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 int(void) AttackRanged;
virtual void(void) AttackBeam;
};
int
monster_alien_slave::AnimIdle(void)
{
return SLV_IDLE;
}
int
monster_alien_slave::AnimWalk(void)
{
return SLV_WALK;
}
int
monster_alien_slave::AnimRun(void)
{
return SLV_RUN;
}
int
monster_alien_slave::AttackMelee(void)
{
/* visual */
AnimPlay(SLV_ATTACK);
m_flAttackThink = m_flAnimTime;
/* functional */
think = AttackFlail;
nextthink = time + 0.25f;
return (1);
}
void
monster_alien_slave::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");
}
int
monster_alien_slave::AttackRanged(void)
{
/* visual */
AnimPlay(SLV_ATTACKZAP);
m_flAttackThink = m_flAnimTime;
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.attack_charge");
/* functional */
think = AttackBeam;
nextthink = time + 1.5f;
return (1);
}
void
monster_alien_slave::AttackBeam(void)
{
traceline(origin, m_eEnemy.origin, FALSE, this);
Sound_Play(this, CHAN_WEAPON, "monster_alien_slave.attack_shoot");
if (trace_fraction >= 1.0 || trace_ent.takedamage != DAMAGE_YES) {
//Sound_Play(this, CHAN_WEAPON, "monster_zombie.attackmiss");
return;
}
Damage_Apply(trace_ent, this, 100, 0, 0);
}
void
monster_alien_slave::IdleChat(void)
{
if (m_flIdleTime > time) {
return;
}
Sentence(m_talkIdle);
m_flIdleTime = time + 5.0f + random(0,20);
}
void
monster_alien_slave::HasBeenHit(void)
{
if (m_flPainTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.pain");
SetFrame(SLV_FLINCH + floor(random(0, 2)));
m_flPainTime = time + 0.25f;
}
void
monster_alien_slave::HasBeenKilled(void)
{
/* headshots == different animation */
if (g_dmg_iHitBody == BODY_HEAD) {
if (random() < 0.5) {
SetFrame(SLV_DIEHS);
} else {
SetFrame(SLV_DIEBACK);
}
} else {
SetFrame(SLV_DIE + floor(random(0, 3)));
}
Sound_Play(this, CHAN_VOICE, "monster_alien_slave.die");
}
void
monster_alien_slave::Respawn(void)
{
super::Respawn();
SetFrame(SLV_IDLE);
}
void
monster_alien_slave::monster_alien_slave(void)
{
Sound_Precache("monster_alien_slave.die");
Sound_Precache("monster_alien_slave.pain");
Sound_Precache("monster_alien_slave.attack_charge");
Sound_Precache("monster_alien_slave.attack_shoot");
Sound_Precache("monster_zombie.attackhit");
Sound_Precache("monster_zombie.attackmiss");
m_talkAnswer = "";
m_talkAsk = "";
m_talkAllyShot = "";
m_talkGreet = "!SLV_ALERT";
m_talkIdle = "!SLV_IDLE";
m_talkSmelling = "";
m_talkStare = "";
m_talkSurvived = "";
m_talkWounded = "";
m_talkPlayerAsk = "";
m_talkPlayerGreet = "!SLV_ALERT";
m_talkPlayerIdle = "";
m_talkPlayerWounded1 = "";
m_talkPlayerWounded2 = "";
m_talkPlayerWounded3 = "";
m_talkUnfollow = "";
m_talkFollow = "";
m_talkStopFollow = "";
netname = "Alien Slave";
model = "models/islave.mdl";
base_health = Skill_GetValue("islave_health", 30);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_ALIEN;
}

View File

@ -1,47 +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_apache (0 0.8 0.8) (-300 -300 -172) (300 300 8)
HALF-LIFE (1998) ENTITY
Boeing AH-64 Apache
*/
class monster_apache:NSMonster
{
void(void) monster_apache;
virtual void(void) Respawn;
};
void monster_apache::Respawn(void)
{
super::Respawn();
movetype = MOVETYPE_NONE;
takedamage = DAMAGE_NO;
iBleeds = FALSE;
setsize(this, [-300,-300,-172], [300, 300, 8]);
}
void monster_apache::monster_apache(void)
{
netname = "Apache";
model = "models/apache.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
base_health = Skill_GetValue("apache_health", 250);
}

View File

@ -1,33 +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_babycrab (0 0.8 0.8) (-16 -16 0) (16 16 36)
HALF-LIFE (1998) ENTITY
Baby Headcrab
*/
class monster_babycrab:monster_headcrab
{
void(void) monster_babycrab;
};
void
monster_babycrab::monster_babycrab(void)
{
}

View File

@ -1,77 +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_barnacle (0 0.8 0.8) (-16 -16 -36) (16 16 0)
HALF-LIFE (1998) ENTITY
Barnacle
*/
enum
{
BCL_IDLE,
BCL_IDLE2,
BCL_IDLE3,
BCL_FLINCH,
BCL_ATTACK,
BCL_CHEW,
BCL_DIE
};
class monster_barnacle:NSMonster
{
void(void) monster_barnacle;
/* overrides */
virtual void(void) HasBeenKilled;
virtual void(void) Respawn;
virtual void(void) Physics;
};
void
monster_barnacle::Physics(void)
{
movetype = MOVETYPE_NONE;
}
void
monster_barnacle::HasBeenKilled(void)
{
SetFrame(BCL_DIE);
StartSoundDef("monster_barnacle.die", CHAN_VOICE, true);
}
void
monster_barnacle::Respawn(void)
{
super::Respawn();
SetFrame(BCL_IDLE);
}
void monster_barnacle::monster_barnacle(void)
{
Sound_Precache("monster_barnacle.attackchew");
Sound_Precache("monster_barnacle.attackpull");
Sound_Precache("monster_barnacle.die");
netname = "Barnacle";
model = "models/barnacle.mdl";
base_mins = [-16,-16,-36];
base_maxs = [16,16,0];
base_health = Skill_GetValue("barnacle_health", 25);
}

View File

@ -1,237 +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_barney (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Barney Calhoun
*/
enum
{
BA_IDLE1,
BA_IDLE2,
BA_IDLE3,
BA_IDLE4,
BA_WALK,
BA_RUN,
BA_SHOOT1,
BA_SHOOT2,
BA_DRAW,
BA_HOLSTER,
BA_RELOAD,
BA_TURNLEFT,
BA_TURNRIGHT,
BA_FLINCH_LA,
BA_FLINCH_RA,
BA_FLINCH_LL,
BA_FLINCH_RL,
BA_FLINCH_SML
};
#if 0
class monster_barney:NSTalkMonster
{
void(void) monster_barney;
virtual void(void) Spawned;
virtual void(void) Respawn;
virtual void(void) OnPlayerUse;
virtual void(void) Pain;
virtual void(void) Death;
virtual int(void) AnimIdle;
virtual int(void) AnimWalk;
virtual int(void) AnimRun;
virtual void(void) AttackDraw;
virtual void(void) AttackHolster;
virtual int(void) AttackMelee;
virtual int(void) AttackRanged;
virtual void(monsterState_t, monsterState_t) StateChanged;
};
int
monster_barney::AnimIdle(void)
{
return BA_IDLE1;
}
int
monster_barney::AnimWalk(void)
{
return BA_WALK;
}
int
monster_barney::AnimRun(void)
{
return BA_RUN;
}
void
monster_barney::AttackDraw(void)
{
AnimPlay(BA_DRAW);
m_flAttackThink = m_flAnimTime;
}
void
monster_barney::AttackHolster(void)
{
AnimPlay(BA_HOLSTER);
m_flAttackThink = m_flAnimTime;
}
int
monster_barney::AttackMelee(void)
{
return AttackRanged();
}
int
monster_barney::AttackRanged(void)
{
/* visual */
AnimPlay(BA_SHOOT1);
m_flAttackThink = time + 0.4f;
/* functional */
v_angle = vectoangles(m_eEnemy.origin - origin);
TraceAttack_FireBullets(1, origin + [0,0,16], 8, [0.01,0.01], 2);
Sound_Play(this, CHAN_WEAPON, "weapon_glock.fire");
return (1);
}
void
monster_barney::StateChanged(monsterState_t oldState, monsterState_t newState)
{
super::StateChanged(oldState, newState);
switch (newState) {
case MONSTER_AIMING:
if (oldState == MONSTER_ALERT)
AttackDraw();
break;
case MONSTER_ALERT:
if (oldState == MONSTER_AIMING)
AttackHolster();
break;
}
}
void
monster_barney::OnPlayerUse(void)
{
if (spawnflags & MSF_PREDISASTER) {
Sentence("!BA_POK");
return;
}
super::OnPlayerUse();
}
void
monster_barney::Pain(void)
{
/* don't bother if we're fully dead */
if (IsAlive() == false)
return;
super::Pain();
if (InAnimation() == true)
return;
if (random() < 0.25f)
return;
Sound_Speak(this, "monster_barney.pain");
AnimPlay(BA_FLINCH_LA + floor(random(0, 5)));
m_flAttackThink = m_flAnimTime;
}
void
monster_barney::Death(void)
{
if (IsAlive() == true) {
SetFrame(25 + floor(random(0, 6)));
Sound_Speak(this, "monster_barney.die");
}
/* now mark our state as 'dead' */
super::Death();
}
void
monster_barney::Respawn(void)
{
super::Respawn();
m_iFlags |= MONSTER_CANFOLLOW;
PlayerUse = OnPlayerUse;
}
void
monster_barney::Spawned(void)
{
Sound_Precache("monster_barney.die");
Sound_Precache("monster_barney.pain");
/* TODO
* BA_MAD - When player gets too naughty
* */
m_talkAnswer = "!BA_ANSWER";
m_talkAsk = "!BA_QUESTION";
m_talkAllyShot = "!BA_SHOOT";
m_talkGreet = "";
m_talkIdle = "!BA_IDLE";
m_talkHearing = "!BA_HEAR";
m_talkSmelling = "!BA_SMELL";
m_talkStare = "!BA_STARE";
m_talkSurvived = "!BA_WOUND";
m_talkWounded = "!BA_WOUND";
m_talkPlayerAsk = "!BA_QUESTION";
m_talkPlayerGreet = "!BA_HELLO";
m_talkPlayerIdle = "!BA_IDLE";
m_talkPlayerWounded1 = "!BA_CUREA";
m_talkPlayerWounded2 = "!BA_CUREB";
m_talkPlayerWounded3 = "!BA_CUREC";
m_talkUnfollow = "!BA_WAIT";
m_talkFollow = "!BA_OK";
m_talkStopFollow = "!BA_STOP";
model = "models/barney.mdl";
netname = "Barney";
base_health = Skill_GetValue("barney_health", 35);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_FRIEND;
super::Spawned();
}
void
monster_barney::monster_barney(void)
{
}
#endif

View File

@ -1,73 +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_barney_dead (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Barney's corpse
*/
class monster_barney_dead:NSTalkMonster
{
int m_iPose;
void(void) monster_barney_dead;
virtual void(void) Respawn;
virtual void(string, string) SpawnKey;
};
void
monster_barney_dead::Respawn(void)
{
v_angle = GetSpawnAngles();
v_angle[0] = Math_FixDelta(v_angle[0]);
v_angle[1] = Math_FixDelta(v_angle[1]);
v_angle[2] = Math_FixDelta(v_angle[2]);
SetOrigin(GetSpawnOrigin());
SetAngles(v_angle);
SetSolid(SOLID_CORPSE);
SetMovetype(MOVETYPE_NONE);
SetModel(GetSpawnModel());
SetSize(VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
SetTakedamage(DAMAGE_YES);
SetHealth(0);
SetVelocity([0,0,0]);
SetFrame(35 + m_iPose);
iBleeds = TRUE;
}
void
monster_barney_dead::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "pose":
m_iPose = stoi(strValue);
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_barney_dead::monster_barney_dead(void)
{
model = "models/barney.mdl";
}

View File

@ -1,131 +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_bigmomma (0 0.8 0.8) (-95 -95 0) (95 95 190)
HALF-LIFE (1998) ENTITY
Gonarch
*/
enum
{
GON_IDLE,
GON_IDLE2,
GON_WALK,
GON_RUN,
GON_DIE,
GON_CLAW,
GON_CLAW2,
GON_CLAW3,
GON_SPAWN,
GON_SHOOT,
GON_FLINCH,
GON_DEFEND,
GON_JUMP,
GON_ANGRY,
GON_ANGRY2,
GON_ANGRY3,
GON_BREAKWALL,
GON_FALL,
GON_FALL2,
GON_FALLDIE
};
class monster_bigmomma:HLXenMonster
{
float m_flIdleTime;
void(void) monster_bigmomma;
virtual void(void) Death;
virtual void(void) Pain;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_bigmomma::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
/* timing needs to adjusted as sounds conflict */
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_bigmomma.idle");
}
void
monster_bigmomma::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_bigmomma.pain");
SetFrame(GON_FLINCH);
m_flAnimTime = time + 0.25f;
}
void
monster_bigmomma::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
SetFrame(GON_DIE);
Sound_Play(this, CHAN_VOICE, "monster_bigmomma.die");
}
/* set the functional differences */
super::Death();
}
void
monster_bigmomma::Respawn(void)
{
super::Respawn();
SetFrame(GON_IDLE);
}
void monster_bigmomma::monster_bigmomma(void)
{
Sound_Precache("monster_bigmomma.alert");
Sound_Precache("monster_bigmomma.attack");
Sound_Precache("monster_bigmomma.child");
Sound_Precache("monster_bigmomma.die");
Sound_Precache("monster_bigmomma.idle");
Sound_Precache("monster_bigmomma.pain");
Sound_Precache("monster_bigmomma.step");
netname = "Gonarch";
model = "models/big_mom.mdl";
/* health is based on factor, for it's not killable until last stage */
base_health = Skill_GetValue("bigmomma_health_factor", 1.5) * 300;
base_mins = [-95,-95,0];
base_maxs = [95,95,190];
}

View File

@ -1,36 +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_bloater (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Flocking Floater
*/
class monster_bloater:HLXenMonster
{
void(void) monster_bloater;
};
void monster_bloater::monster_bloater(void)
{
netname = "Floater";
model = "models/floater.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
}

View File

@ -1,154 +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_bullchicken (0 0.8 0.8) (-32 -32 0) (32 32 64)
HALF-LIFE (1998) ENTITY
Bullsquid
*/
enum
{
BULL_WALK,
BULL_RUN,
BULL_SURPIRSE,
BULL_FLINCH,
BULL_FLINCH2,
BULL_LEFT,
BULL_RIGHT,
BULL_IDLE,
BULL_WHIP,
BULL_BITE,
BULL_RANGE,
BULL_LOOK,
BULL_SEECRAB,
BULL_EAT,
BULL_INSPECT,
BULL_SNIFF,
BULL_DIE,
BULL_DIE2,
BULL_JUMP,
BULL_DRAGIDLE,
BULL_DRAG,
BULL_SCARE,
BULL_FALLIDLE,
BULL_FALL
};
/* the growls are used in combination with the bite sounds
* for close range attacks
*/
class monster_bullchicken:HLXenMonster
{
float m_flIdleTime;
void(void) monster_bullchicken;
virtual void(void) Death;
virtual void(void) Pain;
virtual void(void) IdleNoise;
virtual int(void) AnimIdle;
virtual int(void) AnimWalk;
virtual int(void) AnimRun;
};
int
monster_bullchicken::AnimIdle(void)
{
return BULL_IDLE;
}
int
monster_bullchicken::AnimWalk(void)
{
return BULL_WALK;
}
int
monster_bullchicken::AnimRun(void)
{
return BULL_RUN;
}
void
monster_bullchicken::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
/* timing needs to adjusted as sounds conflict */
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_bullchicken.idle");
}
void
monster_bullchicken::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_bullchicken.pain");
SetFrame((random() < 0.5) ? BULL_FLINCH : BULL_FLINCH2);
m_flAnimTime = time + 0.25f;
}
void
monster_bullchicken::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
/* two different animations */
SetFrame((random() < 0.5) ? BULL_DIE : BULL_DIE2);
Sound_Play(this, CHAN_VOICE, "monster_bullchicken.die");
}
/* set the functional differences */
super::Death();
}
void monster_bullchicken::monster_bullchicken(void)
{
Sound_Precache("monster_bullchicken.alert");
Sound_Precache("monster_bullchicken.attack");
Sound_Precache("monster_bullchicken.attackbite");
Sound_Precache("monster_bullchicken.attackshoot");
Sound_Precache("monster_bullchicken.die");
Sound_Precache("monster_bullchicken.idle");
Sound_Precache("monster_bullchicken.pain");
netname = "Bullsquid";
model = "models/bullsquid.mdl";
base_health = Skill_GetValue("bullsquid_health", 40);
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
}

View File

@ -1,53 +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_cockroach (0 0.8 0.8) (-4 -4 0) (4 4 4)
HALF-LIFE (1998) ENTITY
Cockroach
*/
class monster_cockroach:NSMonster
{
void(void) monster_cockroach;
virtual void(void) Death;
};
void
monster_cockroach::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
Sound_Play(this, CHAN_VOICE, "monster_cockroach.die");
}
/* make sure we gib this thing */
health = -100;
/* set the functional differences */
super::Death();
}
void monster_cockroach::monster_cockroach(void)
{
Sound_Precache("monster_cockroach.die");
netname = "Cockroach";
model = "models/roach.mdl";
base_mins = [-1,-1,0];
base_maxs = [1,1,1];
}

View File

@ -1,36 +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_flyer_flock (0 0.8 0.8) (-16 -16 0) (16 16 16)
HALF-LIFE (1998) ENTITY
Boid
*/
class monster_flyer_flock:HLXenMonster
{
void(void) monster_flyer_flock;
};
void monster_flyer_flock::monster_flyer_flock(void)
{
netname = "Boid";
model = "models/aflock.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,16];
}

View File

@ -1,137 +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_gargantua (0 0.8 0.8) (-32 -32 0) (32 32 128)
HALF-LIFE (1998) ENTITY
Gargantua
*/
enum
{
GARG_IDLE,
GARG_IDLE2,
GARG_IDLE3,
GARG_IDLE4,
GARG_WALK,
GARG_RUN,
GARG_SHOOT,
GARG_SHOOT2,
GARG_ATTACK,
GARG_STOMP,
GARG_LEFT,
GARG_RIGHT,
GARG_FLINCH,
GARG_FLINCH2,
GARG_DIE,
GARG_BITEHEAD,
GARG_THROW,
GARG_SMASH,
GARG_ROLLCAR,
GARG_KICKCAR,
GARG_PUSHCAR,
GARG_BUST
};
class monster_gargantua:HLXenMonster
{
float m_flIdleTime;
void(void) monster_gargantua;
virtual void(void) Spawned;
virtual void(void) HasBeenKilled;
virtual void(void) HasBeenHit;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_gargantua::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
/* timing needs to adjusted as sounds conflict */
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_gargantua.idle");
}
void
monster_gargantua::HasBeenHit(void)
{
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_gargantua.pain");
SetFrame((random() < 0.5) ? GARG_FLINCH : GARG_FLINCH2);
m_flAnimTime = time + 0.25f;
}
void
monster_gargantua::HasBeenKilled(void)
{
SetFrame(GARG_DIE);
Sound_Play(this, CHAN_VOICE, "monster_gargantua.die");
}
void
monster_gargantua::Respawn(void)
{
super::Respawn();
SetFrame(GARG_IDLE);
/* takes damage from explosives only
* takedamage = DAMAGE_NO; */
iBleeds = FALSE;
}
void
monster_gargantua::Spawned(void)
{
super::Spawned();
Sound_Precache("monster_gargantua.alert");
Sound_Precache("monster_gargantua.attack");
Sound_Precache("monster_gargantua.attackflame");
Sound_Precache("monster_gargantua.attackflameon");
Sound_Precache("monster_gargantua.attackflameoff");
Sound_Precache("monster_gargantua.die");
Sound_Precache("monster_gargantua.idle");
Sound_Precache("monster_gargantua.pain");
Sound_Precache("monster_gargantua.step");
}
void monster_gargantua::monster_gargantua(void)
{
netname = "Gargantua";
model = "models/garg.mdl";
base_health = Skill_GetValue("gargantua_health", 800);
base_mins = [-32,-32,0];
base_maxs = [32,32,128];
}

View File

@ -1,86 +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_gman (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
G-Man
*/
enum
{
GMAN_IDLE,
GMAN_IDLETIE,
GMAN_IDLELOOK,
GMAN_IDLE2,
GMAN_OPEN,
GMAN_STAND,
GMAN_WALK,
GMAN_YES,
GMAN_NO,
GMAN_NOBIG,
GMAN_YESBIG,
GMAN_LISTEN,
GMAN_LOOKDOWN,
GMAN_LOOKDOWN2
};
class monster_gman:NSTalkMonster
{
void(void) monster_gman;
virtual void(void) Respawn;
virtual int(void) AnimIdle;
virtual int(void) AnimWalk;
virtual int(void) AnimRun;
};
int
monster_gman::AnimIdle(void)
{
return GMAN_IDLE;
}
int
monster_gman::AnimWalk(void)
{
return GMAN_WALK;
}
int
monster_gman::AnimRun(void)
{
return GMAN_WALK;
}
void monster_gman::Respawn(void)
{
/* he can't die, he's the G-Man! */
super::Respawn();
SetFrame(GMAN_IDLE);
takedamage = DAMAGE_NO;
iBleeds = FALSE;
}
void monster_gman::monster_gman(void)
{
netname = "G-Man";
model = "models/gman.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
}

View File

@ -1,173 +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_headcrab (0 0.8 0.8) (-16 -16 0) (16 16 36)
HALF-LIFE (1998) ENTITY
Headcrab
*/
enum
{
HC_IDLE1,
HC_IDLE2,
HC_IDLE3,
HC_WALK,
HC_RUN,
HC_ANGRY,
HC_FLINCH,
HC_DIE,
HC_180_LEFT,
HC_180_RIGHT,
HC_JUMP,
HC_JUMP_VARIATION1,
HC_JUMP_VARIATION2,
HC_YAW_ADJUSTMENT,
HC_HEADCRABBED1,
HC_HEADCRABBED2,
HC_HEADIDLE,
HC_CRASHIDLE,
HC_CRASH,
HC_STRUGGLEIDLE,
HC_STRUGGLE
};
class monster_headcrab:HLXenMonster
{
bool m_bBiting;
float m_flIdleTime;
void monster_headcrab(void);
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);
};
float
monster_headcrab:: MeleeMaxDistance(void)
{
return 256;
}
int
monster_headcrab::AttackMelee(void)
{
/* visual */
if (random() < 0.5)
AnimPlay(HC_JUMP);
else
AnimPlay(HC_JUMP_VARIATION1);
m_flAttackThink = m_flAnimTime + 0.25;
Sound_Play(this, CHAN_VOICE, "monster_headcrab.attack");
/* functional */
vector jumpVelocity;
makevectors(vectoangles(m_eEnemy.origin - origin));
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, Skill_GetValue("headcrab_dmg_bite", 10), 0, 0);
StartSoundDef("monster_headcrab.attackhit", CHAN_VOICE, true);
m_bBiting = false;
}
}
void
monster_headcrab::HasBeenHit(void)
{
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_headcrab.pain");
SetFrame(HC_FLINCH);
m_flAnimTime = time + 0.25f;
}
void
monster_headcrab::HasBeenKilled(void)
{
SetFrame(HC_DIE);
Sound_Play(this, CHAN_VOICE, "monster_headcrab.die");
}
void
monster_headcrab::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);
StartSoundDef("monster_headcrab.idle", CHAN_VOICE, true);
}
void
monster_headcrab::Spawned(void)
{
super::Spawned();
Sound_Precache("monster_headcrab.alert");
Sound_Precache("monster_headcrab.attack");
Sound_Precache("monster_headcrab.attackhit");
Sound_Precache("monster_headcrab.die");
Sound_Precache("monster_headcrab.idle");
Sound_Precache("monster_headcrab.pain");
}
void
monster_headcrab::monster_headcrab(void)
{
if (classname == "monster_babycrab") {
netname = "Baby Headcrab";
model = "models/baby_headcrab.mdl";
base_health = Skill_GetValue ("headcrab_health", 10) /4;
} else {
netname = "Headcrab";
model = "models/headcrab.mdl";
base_health = Skill_GetValue("headcrab_health", 10);
}
base_mins = [-16,-16,0];
base_maxs = [16,16,36];
m_iAlliance = MAL_ALIEN;
}

View File

@ -1,87 +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_hevsuit_dead (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
HEV-Suit/Player's corpse
*/
class monster_hevsuit_dead:NSMonster
{
int m_iPose;
void(void) monster_hevsuit_dead;
virtual void(void) Respawn;
virtual void(void) Gib;
virtual void(string, string) SpawnKey;
};
void
monster_hevsuit_dead::Gib(void)
{
takedamage = DAMAGE_NO;
FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f);
Disappear();
}
void
monster_hevsuit_dead::Respawn(void)
{
v_angle = GetSpawnAngles();
v_angle[0] = Math_FixDelta(v_angle[0]);
v_angle[1] = Math_FixDelta(v_angle[1]);
v_angle[2] = Math_FixDelta(v_angle[2]);
SetOrigin(GetSpawnOrigin());
angles = v_angle;
solid = SOLID_CORPSE;
movetype = MOVETYPE_NONE;
SetModel(GetSpawnModel());
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
takedamage = DAMAGE_YES;
health = 0;
velocity = [0,0,0];
iBleeds = TRUE;
SetFrame(73 + m_iPose);
}
void
monster_hevsuit_dead::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "pose":
m_iPose = stoi(strValue);
break;
case "body":
SetBody(stoi(strValue) + 1);
break;
case "skin":
SetSkin(stoi(strValue));
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_hevsuit_dead::monster_hevsuit_dead(void)
{
model = "models/player.mdl";
m_iBody = 2;
}

View File

@ -1,86 +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_hgrunt_dead (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Human Grunt's corpse
*/
class monster_hgrunt_dead:NSMonster
{
int m_iPose;
void(void) monster_hgrunt_dead;
virtual void(void) Respawn;
virtual void(void) Gib;
virtual void(string, string) SpawnKey;
};
void
monster_hgrunt_dead::Gib(void)
{
takedamage = DAMAGE_NO;
FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f);
Disappear();
}
void
monster_hgrunt_dead::Respawn(void)
{
v_angle = GetSpawnAngles();
v_angle[0] = Math_FixDelta(v_angle[0]);
v_angle[1] = Math_FixDelta(v_angle[1]);
v_angle[2] = Math_FixDelta(v_angle[2]);
SetOrigin(GetSpawnOrigin());
angles = v_angle;
solid = SOLID_CORPSE;
movetype = MOVETYPE_NONE;
SetModel(GetSpawnModel());
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MAX + [0,0,36]);
takedamage = DAMAGE_YES;
health = 0;
velocity = [0,0,0];
iBleeds = TRUE;
SetFrame(44 + m_iPose);
}
void
monster_hgrunt_dead::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "pose":
m_iPose = stoi(strValue);
break;
case "body":
m_iBody = stoi(strValue) + 1;
break;
case "skin":
skin = stoi(strValue);
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_hgrunt_dead::monster_hgrunt_dead(void)
{
model = "models/hgrunt.mdl";
}

View File

@ -1,241 +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_houndeye (0 0.8 0.8) (-16 -16 0) (16 16 36)
HALF-LIFE (1998) ENTITY
Houndeye
*/
#define HE_BLAST_RADIUS 384
enum
{
HE_IDLE,
HE_IDLE2,
HE_IDLE3,
HE_RUN,
HE_RUN2,
HE_RUN3,
HE_DIE,
HE_DIE2,
HE_DIE3,
HE_DIE4,
HE_ATTACK,
HE_FLINCH,
HE_FLINCH2,
HE_DIE5,
HE_WALKLIMP,
HE_WALK2,
HE_LEADERLOOK,
HE_SLEEP,
HE_GOTOSLEEP,
HE_WAKE,
HE_IDLEMAD,
HE_IDLEMAD2,
HE_IDLEMAD3,
HE_INSPECT,
HE_EAT,
HE_LEFT,
HE_RIGHT,
HE_JUMPBACK,
HE_WAKEFAST,
HE_WHIMPER,
HE_JUMPWINDOW
};
class monster_houndeye:HLXenMonster
{
float m_flIdleTime;
void monster_houndeye(void);
virtual void Spawned(void);
virtual void Pain(void);
virtual void Death(void);
virtual void IdleNoise(void);
virtual void Respawn(void);
virtual int AnimIdle(void);
virtual int AnimWalk(void);
virtual int AnimRun(void);
virtual int AttackMelee(void);
virtual void AttackBlast(void);
virtual float MeleeMaxDistance(void);
};
/* The maximum distance to which we should attempt an attack */
float
monster_houndeye::MeleeMaxDistance(void)
{
return HE_BLAST_RADIUS/2;
}
int
monster_houndeye::AnimIdle(void)
{
return HE_IDLE;
}
int
monster_houndeye::AnimWalk(void)
{
return HE_WALK2;
}
int
monster_houndeye::AnimRun(void)
{
return HE_RUN;
}
int
monster_houndeye::AttackMelee(void)
{
AnimPlay(HE_ATTACK);
Sound_Play(this, CHAN_WEAPON, "monster_houndeye.attack");
m_flAttackThink = m_flAnimTime + 0.5f;
think = AttackBlast;
nextthink = m_flAnimTime;
return (1);
}
void
monster_houndeye::AttackBlast(void)
{
float new_dmg;
float dist;
float diff;
vector pos;
float dmg = 50; /* TODO: set proper damage */
for (entity e = world; (e = findfloat(e, ::takedamage, DAMAGE_YES));) {
pos[0] = e.absmin[0] + (0.5 * (e.absmax[0] - e.absmin[0]));
pos[1] = e.absmin[1] + (0.5 * (e.absmax[1] - e.absmin[1]));
pos[2] = e.absmin[2] + (0.5 * (e.absmax[2] - e.absmin[2]));
if (e.classname == "monster_houndeye")
continue;
/* don't bother if it's not anywhere near us */
dist = vlen(origin - pos);
if (dist > HE_BLAST_RADIUS) {
continue;
}
/* can we physically hit this thing? */
other = world;
traceline(e.origin, origin, MOVE_OTHERONLY, this);
if (trace_fraction < 1.0f)
dmg *= 0.5f;
/* calculate new damage values */
diff = vlen(origin - pos);
diff = (HE_BLAST_RADIUS - diff) / HE_BLAST_RADIUS;
new_dmg = rint(dmg * diff);
if (diff > 0) {
Damage_Apply(e, this, new_dmg, 0, DMG_EXPLODE);
}
}
Sound_Play(this, CHAN_WEAPON, "monster_houndeye.blast");
}
void
monster_houndeye::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_houndeye.pain");
SetFrame(HE_FLINCH + floor(random(0, 2)));
m_flAnimTime = time + 0.25f;
}
void
monster_houndeye::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
SetFrame(HE_DIE + floor(random(0, 4)));
Sound_Play(this, CHAN_VOICE, "monster_houndeye.die");
}
/* set the functional differences */
super::Death();
}
void
monster_houndeye::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_houndeye.idle");
}
void
monster_houndeye::Respawn(void)
{
super::Respawn();
SetFrame(HE_IDLE);
}
void
monster_houndeye::Spawned(void)
{
netname = "Houndeye";
model = "models/houndeye.mdl";
base_health = Skill_GetValue("houndeye_health", 20);
base_mins = [-16,-16,0];
base_maxs = [16,16,36];
m_iAlliance = MAL_ALIEN;
super::Spawned();
Sound_Precache("monster_houndeye.alert");
Sound_Precache("monster_houndeye.attack");
Sound_Precache("monster_houndeye.blast");
Sound_Precache("monster_houndeye.die");
Sound_Precache("monster_houndeye.idle");
Sound_Precache("monster_houndeye.pain");
}
void
monster_houndeye::monster_houndeye(void)
{
}

View File

@ -1,102 +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_assassin (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Black Ops - Assassin
*/
enum
{
HAS_IDLE,
HAS_IDLE3,
HAS_IDLE2,
HAS_RUN,
HAS_WALK,
HAS_SHOOT,
HAS_NADETHROW,
HAS_KICK,
HAS_KICK2,
HAS_DIERUN,
HAS_DIEBACK,
HAS_DIE,
HAS_JUMP,
HAS_UP,
HAS_UNUSED,
HAS_ATTACKDOWN,
HAS_LAND
};
class monster_human_assassin:NSMonster
{
float m_flIdleTime;
void(void) monster_human_assassin;
virtual void(void) Death;
virtual void(void) Respawn;
virtual void Spawned(void);
};
void
monster_human_assassin::monster_human_assassin(void)
{
}
void
monster_human_assassin::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(HAS_DIERUN);
} else {
SetFrame(HAS_DIEBACK);
}
} else {
SetFrame(HAS_DIE);
}
}
/* set the functional differences */
super::Death();
}
void
monster_human_assassin::Spawned(void)
{
netname = "Assassin";
model = "models/hassassin.mdl";
base_health = Skill_GetValue("hassassin_health", 50);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
m_iAlliance = MAL_ENEMY;
super::Spawned();
}
void
monster_human_assassin::Respawn(void)
{
super::Respawn();
frame = HAS_IDLE;
}

View File

@ -1,144 +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_ichthyosaur (0 0.8 0.8) (-32 -32 0) (32 32 64)
HALF-LIFE (1998) ENTITY
Ichthyosaur
*/
enum
{
ICHY_IDLE,
ICHY_SWIM,
ICHY_THRUST,
ICHY_DIE1,
ICHY_DIE2,
ICHY_FLINCH,
ICHY_FLINCH2,
ICHY_DIE3,
ICHY_BITER,
ICHY_BITEL,
ICHY_ATTACK,
ICHY_RIGHT,
ICHY_LEFT,
ICHY_180,
ICHY_HITCAGE,
ICHY_JUMP
};
class monster_ichthyosaur:NSMonster
{
float m_flIdleTime;
void(void) monster_ichthyosaur;
virtual void(void) Spawned;
virtual void(void) Pain;
virtual void(void) Death;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_ichthyosaur::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_ichthyosaur.pain");
SetFrame(ICHY_FLINCH + floor(random(0, 2)));
m_flAnimTime = time + 0.25f;
}
void
monster_ichthyosaur::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
int r = floor(random(0,3));
switch (r) {
case 1:
SetFrame(ICHY_DIE2);
break;
case 2:
SetFrame(ICHY_DIE3);
break;
default:
SetFrame(ICHY_DIE1);
break;
}
Sound_Play(this, CHAN_VOICE, "monster_ichthyosaur.die");
}
/* set the functional differences */
super::Death();
}
void
monster_ichthyosaur::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_ichthyosaur.idle");
}
void
monster_ichthyosaur::Respawn(void)
{
super::Respawn();
SetFrame(ICHY_IDLE);
}
void
monster_ichthyosaur::Spawned(void)
{
netname = "Ichthyosaur";
model = "models/icky.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
super::Spawned();
Sound_Precache("monster_ichthyosaur.alert");
Sound_Precache("monster_ichthyosaur.attack");
Sound_Precache("monster_ichthyosaur.die");
Sound_Precache("monster_ichthyosaur.idle");
Sound_Precache("monster_ichthyosaur.pain");
}
void
monster_ichthyosaur::monster_ichthyosaur(void)
{
}

View File

@ -1,91 +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_leech (0 0.8 0.8) (-6 -6 0) (6 6 6)
HALF-LIFE (1998) ENTITY
Leech
*/
enum
{
LEECH_SWIM,
LEECH_SWIM2,
LEECH_ATTACK,
LEECH_HOVER,
LEECH_LEFT,
LEECH_RIGHT,
LEECH_DIE,
LEECH_DIEEND
};
class monster_leech:NSMonster
{
float m_flIdleTime;
void(void) monster_leech;
virtual void(void) Spawned;
virtual void(void) Death;
virtual void(void) DeathEnd;
virtual void(void) Respawn;
};
void
monster_leech::DeathEnd(void)
{
SetFrame(LEECH_DIEEND);
}
void
monster_leech::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
SetFrame(LEECH_DIE);
think = DeathEnd;
nextthink = time + 1.0f;
}
/* set the functional differences */
super::Death();
}
void
monster_leech::Respawn(void)
{
super::Respawn();
SetFrame(LEECH_SWIM);
}
void
monster_leech::Spawned(void)
{
netname = "Leech";
model = "models/leech.mdl";
base_mins = [-6,-6,0];
base_maxs = [6,6,6];
super::Spawned();
Sound_Precache("monster_leech.alert");
Sound_Precache("monster_leech.attack");
}
void monster_leech::monster_leech(void)
{
}

View File

@ -1,55 +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_miniturret (0 0.8 0.8) (-16 -16 -32) (16 16 32)
HALF-LIFE (1998) ENTITY
Automatic Turret (small)
*/
enum
{
TUR_IDLE,
TUR_FIRE,
TUR_SPIN,
TUR_DEPLOY,
TUR_RETIRE,
TUR_DIE
};
class monster_miniturret:NSMonster
{
void(void) monster_miniturret;
virtual void Spawned(void);
};
void monster_miniturret::monster_miniturret(void)
{
}
void monster_miniturret::Spawned(void)
{
netname = "Mini-Turret";
model = "models/miniturret.mdl";
base_mins = [-16,-16,-32];
base_maxs = [16,16,32];
super::Spawned();
}

View File

@ -1,142 +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_nihilanth (0 0.8 0.8) (-192 -192 0) (192 192 384)
HALF-LIFE (1998) ENTITY
Nihilanth
*/
enum
{
NIL_IDLE,
NIL_ATTACK,
NIL_ATTACK2,
NIL_THROW,
NIL_BLOCK,
NIL_RECHARGE,
NIL_IDLEOPEN,
NIL_ATTACKOPEN,
NIL_ATTACKOPEN2,
NIL_FLINCH,
NIL_FLINCH2,
NIL_FALL,
NIL_DIE,
NIL_FORWARD,
NIL_BACK,
NIL_UP,
NIL_DOWN,
NIL_RIGHT,
NIL_LEFT,
NIL_WALK2,
NIL_SHOOT
};
class monster_nihilanth:HLXenMonster
{
float m_flIdleTime;
void(void) monster_nihilanth;
virtual void(void) Spawned;
virtual void(void) Death;
virtual void(void) Pain;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
};
void
monster_nihilanth::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
/* timing needs to adjusted as sounds conflict */
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_nihilanth.idle");
}
void
monster_nihilanth::Pain(void)
{
super::Pain();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
Sound_Play(this, CHAN_VOICE, "monster_nihilanth.pain");
SetFrame((random() < 0.5) ? NIL_FLINCH : NIL_FLINCH2);
m_flAnimTime = time + 0.25f;
}
void
monster_nihilanth::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
SetFrame(NIL_DIE);
Sound_Play(this, CHAN_VOICE, "monster_nihilanth.die");
}
/* set the functional differences */
super::Death();
}
void
monster_nihilanth::Respawn(void)
{
super::Respawn();
SetFrame(NIL_IDLE);
}
void
monster_nihilanth::Spawned(void)
{
netname = "Nihilanth";
model = "models/nihilanth.mdl";
base_health = Skill_GetValue("nihilanth_health", 800);
base_mins = [-192,-192,-32];
base_maxs = [192,192,384];
super::Spawned();
Sound_Precache("monster_nihilanth.attack");
Sound_Precache("monster_nihilanth.attackball");
Sound_Precache("monster_nihilanth.attackballmove");
Sound_Precache("monster_nihilanth.die");
Sound_Precache("monster_nihilanth.idle");
Sound_Precache("monster_nihilanth.pain");
Sound_Precache("monster_nihilanth.recharge");
}
void
monster_nihilanth::monster_nihilanth(void)
{
}

View File

@ -1,52 +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_osprey (0 0.8 0.8) (-480 -480 -112) (480 480 24)
HALF-LIFE (1998) ENTITY
Bell Boeing VV-22 Osprey
*/
class monster_osprey:NSMonster
{
void(void) monster_osprey;
virtual void(void) Respawn;
virtual void Spawned(void);
};
void monster_osprey::monster_osprey(void)
{
}
void monster_osprey::Spawned(void)
{
netname = "Osprey";
model = "models/osprey.mdl";
base_mins = [-480,-480,-112];
base_maxs = [480,480,24];
super::Spawned();
}
void monster_osprey::Respawn(void)
{
super::Respawn();
takedamage = DAMAGE_NO;
iBleeds = FALSE;
}

View File

@ -1,48 +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_rat (0 0.8 0.8) (-6 -6 0) (6 6 6)
HALF-LIFE (1998) ENTITY
Rat
*/
class monster_rat:NSMonster
{
void(void) monster_rat;
virtual void Spawned(void);
};
void monster_rat::monster_rat(void)
{
netname = "Rat";
model = "models/bigrat.mdl";
base_mins = [-6,-6,-0];
base_maxs = [6,6,6];
}
void monster_rat::Spawned(void)
{
netname = "Rat";
model = "models/bigrat.mdl";
base_mins = [-6,-6,-0];
base_maxs = [6,6,6];
super::Spawned();
}

View File

@ -1,222 +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_scientist (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Scientist
*/
enum
{
SCIA_WALK,
SCIA_WALKSCARED,
SCIA_RUN,
SCIA_RUNSCARED,
SCIA_RUNLOOK,
SCIA_180LEFT,
SCIA_180RIGHT,
SCIA_FLINCH,
SCIA_PAIN,
SCIA_PAINLEFT,
SCIA_PAINRIGHT,
SCIA_PAINLEGLEFT,
SCIA_PAINLEGRIGHT,
SCIA_IDLE1,
SCIA_IDLE2,
SCIA_IDLE3,
SCIA_IDLE4,
SCIA_IDLE5,
SCIA_IDLE6,
SCIA_SCARED_END,
SCIA_SCARED1,
SCIA_SCARED2,
SCIA_SCARED3,
SCIA_SCARED4,
SCIA_PANIC,
SCIA_FEAR1,
SCIA_FEAR2,
SCIA_CRY,
SCIA_SCI1,
SCIA_SCI2,
SCIA_SCI3,
SCIA_DIE_SIMPLE,
SCIA_DIE_FORWARD1,
SCIA_DIE_FORWARD2,
SCIA_DIE_BACKWARD,
SCIA_DIE_HEADSHOT,
SCIA_DIE_GUTSHOT,
SCIA_LYING1,
SCIA_LYING2,
SCIA_DEADSIT,
SCIA_DEADTABLE1,
SCIA_DEADTABLE2,
SCIA_DEADTABLE3
};
class monster_scientist:NSTalkMonster
{
void(void) monster_scientist;
virtual void(void) Spawned;
virtual void(void) Respawn;
virtual void(void) Pain;
virtual void(void) Death;
virtual void(void) PlayerUse;
virtual void(string, string) SpawnKey;
};
void
monster_scientist::PlayerUse(void)
{
if (spawnflags & MSF_PREDISASTER) {
Sentence("!SC_POK");
return;
}
super::OnPlayerUse();
}
void
monster_scientist::Pain(void)
{
WarnAllies();
if (m_flAnimTime > time) {
return;
}
if (random() < 0.25f) {
return;
}
if (IsAlive() == true) {
Sound_Speak(this, "monster_scientist.pain");
SetFrame(SCIA_FLINCH + floor(random(0, 6)));
m_iFlags |= MONSTER_FEAR;
m_flAnimTime = time + 0.25f;
}
}
void
monster_scientist::Death(void)
{
WarnAllies();
if (IsAlive() == true) {
SetFrame(SCIA_DIE_SIMPLE + floor(random(0, 6)));
Sound_Speak(this, "monster_scientist.die");
}
/* now mark our state as 'dead' */
super::Death();
}
void
monster_scientist::Respawn(void)
{
super::Respawn();
m_iFlags |= MONSTER_CANFOLLOW;
}
void
monster_scientist::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "body":
SetBody(stoi(strValue) + 1);
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_scientist::Spawned(void)
{
if (spawnflags & MSF_PREDISASTER) {
m_talkAsk = "";
m_talkPlayerAsk = "!SC_PQUEST";
m_talkPlayerGreet = "!SC_PHELLO";
m_talkPlayerIdle = "!SC_PIDLE";
} else {
m_talkAsk = "!SC_QUESTION";
m_talkPlayerAsk = "!SC_QUESTION";
m_talkPlayerGreet = "!SC_HELLO";
m_talkPlayerIdle = "!SC_PIDLE";
}
m_talkAnswer = "!SC_ANSWER";
m_talkAllyShot = "!SC_PLFEAR";
m_talkGreet = "";
m_talkIdle = "!SC_IDLE";
m_talkHearing = "!SC_HEAR";
m_talkSmelling = "!SC_SMELL";
m_talkStare = "!SC_STARE";
m_talkSurvived = "!SC_WOUND";
m_talkWounded = "!SC_MORTAL";
/* they seem to use predisaster lines regardless of disaster state */
m_talkPlayerWounded1 = "!SC_CUREA";
m_talkPlayerWounded2 = "!SC_CUREB";
m_talkPlayerWounded3 = "!SC_CUREC";
m_talkUnfollow = "!SC_WAIT";
m_talkFollow = "!SC_OK";
m_talkStopFollow = "!SC_STOP";
m_iBody = -1;
model = "models/scientist.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
base_health = Skill_GetValue("scientist_health", 20);
super::Spawned();
Sound_Precache("monster_scientist.die");
Sound_Precache("monster_scientist.pain");
/* has the body not been overriden, etc. choose a character for us */
if (m_iBody == -1) {
SetBody((int)floor(random(1,5)));
}
switch (m_iBody) {
case 1:
m_flPitch = 105;
netname = "Walter";
break;
case 2:
m_flPitch = 100;
netname = "Einstein";
break;
case 3:
m_flPitch = 95;
netname = "Luther";
SetSkin(1);
break;
default:
m_flPitch = 100;
netname = "Slick";
}
}
void
monster_scientist::monster_scientist(void)
{
}

View File

@ -1,121 +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_scientist_dead (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Scientists' corpse
*/
enum
{
DSCIA_LYING1 = 37,
DSCIA_LYING2,
DSCIA_DEADSIT,
DSCIA_DEADTABLE1,
DSCIA_DEADTABLE2,
DSCIA_DEADTABLE3,
DSCIA_DEADHANG
};
class monster_scientist_dead:NSMonster
{
int m_iPose;
void(void) monster_scientist_dead;
virtual void(void) Respawn;
virtual void(void) Gib;
virtual void(string, string) SpawnKey;
};
void
monster_scientist_dead::Gib(void)
{
takedamage = DAMAGE_NO;
FX_GibHuman(origin, vectoangles(origin - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f);
Disappear();
}
void
monster_scientist_dead::Respawn(void)
{
v_angle = GetSpawnAngles();
v_angle[0] = Math_FixDelta(v_angle[0]);
v_angle[1] = Math_FixDelta(v_angle[1]);
v_angle[2] = Math_FixDelta(v_angle[2]);
SetOrigin(GetSpawnOrigin());
angles = v_angle;
solid = SOLID_CORPSE;
movetype = MOVETYPE_NONE;
SetModel(GetSpawnModel());
setsize(this, VEC_HULL_MIN + [0,0,36], VEC_HULL_MIN + [0,0,36]);
takedamage = DAMAGE_YES;
health = 0;
velocity = [0,0,0];
iBleeds = TRUE;
switch (m_iPose) {
case 1:
SetFrame(DSCIA_LYING2);
break;
case 2:
SetFrame(DSCIA_DEADSIT);
break;
case 3:
SetFrame(DSCIA_DEADHANG);
break;
case 4:
SetFrame(DSCIA_DEADTABLE1);
break;
case 5:
SetFrame(DSCIA_DEADTABLE2);
break;
case 6:
SetFrame(DSCIA_DEADTABLE3);
break;
default:
SetFrame(DSCIA_LYING1);
}
DropToFloor();
}
void
monster_scientist_dead::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "pose":
m_iPose = stoi(strValue);
break;
case "body":
SetBody(stoi(strValue) + 1);
break;
case "skin":
SetSkin(stoi(strValue));
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_scientist_dead::monster_scientist_dead(void)
{
model = "models/scientist.mdl";
}

View File

@ -1,87 +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_sentry (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Sentry Gun
*/
enum
{
SENT_IDLE,
SENT_FIRE,
SENT_SPIN,
SENT_DEPLOY,
SENT_RETIRE,
SENT_DIE
};
class monster_sentry:NSMonster
{
void(void) monster_sentry;
virtual void(void) Spawned;
virtual void(void) Death;
virtual void(void) Respawn;
};
void
monster_sentry::Death(void)
{
/* if we're already dead (corpse) don't change animations */
if (IsAlive() == true) {
SetFrame(SENT_DIE);
Sound_Play(this, CHAN_VOICE, "monster_sentry.die");
}
/* set the functional differences */
super::Death();
}
void
monster_sentry::Respawn(void)
{
super::Respawn();
SetFrame(SENT_IDLE);
iBleeds = FALSE;
}
void
monster_sentry::Spawned(void)
{
netname = "Sentry";
model = "models/sentry.mdl";
base_health = Skill_GetValue("sentry_health", 40);
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
super::Spawned();
Sound_Precache("monster_sentry.alert");
Sound_Precache("monster_sentry.die");
Sound_Precache("monster_sentry.idle");
Sound_Precache("monster_sentry.retract");
}
void monster_sentry::monster_sentry(void)
{
}

View File

@ -1,140 +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_sitting_scientist (0 0.8 0.8) (-14 -14 0) (14 14 36)
HALF-LIFE (1998) ENTITY
Sitting scientists
*/
enum
{
DSCIA_LYING1 = 37,
DSCIA_LYING2,
DSCIA_DEADSIT,
DSCIA_DEADTABLE1,
DSCIA_DEADTABLE2,
DSCIA_DEADTABLE3,
DSCIA_DEADHANG
};
class monster_sitting_scientist:NSTalkMonster
{
int m_iPose;
void(void) monster_sitting_scientist;
virtual void(void) Respawn;
virtual void(void) Spawned;
virtual void(void) Death;
virtual void(void) Gib;
virtual void(string, string) SpawnKey;
};
void
monster_sitting_scientist::Gib(void)
{
SetTakedamage(DAMAGE_NO);
FX_GibHuman(GetOrigin(), vectoangles(GetOrigin() - g_dmg_eAttacker.origin), g_dmg_iDamage * 2.0f);
Disappear();
}
void
monster_sitting_scientist::Death(void)
{
if (GetHealth() < -50) {
Gib();
return;
}
}
void
monster_sitting_scientist::Respawn(void)
{
v_angle = GetSpawnAngles();
v_angle[0] = Math_FixDelta(v_angle[0]);
v_angle[1] = Math_FixDelta(v_angle[1]);
v_angle[2] = Math_FixDelta(v_angle[2]);
SetOrigin(GetSpawnOrigin());
SetAngles(v_angle);
SetSolid(SOLID_BBOX);
SetMovetype(MOVETYPE_NONE);
SetModel(GetSpawnModel());
SetSize([-14,-14,0],[14,14,36]);
SetTakedamage(DAMAGE_YES);
SetHealth(0);
SetVelocity([0,0,0]);
SetFrame(74);
DropToFloor();
iBleeds = TRUE;
}
void
monster_sitting_scientist::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "pose":
m_iPose = stoi(strValue);
break;
case "body":
SetBody(stoi(strValue) + 1);
break;
case "skin":
SetSkin(stoi(strValue));
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
monster_sitting_scientist::Spawned(void)
{
model = "models/scientist.mdl";
super::Spawned();
/* has the body not been overriden, etc. choose a character for us */
if (m_iBody == -1) {
SetBody((int)floor(random(1,5)));
}
switch (m_iBody) {
case 1:
m_flPitch = 105;
netname = "Walter";
break;
case 2:
m_flPitch = 100;
netname = "Einstein";
break;
case 3:
m_flPitch = 95;
netname = "Luther";
SetSkin(1);
break;
default:
m_flPitch = 100;
netname = "Slick";
}
}
void
monster_sitting_scientist::monster_sitting_scientist(void)
{
}

View File

@ -1,139 +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_tentacle (0 0.8 0.8) (-32 -32 0) (32 32 64)
HALF-LIFE (1998) ENTITY
Tentacle
*/
enum
{
TE_IDLEPIT,
TE_RISE,
TE_TOFLOOR1,
TE_IDLE,
TE_PISSED,
TE_SMALLRISE,
TE_WAVE,
TE_STRIKE,
TE_TAP,
TE_ROTATE,
TE_REAR,
TE_REARIDLE,
TE_TOLEV1,
TE_IDELLEV1,
TE_FIDGETLEV1,
TE_SNAPLEV1,
TE_STRIKELEV1,
TE_TAPLEV1,
TE_ROTATELEV1,
TE_REARLEV1,
TE_REARIDELLEV1,
TE_TOLEV2,
TE_IDLELEV2,
TE_FIDGETLEV2,
TE_SNAPLEV2,
TE_SWINGLEV2,
TE_TUTLEV2,
TE_STRIKELEV2,
TE_TAPLEV2,
TE_ROTATELEV2,
TE_REARLEV2,
TE_FREAKDIE,
TE_REARIDLE2,
TE_TOLEV3,
TE_IDLELEV3,
TE_FIDGETLEV3,
TE_SIDELEV3,
TE_SWIPELEV3,
TE_STRIKELEV3,
TE_TAPLEV3,
TE_ROTATELEV3,
TE_REARLEV3,
TE_REARIDLELEV3,
TE_DOORLEV1,
TE_ENGINELEV3,
TE_ENGINEIDLE,
TE_ENGINESWAY,
TE_ENGINESWAT,
TE_ENGINEBOB,
TE_ENGINEDEATH,
TE_ENGINEDEATH2,
TE_ENGINEDEATH3,
TE_GRABIDLE,
TE_GRAB
};
class monster_tentacle:HLXenMonster
{
float m_flIdleTime;
void(void) monster_tentacle;
virtual void(void) IdleNoise;
virtual void(void) Respawn;
virtual void(void) Spawned;
};
void
monster_tentacle::IdleNoise(void)
{
/* don't make noise if we're dead (corpse) */
if (IsAlive() == false) {
return;
}
if (m_flIdleTime > time) {
return;
}
/* timing needs to adjusted as sounds conflict */
m_flIdleTime = time + random(2,10);
Sound_Play(this, CHAN_VOICE, "monster_tentacle.idle");
}
void
monster_tentacle::Respawn(void)
{
super::Respawn();
/* not entirely true, takes damage then retreats and reheals */
takedamage = DAMAGE_NO;
iBleeds = FALSE;
SetFrame(TE_IDLE);
}
void
monster_tentacle::Spawned(void)
{
Sound_Precache("monster_tentacle.alert");
Sound_Precache("monster_tentacle.attack");
Sound_Precache("monster_tentacle.die");
Sound_Precache("monster_tentacle.idle");
netname = "Tentacle";
model = "models/tentacle2.mdl";
base_mins = [-32,-32,0];
base_maxs = [32,32,64];
super::Spawned();
}
void
monster_tentacle::monster_tentacle(void)
{
}

View File

@ -1,54 +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_turret (0 0.8 0.8) (-16 -16 0) (16 16 72)
HALF-LIFE (1998) ENTITY
Automatic Turret (large)
*/
enum
{
TUR_IDLE,
TUR_FIRE,
TUR_SPIN,
TUR_DEPLOY,
TUR_RETIRE,
TUR_DIE
};
class monster_turret:NSMonster
{
void(void) monster_turret;
virtual void Spawned(void);
};
void monster_turret::monster_turret(void)
{
}
void monster_turret::Spawned(void)
{
netname = "Turret";
model = "models/turret.mdl";
base_mins = [-16,-16,0];
base_maxs = [16,16,72];
super::Spawned();
}

View File

@ -68,6 +68,7 @@ FX_Corpse_Spawn(player pl, float anim)
body_next.velocity = (pl.velocity) + [0,0,120];
body_next.colormap = pl.colormap;
body_next.SetFrame(anim);
body_next.frame1time = 0.0f;
body_next.ScheduleThink(FX_Corpse_Update, 0.0f);
return (entity)body_next;
}

View File

@ -582,6 +582,10 @@ player::SendEntity
float
player::SendEntity(entity ePEnt, float flChanged)
{
/* just-in-case. */
if (classname != "player")
return (0);
/* don't broadcast invisible players */
if (IsFakeSpectator() && ePEnt != this)
return (0);

View File

@ -65,20 +65,22 @@ monster_tripmine::SendEntity(entity pvsent, float flags)
void
monster_tripmine::Trip(int walkthrough)
{
float dmg;
vector explosionPos = GetOrigin();
float explosionDamage = Skill_GetValue("plr_tripmine", 150);
float explosionRadius = explosionDamage * 2.5f;
if (!walkthrough) {
real_owner = g_dmg_eAttacker;
}
/* This is to prevent infinite loops in Damage_Radius */
Death =
Pain = __NULL__;
takedamage = DAMAGE_NO;
dmg = Skill_GetValue("plr_tripmine", 150);
SetPainCallback(__NULL__);
SetDeathCallback(__NULL__);
SetTakedamage(DAMAGE_NO);
pointparticles(particleeffectnum("fx_explosion.main"), origin, [0,0,0], 1);
Damage_Radius(origin, real_owner, dmg, dmg * 2.5f, TRUE, WEAPON_TRIPMINE);
Sound_Play(self, CHAN_VOICE, "fx.explosion");
pointparticles(particleeffectnum("fx_explosion.main"), GetOrigin(), [0,0,0], 1);
Damage_Radius(explosionPos, real_owner, explosionDamage, explosionRadius, true, WEAPON_TRIPMINE);
StartSoundDef("fx.explosion", CHAN_VOICE, true);
Destroy();
}
@ -94,16 +96,16 @@ monster_tripmine::Ready(void)
traceline(origin, origin + GetForward() * 2048, FALSE, this);
/* first time we're marked as ready, we play a sound and set the distance */
if (takedamage == DAMAGE_NO) {
if (CanBeDamaged() == false) {
/* Laser calibrated to N units! */
m_vecEndPos = trace_endpos;
SetHealth(1);
SetTakedamage(DAMAGE_YES);
StartSoundDef("weapon_tripmine.activate", CHAN_WEAPON, true);
SetSolid(SOLID_BBOX);
Death =
Pain = Damaged;
SendFlags = -1;
SetPainCallback(Damaged);
SetDeathCallback(Damaged);
ForceNetworkUpdate();
}
/* laser shorter than when calibrated, explode! */
@ -204,6 +206,7 @@ void w_tripmine_precache(void)
precache_model("models/v_tripmine.mdl");
#else
precache_model("models/p_tripmine.mdl");
precache_model("models/v_tripmine.mdl");
#endif
}

View File

@ -63,7 +63,7 @@ entityDef monster_scientist
}
// pre-disaster
when "spawnflags" equals "256" {
when "spawnflags" contains "256" {
"talk_ask" ""
"talk_player_ask" "!SC_PQUEST"
"talk_player_greet" "!SC_PHELLO"

View File

@ -7,8 +7,8 @@ entityDef weapon_357
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_357.mdl"
"inv_item" "$WEAPON_PYTHON"
"model" "models/w_357.mdl"
"inv_item" "$WEAPON_PYTHON"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_9mmAR
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmAR.mdl"
"inv_item" "$WEAPON_MP5"
"model" "models/w_9mmAR.mdl"
"inv_item" "$WEAPON_MP5"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
@ -21,22 +21,22 @@ entityDef weapon_mp5
entityDef projectile_ARgrenade
{
"spawnclass" "NSProjectile"
"model" "models/grenade.mdl"
"offset" "16 0 0"
"velocity" "800 0 0"
"model" "models/grenade.mdl"
"offset" "16 0 0"
"velocity" "800 0 0"
"angular_velocity" "-300 0 0"
"gravity" "0.5"
"bounce" "1"
"mins" "0 0 0"
"maxs" "0 0 0"
"gravity" "0.5"
"bounce" "1"
"mins" "0 0 0"
"maxs" "0 0 0"
"detonate_on_fuse" "0"
"detonate_on_death" "1"
"detonate_on_world" "1"
"detonate_on_actor" "1"
"snd_explode" "fx.explosion"
"model_detonate" "fx_explosion.main"
"decal_detonate" "ExplosionScorch"
"smoke_fly" "weapon_9mmAR.nadetrail"
"model_detonate" "fx_explosion.main"
"decal_detonate" "ExplosionScorch"
"smoke_fly" "weapon_9mmAR.nadetrail"
"def_damage" "damage_ARgrneadeDirect"
"def_splash_damage" "damage_ARgrneadeSplash"

View File

@ -7,8 +7,8 @@ entityDef weapon_9mmhandgun
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_9mmhandgun.mdl"
"inv_item" "$WEAPON_GLOCK"
"model" "models/w_9mmhandgun.mdl"
"inv_item" "$WEAPON_GLOCK"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_crossbow
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crossbow.mdl"
"inv_item" "$WEAPON_CROSSBOW"
"model" "models/w_crossbow.mdl"
"inv_item" "$WEAPON_CROSSBOW"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
@ -16,13 +16,13 @@ entityDef weapon_crossbow
entityDef projectile_arrow
{
"spawnclass" "NSProjectile"
"model" "models/crossbow_bolt.mdl"
"velocity" "2000 0 0"
"model" "models/crossbow_bolt.mdl"
"velocity" "2000 0 0"
"angular_velocity" "0 0 20"
"mins" "0 0 0"
"maxs" "0 0 0"
"mins" "0 0 0"
"maxs" "0 0 0"
"def_damage" "damage_arrowDirect"
"model_detonate" "fx_spark.main"
"model_detonate" "fx_spark.main"
"snd_explode" "fx.spark"
"detonate_on_fuse" "0"
"detonate_on_death" "1"
@ -37,13 +37,13 @@ entityDef damage_arrowDirect
entityDef projectile_arrowExplosive
{
"inherit" "projectile_arrow"
"smoke_fly" "weapon_crossbow.trail"
"inherit" "projectile_arrow"
"smoke_fly" "weapon_crossbow.trail"
"def_damage" ""
"def_splash_damage" "damage_arrowSplash"
"model_detonate" "fx_explosion.main"
"model_detonate" "fx_explosion.main"
"snd_explode" "fx.explosion"
"decal_detonate" "ExplosionScorch"
"decal_detonate" "ExplosionScorch"
}
entityDef damage_arrowSplash

View File

@ -7,8 +7,8 @@ entityDef weapon_crowbar
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_crowbar.mdl"
"inv_item" "$WEAPON_CROWBAR"
"model" "models/w_crowbar.mdl"
"inv_item" "$WEAPON_CROWBAR"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_egon
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_egon.mdl"
"inv_item" "$WEAPON_EGON"
"model" "models/w_egon.mdl"
"inv_item" "$WEAPON_EGON"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_gauss
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_gauss.mdl"
"inv_item" "$WEAPON_GAUSS"
"model" "models/w_gauss.mdl"
"inv_item" "$WEAPON_GAUSS"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_handgrenade
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_grenade.mdl"
"inv_item" "$WEAPON_HANDGRENADE"
"model" "models/w_grenade.mdl"
"inv_item" "$WEAPON_HANDGRENADE"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
@ -16,16 +16,16 @@ entityDef weapon_handgrenade
entityDef projectile_handgrenade
{
"spawnclass" "NSProjectile"
"model" "models/w_grenade.mdl"
"frame" "1"
"fuse" "4"
"model" "models/w_grenade.mdl"
"frame" "1"
"fuse" "4"
"detonate_on_fuse" "1"
"bounce" "1"
"bounce" "1"
"angular_velocity" "-350 0 0"
"model_detonate" "fx_explosion.main"
"model_detonate" "fx_explosion.main"
"snd_explode" "fx.explosion"
"snd_bounce" "weapon_handgrenade.bounce"
"decal_detonate" "ExplosionScorch"
"decal_detonate" "ExplosionScorch"
"def_damage" "damage_handgrenadeDirect"
"def_splash_damage" "damage_handgrenadeSplash"

View File

@ -7,8 +7,8 @@ entityDef weapon_hornetgun
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_hgun.mdl"
"inv_item" "$WEAPON_HORNETGUN"
"model" "models/w_hgun.mdl"
"inv_item" "$WEAPON_HORNETGUN"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_rpg
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_rpg.mdl"
"inv_item" "$WEAPON_RPG"
"model" "models/w_rpg.mdl"
"inv_item" "$WEAPON_RPG"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
@ -16,49 +16,49 @@ entityDef weapon_rpg
entityDef projectile_rocket
{
"spawnclass" "NSProjectile"
"model" "models/rpgrocket.mdl"
"model" "models/rpgrocket.mdl"
"def_damage" "damage_rocketDirect"
"def_splash_damage" "damage_rocketSplash"
"health" "0"
"velocity" "250"
"angular_velocity" "0 0 200"
"fuse" "10"
"detonate_on_fuse" "0"
"detonate_on_death" "1"
"detonate_on_world" "1"
"detonate_on_actor" "1"
"health" "0"
"velocity" "250"
"angular_velocity" "0 0 200"
"fuse" "10"
"detonate_on_fuse" "0"
"detonate_on_death" "1"
"detonate_on_world" "1"
"detonate_on_actor" "1"
"impact_damage_effect" "1"
"impact_gib" "1"
"impact_gib" "1"
"thrust" "2000"
"thrust" "2000"
"thrust_start" "0.1"
"thrust_end" "2"
"smoke_fly" "weapon_rpg.trail"
"decal_detonate" "ExplosionScorch"
"model_detonate" "fx_explosion.main"
"smoke_fly" "weapon_rpg.trail"
"decal_detonate" "ExplosionScorch"
"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_color" "2 1.6 0.8"
"explode_light_radius" "320"
"explode_light_fadetime" "0.5"
"snd_explode" "fx.explosion"
"snd_explode" "fx.explosion"
}
entityDef projectile_rocket_homing
{
"inherit" "projectile_rocket"
"inherit" "projectile_rocket"
"thrust_homing" "1"
}
entityDef damage_rocketDirect
{
"damage" "skill:plr_rocketlauncher_impact"
"damage" "skill:plr_rocketlauncher_impact"
"damage_random" "skill:plr_rocketlauncher_impact_rand"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_satchel
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_satchel.mdl"
"inv_item" "$WEAPON_SATCHEL"
"model" "models/w_satchel.mdl"
"inv_item" "$WEAPON_SATCHEL"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}
@ -16,22 +16,22 @@ entityDef weapon_satchel
entityDef projectile_satchel
{
"spawnclass" "NSProjectile"
"model" "models/w_satchel.mdl"
"velocity" "274 0 0"
"model" "models/w_satchel.mdl"
"velocity" "274 0 0"
"angular_velocity" "0 400 0"
"friction" "0.8"
"gravity" "0.5"
"bounce" "1"
"frame" "1"
"mins" "-1 -1 -4"
"maxs" "1 1 4"
"friction" "0.8"
"gravity" "0.5"
"bounce" "1"
"frame" "1"
"mins" "-1 -1 -4"
"maxs" "1 1 4"
"snd_bounce" "weapon_satchel.bounce"
"inherit_velocity" "1"
"def_splash_damage" "damage_satchelExplosion"
"model_detonate" "fx_explosion.main"
"model_detonate" "fx_explosion.main"
"snd_explode" "fx.explosion"
"decal_detonate" "ExplosionScorch"
"decal_detonate" "ExplosionScorch"
}

View File

@ -7,8 +7,8 @@ entityDef weapon_shotgun
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_shotgun.mdl"
"inv_item" "$WEAPON_SHOTGUN"
"model" "models/w_shotgun.mdl"
"inv_item" "$WEAPON_SHOTGUN"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,9 +7,9 @@ entityDef weapon_snark
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/w_sqknest.mdl"
"frame" "1"
"inv_item" "$WEAPON_SNARK"
"model" "models/w_sqknest.mdl"
"frame" "1"
"inv_item" "$WEAPON_SNARK"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -7,11 +7,11 @@ entityDef weapon_tripmine
"editor_rotatable" "1"
"spawnclass" "NSItem"
"model" "models/v_tripmine.mdl"
"body0" "2"
"body1" "2"
"frame" "8"
"inv_item" "$WEAPON_TRIPMINE"
"model" "models/v_tripmine.mdl"
"body0" "2"
"body1" "2"
"frame" "8"
"inv_item" "$WEAPON_TRIPMINE"
"snd_acquire" "weapon.pickup"
"snd_respawn" "item.respawn"
}

View File

@ -77,17 +77,17 @@ r_part hotbits
}
r_part +main
{
{
lighttime 1
lightradius 350
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
lightradius 350
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
count 0 0 2
spawnorg 0 32
orgadd 32
model "sprites/fexplo.spr" framestart=0 framecount=29 framerate=20 additive scalemin=0.5 scalemax=2.5
}
}
r_part +main
{
@ -161,12 +161,12 @@ r_part spark
}
r_part +spark
{
{
lighttime 1
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
count 0 0 1
model "sprites/muzzleflash.spr" framestart=0 framecount=2 framerate=20 additive scalemin=0.1 scalemax=0.5
}
}

View File

@ -72,19 +72,19 @@ r_part smoke_grey
}
r_part water
{
{
count 0 0 1
model "sprites/wsplash3.spr" framestart=0 frameend=14 framerate=20 additive
}
}
r_part slime
{
lighttime 0.5
lightradius 256
lightradiusfade 300
lightrgb 0.0 1.0 0.0
lightrgbfade 0.0 0.0 0.0
}
{
lighttime 0.5
lightradius 256
lightradiusfade 300
lightrgb 0.0 1.0 0.0
lightrgbfade 0.0 0.0 0.0
}
r_part +slime
{
@ -93,16 +93,16 @@ r_part +slime
}
r_part lava
{
lighttime 0.5
lightradius 256
lightradiusfade 300
{
lighttime 0.5
lightradius 256
lightradiusfade 300
lightrgb 1.0 0.0 0.0
lightrgbfade 0.0 0.0 0.0
}
lightrgbfade 0.0 0.0 0.0
}
r_part +lava
{
count 0 0 1
model "sprites/wsplash3.spr" framestart=0 frameend=14 framerate=20 additive
}
}

View File

@ -17,12 +17,12 @@ r_part main
}
r_part +main
{
{
lighttime 1
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
count 0 0 1
model "sprites/muzzleflash.spr" framestart=0 framecount=2 framerate=20 additive scalemin=0.1 scalemax=0.5
}
}

View File

@ -39,11 +39,11 @@ r_part +main
// unused ricochet sprite, reactivated
r_part +main
{
{
count 0 0 1
orgadd 8
model "sprites/richo2.spr" framestart=0 framecount=15 framerate=20 additive scalemin=0.25 scalemax=0.55 alpha=0.65
}
}
// emitter for our bullet hole dust
r_part +main
@ -73,4 +73,4 @@ r_part dustparts
randomvel 10
veladd 50
gravity 800
}
}

View File

@ -18,13 +18,13 @@ r_part main
}
r_part +main
{
{
count 0 0 1
orgadd 8
model "sprites/richo1.spr" framestart=0 framecount=3 framerate=20 additive scalemin=0.5 scalemax=0.5
lighttime 1
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
}
lightradius 64
lightradiusfade 300
lightrgb 1.0 0.5 0.4
lightrgbfade 0.36 0.19 0.19
}

View File

@ -1,6 +1,5 @@
r_part nadetrail
{
step 4
die 1
type beam
@ -9,7 +8,6 @@ r_part nadetrail
emitinterval 5
}
r_part smoke
{
texture "particles/fteparticlefont.tga"
@ -23,4 +21,4 @@ r_part smoke
spawnmode ball
randomvel 10
gravity -25
}
}

View File

@ -4,7 +4,7 @@ fx.explosion
sample weapons/explode3.wav
sample weapons/explode4.wav
sample weapons/explode5.wav
shakes 1.5
shakes 3.0
}
fx.explosion_dist

View File

@ -97,4 +97,20 @@ Player.FlashLightOff
SprayCan.Paint
{
sample player/sprayer.wav
}
Player.Wade
{
sample player/pl_wade1.wav
sample player/pl_wade2.wav
sample player/pl_wade3.wav
sample player/pl_wade4.wav
}
Player.Swim
{
sample player/pl_swim1.wav
sample player/pl_swim2.wav
sample player/pl_swim3.wav
sample player/pl_swim4.wav
}