env_glow: from client-side only entity to shared. also support other rendermodes (accurate to GoldSrc)

This commit is contained in:
Marco Cawthorne 2023-09-19 22:01:36 -07:00
parent e44f56a56d
commit b7126fbadb
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
47 changed files with 759 additions and 785 deletions

View File

@ -159,7 +159,7 @@ NSInteractiveSurface::predraw(void)
return (PREDRAW_NEXT);
makevectors(angles);
R_BeginPolygon(strtolower(m_strSurfaceMat), 0, 0);
R_BeginPolygon(m_strSurfaceMat, 0, 0);
R_PolygonVertex(origin + v_right * fsize[0] - v_up * fsize[1],
[1,1], [1,0,0], 1.0f);
R_PolygonVertex(origin - v_right * fsize[0] - v_up * fsize[1],

View File

@ -20,45 +20,45 @@ Entity_EntityUpdate(float type, float new)
{
switch (type) {
case ENT_ENTITY:
NSEntity_ReadEntity(new);
NSENTITY_READENTITY(NSEntity, new)
break;
case ENT_ENTITYRENDERABLE:
NSRenderableEntity_ReadEntity(new);
NSENTITY_READENTITY(NSRenderableEntity, new)
break;
case ENT_SURFPROP:
NSSurfacePropEntity_ReadEntity(new);
NSENTITY_READENTITY(NSSurfacePropEntity, new)
break;
case ENT_BEAM:
env_beam_ReadEntity(new);
NSENTITY_READENTITY(env_beam, new)
break;
case ENT_LASER:
env_laser_ReadEntity(new);
NSENTITY_READENTITY(env_laser, new)
break;
case ENT_PHYSICS:
NSPhysicsEntity_ReadEntity(new);
NSENTITY_READENTITY(NSPhysicsEntity, new)
break;
case ENT_MONSTER:
NSMonster_ReadEntity(new);
NSENTITY_READENTITY(NSMonster, new)
self.customphysics = Empty;
break;
case ENT_TALKMONSTER:
NSTalkMonster_ReadEntity(new);
NSENTITY_READENTITY(NSTalkMonster, new)
self.customphysics = Empty;
break;
case ENT_VEHICLE:
basevehicle_readentity(new);
NSENTITY_READENTITY(NSVehicle, new)
break;
case ENT_PORTAL:
NSPortal_ReadEntity(new);
NSENTITY_READENTITY(NSPortal, new)
break;
case ENT_VEH_BRUSH:
func_vehicle_readentity(new);
NSENTITY_READENTITY(func_vehicle, new)
break;
case ENT_VEH_TANKMORTAR:
func_tankmortar_readentity(new);
NSENTITY_READENTITY(func_tankmortar, new)
break;
case ENT_VEH_4WHEEL:
prop_vehicle_driveable_readentity(new);
NSENTITY_READENTITY(prop_vehicle_driveable, new)
break;
case ENT_PLAYER:
player pl = (player)self;
@ -78,11 +78,10 @@ Entity_EntityUpdate(float type, float new)
Spectator_ReadEntity(new);
break;
case ENT_SPRITE:
env_sprite spr = (env_sprite)self;
if (new) {
spawnfunc_env_sprite();
}
spr.ReceiveEntity(new, readfloat());
NSENTITY_READENTITY(env_sprite, new)
break;
case ENT_GLOW:
NSENTITY_READENTITY(env_glow, new)
break;
case ENT_SPRAY:
Spray_Parse();
@ -91,68 +90,52 @@ Entity_EntityUpdate(float type, float new)
Decal_Parse();
break;
case ENT_AMBIENTSOUND:
ambient_generic_ReadEntity(new);
NSENTITY_READENTITY(ambient_generic, new)
break;
case ENT_OLDCAMERA:
trigger_camera tc = (trigger_camera)self;
if (new) {
spawnfunc_trigger_camera();
}
tc.ReceiveEntity(new, readfloat());
NSENTITY_READENTITY(trigger_camera, new)
break;
case ENT_MONITOR:
func_monitor fc = (func_monitor)self;
if (new) {
spawnfunc_func_monitor();
}
fc.ReceiveEntity(new, readfloat());
NSENTITY_READENTITY(func_monitor, new)
break;
case ENT_DLIGHT:
light_dynamic_ReadEntity(new);
NSENTITY_READENTITY(light_dynamic, new)
break;
case ENT_PROJECTEDTEXTURE:
env_projectedtexture ept = (env_projectedtexture)self;
if (new) {
spawnfunc_env_projectedtexture();
}
ept.ReceiveEntity(new, readfloat());
NSENTITY_READENTITY(env_projectedtexture, new)
break;
case ENT_SPOTLIGHT:
point_spotlight_ReadEntity(new);
NSENTITY_READENTITY(point_spotlight, new)
break;
case ENT_FOG:
env_fog_readentity(new);
NSENTITY_READENTITY(env_fog, new)
break;
case ENT_STEAM:
env_steam_ReadEntity(new);
NSENTITY_READENTITY(env_steam, new)
break;
case ENT_FOGCONTROLLER:
env_fog_controller_readentity(new);
NSENTITY_READENTITY(env_fog_controller, new)
break;
case ENT_PARTSYSTEM:
info_particle_system ips = (info_particle_system)self;
if (new) {
spawnfunc_info_particle_system();
}
ips.ReceiveEntity(new, readfloat());
NSENTITY_READENTITY(info_particle_system, new)
break;
case ENT_PROPROPE:
prop_rope_readentity(new);
NSENTITY_READENTITY(prop_rope, new)
break;
case ENT_BUBBLES:
env_bubbles_ReadEntity(new);
NSENTITY_READENTITY(env_bubbles, new)
break;
case ENT_CONVEYOR:
func_conveyor_ReadEntity(new);
NSENTITY_READENTITY(func_conveyor, new)
break;
case ENT_WAYPOINT:
info_waypoint_ReadEntity(new);
NSENTITY_READENTITY(info_waypoint, new)
break;
case ENT_PUSH:
trigger_push_ReadEntity(new);
NSENTITY_READENTITY(trigger_push, new)
break;
case ENT_ENTITYPROJECTILE:
NSProjectile_ReadEntity(new);
NSENTITY_READENTITY(NSProjectile, new)
break;
default:
//error(sprintf("Unknown entity type update received. (%d)\n", t));

View File

@ -6,7 +6,6 @@
decals.h
client/defs.h
client/env_cubemap.qc
client/env_glow.qc
client/env_sun.qc
client/env_sound.qc
client/env_soundscape.qc

View File

@ -1,259 +0,0 @@
/*
* 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.
*/
var int autocvar_r_skipGlows = 0;
var int autocvar_r_skipLensFlares = 0;
/*!QUAKED env_glow (1 .5 0) (-8 -8 -8) (8 8 8) EVGLOW_ORIENT
# OVERVIEW
Client-side glare/glow orb effect like the flares in 1997's Unreal.
# KEYS
- "shader" : Material to use for the glare/glow effect.
- "model" : Sprite model to use for the glare/glow (idTech 2 BSPs only)
- "scale" : Scale multiplier.
- "rendercolor" : Material color override in RGB8.
- "renderamt" : Material alpha override in A8.
# SPAWNFLAGS
- EVGLOW_ORIENT (1) : TODO: Glow is an oriented sprite when set.
# TRIVIA
This entity was introduced in Half-Life (1998).
*/
class env_glow:NSEntity /* TODO: change to renderablentity? */
{
public:
void env_glow(void);
virtual void Spawned(void);
virtual void Respawn(void);
virtual float predraw(void);
virtual void postdraw(void);
virtual void SpawnKey(string,string);
virtual void RendererRestarted(void);
virtual bool CanSpawn(bool);
private:
vector m_vecColor;
float m_flAlpha;
float m_flMaxAlpha;
string m_strSprite;
vector m_vecSize;
float m_flScale;
vector m_vecRotate;
vector m_vecOrientation;
nonvirtual bool IsVisible(vector);
nonvirtual void RenderGlow(vector, vector);
};
bool
env_glow::IsVisible(vector vecPlayer)
{
entity oother = other;
if (autocvar_r_skipGlows)
return (false);
if (checkpvs(vecPlayer, this) == FALSE)
return (false);
other = world;
traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this);
other = oother;
/* If we can't trace against the player, or are two close, fade out */
if (trace_fraction < 1.0f || vlen(origin - vecPlayer) < 128)
m_flAlpha = m_flAlpha - frametime;
else
m_flAlpha = m_flAlpha + frametime;
m_flAlpha = bound(0.0f, m_flAlpha, 1.0f);
if (m_flAlpha <= 0.0f)
return (false);
return (true);
}
bool
env_glow::CanSpawn(bool clientSide)
{
return true;
}
void env_sun_lensflare(vector, float, vector);
void
env_glow::postdraw(void)
{
if (!autocvar_r_skipLensFlares)
env_sun_lensflare(origin, m_flAlpha, m_vecColor);
}
void
env_glow::RendererRestarted(void)
{
if (!model && m_strSprite) {
precache_pic(m_strSprite);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
} else {
precache_model(model);
m_strSprite = spriteframe(model, 0, 0.0f);
m_vecSize = drawgetimagesize(m_strSprite) / 2;
}
if (HasSpawnFlags(1)) {
hitcontentsmaski = CONTENTBIT_SOLID;
decal_pickwall(this, origin);
m_vecOrientation = vectoangles(g_tracedDecal.normal * -1);
}
}
void
env_glow::RenderGlow(vector forg, vector fsize)
{
#ifndef FTE_QUADFIX
R_BeginPolygon(m_strSprite, 1, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_EndPolygon();
#else
R_BeginPolygon(m_strSprite, 1, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_EndPolygon();
R_BeginPolygon(m_strSprite, 1, 0);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecColor * m_flMaxAlpha, m_flAlpha);
R_EndPolygon();
#endif
}
float
env_glow::predraw(void)
{
vector forg;
vector fsize;
vector vecPlayer = g_view.GetCameraOrigin();
vector vecAngle = g_view.GetCameraAngle();
float flDist = vlen(vecPlayer - origin);
if (IsVisible(vecPlayer) == false)
return (PREDRAW_NEXT);
/* Scale the glow somewhat with the players distance */
fsize = m_vecSize * m_flScale;
fsize *= bound(1, flDist / 256, 4);
/* Nudge this slightly towards the camera */
makevectors(vectoangles(origin - vecPlayer));
forg = origin + (v_forward * -16);
if (HasSpawnFlags(1)) {
vector above;
makevectors(m_vecOrientation);
above = origin + (v_forward * 16);
/* we're aiming right down */
if (above[2] > origin[2])
makevectors(m_vecOrientation+[0, m_vecRotate[2],0]);
else
makevectors(m_vecOrientation+[0,0, m_vecRotate[2]]);
} else {
makevectors(vecAngle +[0, m_vecRotate[1], m_vecRotate[2]]);
}
RenderGlow(forg, fsize);
return (PREDRAW_NEXT);
}
void
env_glow::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "material":
case "shader":
model = __NULL__;
m_strSprite = strKey;
break;
case "sprite":
case "model":
model = strKey;
break;
case "scale":
m_flScale = stof(strKey);
break;
case "color":
m_vecColor = stov(strKey);
break;
case "rendercolor":
case "rendercolour":
m_vecColor = stov(strKey) / 255;
break;
case "renderamt":
m_flMaxAlpha = stof(strKey) / 255;
break;
case "rotate":
m_vecRotate[2] = stof(strKey);
break;
case "rotate":
break;
default:
super::SpawnKey(strField, strKey);
}
}
void
env_glow::Respawn(void)
{
SetSize([0,0,0], [0,0,0]);
SetOrigin(GetSpawnOrigin());
effects &= ~EF_NOSHADOW;
}
void
env_glow::Spawned(void)
{
super::Spawned();
RendererRestarted();
}
void
env_glow::env_glow(void)
{
m_flScale = 1.0f;
m_flMaxAlpha = 1.0f;
m_vecColor = [1,1,1];
drawmask = MASK_GLOWS;
isCSQC = true;
}

View File

@ -57,11 +57,7 @@ env_particle::CanSpawn(bool clientSide)
void env_particle::customphysics(void)
{
vector vecPlayer;
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &g_seats[s];
vecPlayer = pSeat->m_vecPredictedOrigin;
vector vecPlayer = g_view.GetCameraOrigin();
if (checkpvs(vecPlayer, this) == FALSE) {
return;

View File

@ -99,7 +99,7 @@ env_sound::SpawnKey(string strField, string strKey)
int efx_alias = stoi(strKey);
if (efx_alias >= g_hlefx.length) {
print("^1env_sound::SpawnKey: Invalid roomtype!\n");
NSEntWarning("invalid roomtype!");
m_iRoomType = 0;
} else
m_iRoomType = EFX_Load(g_hlefx[efx_alias]);

View File

@ -77,6 +77,12 @@ float
func_dustcloud_cloud::predraw(void)
{
float alpha;
vector vecPlayer = g_view.GetCameraOrigin();
if (checkpvs(vecPlayer, this) == FALSE) {
return;
}
makevectors(view_angles);
if (lifetime < (m_flLifeTime / 2)) {

View File

@ -77,6 +77,13 @@ float
func_smokevolume_cloud::predraw(void)
{
float alpha;
vector vecPlayer = g_view.GetCameraOrigin();
return PREDRAW_NEXT;
if (checkpvs(vecPlayer, this) == FALSE) {
return PREDRAW_NEXT;
}
makevectors(view_angles);
if (lifetime < (m_flLifeTime / 2)) {
@ -89,6 +96,9 @@ func_smokevolume_cloud::predraw(void)
if (!(spawnflags & 1)) {
m_vecColor *= (getlight(origin) / 255);
m_vecColor[0] = bound(0.0, m_vecColor[0], 1.0);
m_vecColor[1] = bound(0.0, m_vecColor[1], 1.0);
m_vecColor[2] = bound(0.0, m_vecColor[2], 1.0);
}
R_BeginPolygon(m_strMaterial, 0, 0);
@ -121,12 +131,14 @@ float
func_smokevolume::predraw(void)
{
vector vecPlayer = g_view.GetCameraOrigin();
float playerDist = vlen(vecPlayer - origin);
float fracDist = 1.0 - bound(0.0, playerDist / 512, 1.0);
if (checkpvs(vecPlayer, this) == FALSE)
return (PREDRAW_NEXT);
if (m_flMaxDrawDistance > 0.0)
if (vlen(vecPlayer - origin) > m_flMaxDrawDistance)
if (playerDist > m_flMaxDrawDistance)
return (PREDRAW_NEXT);
if (m_flNexTime > cltime)
@ -144,7 +156,7 @@ func_smokevolume::predraw(void)
cloud.m_vecColor[0] = Math_Lerp(m_vecColor1[0], m_vecColor2[0], r);
cloud.m_vecColor[1] = Math_Lerp(m_vecColor1[1], m_vecColor2[1], r);
cloud.m_vecColor[2] = Math_Lerp(m_vecColor1[2], m_vecColor2[2], r);
cloud.m_flMaxAlpha = m_flAlpha;
cloud.m_flMaxAlpha = m_flAlpha * fracDist;
cloud.cloudsize[0] = random(m_flSizeMin, m_flSizeMax);
cloud.cloudsize[1] = random(m_flSizeMin, m_flSizeMax);
cloud.m_flLifeTime = random(m_flLifetimeMin, m_flLifetimeMax);

View File

@ -215,8 +215,7 @@ func_breakable::SpawnKey(string strKey, string strValue)
if (oid >= funcbreakable_objtable.length) {
m_strBreakSpawn = "";
print(sprintf("^1func_breakable^7:" \
"spawnobject %i out of bounds! fix your mod!\n", oid));
NSEntWarning("spawnobject %i out of bounds", oid);
} else {
m_strBreakSpawn = funcbreakable_objtable[oid];
}

View File

@ -148,7 +148,7 @@ func_guntarget::Move(void)
node = (path_corner)find(world, ::targetname, target);
if (!node) {
NSLog("^1func_guntarget::^3Move^7: Path node for %s not found!", targetname);
NSEntWarning("node %s for %s not found!", target, targetname);
return;
}

View File

@ -136,7 +136,7 @@ trigger_once::Touch(entity eToucher)
SetSolid(SOLID_NOT); /* make inactive */
m_iValue = 1;
if (!target) {
if (!target && !m_strKillTarget) {
UseOutput(eToucher, m_strOnStartTouch);
return;
}

View File

@ -10,6 +10,7 @@ shared/env_beam.qc
shared/env_sprite.qc
shared/env_bubbles.qc
shared/env_laser.qc
shared/env_glow.qc
shared/env_projectedtexture.qc
shared/env_fog.qc
shared/env_fog_controller.qc

View File

@ -427,15 +427,3 @@ ambient_generic::predraw(void)
return (PREDRAW_NEXT);
}
#endif
#ifdef CLIENT
void
ambient_generic_ReadEntity(float new)
{
ambient_generic me = (ambient_generic)self;
if (new) {
spawnfunc_ambient_generic();
}
me.ReceiveEntity(new, readfloat());
}
#endif

View File

@ -512,18 +512,4 @@ env_beam::predraw(void)
return (PREDRAW_NEXT);
}
#endif
#ifdef CLIENT
void
env_beam_ReadEntity(float isnew)
{
env_beam beam = (env_beam)self;
float changedflags = readfloat();
if (isnew)
spawnfunc_env_beam();
beam.ReceiveEntity(isnew, changedflags);
}
#endif

View File

@ -345,15 +345,3 @@ env_bubbles::Spawned(void)
precache_model("sprites/bubble.spr");
}
#ifdef CLIENT
void
env_bubbles_ReadEntity(float new)
{
env_bubbles me = (env_bubbles)self;
if (new) {
spawnfunc_env_bubbles();
}
me.ReceiveEntity(new, readfloat());
}
#endif

View File

@ -0,0 +1,205 @@
/*
* Copyright (c) 2023 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.
*/
enumflags
{
ENVFIRE_INFINITE,
ENVFIRE_SMOKELESS,
ENVFIRE_STARTON,
ENVFIRE_STARTFULL,
ENVFIRE_NODROP,
ENVFIRE_NOGLOW,
ENVFIRE_UNUSED,
ENVFIRE_DELETE,
ENVFIRE_TOPVISIBLE
};
/*!QUAKED env_fire (1 .5 0) (-8 -8 -8) (8 8 8) INFINITE_DURATION SMOKELESS STARTON STARTFULL NODROP NOGLOW x DELETE TOPVISIBLE
# OVERVIEW
Environmental fire/flame entity. Will apply damage to entities, including other fire entities. They grow/shrink depending on their ignition level.
# KEYS
- "targetname" : Name
- "health" : Duration, in seconds.
- "firesize" : Size of the fire in world units.
- "fireattack" : Time in seconds until the fire has fully expanded.
- "firetype" : Type of fire. 0 - Standard, 1 - Plasma
- "ignitionpoint" : Amount of fire damage it takes before igniting fully.
- "damagescale" : Burn damage multiplier.
# SPAWNFLAGS
- INFINITE_DURATION (1) : Don't extinguish by itself.
- SMOKELESS (2) : Don't spawn smoke.
- STARTON (4) : Starts enabled.
- STARTFULL (8) : Starts expanded.
- NODROP (16) : Don't drop to floor (?)
- NOGLOW (32) : Don't glow.
- DELETE (128) : Delete from game when extinguished.
- TOPVISIBLE (256) : Visible from above.
# INPUTS
- "StartFire" : Starts the fire effect.
- "Extinguish" : Puts out the fire, with an optional timer (in seconds).
- "ExtinguishTemporary" : Puts out the fire (temporarily).
# OUTPUTS
- "OnIgnited" : Triggered when the fire ignites.
- "OnExtinguished" : Triggered when the fire is extinguished.
# TRIVIA
This entity was introduced in Half-Life 2 (2004).
*/
class
env_fire:NSPointTrigger
{
PREDICTED_FLOAT(m_flSize)
PREDICTED_BOOL(m_bState)
PREDICTED_FLOAT m_flMaxSize)
PREDICTED_FLOATm_flGrowTime)
PREDICTED_BOOL(m_bType)
float m_flIgnitionPoint;
float m_flDamageScale;
float m_flDuration;
void env_fire(void);
#ifdef SERVER
virtual void SpawnKey(string strKey, string strValue);
#endif
};
void
env_fire::env_fire(void)
{
m_flDuration = 30.0f;
m_flSize = 64.0;
m_flGrowTime = 4.0f;
m_bType = false;
m_flIgnitionPoint = 32.0f;
m_flDamageScale = 1.0f;
}
#ifdef SERVER
void
env_fire::SpawnKey(string strKey, string strValue)
{
switch (strKey) {
case "health":
m_flDuration = stof(strValue);
break;
case "firesize":
m_flSize = stof(strValue);
break;
case "fireattack":
m_flGrowTime = stof(strValue);
break;
case "firetype":
m_bType = stof(strValue);
break;
case "ignitionpoint":
m_flIgnitionPoint = stof(strValue);
break;
case "damagescale":
m_flDamageScale = stof(strValue);
break;
default:
super::SpawnKey(strKey, strValue);
}
}
void
env_fire::Respawn(void)
{
SetSize([0,0,0], [0,0,0]);
SetOrigin(GetSpawnOrigin());
}
void
env_fire::EvaluateEntity(void)
{
EVALUATE_VECTOR(origin, 0, EVFIRE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 1, EVFIRE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 2, EVFIRE_CHANGED_ORIGIN)
EVALUATE_VECTOR(angles, 0, EVFIRE_CHANGED_ANGLE)
EVALUATE_VECTOR(angles, 1, EVFIRE_CHANGED_ANGLE)
EVALUATE_VECTOR(angles, 2, EVFIRE_CHANGED_ANGLE)
EVALUATE_FIELD(m_flDuration, EVFIRE_CHANGED_DURATION)
EVALUATE_FIELD(m_flMaxSize, EVFIRE_CHANGED_SIZE)
EVALUATE_FIELD(m_flGrowTime, EVFIRE_CHANGED_GROW)
EVALUATE_FIELD(m_bType, EVFIRE_CHANGED_TYPE)
}
float
env_fire::SendEntity(entity ePEnt, float flChanged)
{
WriteByte(MSG_ENTITY, ENT_STEAM);
WriteFloat(MSG_ENTITY, flChanged);
SENDENTITY_COORD(origin[0], EVFIRE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[1], EVFIRE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[2], EVFIRE_CHANGED_ORIGIN)
SENDENTITY_COORD(angles[0], EVFIRE_CHANGED_ANGLE)
SENDENTITY_COORD(angles[1], EVFIRE_CHANGED_ANGLE)
SENDENTITY_COORD(angles[2], EVFIRE_CHANGED_ANGLE)
SENDENTITY_BYTE(m_bState, EVFIRE_CHANGED_STATE)
SENDENTITY_BYTE(m_bType, EVFIRE_CHANGED_TYPE)
SENDENTITY_FLOAT(m_flSpread, EVFIRE_CHANGED_SPREAD)
SENDENTITY_FLOAT(m_flSpeed, EVFIRE_CHANGED_SPEED)
SENDENTITY_FLOAT(m_flStartSize, EVFIRE_CHANGED_MINS)
SENDENTITY_FLOAT(m_flEndSize , EVFIRE_CHANGED_MAXS)
SENDENTITY_FLOAT(m_flRate, EVFIRE_CHANGED_RATE)
SENDENTITY_COLOR(m_vecColor[0], EVFIRE_CHANGED_COLOR)
SENDENTITY_COLOR(m_vecColor[1], EVFIRE_CHANGED_COLOR)
SENDENTITY_COLOR(m_vecColor[2], EVFIRE_CHANGED_COLOR)
SENDENTITY_FLOAT(m_flLength, EVFIRE_CHANGED_LENGTH)
SENDENTITY_FLOAT(m_flAlpha, EVFIRE_CHANGED_ALPHA)
SENDENTITY_FLOAT(m_flRollSpeed, EVFIRE_CHANGED_ROLL)
//print(sprintf("S (%x): %v %v %i\n", flChanged, origin, m_vecEndPos, m_iActive));
return (1);
}
#else
void
env_fire::ReceiveEntity(float flNew, float flChanged)
{
READENTITY_COORD(origin[0], EVFIRE_CHANGED_ORIGIN)
READENTITY_COORD(origin[1], EVFIRE_CHANGED_ORIGIN)
READENTITY_COORD(origin[2], EVFIRE_CHANGED_ORIGIN)
READENTITY_COORD(angles[0], EVFIRE_CHANGED_ANGLE)
READENTITY_COORD(angles[1], EVFIRE_CHANGED_ANGLE)
READENTITY_COORD(angles[2], EVFIRE_CHANGED_ANGLE)
READENTITY_BYTE(m_bState, EVFIRE_CHANGED_STATE)
READENTITY_BYTE(m_bType, EVFIRE_CHANGED_TYPE)
READENTITY_FLOAT(m_flSpread, EVFIRE_CHANGED_SPREAD)
READENTITY_FLOAT(m_flSpeed, EVFIRE_CHANGED_SPEED)
READENTITY_FLOAT(m_flStartSize, EVFIRE_CHANGED_MINS)
READENTITY_FLOAT(m_flEndSize , EVFIRE_CHANGED_MAXS)
READENTITY_FLOAT(m_flRate, EVFIRE_CHANGED_RATE)
READENTITY_COLOR(m_vecColor[0], EVFIRE_CHANGED_COLOR)
READENTITY_COLOR(m_vecColor[1], EVFIRE_CHANGED_COLOR)
READENTITY_COLOR(m_vecColor[2], EVFIRE_CHANGED_COLOR)
READENTITY_FLOAT(m_flLength, EVFIRE_CHANGED_LENGTH)
READENTITY_FLOAT(m_flAlpha, EVFIRE_CHANGED_ALPHA)
READENTITY_FLOAT(m_flRollSpeed, EVFIRE_CHANGED_ROLL)
//print(sprintf("R (%x): %v %v %i\n", flChanged, origin, m_vecEndPos, m_iActive));
//drawmask = MASK_ENGINE;
setsize(this, [0,0,0], [0,0,0]);
setorigin(this, origin);
}
#endif

View File

@ -215,18 +215,4 @@ env_fog::Trigger(entity act, triggermode_t state)
m_bEnabled = (m_bEnabled) ? false : true;
}
}
#endif
#ifdef CLIENT
void
env_fog_readentity(float isnew)
{
env_fog fog = (env_fog)self;
float flags = readfloat();
if (isnew)
spawnfunc_env_fog();
fog.ReceiveEntity(isnew, flags);
}
#endif

View File

@ -168,13 +168,13 @@ env_fog_controller::FogRender(void)
m_flNextDraw = cltime + 1.0f;
/* apply the fog. wish there was a builtin for this instead... */
localcmd(sprintf("fog %f %f %f %f %f %f\n", \
StartToBias(),
localcmd(sprintf("set r_fog_linear 1; fog %f %f %f %f %f %f\n", \
m_flFogEnd,
Math_Lerp(m_vecFogColor[0], m_vecFogColor2[0], delta),
Math_Lerp(m_vecFogColor[1], m_vecFogColor2[1], delta),
Math_Lerp(m_vecFogColor[2], m_vecFogColor2[2], delta),
m_flFogMaxDensity,
0.0f));
m_flFogStart));
//print(sprintf("%f (%v, %v)\n", delta, p1, p2));
@ -187,13 +187,13 @@ env_fog_controller::FogUpdate(void)
if (!m_iFogActive)
return;
localcmd(sprintf("fog %f %f %f %f %f %f\n", \
StartToBias(),
localcmd(sprintf("set r_fog_linear 1; fog %f %f %f %f %f %f\n", \
m_flFogEnd,
m_vecFogColor[0],
m_vecFogColor[1],
m_vecFogColor[2],
m_flFogMaxDensity,
0.0f));
m_flFogStart));
}
void
@ -528,19 +528,4 @@ env_fog_controller::env_fog_controller(void)
m_vecSpawnColor = [1.0, 1.0, 1.0];
m_flSpawnMaxDensity = 1.0f;
#endif
}
#ifdef CLIENT
void
env_fog_controller_readentity(float isnew)
{
env_fog_controller fog = (env_fog_controller)self;
float flags = readfloat();
if (isnew)
spawnfunc_env_fog_controller();
fog.ReceiveEntity(flags, isnew);
}
#endif
}

