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:
parent
9ad73615d4
commit
6da1f3c4fa
9 changed files with 472 additions and 360 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
142
src/gs-entbase/shared/func_illusionary.qc
Normal file
142
src/gs-entbase/shared/func_illusionary.qc
Normal 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
|
||||
}
|
|
@ -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
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue