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.
nekohook/modules/source2013/sdk/game/server/physics_cannister.h
2020-08-04 13:13:01 -04:00

153 lines
4.7 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef PHYSICS_CANNISTER_H
#define PHYSICS_CANNISTER_H
#ifdef _WIN32
#pragma once
#endif
#include "player_pickup.h"
class CSteamJet;
class CThrustController : public IMotionEvent {
DECLARE_SIMPLE_DATADESC();
public:
IMotionEvent::simresult_e Simulate(IPhysicsMotionController *pController,
IPhysicsObject *pObject, float deltaTime,
Vector &linear,
AngularImpulse &angular) {
angular = m_torqueVector;
linear = m_thrustVector;
return SIM_LOCAL_ACCELERATION;
}
void CalcThrust(const Vector &position, const Vector &direction,
IPhysicsObject *pPhys) {
Vector force = direction * m_thrust * pPhys->GetMass();
// Adjust for the position of the thruster -- apply proper torque)
pPhys->CalculateVelocityOffset(force, position, &m_thrustVector,
&m_torqueVector);
pPhys->WorldToLocalVector(&m_thrustVector, m_thrustVector);
}
Vector m_thrustVector;
AngularImpulse m_torqueVector;
float m_thrust;
};
class CPhysicsCannister : public CBaseCombatCharacter,
public CDefaultPlayerPickupVPhysics {
DECLARE_CLASS(CPhysicsCannister, CBaseCombatCharacter);
public:
~CPhysicsCannister(void);
void Spawn(void);
void Precache(void);
virtual void OnRestore();
bool CreateVPhysics();
DECLARE_DATADESC();
virtual void VPhysicsUpdate(IPhysicsObject *pPhysics);
virtual QAngle PreferredCarryAngles(void) { return QAngle(-90, 0, 0); }
virtual bool HasPreferredCarryAnglesForPlayer(CBasePlayer *pPlayer) {
return true;
}
//
// Input handlers.
//
void InputActivate(inputdata_t &data);
void InputDeactivate(inputdata_t &data);
void InputExplode(inputdata_t &data);
void InputWake(inputdata_t &data);
bool TestCollision(const Ray_t &ray, unsigned int mask, trace_t &trace);
virtual int OnTakeDamage(const CTakeDamageInfo &info);
int ObjectCaps() { return (BaseClass::ObjectCaps() | FCAP_IMPULSE_USE); }
void Use(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType,
float value) {
CBasePlayer *pPlayer = ToBasePlayer(pActivator);
if (pPlayer) {
pPlayer->PickupObject(this);
}
}
void CannisterActivate(CBaseEntity *pActivator, const Vector &thrustOffset);
void CannisterFire(CBaseEntity *pActivator);
void Deactivate(void);
void Explode(CBaseEntity *pAttacker);
void ExplodeTouch(CBaseEntity *pOther);
void VPhysicsCollision(int index, gamevcollisionevent_t *pEvent);
// Don't treat as a live target
virtual bool IsAlive(void) { return false; }
virtual void TraceAttack(const CTakeDamageInfo &info, const Vector &dir,
trace_t *ptr, CDmgAccumulator *pAccumulator);
void ShutdownJet(void);
void BeginShutdownThink(void);
public:
virtual bool OnAttemptPhysGunPickup(CBasePlayer *pPhysGunUser,
PhysGunPickup_t reason) {
return true;
}
virtual void OnPhysGunPickup(CBasePlayer *pPhysGunUser,
PhysGunPickup_t reason);
virtual void OnPhysGunDrop(CBasePlayer *pPhysGunUser, PhysGunDrop_t reason);
virtual CBasePlayer *HasPhysicsAttacker(float dt);
virtual bool ShouldPuntUseLaunchForces(PhysGunForce_t reason) {
if (reason == PHYSGUN_FORCE_LAUNCHED) return (m_thrustTime != 0);
return false;
}
virtual AngularImpulse PhysGunLaunchAngularImpulse(void) {
return vec3_origin;
}
virtual Vector PhysGunLaunchVelocity(const Vector &forward, float flMass) {
return vec3_origin;
}
protected:
void SetPhysicsAttacker(CBasePlayer *pEntity, float flTime);
public:
Vector m_thrustOrigin;
CThrustController m_thruster;
IPhysicsMotionController *m_pController;
CSteamJet *m_pJet;
bool m_active;
float m_thrustTime;
float m_damage;
float m_damageRadius;
float m_activateTime;
string_t m_gasSound;
bool m_bFired; // True if this cannister was fire by a weapon
COutputEvent m_onActivate;
COutputEvent m_OnAwakened;
CHandle<CBasePlayer> m_hPhysicsAttacker;
float m_flLastPhysicsInfluenceTime;
EHANDLE m_hLauncher; // Entity that caused this cannister to launch
private:
Vector CalcLocalThrust(const Vector &offset);
};
#endif // PHYSICS_CANNISTER_H