Starting to clean up more RenderFX stuff, shoving most of it to CGame

This commit is contained in:
Marco Cawthorne 2020-03-30 16:22:24 +02:00
parent f6b26302a2
commit e5a3f0880c
21 changed files with 261 additions and 212 deletions

View file

@ -37,13 +37,6 @@ void CSQC_Ent_Update(float new)
case ENT_PLAYER:
Player_ReadEntity(new);
break;
case ENT_NPC:
CBaseNPC n = (CBaseNPC)self;
if (new) {
spawnfunc_CBaseNPC();
}
n.ReadEntity(readfloat());
break;
case ENT_SPRITE:
env_sprite spr = (env_sprite)self;
if (new) {

View file

@ -26,6 +26,10 @@ class CBaseNPC:CBaseEntity
float
CBaseNPC::predraw(void)
{
#ifdef GS_RENDERFX
RenderFXPass();
#endif
if (lerpfrac > 0) {
lerpfrac -= frametime * 5;
if (lerpfrac < 0) {
@ -43,7 +47,7 @@ CBaseNPC::predraw(void)
frame2time += clframetime;
frame1time += clframetime;
bonecontrol5 = getchannellevel(this, CHAN_VOICE) * 20;
ProcessWordQue();

View file

@ -59,8 +59,7 @@ void player::draw(void)
}
this.subblendfrac =
this.subblend2frac = this.pitch / 90;
this.subblend2frac = this.pitch;
Animation_PlayerUpdate();
/*makevectors([0, this.angles[1], 0]);
@ -113,7 +112,7 @@ void player::draw(void)
}
/* Turn torso */
this.bonecontrol2 = (a)/-120;
this.basesubblendfrac = (a)/-120;
/* Correct the legs */
this.angles[1] -= a;
@ -139,9 +138,9 @@ float player::predraw(void)
makevectors(ang);
traceline(src, src + (v_forward * 8096), FALSE, self);
/*if (serverkeyfloat("*bspversion") == 30) {
if (serverkeyfloat("*bspversion") == 30) {
dynamiclight_add(trace_endpos + (v_forward * -2), 128, [1,1,1]);
} else */{
} else {
float p = dynamiclight_add(src, 512, [1,1,1], 0, "textures/flashlight");
dynamiclight_set(p, LFIELD_ANGLES, ang);
dynamiclight_set(p, LFIELD_FLAGS, 3);

View file

@ -158,7 +158,7 @@ void View_DrawViewModel(void)
} else {
if (eViewModel.forceshader) {
eViewModel.forceshader = 0;
eViewModel.renderflags -= RF_USEAXIS;
eViewModel.renderflags &= ~RF_USEAXIS;
}
}

View file

@ -0,0 +1,71 @@
/*
* Copyright (c) 2016-2019 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.
*/
#define GS_RENDERFX
#ifdef GS_RENDERFX
enum
{
RM_NORMAL,
RM_COLOR,
RM_TEXTURE,
RM_GLOW,
RM_SOLID,
RM_ADDITIVE
};
enum
{
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
};
#endif
enumflags
{
BASEFL_CHANGED_ORIGIN,
BASEFL_CHANGED_ANGLES,
BASEFL_CHANGED_MODELINDEX,
BASEFL_CHANGED_SIZE,
BASEFL_CHANGED_SOLID,
BASEFL_CHANGED_FRAME,
BASEFL_CHANGED_SKIN,
BASEFL_CHANGED_MOVETYPE,
BASEFL_CHANGED_EFFECTS,
BASEFL_CHANGED_BODY,
#ifdef GS_RENDERFX
BASEFL_CHANGED_RENDERCOLOR,
BASEFL_CHANGED_RENDERAMT,
BASEFL_CHANGED_RENDERFX,
BASEFL_CHANGED_RENDERMODE,
#else
BASEFL_CHANGED_ALPHA,
#endif
};

View file

@ -3,6 +3,7 @@
#endif
#includelist
baseentity.h
materials.h
client/baseentity.cpp
client/env_cubemap.cpp

View file

@ -17,23 +17,16 @@
string __fullspawndata;
string Sentences_GetSamples(string);
// keep in sync with client/baseentity.cpp
enumflags
{
BASEFL_CHANGED_ORIGIN,
BASEFL_CHANGED_ANGLES,
BASEFL_CHANGED_MODELINDEX,
BASEFL_CHANGED_SIZE,
BASEFL_CHANGED_SOLID,
BASEFL_CHANGED_FRAME,
BASEFL_CHANGED_SKIN,
BASEFL_CHANGED_MOVETYPE,
BASEFL_CHANGED_ALPHA,
BASEFL_CHANGED_EFFECTS
};
class CBaseEntity
{
#ifdef GS_RENDERFX
int m_iRenderFX;
float m_iRenderMode;
float m_flRenderAmt;
vector m_vecRenderColor;
#endif
int m_iBody;
float m_flSentenceTime;
sound_t *m_pSentenceQue;
int m_iSentenceCount;
@ -51,11 +44,51 @@ class CBaseEntity
virtual void() ProcessWordQue;
virtual void(float flChanged) ReadEntity;
virtual float(void) predraw;
#ifdef GS_RENDERFX
virtual void() RenderFXPass;
#endif
};
#ifdef GS_RENDERFX
void
CBaseEntity::RenderFXPass(void)
{
if (m_iRenderFX == RFX_HOLOGRAM) {
scale = 1.0 * random();
}
switch (m_iRenderMode) {
case RM_NORMAL:
break;
case RM_COLOR:
break;
case RM_TEXTURE:
break;
case RM_GLOW:
effects = EF_ADDITIVE | EF_FULLBRIGHT;
break;
case RM_SOLID:
break;
case RM_ADDITIVE:
effects = EF_ADDITIVE;
break;
}
colormod = m_vecRenderColor;
alpha = m_flRenderAmt;
}
#endif
float
CBaseEntity::predraw(void)
{
#ifdef GS_RENDERFX
RenderFXPass();
#endif
/* mouth flapping action */
bonecontrol5 = getchannellevel(this, CHAN_VOICE) * 20;
frame1time += clframetime;
ProcessWordQue();
addentity(this);
@ -154,12 +187,34 @@ void CBaseEntity::ReadEntity(float flChanged)
if (flChanged & BASEFL_CHANGED_SKIN) {
skin = readbyte() - 128;
}
if (flChanged & BASEFL_CHANGED_ALPHA) {
alpha = readfloat();
}
if (flChanged & BASEFL_CHANGED_EFFECTS) {
effects = readfloat();
}
if (flChanged & BASEFL_CHANGED_BODY) {
m_iBody = readbyte();
setcustomskin(this, "", sprintf("geomset 1 %i\n", m_iBody));
}
#ifdef GS_RENDERFX
if (flChanged & BASEFL_CHANGED_RENDERFX) {
m_iRenderFX = readbyte();
}
if (flChanged & BASEFL_CHANGED_RENDERMODE) {
m_iRenderMode = 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;

View file

@ -3,6 +3,7 @@
#endif
#includelist
baseentity.h
materials.h
server/defs.h
server/baseentity.cpp

View file

@ -14,31 +14,6 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
enum
{
RM_NORMAL,
RM_COLOR,
RM_TEXTURE,
RM_GLOW,
RM_SOLID,
RM_ADDITIVE
};
// keep in sync with client/baseentity.cpp
enumflags
{
BASEFL_CHANGED_ORIGIN,
BASEFL_CHANGED_ANGLES,
BASEFL_CHANGED_MODELINDEX,
BASEFL_CHANGED_SIZE,
BASEFL_CHANGED_SOLID,
BASEFL_CHANGED_FRAME,
BASEFL_CHANGED_SKIN,
BASEFL_CHANGED_MOVETYPE,
BASEFL_CHANGED_ALPHA,
BASEFL_CHANGED_EFFECTS
};
class CBaseEntity
{
string m_strTarget;
@ -49,6 +24,9 @@ class CBaseEntity
vector m_oldOrigin;
vector m_oldAngle;
int m_iBody;
int oldnet_body;
vector oldnet_origin;
vector oldnet_angles;
float oldnet_modelindex;
@ -56,20 +34,29 @@ class CBaseEntity
vector oldnet_maxs;
float oldnet_solid;
float oldnet_movetype;
float oldnet_alpha;
float oldnet_frame;
float oldnet_skin;
float oldnet_effects;
float m_rendermode;
float m_renderamt;
vector m_rendercolor;
#ifdef GS_RENDERFX
int m_iRenderFX;
float m_iRenderMode;
float m_flRenderAmt;
vector m_vecRenderColor;
int m_old_iRenderFX;
float m_old_iRenderMode;
float m_old_flRenderAmt;
vector m_old_vecRenderColor;
#else
float oldnet_alpha;
#endif
string m_parent;
void() CBaseEntity;
virtual void() Respawn;
virtual void() Hide;
virtual void() RendermodeUpdate;
virtual void() ParentUpdate;
virtual float(entity, float) SendEntity;
virtual void(int iHitBody) Pain;
@ -120,12 +107,33 @@ float CBaseEntity::SendEntity(entity ePEnt, float fChanged)
if (fChanged & BASEFL_CHANGED_SKIN) {
WriteByte(MSG_ENTITY, skin + 128);
}
if (fChanged & BASEFL_CHANGED_ALPHA) {
WriteFloat(MSG_ENTITY, alpha);
}
if (fChanged & BASEFL_CHANGED_EFFECTS) {
WriteFloat(MSG_ENTITY, effects);
}
if (fChanged & BASEFL_CHANGED_BODY) {
WriteByte(MSG_ENTITY, m_iBody);
}
#ifdef GS_RENDERFX
if (fChanged & BASEFL_CHANGED_RENDERFX) {
WriteByte(MSG_ENTITY, m_iRenderFX);
}
if (fChanged & BASEFL_CHANGED_RENDERMODE) {
WriteByte(MSG_ENTITY, m_iRenderMode);
}
if (fChanged & BASEFL_CHANGED_RENDERCOLOR) {
WriteFloat(MSG_ENTITY, m_vecRenderColor[0]);
WriteFloat(MSG_ENTITY, m_vecRenderColor[1]);
WriteFloat(MSG_ENTITY, m_vecRenderColor[2]);
}
if (fChanged & BASEFL_CHANGED_RENDERAMT) {
WriteFloat(MSG_ENTITY, m_flRenderAmt);
}
#else
if (fChanged & BASEFL_CHANGED_ALPHA) {
WriteFloat(MSG_ENTITY, alpha);
}
#endif
return TRUE;
}
@ -180,15 +188,34 @@ void CBaseEntity::ParentUpdate(void)
SendFlags |= BASEFL_CHANGED_SKIN;
oldnet_skin = skin;
}
if (alpha != oldnet_alpha) {
SendFlags |= BASEFL_CHANGED_ALPHA;
oldnet_alpha = alpha;
}
if (effects != oldnet_effects) {
SendFlags |= BASEFL_CHANGED_EFFECTS;
oldnet_effects = effects;
}
#ifdef GS_RENDERFX
if (m_old_iRenderFX != m_iRenderFX) {
SendFlags |= BASEFL_CHANGED_RENDERFX;
m_old_iRenderFX = m_iRenderFX;
}
if (m_old_iRenderMode != m_iRenderMode) {
SendFlags |= BASEFL_CHANGED_RENDERMODE;
m_old_iRenderMode = m_iRenderMode;
}
if (m_old_flRenderAmt != m_flRenderAmt) {
SendFlags |= BASEFL_CHANGED_RENDERAMT;
m_old_flRenderAmt = m_flRenderAmt;
}
if (m_old_vecRenderColor != m_vecRenderColor) {
SendFlags |= BASEFL_CHANGED_RENDERCOLOR;
m_old_vecRenderColor = m_vecRenderColor;
}
#else
if (alpha != oldnet_alpha) {
SendFlags |= BASEFL_CHANGED_ALPHA;
oldnet_alpha = alpha;
}
#endif
if (m_parent) {
entity p = find(world, CBaseEntity::m_strTargetName, m_parent);
@ -210,9 +237,9 @@ void CBaseEntity :: CBaseEntity ( void )
}
}
/*m_renderamt = 255;
m_rendercolor = [1,1,1];
m_rendermode = 0;*/
/*m_flRenderAmt = 255;
m_vecRenderColor = [1,1,1];
m_iRenderMode = 0;*/
gflags = GF_CANRESPAWN;
effects |= EF_NOSHADOW;
@ -243,19 +270,22 @@ void CBaseEntity :: CBaseEntity ( void )
target = __NULL__;
break;
case "color":
m_rendercolor = stov( argv( i + 1 ) );
m_vecRenderColor = stov( argv( i + 1 ) );
break;
case "alpha":
m_renderamt = stof( argv( i + 1 ) );
m_flRenderAmt = stof( argv( i + 1 ) );
break;
case "renderamt":
m_renderamt = stof( argv( i + 1 ) ) / 255;
m_flRenderAmt = stof( argv( i + 1 ) ) / 255;
break;
case "rendercolor":
m_rendercolor = stov( argv( i + 1 ) ) / 255;
m_vecRenderColor = stov( argv( i + 1 ) ) / 255;
break;
case "rendermode":
m_rendermode = stof( argv( i + 1 ) );
m_iRenderMode = stoi( argv( i + 1 ) );
break;
case "renderfx":
m_iRenderFX = stoi( argv( i + 1 ) );
break;
case "parentname":
m_parent = argv(i+1);
@ -278,29 +308,6 @@ void CBaseEntity :: CBaseEntity ( void )
m_oldHealth = health;
m_oldOrigin = origin;
m_oldAngle = angles;
RendermodeUpdate();
}
void CBaseEntity::RendermodeUpdate(void)
{
if (m_rendermode == RM_NORMAL) {
return;
}
if (m_rendermode == RM_SOLID && m_renderamt != 0) {
return;
}
colormod = m_rendercolor;
alpha = bound(0.001, m_renderamt, 1.0);
if ( m_rendermode == RM_ADDITIVE ) {
effects = EF_FLAG2; // SSQC: EF_ADDITIVE
} else if ( m_rendermode == RM_GLOW ) {
effects = EF_FLAG2 | EF_FULLBRIGHT;
}
}
void CBaseEntity :: Respawn ( void )

View file

@ -56,8 +56,6 @@ enumflags {
class CBaseMonster:CBaseEntity
{
int body;
int oldnet_body;
vector oldnet_velocity;
float m_flPitch;
int m_iFlags;
@ -92,8 +90,6 @@ class CBaseMonster:CBaseEntity
virtual void() IdleNoise;
virtual void() Gib;
virtual void(string) Sound;
virtual float(entity, float) SendEntity;
virtual void() ParentUpdate;
/* sequences */
virtual void() FreeState;
@ -133,45 +129,6 @@ void CBaseMonster::Sound(string msg)
sound(this, CHAN_VOICE, msg, 1.0, ATTN_NORM);
}
float CBaseMonster::SendEntity(entity ePEnt, float fChanged)
{
if (modelindex == 0) {
return FALSE;
}
WriteByte(MSG_ENTITY, ENT_NPC);
WriteFloat(MSG_ENTITY, fChanged);
if (fChanged & NPC_MODELINDEX)
WriteShort(MSG_ENTITY, modelindex);
if (fChanged & NPC_ORIGIN_X)
WriteCoord(MSG_ENTITY, origin[0]);
if (fChanged & NPC_ORIGIN_Y)
WriteCoord(MSG_ENTITY, origin[1]);
if (fChanged & NPC_ORIGIN_Z)
WriteCoord(MSG_ENTITY, origin[2]);
if (fChanged & NPC_ANGLES_X)
WriteFloat(MSG_ENTITY, angles[0]);
if (fChanged & NPC_ANGLES_Y)
WriteFloat(MSG_ENTITY, angles[1]);
if (fChanged & NPC_ANGLES_Z)
WriteFloat(MSG_ENTITY, angles[2]);
if (fChanged & NPC_VELOCITY_X)
WriteCoord(MSG_ENTITY, velocity[0]);
if (fChanged & NPC_VELOCITY_Y)
WriteCoord(MSG_ENTITY, velocity[1]);
if (fChanged & NPC_VELOCITY_Z)
WriteCoord(MSG_ENTITY, velocity[2]);
if (fChanged & NPC_FRAME)
WriteByte(MSG_ENTITY, frame);
if (fChanged & NPC_SKIN)
WriteByte(MSG_ENTITY, skin);
if (fChanged & NPC_BODY)
WriteByte(MSG_ENTITY, body);
return TRUE;
}
void CBaseMonster::Gib(void)
{
takedamage = DAMAGE_NO;
@ -383,44 +340,6 @@ void CBaseMonster::PlayerUse(void)
}
void CBaseMonster::ParentUpdate(void)
{
if (modelindex != oldnet_modelindex)
SendFlags |= NPC_MODELINDEX;
if (origin[0] != oldnet_origin[0])
SendFlags |= NPC_ORIGIN_X;
if (origin[1] != oldnet_origin[1])
SendFlags |= NPC_ORIGIN_Y;
if (origin[2] != oldnet_origin[2])
SendFlags |= NPC_ORIGIN_Z;
if (angles[0] != oldnet_angles[0])
SendFlags |= NPC_ANGLES_X;
if (angles[1] != oldnet_angles[1])
SendFlags |= NPC_ANGLES_Y;
if (angles[2] != oldnet_angles[2])
SendFlags |= NPC_ANGLES_Z;
if (velocity[0] != oldnet_velocity[0])
SendFlags |= NPC_VELOCITY_X;
if (velocity[1] != oldnet_velocity[1])
SendFlags |= NPC_VELOCITY_Y;
if (velocity[2] != oldnet_velocity[2])
SendFlags |= NPC_VELOCITY_Z;
if (frame != oldnet_frame)
SendFlags |= NPC_FRAME;
if (skin != oldnet_skin)
SendFlags |= NPC_SKIN;
if (body != oldnet_body)
SendFlags |= NPC_BODY;
oldnet_modelindex = modelindex;
oldnet_origin = origin;
oldnet_angles = angles;
oldnet_velocity = velocity;
oldnet_frame = frame;
oldnet_skin = skin;
oldnet_body = body;
}
void CBaseMonster::Pain(int iHitBody)
{

View file

@ -47,10 +47,10 @@ void env_fade :: Trigger (void)
{
WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET);
WriteByte(MSG_MULTICAST, EV_FADE);
WriteByte(MSG_MULTICAST, m_rendercolor[0]);
WriteByte(MSG_MULTICAST, m_rendercolor[1]);
WriteByte(MSG_MULTICAST, m_rendercolor[2]);
WriteByte(MSG_MULTICAST, m_renderamt);
WriteFloat(MSG_MULTICAST, m_vecRenderColor[0]);
WriteFloat(MSG_MULTICAST, m_vecRenderColor[1]);
WriteFloat(MSG_MULTICAST, m_vecRenderColor[2]);
WriteFloat(MSG_MULTICAST, m_flRenderAmt);
WriteFloat(MSG_MULTICAST, m_flFadeDuration);
WriteFloat(MSG_MULTICAST, m_flFadeHold);
WriteByte(MSG_MULTICAST, spawnflags);

View file

@ -43,15 +43,17 @@ void env_render::Trigger(void)
(eFind = find(eFind, CBaseTrigger::m_strTargetName, m_strTarget));) {
CBaseEntity trigger = (CBaseEntity) eFind;
if (!(spawnflags & SF_NORENDERMODE)) {
trigger.m_rendermode = m_rendermode;
trigger.m_iRenderMode = m_iRenderMode;
}
if (!(spawnflags & SF_NORENDERCOLOR)) {
trigger.m_rendercolor = m_rendercolor;
trigger.m_vecRenderColor = m_vecRenderColor;
}
if (!(spawnflags & SF_NORENDERAMT)) {
trigger.m_renderamt = m_renderamt;
trigger.m_flRenderAmt = m_flRenderAmt;
}
if (!(spawnflags & SF_NORENDERFX)) {
trigger.m_iRenderFX = m_iRenderFX;
}
trigger.RendermodeUpdate();
}
}

View file

@ -662,11 +662,11 @@ void monster_scientist::monster_scientist(void)
precache_sound(sci_sndidle[i]);
}
body = -1;
m_iBody = -1;
for (int i = 1; i < (tokenize(__fullspawndata)-1); i += 2) {
switch (argv(i)) {
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
default:
break;
@ -677,13 +677,13 @@ void monster_scientist::monster_scientist(void)
CBaseEntity::CBaseEntity();
precache_model(m_oldModel);
if (body == -1) {
if (m_iBody == -1) {
/* This stuff needs to be persistent because we can't guarantee that
* the client-side geomset refresh happens. Don't shove this into Respawn */
body = floor(random(1,5));
m_iBody = floor(random(1,5));
}
switch (body) {
switch (m_iBody) {
case 1:
m_flPitch = 105;
netname = "Walter";

View file

@ -79,7 +79,6 @@ void Game_Input(void)
BASEFL_CHANGED_FRAME |
BASEFL_CHANGED_SKIN |
BASEFL_CHANGED_MOVETYPE |
BASEFL_CHANGED_ALPHA |
BASEFL_CHANGED_EFFECTS;
}
bprint(PRINT_HIGH, "Respawning all map entities...\n");

View file

@ -69,5 +69,4 @@ void item_suit::item_suit(void)
precache_sound("fvox/hev_logon.wav");
precache_sound("fvox/bell.wav");
CBaseTrigger::CBaseTrigger();
Respawn();
}

View file

@ -67,7 +67,7 @@ void monster_hevsuit_dead::Respawn(void)
void monster_hevsuit_dead::monster_hevsuit_dead(void)
{
model = "models/player.mdl";
body = 2;
m_iBody = 2;
for (int i = 1; i < (tokenize(__fullspawndata)-1); i += 2) {
switch (argv(i)) {
@ -75,7 +75,7 @@ void monster_hevsuit_dead::monster_hevsuit_dead(void)
m_iPose = stoi(argv(i+1));
break;
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
case "skin":
skin = stoi(argv(i+1));

View file

@ -74,7 +74,7 @@ void monster_hgrunt_dead::monster_hgrunt_dead(void)
m_iPose = stoi(argv(i+1));
break;
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
case "skin":
skin = stoi(argv(i+1));

View file

@ -214,11 +214,11 @@ monster_scientist::monster_scientist(void)
m_talkStopFollow = "!SC_STOP";
/* by default a random character etc. is chosen */
body = -1;
m_iBody = -1;
for (int i = 1; i < (tokenize(__fullspawndata)-1); i += 2) {
switch (argv(i)) {
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
default:
break;
@ -231,11 +231,11 @@ monster_scientist::monster_scientist(void)
base_health = Skill_GetValue("scientist_health");
/* has the body not been overriden, etc. choose a character for us */
if (body == -1) {
body = floor(random(1,5));
if (m_iBody == -1) {
m_iBody = floor(random(1,5));
}
switch (body) {
switch (m_iBody) {
case 1:
m_flPitch = 105;
netname = "Walter";

View file

@ -106,7 +106,7 @@ void monster_scientist_dead::monster_scientist_dead(void)
m_iPose = stoi(argv(i+1));
break;
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
case "skin":
skin = stoi(argv(i+1));

View file

@ -100,7 +100,7 @@ void monster_sitting_scientist::monster_sitting_scientist(void)
m_iPose = stoi(argv(i+1));
break;
case "body":
body = stoi(argv(i+1)) + 1;
m_iBody = stoi(argv(i+1)) + 1;
break;
case "skin":
skin = stoi(argv(i+1));
@ -110,13 +110,13 @@ void monster_sitting_scientist::monster_sitting_scientist(void)
}
}
if (body == -1) {
if (m_iBody == -1) {
/* This stuff needs to be persistent because we can't guarantee that
* the client-side geomset refresh happens. Don't shove this into Respawn */
body = floor(random(1,5));
m_iBody = floor(random(1,5));
}
switch (body) {
switch (m_iBody) {
case 1:
m_flPitch = 105;
netname = "Walter";

View file

@ -17,7 +17,6 @@
enum {
ENT_ENTITY = 1,
ENT_PLAYER,
ENT_NPC,
ENT_AMBIENTSOUND,
ENT_ENVLASER,
ENT_SPRITE,