104 lines
3.3 KiB
C++
104 lines
3.3 KiB
C++
//========= 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
|