nuclide/src/shared/NSSurfacePropEntity.qc

691 lines
19 KiB
Plaintext

/*
* Copyright (c) 2016-2022 Vera Visions LLC.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void
NSSurfacePropEntity::NSSurfacePropEntity(void)
{
m_flBurnNext = 0.0f;
#ifdef SERVER
m_iPropData = -1i;
m_iMaterial = -1i;
max_health = 100;
m_strOnBreak = __NULL__;
m_eBurner= __NULL__;
m_iBurnWeapon = 0i;
m_flBurnTime = 0.0f;
m_flBurnDmgTime = 0.0f;
m_oldHealth = 0;
string m_strSurfData = __NULL__;
string m_strPropData = __NULL__;
#endif
}
vector
NSSurfacePropEntity::GetEyePos(void)
{
return origin + view_ofs;
}
void
NSSurfacePropEntity::Spawned(void)
{
super::Spawned();
#ifdef SERVER
/* tokenization complete, now we can load propdata */
SurfaceDataFinish();
PropDataFinish();
/* Input/Output system */
if (m_strOnBreak)
m_strOnBreak = CreateOutput(m_strOnBreak);
#endif
}
/* networking */
#ifdef SERVER
bool
NSSurfacePropEntity::IsAlive(void)
{
return (health > 0) ? true : false;
}
#if 0
typedef enum
{
NETFIELD_BYTE,
NETFIELD_SHORT,
NETFIELD_FLOAT,
NETFIELD_INT,
NETFIELD_COORD,
NETFIELD_ANGLE,
NETFIELD_ENTITY,
NETFIELD_STRING
} nettype_e;
typedef struct
{
.variant field;
.variant field_net;
int changedflag;
__variant defaultvalue;
nettype_e type;
} netinfo_t;
const netinfo_t n_NSSurfacePropEntity[] =
{
{origin[0], NSEntity::origin_net[0], SRFENT_CHANGED_ORIGIN_X, 0, NETFIELD_COORD},
{origin[1], NSEntity::origin_net[1], SRFENT_CHANGED_ORIGIN_Y, 0, NETFIELD_COORD},
{origin[2], NSEntity::origin_net[2], SRFENT_CHANGED_ORIGIN_Z, 0, NETFIELD_COORD},
{angles[0], NSEntity::angles_net[0], SRFENT_CHANGED_ANGLES_X, 0, NETFIELD_ANGLE},
{angles[1], NSEntity::angles_net[1], SRFENT_CHANGED_ANGLES_Y, 0, NETFIELD_ANGLE},
{angles[2], NSEntity::angles_net[2], SRFENT_CHANGED_ANGLES_Z, 0, NETFIELD_ANGLE},
{modelindex, NSEntity::modelindex_net, SRFENT_CHANGED_MODELINDEX, 0, NETFIELD_SHORT},
{solid, NSEntity::solid_net, SRFENT_CHANGED_SOLID, 0, NETFIELD_BYTE},
{movetype, NSEntity::movetype_net, SRFENT_CHANGED_MOVETYPE, 0, NETFIELD_BYTE},
{flags, NSEntity::flags_net, SRFENT_CHANGED_FLAGS, 0, NETFIELD_FLOAT},
{mins[0], NSEntity::mins_net[0], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{mins[1], NSEntity::mins_net[1], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{mins[2], NSEntity::mins_net[2], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{maxs[0], NSEntity::maxs_net[0], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{maxs[1], NSEntity::maxs_net[1], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{maxs[2], NSEntity::maxs_net[2], SRFENT_CHANGED_SIZE, 0, NETFIELD_SHORT},
{frame, NSRenderableEntity::frame_net, SRFENT_CHANGED_FRAME, 0, NETFIELD_SHORT},
{skin, NSRenderableEntity::skin_net, SRFENT_CHANGED_SKIN, 0, NETFIELD_BYTE},
{effects, NSRenderableEntity::effects_net, SRFENT_CHANGED_EFFECTS, 0, NETFIELD_SHORT},
{NSRenderableEntity::m_iBody, NSRenderableEntity::m_iBody_net, SRFENT_CHANGED_BODY, 0, NETFIELD_BYTE},
{scale, NSEntity::scale_net, SRFENT_CHANGED_SCALE, 0, NETFIELD_FLOAT},
{velocity[0], NSEntity::velocity_net[0], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE},
{velocity[1], NSEntity::velocity_net[1], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE},
{velocity[2], NSEntity::velocity_net[2], SRFENT_CHANGED_VELOCITY, 0, NETFIELD_ANGLE},
{NSRenderableEntity::m_iRenderMode, NSRenderableEntity::m_iRenderMode_net, SRFENT_CHANGED_RENDERMODE, 0, NETFIELD_BYTE},
{NSRenderableEntity::m_iRenderFX, NSRenderableEntity::m_iRenderFX_net, SRFENT_CHANGED_RENDERMODE, 0, NETFIELD_BYTE},
};
void
NSSurfacePropEntity::EvaluateEntity(void)
{
for (int i = 0; i < n_NSSurfacePropEntity.length; i++) {
if (this.(n_NSSurfacePropEntity[i].field) != this.(n_NSSurfacePropEntity[i].field_net)) {
SetSendFlags(n_NSSurfacePropEntity[i].changedflag);
print(sprintf("uhh %i\n", i));
}
this.(n_NSSurfacePropEntity[i].field_net) = this.(n_NSSurfacePropEntity[i].field);
}
}
/* Make sure StartFrame calls this */
float
NSSurfacePropEntity::SendEntity(entity ePEnt, float fChanged)
{
if (!modelindex)
return (0);
if (clienttype(ePEnt) != CLIENTTYPE_REAL)
return (0);
WriteByte(MSG_ENTITY, ENT_SURFPROP);
/* don't network triggers unless provoked */
/*if (cvar("developer") == 0 && m_iRenderMode == RM_TRIGGER)
return (0);*/
#if 0
if (fChanged == 0xFFFFFF) {
for (int i = 0; i < n_NSSurfacePropEntity.length; i++) {
/* unflag everything that's the default value */
if (this.(n_NSSurfacePropEntity[i].field) == this.(n_NSSurfacePropEntity[i].defaultvalue))
fChanged &= ~n_NSSurfacePropEntity[i].changedflag;
}
}
#endif
/* broadcast how much data is expected to be read */
WriteFloat(MSG_ENTITY, fChanged);
for (int i = 0; i < n_NSSurfacePropEntity.length; i++) {
if (fChanged & n_NSSurfacePropEntity[i].changedflag) {
switch (n_NSSurfacePropEntity[i].type) {
case NETFIELD_BYTE:
WriteByte(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_SHORT:
WriteShort(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_FLOAT:
WriteFloat(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_INT:
WriteInt(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_COORD:
WriteCoord(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_ANGLE:
WriteShort(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field) * 32767 / 360);
break;
case NETFIELD_ENTITY:
WriteEntity(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
case NETFIELD_STRING:
WriteString(MSG_ENTITY, this.(n_NSSurfacePropEntity[i].field));
break;
}
}
}
return (1);
}
#else
void
NSSurfacePropEntity::EvaluateEntity(void)
{
EVALUATE_VECTOR(origin, 0, SRFENT_CHANGED_ORIGIN_X)
EVALUATE_VECTOR(origin, 1, SRFENT_CHANGED_ORIGIN_Y)
EVALUATE_VECTOR(origin, 2, SRFENT_CHANGED_ORIGIN_Z)
EVALUATE_VECTOR(angles, 0, SRFENT_CHANGED_ANGLES_X)
EVALUATE_VECTOR(angles, 1, SRFENT_CHANGED_ANGLES_Y)
EVALUATE_VECTOR(angles, 2, SRFENT_CHANGED_ANGLES_Z)
EVALUATE_FIELD(modelindex, SRFENT_CHANGED_MODELINDEX)
EVALUATE_FIELD(solid, SRFENT_CHANGED_SOLID)
EVALUATE_FIELD(movetype, SRFENT_CHANGED_FLAGS)
EVALUATE_FIELD(flags, SRFENT_CHANGED_FLAGS)
EVALUATE_VECTOR(mins, 0, SRFENT_CHANGED_SIZE)
EVALUATE_VECTOR(mins, 1, SRFENT_CHANGED_SIZE)
EVALUATE_VECTOR(mins, 2, SRFENT_CHANGED_SIZE)
EVALUATE_VECTOR(maxs, 0, SRFENT_CHANGED_SIZE)
EVALUATE_VECTOR(maxs, 1, SRFENT_CHANGED_SIZE)
EVALUATE_VECTOR(maxs, 2, SRFENT_CHANGED_SIZE)
EVALUATE_FIELD(frame, SRFENT_CHANGED_FRAME)
EVALUATE_FIELD(skin, SRFENT_CHANGED_SKIN)
EVALUATE_FIELD(effects, SRFENT_CHANGED_EFFECTS)
EVALUATE_FIELD(m_iBody, SRFENT_CHANGED_BODY)
EVALUATE_FIELD(scale, SRFENT_CHANGED_SCALE)
EVALUATE_VECTOR(velocity, 0, SRFENT_CHANGED_VELOCITY)
EVALUATE_VECTOR(velocity, 1, SRFENT_CHANGED_VELOCITY)
EVALUATE_VECTOR(velocity, 2, SRFENT_CHANGED_VELOCITY)
EVALUATE_FIELD(m_iRenderMode, SRFENT_CHANGED_RENDERMODE)
EVALUATE_FIELD(m_iRenderFX, SRFENT_CHANGED_RENDERMODE)
EVALUATE_VECTOR(m_vecRenderColor, 0, SRFENT_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 1, SRFENT_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 2, SRFENT_CHANGED_RENDERCOLOR)
EVALUATE_FIELD(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT)
EVALUATE_FIELD(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER)
EVALUATE_FIELD(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER)
EVALUATE_FIELD(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER)
EVALUATE_FIELD(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER)
EVALUATE_FIELD(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER)
}
/* Make sure StartFrame calls this */
float
NSSurfacePropEntity::SendEntity(entity ePEnt, float flChanged)
{
if (!modelindex)
return (0);
if (clienttype(ePEnt) != CLIENTTYPE_REAL)
return (0);
WriteByte(MSG_ENTITY, ENT_SURFPROP);
/* broadcast how much data is expected to be read */
WriteFloat(MSG_ENTITY, flChanged);
SENDENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X)
SENDENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y)
SENDENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z)
SENDENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X)
SENDENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y)
SENDENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z)
SENDENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX)
SENDENTITY_BYTE(solid, SRFENT_CHANGED_SOLID)
SENDENTITY_BYTE(movetype, SRFENT_CHANGED_FLAGS)
SENDENTITY_INT(flags, SRFENT_CHANGED_FLAGS)
SENDENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE)
SENDENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE)
SENDENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE)
SENDENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE)
SENDENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE)
SENDENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE)
SENDENTITY_BYTE(frame, SRFENT_CHANGED_FRAME)
SENDENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN)
SENDENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS)
SENDENTITY_BYTE(m_iBody, SRFENT_CHANGED_BODY)
SENDENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE)
SENDENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY)
SENDENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY)
SENDENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY)
SENDENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE)
SENDENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE)
SENDENTITY_ANGLE(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR)
SENDENTITY_ANGLE(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR)
SENDENTITY_ANGLE(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR)
SENDENTITY_ANGLE(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT)
SENDENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER)
SENDENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER)
SENDENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER)
SENDENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER)
SENDENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER)
return (1);
}
#endif
#else
/*
============
NSSurfacePropEntity::ReceiveEntity
============
*/
void
NSSurfacePropEntity::ReceiveEntity(float flNew, float flChanged)
{
READENTITY_COORD(origin[0], SRFENT_CHANGED_ORIGIN_X)
READENTITY_COORD(origin[1], SRFENT_CHANGED_ORIGIN_Y)
READENTITY_COORD(origin[2], SRFENT_CHANGED_ORIGIN_Z)
READENTITY_ANGLE(angles[0], SRFENT_CHANGED_ANGLES_X)
READENTITY_ANGLE(angles[1], SRFENT_CHANGED_ANGLES_Y)
READENTITY_ANGLE(angles[2], SRFENT_CHANGED_ANGLES_Z)
READENTITY_SHORT(modelindex, SRFENT_CHANGED_MODELINDEX)
READENTITY_BYTE(solid, SRFENT_CHANGED_SOLID)
READENTITY_BYTE(movetype, SRFENT_CHANGED_FLAGS)
READENTITY_INT(flags, SRFENT_CHANGED_FLAGS)
READENTITY_COORD(mins[0], SRFENT_CHANGED_SIZE)
READENTITY_COORD(mins[1], SRFENT_CHANGED_SIZE)
READENTITY_COORD(mins[2], SRFENT_CHANGED_SIZE)
READENTITY_COORD(maxs[0], SRFENT_CHANGED_SIZE)
READENTITY_COORD(maxs[1], SRFENT_CHANGED_SIZE)
READENTITY_COORD(maxs[2], SRFENT_CHANGED_SIZE)
READENTITY_BYTE(frame, SRFENT_CHANGED_FRAME)
READENTITY_FLOAT(skin, SRFENT_CHANGED_SKIN)
READENTITY_FLOAT(effects, SRFENT_CHANGED_EFFECTS)
READENTITY_BYTE(m_iBody, SRFENT_CHANGED_BODY)
READENTITY_FLOAT(scale, SRFENT_CHANGED_SCALE)
READENTITY_COORD(velocity[0], SRFENT_CHANGED_VELOCITY)
READENTITY_COORD(velocity[1], SRFENT_CHANGED_VELOCITY)
READENTITY_COORD(velocity[2], SRFENT_CHANGED_VELOCITY)
READENTITY_BYTE(m_iRenderMode, SRFENT_CHANGED_RENDERMODE)
READENTITY_BYTE(m_iRenderFX, SRFENT_CHANGED_RENDERMODE)
READENTITY_ANGLE(m_vecRenderColor[0], SRFENT_CHANGED_RENDERCOLOR)
READENTITY_ANGLE(m_vecRenderColor[1], SRFENT_CHANGED_RENDERCOLOR)
READENTITY_ANGLE(m_vecRenderColor[2], SRFENT_CHANGED_RENDERCOLOR)
READENTITY_ANGLE(m_flRenderAmt, SRFENT_CHANGED_RENDERAMT)
READENTITY_ANGLE(m_flBoneControl1, SRFENT_CHANGED_CONTROLLER)
READENTITY_ANGLE(m_flBoneControl2, SRFENT_CHANGED_CONTROLLER)
READENTITY_ANGLE(m_flBoneControl3, SRFENT_CHANGED_CONTROLLER)
READENTITY_ANGLE(m_flBoneControl4, SRFENT_CHANGED_CONTROLLER)
READENTITY_ANGLE(m_flBoneControl5, SRFENT_CHANGED_CONTROLLER)
if (scale == 0.0)
scale = 1.0f;
if (flChanged & SRFENT_CHANGED_SIZE)
setsize(this, mins * scale, maxs * scale);
if (flChanged & SRFENT_CHANGED_BODY)
setcustomskin(this, "", sprintf("geomset 0 %i\ngeomset 1 %i\n", m_iBody, m_iBody));
setorigin(this, origin);
}
#endif
#ifdef SERVER
void
NSSurfacePropEntity::SetTakedamage(float type)
{
takedamage = type;
}
void
NSSurfacePropEntity::SetHealth(float new_health)
{
if (max_health > 0)
health = min(new_health, max_health);
else
health = new_health;
}
void
NSSurfacePropEntity::SetMaxHealth(float new_health)
{
max_health = new_health;
health = min(health, max_health);
}
float
NSSurfacePropEntity::GetHealth(void)
{
return health;
}
float
NSSurfacePropEntity::GetMaxHealth(void)
{
return max_health;
}
float
NSSurfacePropEntity::GetSpawnHealth(void)
{
return m_oldHealth;
}
bool
NSSurfacePropEntity::HasPropData(void)
{
return (m_iPropData != -1) ? true : false;
}
__variant
NSSurfacePropEntity::GetPropData(int type)
{
return Prop_GetInfo(m_iPropData, type);
}
bool
NSSurfacePropEntity::HasSurfaceData(void)
{
return (m_iMaterial != -1) ? true : false;
}
__variant
NSSurfacePropEntity::GetSurfaceData(int type)
{
return SurfData_GetInfo(m_iMaterial, type);
}
void
NSSurfacePropEntity::ParentUpdate(void)
{
/* TODO: Move out */
if (flags & FL_ONFIRE) {
if (m_flBurnNext < time) {
if (time > m_flBurnTime) {
flags &= ~FL_ONFIRE;
}
Damage_Apply(this, m_eBurner, 5, m_iBurnWeapon, DMG_BURN | DMG_SKIP_ARMOR);
m_flBurnNext = time + 0.5f;
}
}
NSRenderableEntity::ParentUpdate();
}
/* Burning, fire, flames, etc. */
void
NSSurfacePropEntity::Ignite(entity attacker, float flLifetime, int iWeapon)
{
flags |= FL_ONFIRE;
m_eBurner = attacker;
m_iBurnWeapon = iWeapon;
m_flBurnTime = time + flLifetime;
if (m_flBurnDmgTime < time) {
Damage_Apply(this, attacker, 5, iWeapon, DMG_BURN | DMG_SKIP_ARMOR);
m_flBurnDmgTime = time + 0.25f;
}
}
void
NSSurfacePropEntity::Extinguish(void)
{
flags &= ~FL_ONFIRE;
m_eBurner = __NULL__;
m_iBurnWeapon =
m_flBurnTime = 0;
}
bool
NSSurfacePropEntity::IsOnFire(void)
{
return (flags & FL_ONFIRE) ? true : false;
}
void
NSSurfacePropEntity::Respawn(void)
{
float sh = GetSpawnHealth();
NSRenderableEntity::Respawn();
/* only use spawndata's health if we aren't overriding it */
if (HasPropData() != false && sh <= 0) {
health = (float)GetPropData(PROPINFO_HEALTH);
} else {
health = sh;
}
if (health > 0)
takedamage = DAMAGE_YES;
else
takedamage = DAMAGE_NO;
}
void
NSSurfacePropEntity::Save(float handle)
{
super::Save(handle);
SaveFloat(handle, "m_eBurner", num_for_edict(m_eBurner));
SaveInt(handle, "m_iBurnWeapon", m_iBurnWeapon);
SaveFloat(handle,"m_flBurnTime", m_flBurnTime);
SaveFloat(handle, "m_flBurnNext", m_flBurnNext);
SaveString(handle, "m_strOnBreak", m_strOnBreak);
SaveFloat(handle, "m_oldHealth", m_oldHealth);
SaveInt(handle, "m_iMaterial", m_iMaterial);
SaveInt(handle, "m_iPropData", m_iPropData);
}
void
NSSurfacePropEntity::Restore(string strKey, string strValue)
{
switch (strKey) {
case "m_eBurner":
m_eBurner = edict_num(ReadFloat(strValue));
break;
case "m_iBurnWeapon":
m_iBurnWeapon = ReadInt(strValue);
break;
case "m_flBurnTime":
m_flBurnTime = ReadFloat(strValue);
break;
case "m_flBurnNext":
m_flBurnNext = ReadFloat(strValue);
break;
case "m_strOnBreak":
m_strOnBreak = ReadString(strValue);
break;
case "m_oldHealth":
m_oldHealth = ReadFloat(strValue);
break;
case "m_iMaterial":
m_iMaterial = ReadInt(strValue);
break;
case "m_iPropData":
m_iPropData = ReadInt(strValue);
break;
default:
super::Restore(strKey, strValue);
}
}
void
NSSurfacePropEntity::Input(entity eAct, string strInput, string strData)
{
switch (strInput) {
case "Ignite":
Ignite(eAct, 5000, 0);
break;
case "IgniteLifetime":
Ignite(eAct, stof(strData), 0);
break;
case "Extinguish":
Extinguish();
break;
default:
super::Input(eAct, strInput, strData);
}
}
void
NSSurfacePropEntity::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "health":
max_health = health = stof(strValue);
m_oldHealth = health;
break;
case "propdata":
SetPropData(strValue);
break;
case "surfdata":
case "materialdata":
SetSurfaceData(strValue);
break;
/* Input/Output system */
#ifdef SERVER
case "OnBreak":
m_strOnBreak = PrepareOutput(m_strOnBreak, strValue);
break;
#endif
default:
super::SpawnKey(strKey, strValue);
break;
}
}
void
NSSurfacePropEntity::Pain(void)
{
}
void
NSSurfacePropEntity::Death(void)
{
print(sprintf("%S", m_strOnBreak));
print("\n");
UseOutput(g_dmg_eAttacker, m_strOnBreak);
if (HasPropData() == false)
return;
if (GetPropData(PROPINFO_SKIN) != 0) {
SetSkin(GetPropData(PROPINFO_SKIN));
} else if (GetPropData(PROPINFO_BREAKMODEL) != __NULL__) {
string gibeffect = GetPropData(PROPINFO_BREAKMODEL);
int breakcount = GetPropData(PROPINFO_BREAKCOUNT);
BreakModel_Spawn(absmin, absmax, [0,0,0], 100, breakcount, gibeffect);
Hide();
} else {
Hide();
}
/* handle explosions */
float flExplodeMag, flExplodeRad;
flExplodeMag = GetPropData(PROPINFO_EXPLOSIVE_DMG);
flExplodeRad = GetPropData(PROPINFO_EXPLOSIVE_RADIUS);
if (flExplodeMag) {
if (!flExplodeRad)
flExplodeRad = flExplodeMag * 2.5f;
FX_Explosion(origin);
Damage_Radius(origin, this, flExplodeMag, flExplodeRad, TRUE, 0);
}
}
void
NSSurfacePropEntity::SetSurfaceData(string type)
{
m_strSurfData = type;
}
void
NSSurfacePropEntity::SetPropData(string type)
{
m_strPropData = type;
}
void
NSSurfacePropEntity::SurfaceDataFinish(void)
{
SurfData_SetStage(m_strSurfData);
if (m_strSurfData)
m_iMaterial = SurfData_Finish();
else
m_iMaterial = -1;
}
void
NSSurfacePropEntity::PropDataFinish(void)
{
PropData_SetStage(m_strPropData);
if (m_strPropData)
m_iPropData = PropData_Finish();
else
m_iPropData = -1;
}
#else
void
NSSurfacePropEntity::RenderFire(void)
{
if (flags & FL_ONFIRE) {
vector someorg;
if (m_flBurnNext < time) {
someorg[0] = absmin[0] + ( random() * ( absmax[0] - absmin[0] ) );
someorg[1] = absmin[1] + ( random() * ( absmax[1] - absmin[1] ) );
someorg[2] = absmin[2] + ( random() * ( absmax[2] - absmin[2] ) );
pointparticles(PART_BURNING, someorg, [0,0,0], 1);
m_flBurnNext = time + 0.1f;
}
}
}
float
NSSurfacePropEntity::predraw(void)
{
RenderFire();
return super::predraw();
}
#endif
void
NSSurfacePropEntity::SetModel(string newModel)
{
NSRenderableEntity::SetModel(newModel);
#ifdef SERVER
if (model && HasPropData() == false) {
m_iPropData = PropData_ForModel(model);
}
#endif
}
#ifdef CLIENT
void
NSSurfacePropEntity_ReadEntity(bool new)
{
float fl;
NSSurfacePropEntity rend = (NSSurfacePropEntity)self;
if (new) {
spawnfunc_NSSurfacePropEntity();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
}
#endif