GS-Entbase: massive optimisation - any func_wall and illusionary without a

targetname will not be networked and handled 100% client-side.
This commit is contained in:
Marco Cawthorne 2021-04-10 09:35:06 +02:00
parent 9ad73615d4
commit 6da1f3c4fa
9 changed files with 472 additions and 360 deletions

View File

@ -40,7 +40,6 @@ server/func_button.qc
server/func_brush.qc
server/func_door.qc
server/func_door_rotating.qc
server/func_illusionary.qc
server/func_lod.qc
server/func_ladder.qc
server/func_train.qc
@ -51,7 +50,6 @@ server/func_tank.qc
server/func_tankmortar.qc
server/func_tankcontrols.qc
server/func_pushable.qc
server/func_wall.qc
server/func_wall_toggle.qc
server/func_conveyor.qc
server/func_rotating.qc

View File

@ -1,52 +0,0 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* 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.
*/
/*QUAKED func_illusionary (0 .5 .8) ?
"targetname" Name
Brush that lets light to pass through it and is non-solid.
On idTech 2 BSPs, it will change texture variants when triggered.
Trivia:
This entity was introduced in Quake (1996).
*/
class func_illusionary:CBaseEntity
{
void(void) func_illusionary;
virtual void(void) Use;
};
void func_illusionary::func_illusionary(void)
{
CBaseEntity::CBaseEntity();
SetMovetype(MOVETYPE_PUSH);
SetSolid(SOLID_NOT);
SetModel(model);
SetOrigin(origin);
// TODO: Add support for (skin) -1 = Empty, -7 = Volumetric light
if (skin < 0) {
SetSkin(0);
}
}
void func_illusionary::Use(void)
{
SetSkin(1-skin);
}

View File

