194 lines
5.4 KiB
C++
194 lines
5.4 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef NPCEVENT_H
|
|
#define NPCEVENT_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
#include "eventlist.h"
|
|
|
|
|
|
class CBaseAnimating;
|
|
|
|
struct animevent_t
|
|
{
|
|
#ifdef CLIENT_DLL
|
|
// see mstudioevent_for_client_server_t comment below
|
|
union
|
|
{
|
|
unsigned short _event_highword;
|
|
unsigned short event_newsystem;
|
|
};
|
|
unsigned short _event_lowword;
|
|
#else
|
|
// see mstudioevent_for_client_server_t comment below
|
|
unsigned short _event_highword;
|
|
union
|
|
{
|
|
unsigned short _event_lowword;
|
|
unsigned short event_newsystem;
|
|
};
|
|
#endif
|
|
|
|
const char *options;
|
|
float cycle;
|
|
float eventtime;
|
|
int type;
|
|
CBaseAnimating *pSource;
|
|
bool m_bHandledByScript;
|
|
|
|
// see mstudioevent_for_client_server_t comment below
|
|
int Event_OldSystem( void ) const { return *static_cast< const int* >( static_cast< const void* >( &_event_highword ) ); }
|
|
void Event_OldSystem( int nEvent ) { *static_cast< int* >( static_cast< void* >( &_event_highword ) ) = nEvent; }
|
|
int Event( void ) const
|
|
{
|
|
if ( type & AE_TYPE_NEWEVENTSYSTEM )
|
|
return event_newsystem;
|
|
|
|
return Event_OldSystem();
|
|
}
|
|
void Event( int nEvent )
|
|
{
|
|
if ( type & AE_TYPE_NEWEVENTSYSTEM )
|
|
{
|
|
event_newsystem = nEvent;
|
|
}
|
|
else
|
|
{
|
|
Event_OldSystem( nEvent );
|
|
}
|
|
}
|
|
};
|
|
#define EVENT_SPECIFIC 0
|
|
#define EVENT_SCRIPTED 1000 // see scriptevent.h
|
|
#define EVENT_SHARED 2000
|
|
#define EVENT_WEAPON 3000
|
|
#define EVENT_CLIENT 5000
|
|
|
|
#define NPC_EVENT_BODYDROP_LIGHT 2001
|
|
#define NPC_EVENT_BODYDROP_HEAVY 2002
|
|
|
|
#define NPC_EVENT_SWISHSOUND 2010
|
|
|
|
#define NPC_EVENT_180TURN 2020
|
|
|
|
#define NPC_EVENT_ITEM_PICKUP 2040
|
|
#define NPC_EVENT_WEAPON_DROP 2041
|
|
#define NPC_EVENT_WEAPON_SET_SEQUENCE_NAME 2042
|
|
#define NPC_EVENT_WEAPON_SET_SEQUENCE_NUMBER 2043
|
|
#define NPC_EVENT_WEAPON_SET_ACTIVITY 2044
|
|
|
|
#define NPC_EVENT_LEFTFOOT 2050
|
|
#define NPC_EVENT_RIGHTFOOT 2051
|
|
|
|
#define NPC_EVENT_OPEN_DOOR 2060
|
|
|
|
// !! DON'T CHANGE TO ORDER OF THESE. THEY ARE HARD CODED IN THE WEAPON QC FILES (YUCK!) !!
|
|
#define EVENT_WEAPON_MELEE_HIT 3001
|
|
#define EVENT_WEAPON_SMG1 3002
|
|
#define EVENT_WEAPON_MELEE_SWISH 3003
|
|
#define EVENT_WEAPON_SHOTGUN_FIRE 3004
|
|
#define EVENT_WEAPON_THROW 3005
|
|
#define EVENT_WEAPON_AR1 3006
|
|
#define EVENT_WEAPON_AR2 3007
|
|
#define EVENT_WEAPON_HMG1 3008
|
|
#define EVENT_WEAPON_SMG2 3009
|
|
#define EVENT_WEAPON_MISSILE_FIRE 3010
|
|
#define EVENT_WEAPON_SNIPER_RIFLE_FIRE 3011
|
|
#define EVENT_WEAPON_AR2_GRENADE 3012
|
|
#define EVENT_WEAPON_THROW2 3013
|
|
#define EVENT_WEAPON_PISTOL_FIRE 3014
|
|
#define EVENT_WEAPON_RELOAD 3015
|
|
#define EVENT_WEAPON_THROW3 3016
|
|
#define EVENT_WEAPON_RELOAD_SOUND 3017 // Use this + EVENT_WEAPON_RELOAD_FILL_CLIP to prevent shooting during the reload animation
|
|
#define EVENT_WEAPON_RELOAD_FILL_CLIP 3018
|
|
#define EVENT_WEAPON_SMG1_BURST1 3101 // first round in a 3-round burst
|
|
#define EVENT_WEAPON_SMG1_BURSTN 3102 // 2, 3 rounds
|
|
#define EVENT_WEAPON_AR2_ALTFIRE 3103
|
|
|
|
#define EVENT_WEAPON_SEQUENCE_FINISHED 3900
|
|
|
|
// NOTE: MUST BE THE LAST WEAPON EVENT -- ONLY WEAPON EVENTS BETWEEN EVENT_WEAPON AND THIS
|
|
#define EVENT_WEAPON_LAST 3999
|
|
|
|
|
|
// Because the client and server have a shared memory space for event data,
|
|
// but use different indexes for the event (servers cache them all upfront,
|
|
// while client creates them as sequences fire) we're going to store the server
|
|
// index in the low word and the client index in the high word.
|
|
//
|
|
// studio.h is a public header, so we'll use this matching struct to do the
|
|
// conversion and not force us to macro all the code that checks the event member.
|
|
// This struct's data MUST match mstudioevent_t
|
|
//
|
|
// BUT events that use the old event system use the entire dword which will always
|
|
// match between client and server. Instead of wrapping everything in if checks,
|
|
// for ( type & AE_TYPE_NEWEVENTSYSTEM ) we use the Event accessors to set/get
|
|
// while doing the check under the hood.
|
|
//
|
|
// -Jeep
|
|
struct mstudioevent_for_client_server_t
|
|
{
|
|
DECLARE_BYTESWAP_DATADESC();
|
|
float cycle;
|
|
#ifdef CLIENT_DLL
|
|
union
|
|
{
|
|
// Client shares with the high word
|
|
unsigned short _event_highword;
|
|
unsigned short event_newsystem;
|
|
};
|
|
unsigned short _event_lowword; // Placeholder for the low word
|
|
#else
|
|
unsigned short _event_highword; // Placeholder for the high word
|
|
union
|
|
{
|
|
// Server shares with the low word
|
|
unsigned short _event_lowword;
|
|
unsigned short event_newsystem;
|
|
};
|
|
#endif
|
|
|
|
int type;
|
|
inline const char * pszOptions( void ) const { return options; }
|
|
char options[64];
|
|
|
|
int szeventindex;
|
|
inline char * const pszEventName( void ) const { return ((char *)this) + szeventindex; }
|
|
|
|
// For setting and getting through Event, check the AE_TYPE_NEWEVENTSYSTEM flag to decide
|
|
// if we should set/get just the short used by the client/server or use the whole int.
|
|
int Event_OldSystem( void ) const { return *static_cast< const int* >( static_cast< const void* >( &_event_highword ) ); }
|
|
void Event_OldSystem( int nEvent ) { *static_cast< int* >( static_cast< void* >( &_event_highword ) ) = nEvent; }
|
|
int Event( void ) const
|
|
{
|
|
if ( type & AE_TYPE_NEWEVENTSYSTEM )
|
|
return event_newsystem;
|
|
|
|
return Event_OldSystem();
|
|
}
|
|
void Event( int nEvent )
|
|
{
|
|
if ( type & AE_TYPE_NEWEVENTSYSTEM )
|
|
{
|
|
event_newsystem = nEvent;
|
|
}
|
|
else
|
|
{
|
|
Event_OldSystem( nEvent );
|
|
}
|
|
}
|
|
};
|
|
|
|
#define mstudioevent_t mstudioevent_for_client_server_t
|
|
|
|
|
|
#endif // NPCEVENT_H
|