View File

@ -0,0 +1,353 @@
/*
* 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.
*/
var int autocvar_r_skipGlows = 0;
var int autocvar_r_skipLensFlares = 0;
/*!QUAKED env_glow (1 .5 0) (-8 -8 -8) (8 8 8) EVGLOW_ORIENT
# OVERVIEW
Glare/glow orb effect like the flares in 1997's Unreal.
# KEYS
- "targetname" : Name
- "shader" : Material to use for the glare/glow effect.
- "model" : Sprite model to use for the glare/glow (idTech 2 BSPs only)
- "scale" : Scale multiplier.
- "rendercolor" : Material color override in RGB8.
- "renderamt" : Material alpha override in A8.
- "rendermode" : Render Mode
- "renderfx" : Render FX
# SPAWNFLAGS
- EVGLOW_ORIENT (1) : Glow is an oriented sprite when set.
# TRIVIA
This entity was introduced in Half-Life (1998).
*/
class env_glow:NSRenderableEntity
{
public:
void env_glow(void);
#ifdef SERVER
virtual void Respawn(void);
virtual void SpawnKey(string,string);
virtual void EvaluateEntity(void);
virtual float SendEntity(entity,float);
#else
float m_flMaxAlpha;
vector m_vecSize;
vector m_vecRotate;
virtual float predraw(void);
virtual void postdraw(void);
virtual void RendererRestarted(void);
nonvirtual bool IsVisible(vector);
nonvirtual void RenderGlow(vector, vector);
nonvirtual void RenderNormal(vector, vector);
virtual void ReceiveEntity(float,float);
#endif
private:
NETWORKED_STRING(m_strMaterial)
};
void
env_glow::env_glow(void)
{
m_strMaterial = __NULL__;
#ifdef CLIENT
m_flMaxAlpha = 1.0f;
#endif
}
#ifdef SERVER
void
env_glow::SpawnKey(string strField, string strKey)
{
switch (strField) {
case "material":
case "shader":
model = __NULL__;
m_strMaterial = strKey;
break;
default:
super::SpawnKey(strField, strKey);
}
}
void
env_glow::Respawn(void)
{
if (!model && !m_strMaterial) {
NSEntWarning("no model specified");
Destroy();
return;
}
SetModel(GetSpawnModel());
SetSize([0,0,0], [0,0,0]);
SetOrigin(GetSpawnOrigin());
AddEffects(EF_NOSHADOW);
if (GetRenderColor() == g_vec_null)
SetRenderColor([1.0, 1.0, 1.0]);
if (GetRenderMode() == RM_NORMAL)
SetRenderAmt(1.0);
/*
if (HasSpawnFlags(1)) {
hitcontentsmaski = CONTENTBIT_SOLID;
decal_pickwall(this, origin);
angles = vectoangles(g_tracedDecal.normal * -1);
}
*/
}
void
env_glow::EvaluateEntity(void)
{
EVALUATE_VECTOR(origin, 0, SPRITE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 1, SPRITE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 2, SPRITE_CHANGED_ORIGIN)
EVALUATE_FIELD(modelindex, SPRITE_CHANGED_MODELINDEX)
EVALUATE_FIELD(scale, SPRITE_CHANGED_SCALE)
EVALUATE_FIELD(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
EVALUATE_FIELD(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
EVALUATE_VECTOR(m_vecRenderColor, 0, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 1, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 2, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_FIELD(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
EVALUATE_FIELD(m_strMaterial, SPRITE_CHANGED_MATERIAL)
}
float
env_glow::SendEntity(entity ePEnt, float flChanged)
{
if (clienttype(ePEnt) != CLIENTTYPE_REAL)
return (0);
/* strings are expensive. */
if (!m_strMaterial)
flChanged &= ~SPRITE_CHANGED_MATERIAL;
WriteByte(MSG_ENTITY, ENT_GLOW);
WriteFloat(MSG_ENTITY, flChanged);
SENDENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN)
SENDENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX)
SENDENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE)
SENDENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
SENDENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
SENDENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
SENDENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL)
return (1);
}
#else
bool
env_glow::IsVisible(vector vecPlayer)
{
entity oother = other;
if (autocvar_r_skipGlows)
return (false);
if (checkpvs(vecPlayer, this) == FALSE)
return (false);
other = world;
traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this);
other = oother;
/* If we can't trace against the player, or are two close, fade out */
if (trace_fraction < 1.0f || vlen(origin - vecPlayer) < 128)
m_flMaxAlpha = m_flMaxAlpha - frametime;
else
m_flMaxAlpha = m_flMaxAlpha + frametime;
m_flMaxAlpha = bound(0.0f, m_flMaxAlpha, 1.0f);
if (m_flMaxAlpha <= 0.0f)
return (false);
return (true);
}
void env_sun_lensflare(vector, float, vector);
void
env_glow::postdraw(void)
{
if (GetRenderMode() == RM_GLOW)
if (!autocvar_r_skipLensFlares)
env_sun_lensflare(origin, m_flMaxAlpha, m_vecRenderColor);
}
void
env_glow::RendererRestarted(void)
{
if (!modelindex && m_strMaterial) {
precache_pic(m_strMaterial);
m_vecSize = drawgetimagesize(m_strMaterial) / 2;
} else {
model = modelnameforindex(modelindex);
m_strMaterial = spriteframe(model, 0, 0.0f);
m_vecSize = drawgetimagesize(m_strMaterial) / 2;
//NSEntWarning("%S %d %S %v", model, modelindex, m_strMaterial, m_vecSize);
}
}
void
env_glow::RenderGlow(vector forg, vector fsize)
{
#ifndef FTE_QUADFIX
R_BeginPolygon(m_strMaterial, 1, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_EndPolygon();
#else
R_BeginPolygon(m_strMaterial, 1, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_EndPolygon();
R_BeginPolygon(m_strMaterial, 1, 0);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecRenderColor * m_flRenderAmt, m_flMaxAlpha);
R_EndPolygon();
#endif
}
void
env_glow::RenderNormal(vector forg, vector fsize)
{
#ifndef FTE_QUADFIX
R_BeginPolygon(m_strMaterial, 0, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecRenderColor, m_flRenderAmt);
R_EndPolygon();
#else
R_BeginPolygon(m_strMaterial, 0, 0);
R_PolygonVertex(forg + v_right * fsize[0] - v_up * fsize[1],
[1,1], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor, m_flRenderAmt);
R_EndPolygon();
R_BeginPolygon(m_strMaterial, 0, 0);
R_PolygonVertex(forg - v_right * fsize[0] - v_up * fsize[1],
[0,1], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg - v_right * fsize[0] + v_up * fsize[1],
[0,0], m_vecRenderColor, m_flRenderAmt);
R_PolygonVertex(forg + v_right * fsize[0] + v_up * fsize[1],
[1,0], m_vecRenderColor, m_flRenderAmt);
R_EndPolygon();
#endif
}
float
env_glow::predraw(void)
{
vector forg;
vector fsize;
vector vecPlayer = g_view.GetCameraOrigin();
vector vecAngle = g_view.GetCameraAngle();
float flDist = vlen(vecPlayer - origin);
if (GetRenderMode() == RM_GLOW) {
if (IsVisible(vecPlayer) == false)
return (PREDRAW_NEXT);
/* Scale the glow somewhat with the players distance */
fsize = m_vecSize * scale;
fsize *= bound(1, flDist / 256, 4);
}
/* Nudge this slightly towards the camera */
makevectors(vectoangles(origin - vecPlayer));
forg = origin + (v_forward * -16);
if (HasSpawnFlags(1)) {
vector above;
makevectors(angles);
above = origin + (v_forward * 16);
/* we're aiming right down */
if (above[2] > origin[2])
makevectors(angles + [0, m_vecRotate[2],0]);
else
makevectors(angles + [0,0, m_vecRotate[2]]);
} else {
makevectors(vecAngle + [0, m_vecRotate[1], m_vecRotate[2]]);
}
if (GetRenderMode() == RM_GLOW)
RenderGlow(forg, fsize);
else if (GetRenderMode() == RM_ADDITIVE)
RenderGlow(forg, m_vecSize * scale);
else
RenderNormal(forg, m_vecSize * scale);
return (PREDRAW_NEXT);
}
void
env_glow::ReceiveEntity(float flNew, float flChanged)
{
READENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN)
READENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN)
READENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN)
READENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX)
READENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE)
READENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
READENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
READENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
READENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL)
if (flNew)
RendererRestarted();
drawmask = MASK_GLOWS;
setsize(this, g_vec_null, g_vec_null);
setorigin(this, origin);
}
#endif

