mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-03-12 05:22:55 +00:00
Merge @malortie's patches for Times of Troubles.
This commit is contained in:
parent
21317e7da3
commit
44ccc8a6e8
@ -111,6 +111,8 @@ BOOL CPython::Deploy()
|
|||||||
pev->body = 0;
|
pev->body = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_flSoundDelay = 0;
|
||||||
|
|
||||||
return DefaultDeploy( "models/v_357.mdl", "models/p_357.mdl", PYTHON_DRAW, "python", UseDecrement(), pev->body );
|
return DefaultDeploy( "models/v_357.mdl", "models/p_357.mdl", PYTHON_DRAW, "python", UseDecrement(), pev->body );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,6 +128,8 @@ void CPython::Holster( int skiplocal /* = 0 */ )
|
|||||||
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
|
m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 1.0;
|
||||||
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
|
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10, 15 );
|
||||||
SendWeaponAnim( PYTHON_HOLSTER );
|
SendWeaponAnim( PYTHON_HOLSTER );
|
||||||
|
|
||||||
|
m_flSoundDelay = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPython::SecondaryAttack( void )
|
void CPython::SecondaryAttack( void )
|
||||||
@ -227,9 +231,10 @@ void CPython::Reload( void )
|
|||||||
#else
|
#else
|
||||||
bUseScope = g_pGameRules->IsMultiplayer();
|
bUseScope = g_pGameRules->IsMultiplayer();
|
||||||
#endif
|
#endif
|
||||||
if( DefaultReload( 6, PYTHON_RELOAD, 2.0, bUseScope ) )
|
int iResult = DefaultReload( PYTHON_MAX_CLIP, PYTHON_RELOAD, 2.0, bUseScope );
|
||||||
|
if( iResult )
|
||||||
{
|
{
|
||||||
m_flSoundDelay = 1.5;
|
m_flSoundDelay = gpGlobals->time + 1.5f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,7 +245,7 @@ void CPython::WeaponIdle( void )
|
|||||||
m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
|
m_pPlayer->GetAutoaimVector( AUTOAIM_10DEGREES );
|
||||||
|
|
||||||
// ALERT( at_console, "%.2f\n", gpGlobals->time - m_flSoundDelay );
|
// ALERT( at_console, "%.2f\n", gpGlobals->time - m_flSoundDelay );
|
||||||
if( m_flSoundDelay != 0 && m_flSoundDelay <= UTIL_WeaponTimeBase() )
|
if( m_flSoundDelay != 0 && ( m_flSoundDelay <= UTIL_WeaponTimeBase() || m_flSoundDelay <= gpGlobals->time ) )
|
||||||
{
|
{
|
||||||
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_reload1.wav", RANDOM_FLOAT( 0.8, 0.9 ), ATTN_NORM );
|
EMIT_SOUND( ENT( m_pPlayer->pev ), CHAN_WEAPON, "weapons/357_reload1.wav", RANDOM_FLOAT( 0.8, 0.9 ), ATTN_NORM );
|
||||||
m_flSoundDelay = 0;
|
m_flSoundDelay = 0;
|
||||||
|
@ -26,16 +26,7 @@
|
|||||||
#include "scripted.h"
|
#include "scripted.h"
|
||||||
#include "animation.h"
|
#include "animation.h"
|
||||||
#include "soundent.h"
|
#include "soundent.h"
|
||||||
|
#include "scientist.h"
|
||||||
#define NUM_SCIENTIST_HEADS 4 // four heads available for scientist model
|
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
HEAD_GLASSES = 0,
|
|
||||||
HEAD_EINSTEIN = 1,
|
|
||||||
HEAD_LUTHER = 2,
|
|
||||||
HEAD_SLICK = 3
|
|
||||||
};
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
@ -68,56 +59,6 @@ enum
|
|||||||
//=======================================================
|
//=======================================================
|
||||||
// Scientist
|
// Scientist
|
||||||
//=======================================================
|
//=======================================================
|
||||||
class CScientist : public CTalkMonster
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Spawn( void );
|
|
||||||
void Precache( void );
|
|
||||||
|
|
||||||
void SetYawSpeed( void );
|
|
||||||
int Classify( void );
|
|
||||||
void HandleAnimEvent( MonsterEvent_t *pEvent );
|
|
||||||
void RunTask( Task_t *pTask );
|
|
||||||
void StartTask( Task_t *pTask );
|
|
||||||
int ObjectCaps( void ) { return CTalkMonster::ObjectCaps() | FCAP_IMPULSE_USE; }
|
|
||||||
int TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType );
|
|
||||||
virtual int FriendNumber( int arrayNumber );
|
|
||||||
void SetActivity( Activity newActivity );
|
|
||||||
Activity GetStoppedActivity( void );
|
|
||||||
int ISoundMask( void );
|
|
||||||
void DeclineFollowing( void );
|
|
||||||
|
|
||||||
float CoverRadius( void ) { return 1200; } // Need more room for cover because scientists want to get far away!
|
|
||||||
BOOL DisregardEnemy( CBaseEntity *pEnemy ) { return !pEnemy->IsAlive() || ( gpGlobals->time - m_fearTime ) > 15; }
|
|
||||||
|
|
||||||
BOOL CanHeal( void );
|
|
||||||
void Heal( void );
|
|
||||||
void Scream( void );
|
|
||||||
|
|
||||||
// Override these to set behavior
|
|
||||||
Schedule_t *GetScheduleOfType( int Type );
|
|
||||||
Schedule_t *GetSchedule( void );
|
|
||||||
MONSTERSTATE GetIdealState( void );
|
|
||||||
|
|
||||||
void DeathSound( void );
|
|
||||||
void PainSound( void );
|
|
||||||
|
|
||||||
void TalkInit( void );
|
|
||||||
|
|
||||||
void Killed( entvars_t *pevAttacker, int iGib );
|
|
||||||
|
|
||||||
virtual int Save( CSave &save );
|
|
||||||
virtual int Restore( CRestore &restore );
|
|
||||||
static TYPEDESCRIPTION m_SaveData[];
|
|
||||||
|
|
||||||
CUSTOM_SCHEDULES
|
|
||||||
|
|
||||||
private:
|
|
||||||
float m_painTime;
|
|
||||||
float m_healTime;
|
|
||||||
float m_fearTime;
|
|
||||||
};
|
|
||||||
|
|
||||||
LINK_ENTITY_TO_CLASS( monster_scientist, CScientist )
|
LINK_ENTITY_TO_CLASS( monster_scientist, CScientist )
|
||||||
|
|
||||||
TYPEDESCRIPTION CScientist::m_SaveData[] =
|
TYPEDESCRIPTION CScientist::m_SaveData[] =
|
||||||
@ -1082,20 +1023,6 @@ int CScientist::FriendNumber( int arrayNumber )
|
|||||||
//=========================================================
|
//=========================================================
|
||||||
// Dead Scientist PROP
|
// Dead Scientist PROP
|
||||||
//=========================================================
|
//=========================================================
|
||||||
class CDeadScientist : public CBaseMonster
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Spawn( void );
|
|
||||||
int Classify( void )
|
|
||||||
{
|
|
||||||
return CLASS_HUMAN_PASSIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void KeyValue( KeyValueData *pkvd );
|
|
||||||
int m_iPose;// which sequence to display
|
|
||||||
static char *m_szPoses[7];
|
|
||||||
};
|
|
||||||
|
|
||||||
char *CDeadScientist::m_szPoses[] =
|
char *CDeadScientist::m_szPoses[] =
|
||||||
{
|
{
|
||||||
"lying_on_back",
|
"lying_on_back",
|
||||||
|
93
dlls/scientist.h
Normal file
93
dlls/scientist.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* This product contains software technology licensed from Id
|
||||||
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This source code contains proprietary and confidential information of
|
||||||
|
* Valve LLC and its suppliers. Access to this code is restricted to
|
||||||
|
* persons who have executed a written SDK license with Valve. Any access,
|
||||||
|
* use or distribution of this code by or to any unlicensed person is illegal.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
#ifndef SCIENTIST_H
|
||||||
|
#define SCIENTIST_H
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( TOT_DLL )
|
||||||
|
#define NUM_SCIENTIST_HEADS 4 // four heads available for scientist model
|
||||||
|
enum { HEAD_GLASSES = 0, HEAD_EINSTEIN = 1, HEAD_LUTHER = 2, HEAD_SLICK = 3 };
|
||||||
|
|
||||||
|
//=======================================================
|
||||||
|
// Scientist
|
||||||
|
//=======================================================
|
||||||
|
|
||||||
|
class CScientist : public CTalkMonster
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void Spawn(void);
|
||||||
|
virtual void Precache(void);
|
||||||
|
|
||||||
|
void SetYawSpeed(void);
|
||||||
|
int Classify(void);
|
||||||
|
void HandleAnimEvent(MonsterEvent_t *pEvent);
|
||||||
|
void RunTask(Task_t *pTask);
|
||||||
|
void StartTask(Task_t *pTask);
|
||||||
|
int ObjectCaps(void) { return CTalkMonster::ObjectCaps() | FCAP_IMPULSE_USE; }
|
||||||
|
int TakeDamage(entvars_t* pevInflictor, entvars_t* pevAttacker, float flDamage, int bitsDamageType);
|
||||||
|
virtual int FriendNumber(int arrayNumber);
|
||||||
|
void SetActivity(Activity newActivity);
|
||||||
|
Activity GetStoppedActivity(void);
|
||||||
|
int ISoundMask(void);
|
||||||
|
void DeclineFollowing(void);
|
||||||
|
|
||||||
|
float CoverRadius(void) { return 1200; } // Need more room for cover because scientists want to get far away!
|
||||||
|
BOOL DisregardEnemy(CBaseEntity *pEnemy) { return !pEnemy->IsAlive() || (gpGlobals->time - m_fearTime) > 15; }
|
||||||
|
|
||||||
|
virtual BOOL CanHeal(void);
|
||||||
|
void Heal(void);
|
||||||
|
void Scream(void);
|
||||||
|
|
||||||
|
// Override these to set behavior
|
||||||
|
Schedule_t *GetScheduleOfType(int Type);
|
||||||
|
Schedule_t *GetSchedule(void);
|
||||||
|
MONSTERSTATE GetIdealState(void);
|
||||||
|
|
||||||
|
void DeathSound(void);
|
||||||
|
void PainSound(void);
|
||||||
|
|
||||||
|
void TalkInit(void);
|
||||||
|
|
||||||
|
void Killed(entvars_t *pevAttacker, int iGib);
|
||||||
|
|
||||||
|
virtual int Save(CSave &save);
|
||||||
|
virtual int Restore(CRestore &restore);
|
||||||
|
static TYPEDESCRIPTION m_SaveData[];
|
||||||
|
|
||||||
|
CUSTOM_SCHEDULES;
|
||||||
|
|
||||||
|
private:
|
||||||
|
float m_painTime;
|
||||||
|
float m_healTime;
|
||||||
|
float m_fearTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
//=========================================================
|
||||||
|
// Dead Scientist PROP
|
||||||
|
//=========================================================
|
||||||
|
class CDeadScientist : public CBaseMonster
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void Spawn(void);
|
||||||
|
int Classify(void) { return CLASS_HUMAN_PASSIVE; }
|
||||||
|
|
||||||
|
void KeyValue(KeyValueData *pkvd);
|
||||||
|
int m_iPose;// which sequence to display
|
||||||
|
static char *m_szPoses[7];
|
||||||
|
};
|
||||||
|
#endif // defined ( TOT_DLL )
|
||||||
|
|
||||||
|
#endif // SCIENTIST_H
|
@ -372,6 +372,32 @@ void CCineMonster::PossessEntity( void )
|
|||||||
pTarget->pev->framerate = 0;
|
pTarget->pev->framerate = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Fix a bug where barney would not run to the osprey on map 7.
|
||||||
|
//
|
||||||
|
if( FStrEq( STRING( gpGlobals->mapname ), "map7" ) )
|
||||||
|
{
|
||||||
|
if( FStrEq(STRING( pev->target ), "jan_osprey15" ) )
|
||||||
|
{
|
||||||
|
CCineMonster *pSeq = (CCineMonster*)UTIL_FindEntityByTargetname( NULL, "jan_osprey3" );
|
||||||
|
if( pSeq )
|
||||||
|
{
|
||||||
|
pTarget->m_pGoalEnt = pSeq;
|
||||||
|
pTarget->m_pCine = pSeq;
|
||||||
|
pTarget->m_hTargetEnt = pSeq;
|
||||||
|
|
||||||
|
UTIL_SetOrigin( pTarget->pev, pSeq->pev->origin );
|
||||||
|
pTarget->pev->ideal_yaw = pSeq->pev->angles.y;
|
||||||
|
pTarget->pev->avelocity = Vector( 0, 0, 0 );
|
||||||
|
pTarget->pev->velocity = Vector( 0, 0, 0 );
|
||||||
|
pTarget->pev->effects |= EF_NOINTERP;
|
||||||
|
pTarget->pev->angles.y = pSeq->pev->angles.y;
|
||||||
|
pTarget->m_scriptState = SCRIPT_WAIT;
|
||||||
|
m_startTime = gpGlobals->time + 1E6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
143
dlls/tot/civ.cpp
Normal file
143
dlls/tot/civ.cpp
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
/***
|
||||||
|
*
|
||||||
|
* Copyright (c) 1996-2001, Valve LLC. All rights reserved.
|
||||||
|
*
|
||||||
|
* This product contains software technology licensed from Id
|
||||||
|
* Software, Inc. ("Id Technology"). Id Technology (c) 1996 Id Software, Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This source code contains proprietary and confidential information of
|
||||||
|
* Valve LLC and its suppliers. Access to this code is restricted to
|
||||||
|
* persons who have executed a written SDK license with Valve. Any access,
|
||||||
|
* use or distribution of this code by or to any unlicensed person is illegal.
|
||||||
|
*
|
||||||
|
****/
|
||||||
|
|
||||||
|
#include "extdll.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "cbase.h"
|
||||||
|
#include "monsters.h"
|
||||||
|
#include "talkmonster.h"
|
||||||
|
#include "schedule.h"
|
||||||
|
#include "defaultai.h"
|
||||||
|
#include "scripted.h"
|
||||||
|
#include "animation.h"
|
||||||
|
#include "soundent.h"
|
||||||
|
#include "scientist.h"
|
||||||
|
|
||||||
|
class CCivScientist : public CScientist
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Spawn(void);
|
||||||
|
void Precache(void);
|
||||||
|
|
||||||
|
BOOL CanHeal(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
LINK_ENTITY_TO_CLASS(monster_civ, CCivScientist);
|
||||||
|
|
||||||
|
|
||||||
|
//=========================================================
|
||||||
|
// Spawn
|
||||||
|
//=========================================================
|
||||||
|
void CCivScientist::Spawn(void)
|
||||||
|
{
|
||||||
|
Precache();
|
||||||
|
|
||||||
|
SET_MODEL(ENT(pev), "models/civ_sci.mdl");
|
||||||
|
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX);
|
||||||
|
|
||||||
|
pev->solid = SOLID_SLIDEBOX;
|
||||||
|
pev->movetype = MOVETYPE_STEP;
|
||||||
|
m_bloodColor = BLOOD_COLOR_RED;
|
||||||
|
pev->health = gSkillData.scientistHealth;
|
||||||
|
pev->view_ofs = Vector(0, 0, 50);// position of the eyes relative to monster's origin.
|
||||||
|
m_flFieldOfView = VIEW_FIELD_WIDE; // NOTE: we need a wide field of view so scientists will notice player and say hello
|
||||||
|
m_MonsterState = MONSTERSTATE_NONE;
|
||||||
|
|
||||||
|
// m_flDistTooFar = 256.0;
|
||||||
|
|
||||||
|
m_afCapability = bits_CAP_HEAR | bits_CAP_TURN_HEAD | bits_CAP_OPEN_DOORS | bits_CAP_AUTO_DOORS | bits_CAP_USE;
|
||||||
|
|
||||||
|
// White hands
|
||||||
|
pev->skin = 0;
|
||||||
|
|
||||||
|
if (pev->body == -1)
|
||||||
|
{// -1 chooses a random head
|
||||||
|
pev->body = RANDOM_LONG(0, NUM_SCIENTIST_HEADS - 1);// pick a head, any head
|
||||||
|
}
|
||||||
|
|
||||||
|
// Luther is black, make his hands black
|
||||||
|
if (pev->body == HEAD_LUTHER)
|
||||||
|
pev->skin = 1;
|
||||||
|
|
||||||
|
MonsterInit();
|
||||||
|
SetUse(&CCivScientist::FollowerUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=========================================================
|
||||||
|
// Precache - precaches all resources this monster needs
|
||||||
|
//=========================================================
|
||||||
|
void CCivScientist::Precache(void)
|
||||||
|
{
|
||||||
|
CScientist::Precache();
|
||||||
|
|
||||||
|
PRECACHE_MODEL("models/civ_sci.mdl");
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL CCivScientist::CanHeal(void)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=========================================================
|
||||||
|
// Dead Scientist PROP
|
||||||
|
//=========================================================
|
||||||
|
class CDeadCivScientist : public CDeadScientist
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Spawn(void);
|
||||||
|
|
||||||
|
static char *m_szPoses[7];
|
||||||
|
};
|
||||||
|
|
||||||
|
char *CDeadCivScientist::m_szPoses[] = { "lying_on_back", "lying_on_stomach", "dead_sitting", "dead_hang", "dead_table1", "dead_table2", "dead_table3" };
|
||||||
|
|
||||||
|
LINK_ENTITY_TO_CLASS(monster_civ_dead, CDeadCivScientist);
|
||||||
|
|
||||||
|
//
|
||||||
|
// ********** DeadScientist SPAWN **********
|
||||||
|
//
|
||||||
|
void CDeadCivScientist::Spawn()
|
||||||
|
{
|
||||||
|
PRECACHE_MODEL("models/civ_sci.mdl");
|
||||||
|
SET_MODEL(ENT(pev), "models/civ_sci.mdl");
|
||||||
|
|
||||||
|
pev->effects = 0;
|
||||||
|
pev->sequence = 0;
|
||||||
|
// Corpses have less health
|
||||||
|
pev->health = 8;//gSkillData.scientistHealth;
|
||||||
|
|
||||||
|
m_bloodColor = BLOOD_COLOR_RED;
|
||||||
|
|
||||||
|
if (pev->body == -1)
|
||||||
|
{// -1 chooses a random head
|
||||||
|
pev->body = RANDOM_LONG(0, NUM_SCIENTIST_HEADS - 1);// pick a head, any head
|
||||||
|
}
|
||||||
|
// Luther is black, make his hands black
|
||||||
|
if (pev->body == HEAD_LUTHER)
|
||||||
|
pev->skin = 1;
|
||||||
|
else
|
||||||
|
pev->skin = 0;
|
||||||
|
|
||||||
|
pev->sequence = LookupSequence(m_szPoses[m_iPose]);
|
||||||
|
if (pev->sequence == -1)
|
||||||
|
{
|
||||||
|
ALERT(at_console, "Dead scientist with bad pose\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// pev->skin += 2; // use bloody skin -- UNDONE: Turn this back on when we have a bloody skin again!
|
||||||
|
MonsterInitDead();
|
||||||
|
}
|
@ -1527,3 +1527,10 @@ TYPEDESCRIPTION CSatchel::m_SaveData[] =
|
|||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )
|
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )
|
||||||
|
|
||||||
|
TYPEDESCRIPTION CPython::m_SaveData[] =
|
||||||
|
{
|
||||||
|
DEFINE_FIELD( CPython, m_flSoundDelay, FIELD_TIME ),
|
||||||
|
};
|
||||||
|
|
||||||
|
IMPLEMENT_SAVERESTORE( CPython, CBasePlayerWeapon )
|
||||||
|
@ -514,6 +514,11 @@ private:
|
|||||||
class CPython : public CBasePlayerWeapon
|
class CPython : public CBasePlayerWeapon
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
#ifndef CLIENT_DLL
|
||||||
|
int Save( CSave &save );
|
||||||
|
int Restore( CRestore &restore );
|
||||||
|
static TYPEDESCRIPTION m_SaveData[];
|
||||||
|
#endif
|
||||||
void Spawn( void );
|
void Spawn( void );
|
||||||
void Precache( void );
|
void Precache( void );
|
||||||
int iItemSlot( void ) { return 2; }
|
int iItemSlot( void ) { return 2; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user