Improvements to some GoldSrc rendermode code, better teleporting behaviour

for scripted_sequences.
This commit is contained in:
Marco Cawthorne 2022-01-21 12:24:25 -08:00
parent 1bd7d1a68c
commit 82b1cb68fa
Signed by: eukara
GPG Key ID: C196CD8BA993248A
10 changed files with 214 additions and 115 deletions

View File

@ -32,23 +32,23 @@ enum
enum
{
RFX_NORMAL,
RFX_SLOWPULSE,
RFX_FASTPULSE,
RFX_SLOWWIDEPULSE,
RFX_FASTWIDEPULSE,
RFX_SLOWFADEAWAY,
RFX_FASTFADEAWAY,
RFX_SLOWBECOMESOLID,
RFX_FASTBECOMESOLID,
RFX_SLOWSTROBE,
RFX_FASTSTROBE,
RFX_FASTERSTROBE,
RFX_SLOWFLICKER,
RFX_FASTFLICKER,
RFX_CONSTANTGLOW,
RFX_DISTORT,
RFX_HOLOGRAM
RFX_NORMAL = 0,
RFX_SLOWPULSE = 1,
RFX_FASTPULSE = 2,
RFX_SLOWWIDEPULSE = 3,
RFX_FASTWIDEPULSE = 4,
RFX_SLOWFADEAWAY = 5,
RFX_FASTFADEAWAY = 6,
RFX_SLOWBECOMESOLID = 7,
RFX_FASTBECOMESOLID = 8,
RFX_SLOWSTROBE = 9,
RFX_FASTSTROBE = 10,
RFX_FASTERSTROBE = 11,
RFX_SLOWFLICKER = 12,
RFX_FASTFLICKER = 13,
RFX_CONSTANTGLOW = 14,
RFX_DISTORT = 15,
RFX_HOLOGRAM = 16
};
#endif
@ -69,7 +69,6 @@ enumflags
#ifdef GS_RENDERFX
BASEFL_CHANGED_RENDERCOLOR,
BASEFL_CHANGED_RENDERAMT,
BASEFL_CHANGED_RENDERFX,
BASEFL_CHANGED_RENDERMODE,
#else
BASEFL_CHANGED_ALPHA,

View File

@ -106,7 +106,7 @@ env_render::Trigger(entity act, int state)
trigger.SetRenderAmt(m_flRenderAmt);
}
if (!(spawnflags & SF_NORENDERFX)) {
dprint(sprintf("\tFX change from %i to %i\n", trigger.m_iRenderFX, m_iRenderFX));
dprint(sprintf("\tFX change from %d to %d\n", trigger.m_iRenderFX, m_iRenderFX));
trigger.SetRenderFX(m_iRenderFX);
}
}

View File