View File

@ -401,18 +401,4 @@ env_laser::predraw(void)
return (PREDRAW_NEXT);
}
#endif
#ifdef CLIENT
void
env_laser_ReadEntity(float isnew)
{
env_laser laser = (env_laser)self;
float changedflags = readfloat();
if (isnew)
spawnfunc_env_laser();
laser.ReceiveEntity(isnew, changedflags);
}
#endif

View File

@ -66,8 +66,8 @@ private:
int m_iToggled;
float m_flEffects;
PREDICTED_STRING(m_strMaterial)
PREDICTED_FLOAT(m_flFramerate)
NETWORKED_STRING(m_strMaterial)
NETWORKED_FLOAT(m_flFramerate)
#ifdef CLIENT
int m_iMaxFrame;
@ -96,48 +96,36 @@ public:
#endif
};
void
env_sprite::env_sprite(void)
{
NETWORKED_DEFAULT(m_strMaterial, __NULL__)
NETWORKED_DEFAULT(m_flFramerate, 10.0f)
NETWORKED_DEFAULT(scale, 1.0f)
m_iIsShader = false;
}
#ifdef SERVER
void
env_sprite::EvaluateEntity(void)
{
if (ATTR_CHANGED(origin)) {
SetSendFlags(SPRITE_CHANGED_ORIGIN);
}
if (ATTR_CHANGED(modelindex)) {
SetSendFlags(SPRITE_CHANGED_MODELINDEX);
}
if (ATTR_CHANGED(m_flFramerate)) {
SetSendFlags(SPRITE_CHANGED_FRAMERATE);
}
if (ATTR_CHANGED(scale)) {
SetSendFlags(SPRITE_CHANGED_SCALE);
}
if (ATTR_CHANGED(m_iRenderMode)) {
SetSendFlags(SPRITE_CHANGED_RENDERMODE);
}
if (ATTR_CHANGED(m_vecRenderColor)) {
SetSendFlags(SPRITE_CHANGED_RENDERCOLOR);
}
if (ATTR_CHANGED(m_flRenderAmt)) {
SetSendFlags(SPRITE_CHANGED_RENDERAMT);
}
if (ATTR_CHANGED(m_strMaterial)) {
SetSendFlags(SPRITE_CHANGED_MATERIAL);
}
SAVE_STATE(origin)
SAVE_STATE(modelindex)
SAVE_STATE(m_flFramerate)
SAVE_STATE(scale)
SAVE_STATE(m_iRenderMode)
SAVE_STATE(m_iRenderFX)
SAVE_STATE(m_vecRenderColor)
SAVE_STATE(m_flRenderAmt)
SAVE_STATE(m_strMaterial)
EVALUATE_VECTOR(origin, 0, SPRITE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 1, SPRITE_CHANGED_ORIGIN)
EVALUATE_VECTOR(origin, 2, SPRITE_CHANGED_ORIGIN)
EVALUATE_FIELD(modelindex, SPRITE_CHANGED_MODELINDEX)
EVALUATE_FIELD(m_flFramerate, SPRITE_CHANGED_FRAMERATE)
EVALUATE_FIELD(scale, SPRITE_CHANGED_SCALE)
EVALUATE_FIELD(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
EVALUATE_FIELD(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
EVALUATE_VECTOR(m_vecRenderColor, 0, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 1, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_VECTOR(m_vecRenderColor, 2, SPRITE_CHANGED_RENDERCOLOR)
EVALUATE_FIELD(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
EVALUATE_FIELD(m_strMaterial, SPRITE_CHANGED_MATERIAL)
}
float
env_sprite::SendEntity(entity ePEnt, float flFlags)
env_sprite::SendEntity(entity ePEnt, float flChanged)
{
if (clienttype(ePEnt) != CLIENTTYPE_REAL)
return (0);
@ -149,41 +137,26 @@ env_sprite::SendEntity(entity ePEnt, float flFlags)
if (m_iToggled == FALSE)
return (0);
/* strings are expensive. */
if (!m_strMaterial)
flChanged &= ~SPRITE_CHANGED_MATERIAL;
WriteByte(MSG_ENTITY, ENT_SPRITE);
WriteFloat(MSG_ENTITY, flFlags);
WriteFloat(MSG_ENTITY, flChanged);
if (flFlags & SPRITE_CHANGED_ORIGIN) {
WriteCoord(MSG_ENTITY, origin[0]);
WriteCoord(MSG_ENTITY, origin[1]);
WriteCoord(MSG_ENTITY, origin[2]);
}
if (flFlags & SPRITE_CHANGED_MODELINDEX) {
WriteFloat(MSG_ENTITY, modelindex);
}
if (flFlags & SPRITE_CHANGED_FRAMERATE) {
WriteFloat(MSG_ENTITY, m_flFramerate);
}
if (flFlags & SPRITE_CHANGED_SCALE) {
WriteFloat(MSG_ENTITY, scale);
}
if (flFlags & SPRITE_CHANGED_RENDERMODE) {
WriteByte(MSG_ENTITY, m_iRenderMode);
}
if (flFlags & SPRITE_CHANGED_RENDERFX) {
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (flFlags & SPRITE_CHANGED_RENDERCOLOR) {
WriteFloat(MSG_ENTITY, m_vecRenderColor[0]);
WriteFloat(MSG_ENTITY, m_vecRenderColor[1]);
WriteFloat(MSG_ENTITY, m_vecRenderColor[2]);
}
if (flFlags & SPRITE_CHANGED_RENDERAMT) {
WriteFloat(MSG_ENTITY, m_flRenderAmt);
}
if (flFlags & SPRITE_CHANGED_MATERIAL) {
WriteString(MSG_ENTITY, m_strMaterial);
}
SENDENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN)
SENDENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN)
SENDENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX)
SENDENTITY_FLOAT(m_flFramerate, SPRITE_CHANGED_FRAMERATE)
SENDENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE)
SENDENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
SENDENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
SENDENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
SENDENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL)
return (1);
}
@ -305,39 +278,21 @@ env_sprite::think(void)
}
void
env_sprite::ReceiveEntity(float flNew, float flFlags)
env_sprite::ReceiveEntity(float flNew, float flChanged)
{
if (flFlags & SPRITE_CHANGED_ORIGIN) {
origin[0] = readcoord();
origin[1] = readcoord();
origin[2] = readcoord();
}
if (flFlags & SPRITE_CHANGED_MODELINDEX) {
modelindex = readfloat();
}
if (flFlags & SPRITE_CHANGED_FRAMERATE) {
m_flFramerate = readfloat();
}
if (flFlags & SPRITE_CHANGED_SCALE) {
scale = readfloat();
}
if (flFlags & SPRITE_CHANGED_RENDERMODE) {
m_iRenderMode = readbyte();
}
if (flFlags & SPRITE_CHANGED_RENDERFX) {
m_iRenderFX = readbyte();
}
if (flFlags & SPRITE_CHANGED_RENDERCOLOR) {
m_vecRenderColor[0] = readfloat();
m_vecRenderColor[1] = readfloat();
m_vecRenderColor[2] = readfloat();
}
if (flFlags & SPRITE_CHANGED_RENDERAMT) {
m_flRenderAmt = readfloat();
}
if (flFlags & SPRITE_CHANGED_MATERIAL) {
m_strMaterial = readstring();
}
READENTITY_COORD(origin[0], SPRITE_CHANGED_ORIGIN)
READENTITY_COORD(origin[1], SPRITE_CHANGED_ORIGIN)
READENTITY_COORD(origin[2], SPRITE_CHANGED_ORIGIN)
READENTITY_FLOAT(modelindex, SPRITE_CHANGED_MODELINDEX)
READENTITY_FLOAT(m_flFramerate, SPRITE_CHANGED_FRAMERATE)
READENTITY_FLOAT(scale, SPRITE_CHANGED_SCALE)
READENTITY_BYTE(m_iRenderMode, SPRITE_CHANGED_RENDERMODE)
READENTITY_BYTE(m_iRenderFX, SPRITE_CHANGED_RENDERFX)
READENTITY_COLOR(m_vecRenderColor[0], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[1], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[2], SPRITE_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_flRenderAmt, SPRITE_CHANGED_RENDERAMT)
READENTITY_STRING(m_strMaterial, SPRITE_CHANGED_MATERIAL)
drawmask = MASK_ENGINE;
nextthink = time + (1 / m_flFramerate);
@ -366,15 +321,6 @@ env_sprite::SetFramerate(bool flag)
}
void
env_sprite::env_sprite(void)
{
m_iIsShader = false;
m_flFramerate = 10;
m_strMaterial = __NULL__;
scale = 1.0f;
}
#ifdef CLIENT
void
EnvSprite_ParseEvent(void)

