This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

329 lines
16 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef ITOOLENTITY_H
#define ITOOLENTITY_H
#ifdef _WIN32
#pragma once
#endif
#include "../Color.h"
#include "../basehandle.h"
#include "../engine/ishadowmgr.h"
#include "../iclientrenderable.h"
#include "../tier1/interface.h"
#include "../tier1/utlvector.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class IServerEntity;
class IClientEntity;
class IToolSystem;
class IClientRenderable;
class Vector;
class QAngle;
class CBaseEntity;
class CBaseAnimating;
class CTakeDamageInfo;
class ITempEntsSystem;
class IEntityFactoryDictionary;
class CBaseTempEntity;
class CGlobalEntityList;
class IEntityFindFilter;
//-----------------------------------------------------------------------------
// Safe accessor to an entity
//-----------------------------------------------------------------------------
typedef unsigned int HTOOLHANDLE;
enum { HTOOLHANDLE_INVALID = 0 };
//-----------------------------------------------------------------------------
// If you change this, change the flags in IClientShadowMgr.h also
//-----------------------------------------------------------------------------
enum ClientShadowFlags_t {
SHADOW_FLAGS_USE_RENDER_TO_TEXTURE = (SHADOW_FLAGS_LAST_FLAG << 1),
SHADOW_FLAGS_ANIMATING_SOURCE = (SHADOW_FLAGS_LAST_FLAG << 2),
SHADOW_FLAGS_USE_DEPTH_TEXTURE = (SHADOW_FLAGS_LAST_FLAG << 3),
// Update this if you add flags
CLIENT_SHADOW_FLAGS_LAST_FLAG = SHADOW_FLAGS_USE_DEPTH_TEXTURE
};
//-----------------------------------------------------------------------------
// Opaque pointer returned from Find* methods, don't store this, you need to
// Attach it to a tool entity or discard after searching
//-----------------------------------------------------------------------------
typedef void *EntitySearchResult;
//-----------------------------------------------------------------------------
// Purpose: Client side tool interace (right now just handles
// IClientRenderables).
// In theory could support hooking into client side entities directly
//-----------------------------------------------------------------------------
class IClientTools : public IBaseInterface {
public:
// Allocates or returns the handle to an entity previously found using the
// Find* APIs below
virtual HTOOLHANDLE AttachToEntity(EntitySearchResult entityToAttach) = 0;
virtual void DetachFromEntity(EntitySearchResult entityToDetach) = 0;
// Checks whether a handle is still valid.
virtual bool IsValidHandle(HTOOLHANDLE handle) = 0;
// Iterates the list of entities which have been associated with tools
virtual int GetNumRecordables() = 0;
virtual HTOOLHANDLE GetRecordable(int index) = 0;
// Iterates through ALL entities (separate list for client vs. server)
virtual EntitySearchResult NextEntity(EntitySearchResult currentEnt) = 0;
EntitySearchResult FirstEntity() { return NextEntity(NULL); }
// Use this to turn on/off the presence of an underlying game entity
virtual void SetEnabled(HTOOLHANDLE handle, bool enabled) = 0;
// Use this to tell an entity to post "state" to all listening tools
virtual void SetRecording(HTOOLHANDLE handle, bool recording) = 0;
// Some entities are marked with ShouldRecordInTools false, such as ui
// entities, etc.
virtual bool ShouldRecord(HTOOLHANDLE handle) = 0;
virtual HTOOLHANDLE GetToolHandleForEntityByIndex(int entindex) = 0;
virtual int GetModelIndex(HTOOLHANDLE handle) = 0;
virtual const char *GetModelName(HTOOLHANDLE handle) = 0;
virtual const char *GetClassname(HTOOLHANDLE handle) = 0;
virtual void AddClientRenderable(IClientRenderable *pRenderable,
int renderGroup) = 0;
virtual void RemoveClientRenderable(IClientRenderable *pRenderable) = 0;
virtual void SetRenderGroup(IClientRenderable *pRenderable,
int renderGroup) = 0;
virtual void MarkClientRenderableDirty(IClientRenderable *pRenderable) = 0;
virtual void UpdateProjectedTexture(ClientShadowHandle_t h,
bool bForce) = 0;
virtual bool DrawSprite(IClientRenderable *pRenderable, float scale,
float frame, int rendermode, int renderfx,
const Color &color, float flProxyRadius,
int *pVisHandle) = 0;
virtual EntitySearchResult GetLocalPlayer() = 0;
virtual bool GetLocalPlayerEyePosition(Vector &org, QAngle &ang,
float &fov) = 0;
// See ClientShadowFlags_t above
virtual ClientShadowHandle_t CreateShadow(CBaseHandle handle,
int nFlags) = 0;
virtual void DestroyShadow(ClientShadowHandle_t h) = 0;
virtual ClientShadowHandle_t CreateFlashlight(
const FlashlightState_t &lightState) = 0;
virtual void DestroyFlashlight(ClientShadowHandle_t h) = 0;
virtual void UpdateFlashlightState(ClientShadowHandle_t h,
const FlashlightState_t &lightState) = 0;
virtual void AddToDirtyShadowList(ClientShadowHandle_t h,
bool force = false) = 0;
virtual void MarkRenderToTextureShadowDirty(ClientShadowHandle_t h) = 0;
// Global toggle for recording
virtual void EnableRecordingMode(bool bEnable) = 0;
virtual bool IsInRecordingMode() const = 0;
// Trigger a temp entity
virtual void TriggerTempEntity(KeyValues *pKeyValues) = 0;
// get owning weapon (for viewmodels)
virtual int GetOwningWeaponEntIndex(int entindex) = 0;
virtual int GetEntIndex(EntitySearchResult entityToAttach) = 0;
virtual int FindGlobalFlexcontroller(char const *name) = 0;
virtual char const *GetGlobalFlexControllerName(int idx) = 0;
// helper for traversing ownership hierarchy
virtual EntitySearchResult GetOwnerEntity(
EntitySearchResult currentEnt) = 0;
// common and useful types to query for hierarchically
virtual bool IsPlayer(EntitySearchResult currentEnt) = 0;
virtual bool IsBaseCombatCharacter(EntitySearchResult currentEnt) = 0;
virtual bool IsNPC(EntitySearchResult currentEnt) = 0;
virtual Vector GetAbsOrigin(HTOOLHANDLE handle) = 0;
virtual QAngle GetAbsAngles(HTOOLHANDLE handle) = 0;
// This reloads a portion or all of a particle definition file.
// It's up to the client to decide if it cares about this file
// Use a UtlBuffer to crack the data
virtual void ReloadParticleDefintions(const char *pFileName,
const void *pBufData, int nLen) = 0;
// Sends a mesage from the tool to the client
virtual void PostToolMessage(KeyValues *pKeyValues) = 0;
// Indicates whether the client should render particle systems
virtual void EnableParticleSystems(bool bEnable) = 0;
// Is the game rendering in 3rd person mode?
virtual bool IsRenderingThirdPerson() const = 0;
};
#define VCLIENTTOOLS_INTERFACE_VERSION "VCLIENTTOOLS001"
//-----------------------------------------------------------------------------
// Purpose: Interface from engine to tools for manipulating entities
//-----------------------------------------------------------------------------
class IServerTools : public IBaseInterface {
public:
virtual IServerEntity *GetIServerEntity(IClientEntity *pClientEntity) = 0;
virtual bool SnapPlayerToPosition(const Vector &org, const QAngle &ang,
IClientEntity *pClientPlayer = NULL) = 0;
virtual bool GetPlayerPosition(Vector &org, QAngle &ang,
IClientEntity *pClientPlayer = NULL) = 0;
virtual bool SetPlayerFOV(int fov, IClientEntity *pClientPlayer = NULL) = 0;
virtual int GetPlayerFOV(IClientEntity *pClientPlayer = NULL) = 0;
virtual bool IsInNoClipMode(IClientEntity *pClientPlayer = NULL) = 0;
// entity searching
virtual CBaseEntity *FirstEntity(void) = 0;
virtual CBaseEntity *NextEntity(CBaseEntity *pEntity) = 0;
virtual CBaseEntity *FindEntityByHammerID(int iHammerID) = 0;
// entity query
virtual bool GetKeyValue(CBaseEntity *pEntity, const char *szField,
char *szValue, int iMaxLen) = 0;
virtual bool SetKeyValue(CBaseEntity *pEntity, const char *szField,
const char *szValue) = 0;
virtual bool SetKeyValue(CBaseEntity *pEntity, const char *szField,
float flValue) = 0;
virtual bool SetKeyValue(CBaseEntity *pEntity, const char *szField,
const Vector &vecValue) = 0;
// entity spawning
virtual CBaseEntity *CreateEntityByName(const char *szClassName) = 0;
virtual void DispatchSpawn(CBaseEntity *pEntity) = 0;
// This reloads a portion or all of a particle definition file.
// It's up to the server to decide if it cares about this file
// Use a UtlBuffer to crack the data
virtual void ReloadParticleDefintions(const char *pFileName,
const void *pBufData, int nLen) = 0;
virtual void AddOriginToPVS(const Vector &org) = 0;
virtual void MoveEngineViewTo(const Vector &vPos,
const QAngle &vAngles) = 0;
virtual bool DestroyEntityByHammerId(int iHammerID) = 0;
virtual CBaseEntity *GetBaseEntityByEntIndex(int iEntIndex) = 0;
virtual void RemoveEntity(CBaseEntity *pEntity) = 0;
virtual void RemoveEntityImmediate(CBaseEntity *pEntity) = 0;
virtual IEntityFactoryDictionary *GetEntityFactoryDictionary(void) = 0;
virtual void SetMoveType(CBaseEntity *pEntity, int val) = 0;
virtual void SetMoveType(CBaseEntity *pEntity, int val,
int moveCollide) = 0;
virtual void ResetSequence(CBaseAnimating *pEntity, int nSequence) = 0;
virtual void ResetSequenceInfo(CBaseAnimating *pEntity) = 0;
virtual void ClearMultiDamage(void) = 0;
virtual void ApplyMultiDamage(void) = 0;
virtual void AddMultiDamage(const CTakeDamageInfo &pTakeDamageInfo,
CBaseEntity *pEntity) = 0;
virtual void RadiusDamage(const CTakeDamageInfo &info, const Vector &vecSrc,
float flRadius, int iClassIgnore,
CBaseEntity *pEntityIgnore) = 0;
virtual ITempEntsSystem *GetTempEntsSystem(void) = 0;
virtual CBaseTempEntity *GetTempEntList(void) = 0;
virtual CGlobalEntityList *GetEntityList(void) = 0;
virtual bool IsEntityPtr(void *pTest) = 0;
virtual CBaseEntity *FindEntityByClassname(CBaseEntity *pStartEntity,
const char *szName) = 0;
virtual CBaseEntity *FindEntityByName(
CBaseEntity *pStartEntity, const char *szName,
CBaseEntity *pSearchingEntity = NULL, CBaseEntity *pActivator = NULL,
CBaseEntity *pCaller = NULL, IEntityFindFilter *pFilter = NULL) = 0;
virtual CBaseEntity *FindEntityInSphere(CBaseEntity *pStartEntity,
const Vector &vecCenter,
float flRadius) = 0;
virtual CBaseEntity *FindEntityByTarget(CBaseEntity *pStartEntity,
const char *szName) = 0;
virtual CBaseEntity *FindEntityByModel(CBaseEntity *pStartEntity,
const char *szModelName) = 0;
virtual CBaseEntity *FindEntityByNameNearest(
const char *szName, const Vector &vecSrc, float flRadius,
CBaseEntity *pSearchingEntity = NULL, CBaseEntity *pActivator = NULL,
CBaseEntity *pCaller = NULL) = 0;
virtual CBaseEntity *FindEntityByNameWithin(
CBaseEntity *pStartEntity, const char *szName, const Vector &vecSrc,
float flRadius, CBaseEntity *pSearchingEntity = NULL,
CBaseEntity *pActivator = NULL, CBaseEntity *pCaller = NULL) = 0;
virtual CBaseEntity *FindEntityByClassnameNearest(const char *szName,
const Vector &vecSrc,
float flRadius) = 0;
virtual CBaseEntity *FindEntityByClassnameWithin(CBaseEntity *pStartEntity,
const char *szName,
const Vector &vecSrc,
float flRadius) = 0;
virtual CBaseEntity *FindEntityByClassnameWithin(CBaseEntity *pStartEntity,
const char *szName,
const Vector &vecMins,
const Vector &vecMaxs) = 0;
virtual CBaseEntity *FindEntityGeneric(CBaseEntity *pStartEntity,
const char *szName,
CBaseEntity *pSearchingEntity = NULL,
CBaseEntity *pActivator = NULL,
CBaseEntity *pCaller = NULL) = 0;
virtual CBaseEntity *FindEntityGenericWithin(
CBaseEntity *pStartEntity, const char *szName, const Vector &vecSrc,
float flRadius, CBaseEntity *pSearchingEntity = NULL,
CBaseEntity *pActivator = NULL, CBaseEntity *pCaller = NULL) = 0;
virtual CBaseEntity *FindEntityGenericNearest(
const char *szName, const Vector &vecSrc, float flRadius,
CBaseEntity *pSearchingEntity = NULL, CBaseEntity *pActivator = NULL,
CBaseEntity *pCaller = NULL) = 0;
virtual CBaseEntity *FindEntityNearestFacing(const Vector &origin,
const Vector &facing,
float threshold) = 0;
virtual CBaseEntity *FindEntityClassNearestFacing(const Vector &origin,
const Vector &facing,
float threshold,
char *classname) = 0;
virtual CBaseEntity *FindEntityProcedural(
const char *szName, CBaseEntity *pSearchingEntity = NULL,
CBaseEntity *pActivator = NULL, CBaseEntity *pCaller = NULL) = 0;
};
typedef IServerTools IServerTools001;
typedef IServerTools IServerTools002;
#define VSERVERTOOLS_INTERFACE_VERSION_1 "VSERVERTOOLS001"
#define VSERVERTOOLS_INTERFACE_VERSION_2 "VSERVERTOOLS002"
#define VSERVERTOOLS_INTERFACE_VERSION "VSERVERTOOLS003"
#define VSERVERTOOLS_INTERFACE_VERSION_INT 3
//-----------------------------------------------------------------------------
// Purpose: Client side tool interace (right now just handles
// IClientRenderables).
// In theory could support hooking into client side entities directly
//-----------------------------------------------------------------------------
class IServerChoreoTools : public IBaseInterface {
public:
// Iterates through ALL entities (separate list for client vs. server)
virtual EntitySearchResult NextChoreoEntity(
EntitySearchResult currentEnt) = 0;
EntitySearchResult FirstChoreoEntity() { return NextChoreoEntity(NULL); }
virtual const char *GetSceneFile(EntitySearchResult sr) = 0;
// For interactive editing
virtual int GetEntIndex(EntitySearchResult sr) = 0;
virtual void ReloadSceneFromDisk(int entindex) = 0;
};
#define VSERVERCHOREOTOOLS_INTERFACE_VERSION "VSERVERCHOREOTOOLS001"
#endif // ITOOLENTITY_H