@ -43,6 +43,7 @@ prop_dynamic::Respawn(void)
{
super::Respawn();
SetModel(GetSpawnModel());
UpdateBounds();
if (spawnflags & PRPDYN_NONSOLID)
SetSolid(SOLID_NOT);
@ -56,15 +57,14 @@ prop_dynamic::SpawnKey(string strKey, string strValue)
float s = stof(strValue);
switch (s) {
case 0:
SetSolid(SOLID_NOT);
break;
case 2:
SetSolid(SOLID_BBOX);
break;
case 6:
SetSolid(SOLID_BSP);
break;
default:
SetSolid(SOLID_NOT);
}
break;
default:

View File

@ -207,12 +207,10 @@ scripted_sequence::RunOnEntity(entity targ)
f.NewRoute(origin);
f.m_flSequenceSpeed = 64;
dprint("\tType: SS_WALK\n");
return;
} else if (m_iMove == SS_RUN) {
f.NewRoute(origin);
f.m_flSequenceSpeed = 200;
dprint("\tType: SS_RUN\n");
return;
} else if (m_iMove == SS_INSTANTANEOUS) {
setorigin(f, this.origin);
dprint("\tType: SS_INSTANTANEOUS\n");

View File

@ -286,28 +286,9 @@ NSEntity::SetSolid(float newSolid)
void
NSEntity::UpdateBounds(void)
{
SetSize(m_vecMins, m_vecMaxs);
}
void
NSEntity::SetAngles(vector newAngles)
{
if (newAngles == angles)
return;
angles = newAngles;
SetSendFlags(BASEFL_CHANGED_ANGLES);
UpdateBounds();
}
void
NSEntity::SetSize(vector newMins, vector newMaxs)
{
vector newMins, newMaxs;
float flScale = 1.0f;
m_vecMins = newMins;
m_vecMaxs = newMaxs;
/* avoid useless computation */
if (angles != [0,0,0]) {
/* adjust bbox according to rotation */
@ -345,6 +326,32 @@ NSEntity::SetSize(vector newMins, vector newMaxs)
SetSendFlags(BASEFL_CHANGED_SIZE);
}
void
NSEntity::SetAngles(vector newAngles)
{
if (newAngles == angles)
return;
angles = newAngles;
SetSendFlags(BASEFL_CHANGED_ANGLES);
}
void
NSEntity::SetSize(vector newMins, vector newMaxs)
{
float flScale = 1.0f;
m_vecMins = newMins;
m_vecMaxs = newMaxs;
/* 0.0 is never valid, if you want it to disappear do something else */
if (scale != 0.0)
flScale = scale;
setsize(this, newMins * flScale, newMaxs * flScale);
SetSendFlags(BASEFL_CHANGED_SIZE);
}
void
NSEntity::SetOrigin(vector newOrigin)
{

View File

@ -294,7 +294,7 @@ void
NSMonster::FreeStateMoved(void)
{
vector new_origin;
new_origin = gettaginfo(this, 0);
new_origin = gettaginfo(this, 1);
SetOrigin(new_origin);
FreeState();
}
@ -749,11 +749,9 @@ NSMonster::SendEntity(entity ePEnt, float fChanged)
}
#ifdef GS_RENDERFX
if (fChanged & BASEFL_CHANGED_RENDERFX) {
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERMODE) {
WriteByte(MSG_ENTITY, m_iRenderMode);
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERCOLOR) {
@ -855,11 +853,9 @@ NSMonster::ReceiveEntity(float flNew, float flChanged)
}
#ifdef GS_RENDERFX
if (flChanged & BASEFL_CHANGED_RENDERFX) {
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERMODE) {
m_iRenderMode = readbyte();
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERCOLOR) {
m_vecRenderColor[0] = readfloat();

View File

@ -55,13 +55,13 @@ class NSRenderableEntity:NSEntity
virtual void(void) MakeStatic;
#ifdef GS_RENDERFX
int m_iRenderFX;
float m_iRenderFX;
float m_iRenderMode;
float m_flRenderAmt;
vector m_vecRenderColor;
/* set */
nonvirtual void(int) SetRenderFX;
nonvirtual void(float) SetRenderFX;
nonvirtual void(float) SetRenderMode;
nonvirtual void(float) SetRenderAmt;
nonvirtual void(vector) SetRenderColor;
@ -70,7 +70,7 @@ class NSRenderableEntity:NSEntity
nonvirtual void(void) RenderFXPass;
#else
/* respawn */
int m_oldiRenderFX;
float m_oldiRenderFX;
float m_oldiRenderMode;
float m_oldflRenderAmt;
vector m_oldvecRenderColor;

View File

@ -162,11 +162,9 @@ NSRenderableEntity::SendEntity(entity ePEnt, float fChanged)
}
#ifdef GS_RENDERFX
if (fChanged & BASEFL_CHANGED_RENDERFX) {
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERMODE) {
WriteByte(MSG_ENTITY, m_iRenderMode);
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERCOLOR) {
@ -211,6 +209,12 @@ NSRenderableEntity::RenderFXPass(void)
colormod = m_vecRenderColor;
alpha = m_flRenderAmt;
/* these should be reset! */
renderflags = 0;
effects = 0;
drawflags = 0;
abslight = 0;
switch (m_iRenderMode) {
case RM_NORMAL:
colormod = [1,1,1];
@ -226,6 +230,7 @@ NSRenderableEntity::RenderFXPass(void)
drawflags = 7;
abslight = 128;
}
break;
case RM_GLOW:
case RM_WORLDGLOW: /* TODO: Figure out what this does differently */
@ -284,8 +289,49 @@ NSRenderableEntity::RenderFXPass(void)
alpha = 0.0f;
}
/* messy hologram imitation */
if (m_iRenderFX == RFX_HOLOGRAM) {
switch (m_iRenderFX) {
case RFX_SLOWPULSE:
alpha = sin(cltime * 0.5);
break;
case RFX_FASTPULSE:
alpha = sin(cltime * 2.0);
break;
case RFX_SLOWWIDEPULSE:
alpha = sin(cltime * 0.5);
break;
case RFX_FASTWIDEPULSE:
alpha = sin(cltime * 2.0);
break;
case RFX_SLOWFADEAWAY:
alpha -= clframetime * 0.25;
break;
case RFX_FASTFADEAWAY:
effects = 0;
alpha -= clframetime;
break;
case RFX_SLOWBECOMESOLID:
break;
case RFX_FASTBECOMESOLID:
break;
case RFX_SLOWSTROBE:
alpha = (cltime & 1) ? 1.0 : 0.0f;
break;
case RFX_FASTSTROBE:
alpha = ((cltime*2.0) & 1) ? 1.0 : 0.0f;
break;
case RFX_FASTERSTROBE:
alpha = ((cltime*4.0) & 1) ? 1.0 : 0.0f;
break;
case RFX_SLOWFLICKER:
break;
case RFX_FASTFLICKER:
break;
case RFX_CONSTANTGLOW:
break;
case RFX_DISTORT:
break;
case RFX_HOLOGRAM:
/* messy hologram imitation */
float dist;
float r;
@ -313,6 +359,9 @@ NSRenderableEntity::RenderFXPass(void)
effects = EF_ADDITIVE;
drawflags = 7;
abslight = 128;
break;
default:
break;
}
/* HACK: This marks this entity as alphatested in platform's defaultwall.glsl */
@ -388,11 +437,9 @@ NSRenderableEntity::ReceiveEntity(float flNew, float flChanged)
}
#ifdef GS_RENDERFX
if (flChanged & BASEFL_CHANGED_RENDERFX) {
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERMODE) {
m_iRenderMode = readbyte();
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERCOLOR) {
m_vecRenderColor[0] = readfloat();
@ -555,13 +602,13 @@ NSRenderableEntity::SetScale(float newScale)
#ifdef GS_RENDERFX
void
NSRenderableEntity::SetRenderFX(int newFX)
NSRenderableEntity::SetRenderFX(float newFX)
{
if (newFX == m_iRenderFX)
return;
m_iRenderFX = newFX;
SetSendFlags(BASEFL_CHANGED_RENDERFX);
SetSendFlags(BASEFL_CHANGED_RENDERMODE);
}
void
NSRenderableEntity::SetRenderMode(float newMode)
@ -609,8 +656,8 @@ NSRenderableEntity::Save(float handle)
#else
SaveFloat(handle, "renderamt", m_flRenderAmt);
SaveVector(handle, "rendercolor", m_vecRenderColor);
SaveInt(handle, "rendermode", m_iRenderMode);
SaveInt(handle, "renderfx", m_iRenderFX);
SaveFloat(handle, "rendermode", m_iRenderMode);
SaveFloat(handle, "renderfx", m_iRenderFX);
#endif
super::Save(handle);
@ -649,10 +696,10 @@ NSRenderableEntity::Restore(string strKey, string strValue)
m_vecRenderColor = stov(strValue) / 255;
break;
case "rendermode":
m_iRenderMode = stoi(strValue);
m_iRenderMode = stof(strValue);
break;
case "renderfx":
m_iRenderFX = stoi(strValue);
m_iRenderFX = stof(strValue);
break;
#endif
default:
@ -736,10 +783,10 @@ NSRenderableEntity::SpawnKey(string strKey, string strValue)
m_vecRenderColor = stov(strValue) / 255;
break;
case "rendermode":
m_iRenderMode = stoi(strValue);
m_iRenderMode = stof(strValue);
break;
case "renderfx":
m_iRenderFX = stoi(strValue);
m_iRenderFX = stof(strValue);
break;
#endif
default:

View File

@ -119,5 +119,6 @@ class NSTalkMonster:NSMonster
virtual void(string) SentenceSample;
virtual void(string) Sentence;
virtual void(void) ProcessWordQue;
virtual void(float,float) ReceiveEntity;
#endif
};

View File

@ -605,52 +605,10 @@ NSTalkMonster::SendEntity(entity ePEnt, float fChanged)
WriteByte(MSG_ENTITY, ENT_TALKMONSTER);
/* newly popped into the PVS, sadly this is the only hacky way to check
* for this right now. convince the engine maintainer to make this more sensible */
if (fChanged == 0xFFFFFF) {
/* check for defaults. if these are predictable fields, don't even bother
* networking them! you're just wasting bandwidth. */
if (frame == 0)
fChanged &= ~BASEFL_CHANGED_FRAME;
if (skin == 0)
fChanged &= ~BASEFL_CHANGED_SKIN;
if (effects == 0)
fChanged &= ~BASEFL_CHANGED_EFFECTS;
if (m_iBody == 0)
fChanged &= ~BASEFL_CHANGED_BODY;
if (scale == 0.0 || scale == 1.0)
fChanged &= ~BASEFL_CHANGED_SCALE;
if (origin == [0,0,0])
fChanged &= ~BASEFL_CHANGED_ORIGIN;
if (angles == [0,0,0])
fChanged &= ~BASEFL_CHANGED_ANGLES;
if (velocity == [0,0,0])
fChanged &= ~BASEFL_CHANGED_VELOCITY;
if (mins == [0,0,0] && maxs == [0,0,0])
fChanged &= ~BASEFL_CHANGED_SIZE;
if (solid == SOLID_NOT)
fChanged &= ~BASEFL_CHANGED_SOLID;
if (movetype == MOVETYPE_NONE)
fChanged &= ~BASEFL_CHANGED_MOVETYPE;
#ifdef GS_RENDERFX
if (m_iRenderMode == RM_NORMAL)
fChanged &= ~BASEFL_CHANGED_RENDERMODE;
#endif
}
/* don't network triggers unless provoked */
/*if (cvar("developer") == 0 && m_iRenderMode == RM_TRIGGER)
return (0);*/
#ifdef GS_RENDERFX
/* let's not waste networking power on certain render-modes where they would
* not apply anyway. this seems sensible enough. */
if (m_iRenderMode == RM_NORMAL || m_iRenderMode == RM_TRIGGER) {
fChanged &= ~BASEFL_CHANGED_RENDERCOLOR;
fChanged &= ~BASEFL_CHANGED_RENDERAMT;
}
#endif
/* broadcast how much data is expected to be read */
WriteFloat(MSG_ENTITY, fChanged);
@ -705,11 +663,9 @@ NSTalkMonster::SendEntity(entity ePEnt, float fChanged)
}
#ifdef GS_RENDERFX
if (fChanged & BASEFL_CHANGED_RENDERFX) {
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERMODE) {
WriteByte(MSG_ENTITY, m_iRenderMode);
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERCOLOR) {
@ -830,6 +786,101 @@ NSTalkMonster::predraw(void)
return render;
}
/*
============
NSTalkMonster::ReceiveEntity
============
*/
void
NSTalkMonster::ReceiveEntity(float flNew, float flChanged)
{
if (flChanged & BASEFL_CHANGED_ORIGIN) {
origin[0] = readcoord();
origin[1] = readcoord();
origin[2] = readcoord();
}
if (flChanged & BASEFL_CHANGED_ANGLES) {
angles[0] = readshort() / (32767 / 360);
angles[1] = readshort() / (32767 / 360);
angles[2] = readshort() / (32767 / 360);
}
if (flChanged & BASEFL_CHANGED_MODELINDEX) {
setmodelindex(this, readshort());
}
if (flChanged & BASEFL_CHANGED_SOLID) {
solid = readbyte();
}
if (flChanged & BASEFL_CHANGED_MOVETYPE) {
movetype = readbyte();
if (movetype == MOVETYPE_PHYSICS) {
movetype = MOVETYPE_NONE;
}
}
if (flChanged & BASEFL_CHANGED_SIZE) {
mins[0] = readcoord();
mins[1] = readcoord();
mins[2] = readcoord();
maxs[0] = readcoord();
maxs[1] = readcoord();
maxs[2] = readcoord();
setsize(this, mins, maxs);
}
if (flChanged & BASEFL_CHANGED_FRAME) {
frame = readbyte();
frame1time = readfloat();
frame2time = frame1time;
}
if (flChanged & BASEFL_CHANGED_SKIN) {
skin = readbyte() - 128;
}
if (flChanged & BASEFL_CHANGED_EFFECTS) {
effects = readfloat();
}
if (flChanged & BASEFL_CHANGED_BODY) {
m_iBody = readbyte();
setcustomskin(this, "", sprintf("geomset 1 %i\n", m_iBody));
}
if (flChanged & BASEFL_CHANGED_SCALE) {
scale = readfloat();
}
if (flChanged & BASEFL_CHANGED_VELOCITY) {
velocity[0] = readfloat();
velocity[1] = readfloat();
velocity[2] = readfloat();
}
#ifdef GS_RENDERFX
if (flChanged & BASEFL_CHANGED_RENDERMODE) {
m_iRenderMode = readbyte();
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERCOLOR) {
m_vecRenderColor[0] = readfloat();
m_vecRenderColor[1] = readfloat();
m_vecRenderColor[2] = readfloat();
}
if (flChanged & BASEFL_CHANGED_RENDERAMT) {
m_flRenderAmt = readfloat();
}
#else
if (flChanged & BASEFL_CHANGED_ALPHA) {
alpha = readfloat();
}
#endif
if (modelindex) {
drawmask = MASK_ENGINE;
} else {
drawmask = 0;
}
if (scale == 0.0)
scale = 1.0f;
setorigin(this, origin);
}
void
NSTalkMonster_ParseSentence(void)
{