View File

@ -481,18 +481,4 @@ env_steam::predraw(void)
addentity(self);
return (PREDRAW_NEXT);
}
#endif
#ifdef CLIENT
void
env_steam_ReadEntity(float isnew)
{
env_steam laser = (env_steam)self;
float changedflags = readfloat();
if (isnew)
spawnfunc_env_steam();
laser.ReceiveEntity(isnew, changedflags);
}
#endif

View File

@ -364,20 +364,6 @@ func_conveyor::ReceiveEntity(float flNew, float flChanged)
setorigin(this, origin);
}
void
func_conveyor_ReadEntity(bool new)
{
float fl;
func_conveyor rend = (func_conveyor)self;
if (new) {
spawnfunc_func_conveyor();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
}
#endif
void

View File

@ -458,18 +458,4 @@ func_tankmortar::func_tankmortar(void)
{
m_iVehicleFlags |= VHF_FROZEN | VHF_NOATTACK;
}
#ifdef CLIENT
void
func_tankmortar_readentity(float isnew)
{
func_tankmortar veh = (func_tankmortar)self;
float flags = readfloat();
if (isnew)
spawnfunc_func_tankmortar();
veh.ReceiveEntity(flags, isnew);
}
#endif
}

View File

@ -1018,18 +1018,4 @@ func_vehicle::SendEntity(entity ePEnt, float flChanged)
return true;
}
#endif
#ifdef CLIENT
void
func_vehicle_readentity(float isnew)
{
func_vehicle veh = (func_vehicle)self;
float flags = readfloat();
if (isnew)
spawnfunc_func_vehicle();
veh.ReceiveEntity(flags, isnew);
}
#endif

