246 lines
7.0 KiB
C++
246 lines
7.0 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
#ifndef PHYSOBJ_H
|
|
#define PHYSOBJ_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifndef PHYSICS_H
|
|
#include "physics.h"
|
|
#endif
|
|
|
|
#include "entityoutput.h"
|
|
#include "func_break.h"
|
|
#include "player_pickup.h"
|
|
|
|
// ---------------------------------------------------------------------
|
|
//
|
|
// CPhysBox -- physically simulated brush rectangular solid
|
|
//
|
|
// ---------------------------------------------------------------------
|
|
// Physbox Spawnflags. Start at 0x01000 to avoid collision with CBreakable's
|
|
#define SF_PHYSBOX_ASLEEP 0x01000
|
|
#define SF_PHYSBOX_IGNOREUSE 0x02000
|
|
#define SF_PHYSBOX_DEBRIS 0x04000
|
|
#define SF_PHYSBOX_MOTIONDISABLED 0x08000
|
|
#define SF_PHYSBOX_USEPREFERRED 0x10000
|
|
#define SF_PHYSBOX_ENABLE_ON_PHYSCANNON 0x20000
|
|
#define SF_PHYSBOX_NO_ROTORWASH_PUSH \
|
|
0x40000 // The rotorwash doesn't push these
|
|
#define SF_PHYSBOX_ENABLE_PICKUP_OUTPUT 0x80000
|
|
#define SF_PHYSBOX_ALWAYS_PICK_UP \
|
|
0x100000 // Physcannon can always pick this up, no matter what mass or
|
|
// constraints may apply.
|
|
#define SF_PHYSBOX_NEVER_PICK_UP \
|
|
0x200000 // Physcannon will never be able to pick this up.
|
|
#define SF_PHYSBOX_NEVER_PUNT \
|
|
0x400000 // Physcannon will never be able to punt this object.
|
|
#define SF_PHYSBOX_PREVENT_PLAYER_TOUCH_ENABLE \
|
|
0x800000 // If set, the player will not cause the object to enable its
|
|
// motion when bumped into
|
|
|
|
// UNDONE: Hook collisions into the physics system to generate touch functions
|
|
// and take damage on falls UNDONE: Base class PhysBrush
|
|
class CPhysBox : public CBreakable {
|
|
DECLARE_CLASS(CPhysBox, CBreakable);
|
|
|
|
public:
|
|
DECLARE_SERVERCLASS();
|
|
|
|
void Spawn(void);
|
|
bool CreateVPhysics();
|
|
void Move(const Vector &force);
|
|
virtual int ObjectCaps();
|
|
virtual void Use(CBaseEntity *pActivator, CBaseEntity *pCaller,
|
|
USE_TYPE useType, float value);
|
|
|
|
virtual int DrawDebugTextOverlays(void);
|
|
|
|
virtual void VPhysicsUpdate(IPhysicsObject *pPhysics);
|
|
virtual void VPhysicsCollision(int index, gamevcollisionevent_t *pEvent);
|
|
int OnTakeDamage(const CTakeDamageInfo &info);
|
|
void EnableMotion(void);
|
|
|
|
bool CanBePickedUpByPhyscannon();
|
|
|
|
// IPlayerPickupVPhysics
|
|
virtual void OnPhysGunPickup(CBasePlayer *pPhysGunUser,
|
|
PhysGunPickup_t reason);
|
|
virtual void OnPhysGunDrop(CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason);
|
|
|
|
bool HasPreferredCarryAnglesForPlayer(CBasePlayer *pPlayer);
|
|
virtual QAngle PreferredCarryAngles(void) {
|
|
return m_angPreferredCarryAngles;
|
|
}
|
|
|
|
// inputs
|
|
void InputWake(inputdata_t &inputdata);
|
|
void InputSleep(inputdata_t &inputdata);
|
|
void InputEnableMotion(inputdata_t &inputdata);
|
|
void InputDisableMotion(inputdata_t &inputdata);
|
|
void InputForceDrop(inputdata_t &inputdata);
|
|
void InputDisableFloating(inputdata_t &inputdata);
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
protected:
|
|
int m_damageType;
|
|
float m_massScale;
|
|
string_t m_iszOverrideScript;
|
|
int m_damageToEnableMotion;
|
|
float m_flForceToEnableMotion;
|
|
QAngle m_angPreferredCarryAngles;
|
|
bool m_bNotSolidToWorld;
|
|
|
|
// Outputs
|
|
COutputEvent m_OnDamaged;
|
|
COutputEvent m_OnAwakened;
|
|
COutputEvent m_OnMotionEnabled;
|
|
COutputEvent m_OnPhysGunPickup;
|
|
COutputEvent m_OnPhysGunPunt;
|
|
COutputEvent m_OnPhysGunOnlyPickup;
|
|
COutputEvent m_OnPhysGunDrop;
|
|
COutputEvent m_OnPlayerUse;
|
|
|
|
CHandle<CBasePlayer> m_hCarryingPlayer; // Player who's carrying us
|
|
};
|
|
|
|
// ---------------------------------------------------------------------
|
|
//
|
|
// CPhysExplosion -- physically simulated explosion
|
|
//
|
|
// ---------------------------------------------------------------------
|
|
class CPhysExplosion : public CPointEntity {
|
|
public:
|
|
DECLARE_CLASS(CPhysExplosion, CPointEntity);
|
|
|
|
void Spawn(void);
|
|
void Explode(CBaseEntity *pActivator, CBaseEntity *pCaller);
|
|
|
|
CBaseEntity *FindEntity(CBaseEntity *pEntity, CBaseEntity *pActivator,
|
|
CBaseEntity *pCaller);
|
|
|
|
int DrawDebugTextOverlays(void);
|
|
|
|
// Input handlers
|
|
void InputExplode(inputdata_t &inputdata);
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
private:
|
|
float GetRadius(void);
|
|
|
|
float m_damage;
|
|
float m_radius;
|
|
string_t m_targetEntityName;
|
|
float m_flInnerRadius;
|
|
|
|
COutputEvent m_OnPushedPlayer;
|
|
};
|
|
|
|
//==================================================
|
|
// CPhysImpact
|
|
//==================================================
|
|
|
|
class CPhysImpact : public CPointEntity {
|
|
public:
|
|
DECLARE_CLASS(CPhysImpact, CPointEntity);
|
|
|
|
void Spawn(void);
|
|
// void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE
|
|
// useType, float value );
|
|
void Activate(void);
|
|
|
|
void InputImpact(inputdata_t &inputdata);
|
|
|
|
DECLARE_DATADESC();
|
|
|
|
private:
|
|
void PointAtEntity(void);
|
|
|
|
float m_damage;
|
|
float m_distance;
|
|
string_t m_directionEntityName;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: A magnet that creates constraints between itself and anything it
|
|
// touches
|
|
//-----------------------------------------------------------------------------
|
|
|
|
struct magnetted_objects_t {
|
|
IPhysicsConstraint *pConstraint;
|
|
EHANDLE hEntity;
|
|
|
|
DECLARE_SIMPLE_DATADESC();
|
|
};
|
|
|
|
class CPhysMagnet : public CBaseAnimating, public IPhysicsConstraintEvent {
|
|
DECLARE_CLASS(CPhysMagnet, CBaseAnimating);
|
|
|
|
public:
|
|
DECLARE_DATADESC();
|
|
DECLARE_SERVERCLASS();
|
|
|
|
CPhysMagnet();
|
|
~CPhysMagnet();
|
|
|
|
void Spawn(void);
|
|
void Precache(void);
|
|
void Touch(CBaseEntity *pOther);
|
|
void VPhysicsCollision(int index, gamevcollisionevent_t *pEvent);
|
|
void DoMagnetSuck(CBaseEntity *pOther);
|
|
void SetConstraintGroup(IPhysicsConstraintGroup *pGroup);
|
|
|
|
bool IsOn(void) { return m_bActive; }
|
|
int GetNumAttachedObjects(void);
|
|
float GetTotalMassAttachedObjects(void);
|
|
CBaseEntity *GetAttachedObject(int iIndex);
|
|
|
|
// Checking for hitting something
|
|
void ResetHasHitSomething(void) { m_bHasHitSomething = false; }
|
|
bool HasHitSomething(void) { return m_bHasHitSomething; }
|
|
|
|
// Inputs
|
|
void InputToggle(inputdata_t &inputdata);
|
|
void InputTurnOn(inputdata_t &inputdata);
|
|
void InputTurnOff(inputdata_t &inputdata);
|
|
|
|
void InputConstraintBroken(inputdata_t &inputdata);
|
|
|
|
void DetachAll(void);
|
|
|
|
// IPhysicsConstraintEvent
|
|
public:
|
|
void ConstraintBroken(IPhysicsConstraint *pConstraint);
|
|
|
|
protected:
|
|
// Outputs
|
|
COutputEvent m_OnMagnetAttach;
|
|
COutputEvent m_OnMagnetDetach;
|
|
|
|
// Keys
|
|
float m_massScale;
|
|
string_t m_iszOverrideScript;
|
|
float m_forceLimit;
|
|
float m_torqueLimit;
|
|
|
|
CUtlVector<magnetted_objects_t> m_MagnettedEntities;
|
|
IPhysicsConstraintGroup *m_pConstraintGroup;
|
|
|
|
bool m_bActive;
|
|
bool m_bHasHitSomething;
|
|
float m_flTotalMass;
|
|
float m_flRadius;
|
|
float m_flNextSuckTime;
|
|
int m_iMaxObjectsAttached;
|
|
};
|
|
|
|
#endif // PHYSOBJ_H
|