Merge branch 'tot' into mobile_hacks

This commit is contained in:
Andrey Akhmichin 2019-11-30 17:55:38 +05:00
commit 77daf36fea
11 changed files with 304 additions and 75 deletions

View File

@ -127,6 +127,7 @@ LOCAL_SRC_FILES := agrunt.cpp airtank.cpp \
xen.cpp \
zombie.cpp \
redempt/roy.cpp \
tot/civ.cpp \
../pm_shared/pm_debug.c \
../pm_shared/pm_math.c \
../pm_shared/pm_shared.c

View File

@ -43,7 +43,8 @@ else()
add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE)
endif()
set (SVDLL_SOURCES
set (SVDLL_SOURCES
tot/civ.cpp
agrunt.cpp
airtank.cpp
aflock.cpp

View File

@ -49,6 +49,7 @@ public:
int m_iJuice;
int m_iOn; // 0 = off, 1 = startup, 2 = going
float m_flSoundTime;
BOOL m_bTriggerable;
};
TYPEDESCRIPTION CRecharge::m_SaveData[] =
@ -58,6 +59,7 @@ TYPEDESCRIPTION CRecharge::m_SaveData[] =
DEFINE_FIELD( CRecharge, m_iJuice, FIELD_INTEGER ),
DEFINE_FIELD( CRecharge, m_iOn, FIELD_INTEGER ),
DEFINE_FIELD( CRecharge, m_flSoundTime, FIELD_TIME ),
DEFINE_FIELD( CRecharge, m_bTriggerable, FIELD_BOOLEAN )
};
IMPLEMENT_SAVERESTORE( CRecharge, CBaseEntity )
@ -94,6 +96,7 @@ void CRecharge::Spawn()
UTIL_SetSize( pev, pev->mins, pev->maxs );
SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_iJuice = (int)gSkillData.suitchargerCapacity;
m_bTriggerable = !FStringNull( pev->target );
pev->frame = 0;
}
@ -118,6 +121,11 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
if( m_iJuice <= 0 )
{
pev->frame = 1;
if( m_bTriggerable )
{
FireTargets( STRING( pev->target ), pActivator, this, USE_TOGGLE, 0 );
m_bTriggerable = FALSE;
}
Off();
}
@ -172,6 +180,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
void CRecharge::Recharge( void )
{
m_iJuice = (int)gSkillData.suitchargerCapacity;
m_bTriggerable = !FStringNull( pev->target );
pev->frame = 0;
SetThink( &CBaseEntity::SUB_DoNothing );
}

View File

@ -116,6 +116,7 @@ public:
int m_iJuice;
int m_iOn; // 0 = off, 1 = startup, 2 = going
float m_flSoundTime;
BOOL m_bTriggerable;
};
TYPEDESCRIPTION CWallHealth::m_SaveData[] =
@ -125,6 +126,7 @@ TYPEDESCRIPTION CWallHealth::m_SaveData[] =
DEFINE_FIELD( CWallHealth, m_iJuice, FIELD_INTEGER ),
DEFINE_FIELD( CWallHealth, m_iOn, FIELD_INTEGER ),
DEFINE_FIELD( CWallHealth, m_flSoundTime, FIELD_TIME ),
DEFINE_FIELD( CWallHealth, m_bTriggerable, FIELD_BOOLEAN )
};
IMPLEMENT_SAVERESTORE( CWallHealth, CBaseEntity )
@ -161,6 +163,7 @@ void CWallHealth::Spawn()
UTIL_SetSize( pev, pev->mins, pev->maxs );
SET_MODEL( ENT( pev ), STRING( pev->model ) );
m_iJuice = (int)gSkillData.healthchargerCapacity;
m_bTriggerable = !FStringNull( pev->target );
pev->frame = 0;
}
@ -183,6 +186,11 @@ void CWallHealth::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE u
// if there is no juice left, turn it off
if( m_iJuice <= 0 )
{
if( m_bTriggerable )
{
FireTargets( STRING( pev->target ), pActivator, this, USE_TOGGLE, 0 );
m_bTriggerable = FALSE;
}
pev->frame = 1;
Off();
}
@ -232,6 +240,7 @@ void CWallHealth::Recharge( void )
{
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/medshot4.wav", 1.0, ATTN_NORM );
m_iJuice = (int)gSkillData.healthchargerCapacity;
m_bTriggerable = !FStringNull( pev->target );
pev->frame = 0;
SetThink( &CBaseEntity::SUB_DoNothing );
}

View File

@ -111,6 +111,8 @@ BOOL CPython::Deploy()
pev->body = 0;
}
m_flSoundDelay = 0;
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.0f;
m_flTimeWeaponIdle = UTIL_WeaponTimeBase() + UTIL_SharedRandomFloat( m_pPlayer->random_seed, 10.0f, 15.0f );
SendWeaponAnim( PYTHON_HOLSTER );
m_flSoundDelay = 0;
}
void CPython::SecondaryAttack( void )

View File

@ -26,16 +26,7 @@
#include "scripted.h"
#include "animation.h"
#include "soundent.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
};
#include "scientist.h"
enum
{
@ -68,56 +59,6 @@ enum
//=======================================================
// 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_rosenberg, CScientist )
@ -1180,20 +1121,6 @@ int CScientist::FriendNumber( int arrayNumber )
//=========================================================
// 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 const char *m_szPoses[7];
};
const char *CDeadScientist::m_szPoses[] =
{
"lying_on_back",

97
dlls/scientist.h Normal file
View File

@ -0,0 +1,97 @@
/***
*
* 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
#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 const char *m_szPoses[7];
};
#endif // SCIENTIST_H

View File

@ -372,6 +372,32 @@ void CCineMonster::PossessEntity( void )
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
View 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 const char *m_szPoses[7];
};
const 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();
}

View File

@ -1630,3 +1630,10 @@ TYPEDESCRIPTION CSatchel::m_SaveData[] =
};
IMPLEMENT_SAVERESTORE( CSatchel, CBasePlayerWeapon )
TYPEDESCRIPTION CPython::m_SaveData[] =
{
DEFINE_FIELD( CPython, m_flSoundDelay, FIELD_TIME ),
};
IMPLEMENT_SAVERESTORE( CPython, CBasePlayerWeapon )

View File

@ -526,6 +526,11 @@ private:
class CPython : public CBasePlayerWeapon
{
public:
#ifndef CLIENT_DLL
int Save( CSave &save );
int Restore( CRestore &restore );
static TYPEDESCRIPTION m_SaveData[];
#endif
void Spawn( void );
void Precache( void );
int iItemSlot( void ) { return 2; }