View File

@ -245,18 +245,4 @@ info_waypoint::postdraw(void)
Font_DrawText_RGBA(projectedPos, m_strText, [1,1,1], a, FONT_CON);
}
}
void
info_waypoint_ReadEntity(bool new)
{
float fl;
info_waypoint rend = (info_waypoint)self;
if (new) {
spawnfunc_info_waypoint();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
}
#endif

View File

@ -416,19 +416,4 @@ light_dynamic::light_dynamic(void)
}
/* compatibility for q3map users, stay safe out there */
class dynamic_light:light_dynamic { };
#ifdef CLIENT
void
light_dynamic_ReadEntity(float new)
{
light_dynamic dl = (light_dynamic)self;
if (new) {
spawnfunc_light_dynamic();
}
dl.ReceiveEntity(new, readfloat());
dl.drawmask = MASK_GLOWS;
}
#endif
class dynamic_light:light_dynamic { };

View File

@ -353,16 +353,4 @@ point_spotlight::point_spotlight(void)
m_flBeamWidth = 50.0f;
m_vecColor = [1.0,1.0,1.0];
#endif
}
#ifdef CLIENT
void
point_spotlight_ReadEntity(float isNew)
{
point_spotlight ept = (point_spotlight)self;
if (isNew) {
spawnfunc_point_spotlight();
}
ept.ReceiveEntity(isNew, readfloat());
}
#endif
}