@ -9,6 +9,8 @@ shared/func_friction.qc
shared/env_projectedtexture.qc
shared/light_dynamic.qc
shared/func_monitor.qc
shared/func_illusionary.qc
shared/func_wall.qc
shared/trigger_camera.qc
shared/trigger_gravity.qc
shared/info_particle_system.qc

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -30,7 +30,6 @@ class CBaseEntity
void(void) CBaseEntity;
virtual void(void) Init;
virtual void(void) Initialized;
virtual void(string, string) SpawnKey;
virtual void(string) Sentence;
virtual void(void) ProcessWordQue;
virtual void(float flChanged) ReceiveEntity;
@ -62,6 +61,8 @@ class CBaseEntity
virtual float(entity, float) SendEntity;
virtual void(void) Pain;
virtual void(void) Death;
virtual void(void) SpawnInit;
#endif
virtual void(float) SetEffects;
virtual void(float) SetFrame;
@ -76,15 +77,19 @@ class CBaseEntity
virtual void(vector) SetOrigin;
virtual void(vector, vector) SetSize;
virtual void(string, string) SpawnKey;
virtual void(void) SpawnInit;
#endif
#ifdef GS_RENDERFX
int m_iRenderFX;
float m_iRenderMode;
float m_flRenderAmt;
vector m_vecRenderColor;
/* set */
virtual void(int) SetRenderFX;
virtual void(float) SetRenderMode;
virtual void(float) SetRenderAmt;
virtual void(vector) SetRenderColor;
#ifdef CLIENT
virtual void(void) RenderFXPass;
#else
@ -93,11 +98,6 @@ class CBaseEntity
float m_oldiRenderMode;
float m_oldflRenderAmt;
vector m_oldvecRenderColor;
virtual void(int) SetRenderFX;
virtual void(float) SetRenderMode;
virtual void(float) SetRenderAmt;
virtual void(vector) SetRenderColor;
#endif
#endif
};

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -323,61 +323,6 @@ CBaseEntity::ReceiveEntity(float flChanged)
setsize(this, mins, maxs);
}
void
CBaseEntity::SpawnKey(string strField, string strKey)
{
switch (strField) {
/* compiler specific stuff */
case "angle":
case "_minlight":
case "_cs":
break;
case "shadows":
if (stof(strKey) == 1)
effects &= ~EF_NOSHADOW;
break;
case "targetname":
targetname = strKey;
break;
case "target":
target = strKey;
break;
case "origin":
origin = stov(strKey);
setorigin(this, origin);
break;
case "angles":
angles = stov(strKey);
break;
case "model":
model = strKey;
break;
case "style":
style = stof(strKey);
break;
case "color":
color = stov(strKey);
break;
case "movetype":
movetype = stof(strKey);
break;
case "solid":
solid = stof(strKey);
break;
case "scale":
scale = stof(strKey);
break;
case "spawnflags":
spawnflags = stof(strKey);
break;
default:
#ifdef GS_DEVELOPER
print(sprintf("%s::SpawnKey: Unknown '%s' value '%s'\n",
this.classname, strField, strKey));
#endif
}
}
void
CBaseEntity::postdraw(void)
{
@ -440,156 +385,6 @@ CBaseEntity_ParseSentence(void)
}
}
#else
/* we want to really use those set functions because they'll notify of any
* networking related changes. otherwise we'll have to keep track of copies
* that get updated every frame */
void
CBaseEntity::SetEffects(float newEffects)
{
if (newEffects == effects)
return;
effects = newEffects;
SendFlags |= BASEFL_CHANGED_EFFECTS;
}
void
CBaseEntity::SetFrame(float newFrame)
{
if (newFrame == frame)
return;
frame = newFrame;
frame1time = 0.0f;
SendFlags |= BASEFL_CHANGED_FRAME;
}
void
CBaseEntity::SetModel(string newModel)
{
model = newModel;
setmodel(this, newModel);
SendFlags |= BASEFL_CHANGED_MODELINDEX;
}
void
CBaseEntity::SetModelindex(float newModelIndex)
{
if (newModelIndex == modelindex)
return;
modelindex = newModelIndex;
SendFlags |= BASEFL_CHANGED_MODELINDEX;
}
void
CBaseEntity::SetMovetype(float newMovetype)
{
if (newMovetype == movetype)
return;
movetype = newMovetype;
SendFlags |= BASEFL_CHANGED_MOVETYPE;
}
void
CBaseEntity::SetSkin(float newSkin)
{
if (newSkin == skin)
return;
skin = newSkin;
SendFlags |= BASEFL_CHANGED_SKIN;
}
void
CBaseEntity::SetSolid(float newSolid)
{
if (newSolid == solid)
return;
solid = newSolid;
SendFlags |= BASEFL_CHANGED_SOLID;
}
void
CBaseEntity::SetBody(int newBody)
{
if (newBody == m_iBody)
return;
m_iBody = newBody;
SendFlags |= BASEFL_CHANGED_BODY;
}
void
CBaseEntity::SetScale(float newScale)
{
if (newScale == scale)
return;
scale = newScale;
SendFlags |= BASEFL_CHANGED_SCALE;
}
void
CBaseEntity::SetAngles(vector newAngles)
{
if (newAngles == angles)
return;
angles = newAngles;
SendFlags |= BASEFL_CHANGED_ANGLES;
}
void
CBaseEntity::SetSize(vector newMins, vector newMaxs)
{
if (newMins == mins && newMaxs == maxs)
return;
setsize(this, newMins, newMaxs);
SendFlags |= BASEFL_CHANGED_SIZE;
}
void
CBaseEntity::SetOrigin(vector newOrigin)
{
if (newOrigin == origin)
return;
setorigin(this, newOrigin);
SendFlags |= BASEFL_CHANGED_ORIGIN;
}
#ifdef GS_RENDERFX
void
CBaseEntity::SetRenderFX(int newFX)
{
if (newFX == m_iRenderFX)
return;
m_iRenderFX = newFX;
SendFlags |= BASEFL_CHANGED_RENDERFX;
}
void
CBaseEntity::SetRenderMode(float newMode)
{
if (newMode == m_iRenderMode)
return;
m_iRenderMode = newMode;
SendFlags |= BASEFL_CHANGED_RENDERMODE;
}
void
CBaseEntity::SetRenderAmt(float newAmt)
{
if (newAmt == m_flRenderAmt)
return;
m_flRenderAmt = newAmt;
SendFlags |= BASEFL_CHANGED_RENDERAMT;
}
void
CBaseEntity::SetRenderColor(vector newColor)
{
if (newColor == m_vecRenderColor)
return;
m_vecRenderColor = newColor;
SendFlags |= BASEFL_CHANGED_RENDERCOLOR;
}
#endif
/* Make sure StartFrame calls this */
float
CBaseEntity::SendEntity(entity ePEnt, float fChanged)
@ -789,6 +584,204 @@ CBaseEntity::Hide(void)
takedamage = DAMAGE_NO;
}
void
CBaseEntity::CBaseEntity(void)
{
/* Not in Deathmatch */
if (spawnflags & 2048) {
if (cvar("sv_playerslots") > 1) {
remove(this);
return;
}
}
identity = 1;
effects |= EF_NOSHADOW;
scale = 1.0f;
SpawnInit();
m_oldAngle = angles;
m_oldOrigin = origin;
m_oldSolid = solid;
m_oldHealth = health;
m_oldModel = Util_FixModel(model);
#ifdef GS_RENDERFX
m_oldiRenderFX = m_iRenderFX;
m_oldiRenderMode = m_iRenderMode;
m_oldvecRenderColor = m_vecRenderColor;
m_oldflRenderAmt = m_flRenderAmt;
m_oldvecRenderColor = m_vecRenderColor;
m_oldflRenderAmt = m_flRenderAmt;
#endif
m_oldstrTarget = target;
if (m_oldModel != "") {
precache_model(m_oldModel);
}
}
#endif
/* we want to really use those set functions because they'll notify of any
* networking related changes. otherwise we'll have to keep track of copies
* that get updated every frame */
void
CBaseEntity::SetSendFlags(float flSendFlags)
{
#ifdef SERVER
SendFlags |= flSendFlags;
#endif
}
void
CBaseEntity::SetEffects(float newEffects)
{
if (newEffects == effects)
return;
effects = newEffects;
SetSendFlags(BASEFL_CHANGED_EFFECTS);
}
void
CBaseEntity::SetFrame(float newFrame)
{
if (newFrame == frame)
return;
frame = newFrame;
frame1time = 0.0f;
SetSendFlags(BASEFL_CHANGED_FRAME);
}
void
CBaseEntity::SetModel(string newModel)
{
model = newModel;
setmodel(this, newModel);
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
void
CBaseEntity::SetModelindex(float newModelIndex)
{
if (newModelIndex == modelindex)
return;
modelindex = newModelIndex;
SetSendFlags(BASEFL_CHANGED_MODELINDEX);
}
void
CBaseEntity::SetMovetype(float newMovetype)
{
if (newMovetype == movetype)
return;
movetype = newMovetype;
SetSendFlags(BASEFL_CHANGED_MOVETYPE);
}
void
CBaseEntity::SetSkin(float newSkin)
{
if (newSkin == skin)
return;
skin = newSkin;
SetSendFlags(BASEFL_CHANGED_SKIN);
}
void
CBaseEntity::SetSolid(float newSolid)
{
if (newSolid == solid)
return;
solid = newSolid;
SetSendFlags(BASEFL_CHANGED_SOLID);
}
void
CBaseEntity::SetBody(int newBody)
{
if (newBody == m_iBody)
return;
m_iBody = newBody;
SetSendFlags(BASEFL_CHANGED_BODY);
}
void
CBaseEntity::SetScale(float newScale)
{
if (newScale == scale)
return;
scale = newScale;
SetSendFlags(BASEFL_CHANGED_SCALE);
}
void
CBaseEntity::SetAngles(vector newAngles)
{
if (newAngles == angles)
return;
angles = newAngles;
SetSendFlags(BASEFL_CHANGED_ANGLES);
}
void
CBaseEntity::SetSize(vector newMins, vector newMaxs)
{
if (newMins == mins && newMaxs == maxs)
return;
setsize(this, newMins, newMaxs);
SetSendFlags(BASEFL_CHANGED_SIZE);
}
void
CBaseEntity::SetOrigin(vector newOrigin)
{
if (newOrigin == origin)
return;
setorigin(this, newOrigin);
SetSendFlags(BASEFL_CHANGED_ORIGIN);
}
#ifdef GS_RENDERFX
void
CBaseEntity::SetRenderFX(int newFX)
{
if (newFX == m_iRenderFX)
return;
m_iRenderFX = newFX;
SetSendFlags(BASEFL_CHANGED_RENDERFX);
}
void
CBaseEntity::SetRenderMode(float newMode)
{
if (newMode == m_iRenderMode)
return;
m_iRenderMode = newMode;
SetSendFlags(BASEFL_CHANGED_RENDERMODE);
}
void
CBaseEntity::SetRenderAmt(float newAmt)
{
if (newAmt == m_flRenderAmt)
return;
m_flRenderAmt = newAmt;
SetSendFlags(BASEFL_CHANGED_RENDERAMT);
}
void
CBaseEntity::SetRenderColor(vector newColor)
{
if (newColor == m_vecRenderColor)
return;
m_vecRenderColor = newColor;
SetSendFlags(BASEFL_CHANGED_RENDERCOLOR);
}
#endif
void
CBaseEntity::SpawnKey(string strKey, string strValue)
{
@ -810,9 +803,6 @@ CBaseEntity::SpawnKey(string strKey, string strValue)
case "solid":
solid = stof(strValue);
break;
case "health":
health = stof(strValue);
break;
case "shadows":
if (stof(strValue) == 1) {
effects &= ~EF_NOSHADOW;
@ -852,61 +842,26 @@ CBaseEntity::SpawnKey(string strKey, string strValue)
m_iRenderFX = stoi(strValue);
break;
#endif
case "parentname":
m_parent = strValue;
break;
case "model":
model = strValue;
break;
case "classname":
case "spawnflags":
break;
#ifdef SERVER
case "health":
health = stof(strValue);
break;
case "parentname":
m_parent = strValue;
break;
case "ignorepvs":
pvsflags = PVSF_IGNOREPVS;
break;
#endif
default:
print(sprintf("^3%s^7::SpawnKey:: Unknown key '%s' with value '%s'\n",
classname, strKey, strValue));
break;
}
}
void
CBaseEntity::CBaseEntity(void)
{
/* Not in Deathmatch */
if (spawnflags & 2048) {
if (cvar("sv_playerslots") > 1) {
remove(this);
return;
}
}
identity = 1;
effects |= EF_NOSHADOW;
scale = 1.0f;
SpawnInit();
m_oldAngle = angles;
m_oldOrigin = origin;
m_oldSolid = solid;
m_oldHealth = health;
m_oldModel = Util_FixModel(model);
#ifdef GS_RENDERFX
m_oldiRenderFX = m_iRenderFX;
m_oldiRenderMode = m_iRenderMode;
m_oldvecRenderColor = m_vecRenderColor;
m_oldflRenderAmt = m_flRenderAmt;
m_oldvecRenderColor = m_vecRenderColor;
m_oldflRenderAmt = m_flRenderAmt;
#endif
m_oldstrTarget = target;
if (m_oldModel != "") {
precache_model(m_oldModel);
}
}
#endif

View File

@ -0,0 +1,142 @@
/*
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
*
* 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.
*/
/*QUAKED func_illusionary (0 .5 .8) ?
"targetname" Name
Brush that lets light to pass through it and is non-solid.
On idTech 2 BSPs, it will change texture variants when triggered.
Trivia:
This entity was introduced in Quake (1996).
*/
class
#ifdef CLIENT
func_illusionary:CBaseEntity
#else
func_illusionary:CBaseTrigger
#endif
{
void(void) func_illusionary;
#ifdef SERVER
virtual void(void) Respawn;
virtual float(entity, float) SendEntity;
virtual void(entity, int) Trigger;
#else
virtual float() predraw;
virtual void(void) Init;
#endif
};
#ifdef SERVER
/* we're overriding SendEntity so that we don't network func_illusionarys
* without a targetname. They'll never experience gameplay changes
* and therefore can be handled fully client-side */
float
func_illusionary::SendEntity(entity pvsent, float fl)
{
if (targetname)
CBaseTrigger::SendEntity(pvsent, fl);
else
return FALSE;
}
void
func_illusionary::Trigger(entity act, int state)
{
switch (state) {
case TRIG_OFF:
SetSkin(0);
break;
case TRIG_ON:
SetSkin(1);
break;
default:
SetSkin(1-skin);
}
}
void
func_illusionary::Respawn(void)
{
/* reset the visual parameters */
CBaseEntity::Respawn();
/* func_illusionary specifics */
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_PUSH);
SetSolid(SOLID_BSP);
SetModel(m_oldModel);
SetOrigin(m_oldOrigin);
SetSkin(0);
// TODO: Add support for (skin) -1 = Empty, -7 = Volumetric light
if (skin < 0) {
SetSkin(0);
}
}
#else
float
func_illusionary::predraw(void)
{
vector vecPlayer;
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &g_seats[s];
vecPlayer = pSeat->m_vecPredictedOrigin;
if (checkpvs(vecPlayer, this) == FALSE) {
return PREDRAW_NEXT;
}
CBaseEntity::predraw();
addentity(self);
return PREDRAW_NEXT;
}
void
func_illusionary::Init(void)
{
CBaseEntity::Init();
/* this entity is being controlled by the server, remove it */
if (targetname) {
think = Util_Destroy;
nextthink = time;
return;
}
precache_model(model);
setmodel(this, model);
setorigin(this, origin);
SetAngles([0,0,0]);
SetMovetype(MOVETYPE_NONE);
SetSolid(SOLID_NOT);
drawmask = MASK_ENGINE;
}
#endif
void
func_illusionary::func_illusionary(void)
{
#ifdef CLIENT
Init();
#else
CBaseTrigger::CBaseTrigger();
#endif
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
* Copyright (c) 2016-2021 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@ -24,14 +24,38 @@ Trivia:
This entity was introduced in Quake (1996).
*/
class func_wall:CBaseTrigger
class
#ifdef CLIENT
func_wall:CBaseEntity
#else
func_wall:CBaseTrigger
#endif
{
void(void) func_wall;
#ifdef SERVER
virtual void(void) Respawn;
virtual float(entity, float) SendEntity;
virtual void(entity, int) Trigger;
#else
virtual float() predraw;
virtual void(void) Init;
#endif
};
#ifdef SERVER
/* we're overriding SendEntity so that we don't network func_walls
* without a targetname. They'll never experience gameplay changes
* and therefore can be handled fully client-side */
float
func_wall::SendEntity(entity pvsent, float fl)
{
if (targetname)
CBaseTrigger::SendEntity(pvsent, fl);
else
return FALSE;
}
void
func_wall::Trigger(entity act, int state)
{
@ -61,9 +85,52 @@ func_wall::Respawn(void)
SetOrigin(m_oldOrigin);
SetFrame(0);
}
#else
float
func_wall::predraw(void)
{
vector vecPlayer;
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &g_seats[s];
vecPlayer = pSeat->m_vecPredictedOrigin;
if (checkpvs(vecPlayer, this) == FALSE) {
return PREDRAW_NEXT;
}
CBaseEntity::predraw();
addentity(self);
return PREDRAW_NEXT;
}
void
func_wall::Init(void)
{
CBaseEntity::Init();
/* this entity is being controlled by the server, remove it */
if (targetname) {
think = Util_Destroy;
nextthink = time;
return;
}
precache_model(model);
setmodel(this, model);
setorigin(this, origin);
movetype = MOVETYPE_NONE;
drawmask = MASK_ENGINE;
solid = SOLID_BSP;
}
#endif
void
func_wall::func_wall(void)
{
#ifdef CLIENT
Init();
#else
CBaseTrigger::CBaseTrigger();
#endif
}

View File

@ -15,29 +15,29 @@
*/
/* engine reserved */
#define FL_FLY (1<<0)
#define FL_SWIM (1<<1)
#define FL_GLIMPSE (1<<2)
#define FL_CLIENT (1<<3)
#define FL_INWATER (1<<4)
#define FL_MONSTER (1<<5)
#define FL_GODMODE (1<<6)
#define FL_NOTARGET (1<<7)
#define FL_ITEM (1<<8)
#define FL_ONGROUND (1<<9)
#define FL_PARTIALGROUND (1<<10)
#define FL_WATERJUMP (1<<11)
#define FL_JUMPRELEASED (1<<12)
#define FL_FLY (1<<0)
#define FL_SWIM (1<<1)
#define FL_GLIMPSE (1<<2)
#define FL_CLIENT (1<<3)
#define FL_INWATER (1<<4)
#define FL_MONSTER (1<<5)
#define FL_GODMODE (1<<6)
#define FL_NOTARGET (1<<7)
#define FL_ITEM (1<<8)
#define FL_ONGROUND (1<<9)
#define FL_PARTIALGROUND (1<<10)
#define FL_WATERJUMP (1<<11)
#define FL_JUMPRELEASED (1<<12)
#define FL_FINDABLE_NONSOLID (1<<14)
#define FLQW_LAGGEDMOVE (1<<16)
#define FLQW_LAGGEDMOVE (1<<16)
/* nuclide */
#define FL_ONLADDER (1<<13)
#define FL_CROUCHING (1<<17)
#define FL_INVEHICLE (1<<18)
#define FL_FROZEN (1<<19)
#define FL_USE_RELEASED (1<<20)
#define FL_NOATTACK (1<<21)
#define FL_RESERVED1 (1<<22)
#define FL_RESERVED2 (1<<23)
#define FL_RESERVED3 (1<<15)
#define FL_ONLADDER (1<<13)
#define FL_CROUCHING (1<<17)
#define FL_INVEHICLE (1<<18)
#define FL_FROZEN (1<<19)
#define FL_USE_RELEASED (1<<20)
#define FL_NOATTACK (1<<21)
#define FL_RESERVED1 (1<<22)
#define FL_RESERVED2 (1<<23)
#define FL_RESERVED3 (1<<15)

View File

@ -41,15 +41,15 @@ enum
/* q3 bsp base flags */
#define SURF_NODAMAGE 0x1i // never give falling damage
#define SURF_SLICK 0x2i // effects game physics
#define SURF_SKY 0x4i // lighting from environment map
#define SURF_LADDER 0x8i // climb this surface
#define SURF_SLICK 0x2i // effects game physics
#define SURF_SKY 0x4i // lighting from environment map
#define SURF_LADDER 0x8i // climb this surface
#define SURF_NOIMPACT 0x10i // don't make missile explosions
#define SURF_NOMARKS 0x20i // don't leave missile marks
#define SURF_Q3FLESH 0x40i // make flesh sounds and effects
#define SURF_NODRAW 0x80i // don't generate a drawsurface at all
#define SURF_HINT 0x100i // make a primary bsp splitter
#define SURF_SKIP 0x200i // completely ignore, allowing non-closed brushes
#define SURF_NODRAW 0x80i // don't generate a drawsurface at all
#define SURF_HINT 0x100i // make a primary bsp splitter
#define SURF_SKIP 0x200i // completely ignore, allowing non-closed brushes
#define SURF_NOLIGHTMAP 0x400i // surface doesn't need a lightmap
#define SURF_POINTLIGHT 0x800i // generate lighting info at vertexes
#define SURF_METALSTEPS 0x1000i // clanking footsteps
@ -58,7 +58,7 @@ enum
#define SURF_LIGHTFILTER 0x8000i // act as a light filter during q3map -light
#define SURF_ALPHASHADOW 0x10000i // do per-pixel light shadow casting in q3map
#define SURF_NODLIGHT 0x20000i // don't dlight even if solid (solid lava, skies)
#define SURF_DUST 0x40000i // leave a dust trail when walking on this surface
#define SURF_DUST 0x40000i // leave a dust trail when walking on this surface
/* behaviour surfaceflags */
#define SURF_LEAKSTEAM 0x00080000i /* when shot, the material emits steam */
@ -72,21 +72,21 @@ enum
#define SURF_RESERVED7 0x08000000i
/* material surfaceflags (need to be masked) */
#define SURF_MASK 0x0FFFFFFFi
#define SURF_ALIEN 0x10000000i
#define SURF_MASK 0x0FFFFFFFi
#define SURF_ALIEN 0x10000000i
#define SURF_BLOODYFLESH 0x20000000i
#define SURF_FOLIAGE 0x30000000i
#define SURF_COMPUTER 0x40000000i
#define SURF_DIRT 0x50000000i
#define SURF_VENT 0x60000000i
#define SURF_GRATE 0x70000000i
#define SURF_METAL 0x80000000i
#define SURF_GLASS 0x90000000i
#define SURF_SAND 0xA0000000i
#define SURF_SLOSH 0xB0000000i
#define SURF_SNOW 0xC0000000i
#define SURF_TILE 0xD0000000i
#define SURF_WOOD 0xE0000000i
#define SURF_DIRT 0x50000000i
#define SURF_VENT 0x60000000i
#define SURF_GRATE 0x70000000i
#define SURF_METAL 0x80000000i
#define SURF_GLASS 0x90000000i
#define SURF_SAND 0xA0000000i
#define SURF_SLOSH 0xB0000000i
#define SURF_SNOW 0xC0000000i
#define SURF_TILE 0xD0000000i
#define SURF_WOOD 0xE0000000i
#define SURF_CONCRETE 0xF0000000i
/* this is used for material-lookups using the external materials.txt file