Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
3.1 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef FUNC_BREAKABLESURF_H
#define FUNC_BREAKABLESURF_H
#ifdef _WIN32
#pragma once
#endif
#define MAX_NUM_PANELS 16 //Must match client
#include "func_break.h"
//#############################################################################
// > CWindowPane
//
// A piece that falls out of the window
//#############################################################################
class CWindowPane : public CBaseAnimating
{
public:
DECLARE_CLASS( CWindowPane, CBaseAnimating );
static CWindowPane* CreateWindowPane( const Vector &vecOrigin, const QAngle &vecAngles );
void Spawn( void );
void Precache( void );
void PaneTouch( CBaseEntity *pOther );
void Die( void );
DECLARE_DATADESC();
};
//#############################################################################
// > CBreakableSurface
//
// A breakable surface
//#############################################################################
class CBreakableSurface : public CBreakable
{
DECLARE_CLASS( CBreakableSurface, CBreakable );
DECLARE_DATADESC();
DECLARE_SERVERCLASS();
public:
CNetworkVar( int, m_nNumWide );
CNetworkVar( int, m_nNumHigh );
CNetworkVar( float, m_flPanelWidth );
CNetworkVar( float, m_flPanelHeight );
CNetworkVector( m_vNormal );
CNetworkVector( m_vCorner );
CNetworkVar( bool, m_bIsBroken );
CNetworkVar( ShatterSurface_t, m_nSurfaceType );
int m_nNumBrokenPanes;
float m_flSupport[MAX_NUM_PANELS][MAX_NUM_PANELS]; //UNDONE: allocate dynamically?
int m_nFragility;
Vector m_vLLVertex;
Vector m_vULVertex;
Vector m_vLRVertex;
Vector m_vURVertex;
int m_nQuadError;
void SurfaceTouch( CBaseEntity *pOther );
void PanePos(const Vector &vPos, float *flWidth, float *flHeight);
bool IsBroken(int nWidth, int nHeight);
void SetSupport(int w, int h, float support);
float GetSupport(int nWidth, int nHeight);
float RecalcSupport(int nWidth, int nHeight);
void BreakPane(int nWidth, int nHeight);
void DropPane(int nWidth, int nHeight);
bool ShatterPane(int nWidth, int nHeight, const Vector &force, const Vector &vForcePos);
void BreakAllPanes(void);
void CreateShards(const Vector &vBreakPos, const QAngle &vAngles,
const Vector &vForce, const Vector &vForcePos,
float flWidth, float flHeight,
int nShardSize);
void Spawn(void);
void Precache(void);
void Die( CBaseEntity *pBreaker, const Vector &vAttackDir );
void BreakThink(void);
void Event_Killed( CBaseEntity *pInflictor, CBaseEntity *pAttacker, float flDamage, int bitsDamageType );
void TraceAttack( const CTakeDamageInfo &info, const Vector &vecDir, trace_t *ptr, CDmgAccumulator *pAccumulator );
int OnTakeDamage( const CTakeDamageInfo &info );
void InputShatter( inputdata_t &inputdata );
void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
private:
// One bit per pane
CNetworkArray( bool, m_RawPanelBitVec, MAX_NUM_PANELS * MAX_NUM_PANELS );
};
#endif // FUNC_BREAKABLESURF_H