View File

@ -307,19 +307,4 @@ prop_rope::prop_rope(void)
/* this is empty for a good reason */
drawmask = MASK_ENGINE;
#endif
}
#ifdef CLIENT
void
prop_rope_readentity(float isnew)
{
prop_rope rope = (prop_rope)self;
float flags = readfloat();
if (isnew)
spawnfunc_prop_rope();
rope.ReceiveEntity(flags, isnew);
}
#endif
}

View File

@ -903,18 +903,4 @@ prop_vehicle_driveable::Spawned(void)
#ifdef SERVER
Sound_Precache("prop_vehicle_driveable.bounce");
#endif
}
#ifdef CLIENT
void
prop_vehicle_driveable_readentity(float isnew)
{
prop_vehicle_driveable veh = (prop_vehicle_driveable)self;
float flags = readfloat();
if (isnew)
spawnfunc_prop_vehicle_driveable();
veh.ReceiveEntity(flags, isnew);
}
#endif
}

View File

@ -87,8 +87,6 @@ trigger_camera::ReceiveEntity(float flNew, float flFlags)
{
float flWait = 0.0f;
print(sprintf("camera update %d %d %x\n", entnum, flNew, flFlags));
if (flFlags & OCAMFL_CHANGED_ORIGIN) {
origin[0] = readcoord();
origin[1] = readcoord();
@ -234,7 +232,7 @@ trigger_camera::GoToTarget(void)
NSLog("trigger_camera (%s): Moving to path_corner %S within %f secs", targetname, target, flTravelTime);
if (!flTravelTime) {
print("^1trigger_camera::^3GoToTarget^7: Distance short, going next\n");
NSEntWarning("distance too short, going to next");
NextPath();
return;
}
@ -264,7 +262,7 @@ trigger_camera::NextPath(void)
/* warp next frame */
if (eNode.HasSpawnFlags(PC_TELEPORT)) {
print(sprintf("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname));
NSLog("^1trigger_camera::^3NextPath^7: Node %s wants %s to teleport\n", eNode.targetname, targetname);
ScheduleThink(NextPath, 0.0f);
return;
}
@ -290,7 +288,7 @@ trigger_camera::Trigger(entity act, triggermode_t state)
act = find(world, ::classname, "player");
}
print(sprintf("trigger_camera for %S is now %S\n", act.netname, targetname));
NSLog("trigger_camera for %S is now %S\n", act.netname, targetname);
/* kill the other cams the player may be attached to */
for (trigger_camera cam = __NULL__; (cam = (trigger_camera)find(cam, ::classname, "trigger_camera"));) {

View File

@ -368,8 +368,4 @@ public:
nonvirtual float GetSpawnTime(void);
/** Move the entity to a new position, with updated angles. */
nonvirtual void Transport(vector, vector);
};
#ifdef CLIENT
void NSEntity_ReadEntity(float);
#endif
};

View File

@ -908,7 +908,7 @@ bool NSEntity::StartSound( string strSample, float channel, float flags, bool br
}
bool NSEntity::StartSoundDef( string strSample, float channel, bool broadcast ) {
NSLog( "StartSoundDef: %s %d %d", strSample, channel, broadcast );
NSLog( "^2%s::^3StartSoundDef^7: %s (chan: %d bcast: %d)", classname, strSample, channel, broadcast );
Sound_Play( this, channel, strSample );
return ( true );
}
@ -979,20 +979,4 @@ NSEntity::Transport(vector new_pos, vector new_ang)
if (flags & FL_CLIENT)
Client_FixAngle(this, new_ang);
#endif
}
#ifdef CLIENT
void
NSEntity_ReadEntity(bool new)
{
float fl;
NSEntity read = (NSEntity)self;
if (new) {
spawnfunc_NSEntity();
}
fl = readfloat();
read.ReceiveEntity(new, fl);
}
#endif
}

View File

@ -576,7 +576,6 @@ private:
#ifdef CLIENT
string Sentences_GetSamples(string);
string Sentences_ProcessSample(string);
void NSMonster_ReadEntity(bool);
#endif
#ifdef SERVER

View File

@ -2099,19 +2099,7 @@ NSMonster::_RenderDebugViewCone(void)
}
#endif
#ifdef CLIENT
void
NSMonster_ReadEntity(bool new)
{
NSMonster me = (NSMonster)self;
if (new) {
spawnfunc_NSMonster();
}
me.ReceiveEntity(new, readfloat());
}
#else
#ifdef SERVER
var int autocvar_ai_alertdebug = 0;
var float g_monsteralert_timer;

View File

@ -120,8 +120,4 @@ public:
nonvirtual void ApplyTorqueCenter(vector);
/** Called by the physics routine to figure out the impact damage. */
nonvirtual float CalculateImpactDamage(int,int);
};
#ifdef CLIENT
void NSPhysicsEntity_ReadEntity(bool);
#endif
};

View File

@ -633,20 +633,4 @@ NSPhysicsEntity::SpawnKey(string strKey, string strValue)
super::SpawnKey(strKey, strValue);
break;
}
}
#ifdef CLIENT
void
NSPhysicsEntity_ReadEntity(bool new)
{
float fl;
NSPhysicsEntity rend = (NSPhysicsEntity)self;
if (new) {
spawnfunc_NSPhysicsEntity();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
//print(sprintf("physics ent update: %d %x %d %v\n", self.entnum, fl, self.origin, vlen(self.velocity)));
}
#endif
}

View File

@ -90,8 +90,6 @@ private:
};
#ifdef CLIENT
void NSPortal_ReadEntity(bool);
#define READENTITY_PORTAL(field, changedflag) {\
if (flChanged & changedflag) {\
field = (NSPortal)findfloat(world, ::entnum, readentitynum());\

View File

@ -445,16 +445,4 @@ NSPortal::ReceiveEntity(float flNew, float flChanged)
drawmask = MASK_ENGINE;
predraw = 0;
}
#endif
#ifdef CLIENT
void
NSPortal_ReadEntity(bool new)
{
NSPortal me = (NSPortal)self;
if (new) {
spawnfunc_NSPortal();
}
me.ReceiveEntity(new, readfloat());
}
#endif

View File

@ -153,11 +153,6 @@ public:
#endif
};
#ifdef CLIENT
void NSProjectile_ReadEntity(bool);
#endif
#ifdef SERVER
NSProjectile NSProjectile_SpawnDef(string entityDef, NSEntity theOwner);
NSProjectile NSProjectile_SpawnDefAtPosition(string entityDef, NSEntity theOwner, vector vecOrigin, vector vecAngles);

View File

@ -840,23 +840,6 @@ NSProjectile::ReceiveEntity(float flNew, float flChanged)
}
#endif
#ifdef CLIENT
void
NSProjectile_ReadEntity(bool new)
{
float fl;
NSProjectile rend = (NSProjectile)self;
if (new) {
spawnfunc_NSProjectile();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
}
#endif
#ifdef SERVER
NSProjectile
NSProjectile_SpawnDef(string entityDef, NSEntity theOwner)

View File

@ -208,8 +208,4 @@ public:
nonvirtual void RenderAxialScale(void);
nonvirtual void RenderGLQuakeShadow(void);
#endif
};
#ifdef CLIENT
void NSRenderableEntity_ReadEntity(bool)
#endif
};

View File

@ -217,9 +217,9 @@ NSRenderableEntity::SendEntity(entity ePEnt, float flChanged)
SENDENTITY_COORD(avelocity[2], RDENT_CHANGED_ANGULARVELOCITY)
SENDENTITY_BYTE(m_iRenderMode, RDENT_CHANGED_RENDERMODE)
SENDENTITY_BYTE(m_iRenderFX, RDENT_CHANGED_RENDERMODE)
SENDENTITY_ANGLE(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_ANGLE(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_ANGLE(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_COLOR(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR)
/* these need more precision for shader hacks... */
SENDENTITY_FLOAT(glowmod[0], RDENT_CHANGED_RENDERCOLOR)
SENDENTITY_FLOAT(glowmod[1], RDENT_CHANGED_RENDERCOLOR)
@ -277,9 +277,9 @@ NSRenderableEntity::ReceiveEntity(float flNew, float flChanged)
READENTITY_COORD(avelocity[2], RDENT_CHANGED_ANGULARVELOCITY)
READENTITY_BYTE(m_iRenderMode, RDENT_CHANGED_RENDERMODE)
READENTITY_BYTE(m_iRenderFX, RDENT_CHANGED_RENDERMODE)
READENTITY_ANGLE(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR)
READENTITY_ANGLE(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR)
READENTITY_ANGLE(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[0], RDENT_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[1], RDENT_CHANGED_RENDERCOLOR)
READENTITY_COLOR(m_vecRenderColor[2], RDENT_CHANGED_RENDERCOLOR)
/* these need more precision for shader hacks... */
READENTITY_FLOAT(glowmod[0], RDENT_CHANGED_RENDERCOLOR)
READENTITY_FLOAT(glowmod[1], RDENT_CHANGED_RENDERCOLOR)
@ -638,6 +638,12 @@ NSRenderableEntity::Respawn(void)
SetRenderMode(m_oldiRenderMode);
SetRenderAmt(m_oldflRenderAmt);
SetRenderColor(m_oldvecRenderColor);
if (GetRenderColor() == g_vec_null)
SetRenderColor([1.0, 1.0, 1.0]);
if (GetRenderMode() == RM_NORMAL)
SetRenderAmt(1.0);
}
#endif
@ -1042,20 +1048,4 @@ NSRenderableEntity::SpawnKey(string strKey, string strValue)
super::SpawnKey(strKey, strValue);
break;
}
}
#ifdef CLIENT
void
NSRenderableEntity_ReadEntity(bool new)
{
float fl;
NSRenderableEntity rend = (NSRenderableEntity)self;
if (new) {
spawnfunc_NSRenderableEntity();
}
fl = readfloat();
rend.ReceiveEntity(new, fl);
}
#endif
}

View File

@ -50,8 +50,9 @@ NSTrigger::UseTargets(entity act, int state, float fDelay)
remove(self);
}
if (!target || target == "")
return;
if not (m_strKillTarget)
if not (target)
return;
if (fDelay > 0.0f) {
NSLog("^2%s::^3UseTargets^7: Triggering `%s`",
@ -82,9 +83,11 @@ NSTrigger::UseTargets(entity act, int state, float fDelay)
}
if (m_strKillTarget && m_strKillTarget != "") {
entity eKill = find(world, ::targetname, m_strKillTarget);
NSEntity eKill = (NSEntity)find(world, ::targetname, m_strKillTarget);
NSLog("^2%s::^3UseTargets^7: Killing `%s`",
classname, m_strKillTarget);
if (eKill) {
remove(eKill);
eKill.Destroy();
}
}
}

View File

@ -15,6 +15,18 @@
*/
/* networking helpers */
#define NETWORKED_INT(x) int x; int x ##_net;
#define NETWORKED_FLOAT(x) float x; float x ##_net;
#define NETWORKED_VECTOR(x) vector x; vector x ##_net;
#define NETWORKED_ENT(x) entity x; entity x ##_net;
#define NETWORKED_STRING(x) string x; string x ##_net;
#define NETWORKED_BOOL(x) bool x; bool x ##_net;
#define NETWORKED_INT_N(x) int x ##_net;
#define NETWORKED_FLOAT_N(x) float x ##_net;
#define NETWORKED_VECTOR_N(x) vector x ##_net;
#define NETWORKED_STRING_N(x) string x ##_net;
#define PREDICTED_INT(x) int x; int x ##_net;
#define PREDICTED_FLOAT(x) float x; float x ##_net;
#define PREDICTED_VECTOR(x) vector x; vector x ##_net;
@ -27,6 +39,22 @@
#define PREDICTED_VECTOR_N(x) vector x ##_net;
#define PREDICTED_STRING_N(x) string x ##_net;
#ifdef CLIENT
#define NSENTITY_READENTITY(x, y) \
{ \
local x x ##_e = ( x )self;\
if (y == true) { \
self.classname = strcat("spawnfunc_", #x); \
callfunction(self.classname); \
} \
x ##_e.ReceiveEntity( y, readfloat() );\
}
#else
#endif
#define NETWORKED_DEFAULT(x, y) x ##_net = x = y;
#define ROLL_BACK(x) x = x ##_net;
#define SAVE_STATE(x) x ##_net = x;
#define SAVE_STATE_FIELD(x, y) x ##_net[y] = x[y];
@ -175,6 +203,10 @@ crossprint(string m)
__wrap string
precache_model(string m)
{
if not (m) {
breakpoint();
}
#ifdef CLIENT
NSLog("^3Client precaching model ^7%s", m);
#else

View File

@ -40,6 +40,7 @@ typedef enum
ENT_LASER, /**< of type env_laser */
ENT_PARTSYSTEM, /**< of type info_particle_system */
ENT_SPRITE, /**< of type env_sprite */
ENT_GLOW, /**< of type env_glow */
ENT_SPRAY, /**< of type spray */
ENT_DECAL, /**< of type infodecal */
ENT_OLDCAMERA, /**< of type trigger_camera */

View File

@ -37,6 +37,12 @@ _NSAssert(bool condition, string function, string descr)
}
}
void
_NSEntWarning(string className, vector classOrg, string warnMessage)
{
print(sprintf("^1Class %s at %v: %s\n", className, classOrg, warnMessage));
}
/** Logs an error type message, with timestamp.
The console variable `g_developer` has to be `1` for them to be visible.
@ -50,6 +56,9 @@ _NSAssert(bool condition, string function, string descr)
#define NSAssert(condition, ...) _NSAssert(condition, __FUNC__, sprintf(__VA_ARGS__))
#define NSEntWarning(...) _NSEntWarning(classname, origin, sprintf(__VA_ARGS__))
typedef enumflags
{
SEARCH_INSENSITIVE, /**< Attempt to do a case-insensitive search (slower) */