diff --git a/src/gs-entbase/client/env_glow.cpp b/src/gs-entbase/client/env_glow.cpp index 3197b78d..aef0ed3e 100644 --- a/src/gs-entbase/client/env_glow.cpp +++ b/src/gs-entbase/client/env_glow.cpp @@ -59,7 +59,7 @@ float env_glow::predraw(void) /* Scale the glow somewhat with the players distance */ fsize = m_vecSize * m_flScale; - fsize *= vlen(vecPlayer - origin) / 256; + fsize *= bound(1, vlen(vecPlayer - origin) / 256, 4); /* Fade out when the player is starting to move away */ falpha = 1 - bound(0, vlen(vecPlayer - origin) / 1024, 1); diff --git a/src/gs-entbase/client/env_particle.cpp b/src/gs-entbase/client/env_particle.cpp index 72f67030..30dcba6b 100644 --- a/src/gs-entbase/client/env_particle.cpp +++ b/src/gs-entbase/client/env_particle.cpp @@ -42,7 +42,17 @@ class env_particle:CBaseEntity void env_particle::customphysics(void) { - if (checkpvs(viewClient.vecPlayerOrigin, this) == FALSE) { + vector vecPlayer; + +#ifdef WASTES + vecPlayer = viewClient.vecPlayerOrigin; +#else + int s = (float)getproperty(VF_ACTIVESEAT); + pSeat = &seats[s]; + vecPlayer = pSeat->vPlayerOrigin; +#endif + + if (checkpvs(vecPlayer, this) == FALSE) { return; } @@ -55,7 +65,7 @@ void env_particle::customphysics(void) } if (m_strTarget) { - m_eTarget = find(world, ::targetname, m_strTarget); + m_eTarget = find(world, CBaseEntity::targetname, m_strTarget); makevectors(vectoangles(m_eTarget.origin - origin) * -1); angles = v_forward; } diff --git a/src/gs-entbase/client/env_sound.cpp b/src/gs-entbase/client/env_sound.cpp index b49646cc..f0b0253c 100644 --- a/src/gs-entbase/client/env_sound.cpp +++ b/src/gs-entbase/client/env_sound.cpp @@ -57,7 +57,6 @@ Client-side environmental reverb modifier. This works only with the OpenAL sound backend. */ -int g_iDSP; float g_flDSPCheck; enum { @@ -136,149 +135,121 @@ reverbinfo_t reverbPresets [35] = { { 1.0000f, 0.7000f, 0.3162f, 0.4477f, 1.0000f, 1.5100f, 1.2500f, 1.1400f, 0.8913f, 0.0200f, [0,0,0], 1.4125f, 0.0300f, [0,0,0], 0.1790f, 0.1500f, 0.8950f, 0.1900f, 0.9920f, 5000.0000f, 250.0000f, 0.0000f, 0x0 } }; +int g_iDSP; +int g_iDSPold; +float g_flDSPTime; + class env_sound:CBaseEntity { int m_iRoomType; int m_iRadius; void() env_sound; - virtual void() customphysics; virtual void(string, string) SpawnKey; }; -void env_sound::customphysics(void) -{ - vector vecPlayer; - -#ifdef WASTES - vecPlayer = viewClient.vecPlayerOrigin; -#else - int s = (float)getproperty(VF_ACTIVESEAT); - pSeat = &seats[s]; - vecPlayer = pSeat->vPlayerOrigin; -#endif - - if (checkpvs(vecPlayer, this) == FALSE) { - return; - } - - float fDist = vlen(vecPlayer - this.origin); - - if (g_flDSPCheck > time) { - return; - } - - other = world; - traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this); - - if (trace_fraction < 1.0f) { - return; - } - - if (fDist <= m_iRadius) { - if (g_iDSP == m_iRoomType) { - return; - } - setup_reverb(12, &reverbPresets[m_iRoomType], sizeof(reverbinfo_t)); - dprint(sprintf("[DSP] Environment changed to %i\n", m_iRoomType)); - g_iDSP = m_iRoomType; - g_flDSPCheck = time + 0.5; - } -} - void env_sound::env_sound(void) { + m_iRadius = 256; Init(); + movetype = MOVETYPE_NONE; + solid = SOLID_TRIGGER; + geomtype = GEOMTYPE_CAPSULE; + setsize(this, [-m_iRadius,-m_iRadius,-m_iRadius], [m_iRadius,m_iRadius,m_iRadius]); + setorigin(this, origin); + /* Valve BSP, convert their env_sound */ - if (serverkeyfloat("*bspversion") == 30) { - switch(m_iRoomType) { - case 0: - case 1: - m_iRoomType = DSP_DEFAULT; - break; - case 2: - m_iRoomType = DSP_SEWERPIPE; - break; - case 3: - m_iRoomType = DSP_SEWERPIPE; - break; - case 4: - m_iRoomType = DSP_SEWERPIPE; - break; - case 5: - m_iRoomType = DSP_HALLWAY; - break; - case 6: - m_iRoomType = DSP_UNDERPASS; - break; - case 7: - m_iRoomType = DSP_SUBWAY; - break; - case 8: - m_iRoomType = DSP_BATHROOM; - break; - case 9: - m_iRoomType = DSP_LIVINGROOM; - break; - case 10: - m_iRoomType = DSP_AUDITORIUM; - break; - case 11: - m_iRoomType = DSP_QUARRY; - break; - case 12: - m_iRoomType = DSP_FOREST; - break; - case 13: - m_iRoomType = DSP_MOUNTAINS; - break; - case 14: - m_iRoomType = DSP_UNDERWATER; - break; - case 15: - m_iRoomType = DSP_UNDERWATER; - break; - case 16: - m_iRoomType = DSP_UNDERWATER; - break; - case 17: - m_iRoomType = DSP_PARKINGLOT; - break; - case 18: - m_iRoomType = DSP_CAVE; - break; - case 19: - m_iRoomType = DSP_ABANDONED; - break; - case 20: - m_iRoomType = DSP_CHAPEL; - break; - case 21: - m_iRoomType = DSP_CONCERTHALL; - break; - case 22: - m_iRoomType = DSP_MUSEUM; - break; - case 23: - m_iRoomType = DSP_CAVE; - break; - case 24: - m_iRoomType = DSP_CAVE; - break; - case 25: - m_iRoomType = DSP_CAVE; - break; - case 26: - m_iRoomType = DSP_DRUGGED; - break; - case 27: - m_iRoomType = DSP_DIZZY; - break; - case 28: - m_iRoomType = DSP_PSYCHOTIC; - break; - } + if (serverkeyfloat("*bspversion") != 30) { + return; + } + + switch(m_iRoomType) { + case 0: + case 1: + m_iRoomType = DSP_DEFAULT; + break; + case 2: + m_iRoomType = DSP_SEWERPIPE; + break; + case 3: + m_iRoomType = DSP_SEWERPIPE; + break; + case 4: + m_iRoomType = DSP_SEWERPIPE; + break; + case 5: + m_iRoomType = DSP_HALLWAY; + break; + case 6: + m_iRoomType = DSP_UNDERPASS; + break; + case 7: + m_iRoomType = DSP_SUBWAY; + break; + case 8: + m_iRoomType = DSP_BATHROOM; + break; + case 9: + m_iRoomType = DSP_LIVINGROOM; + break; + case 10: + m_iRoomType = DSP_AUDITORIUM; + break; + case 11: + m_iRoomType = DSP_QUARRY; + break; + case 12: + m_iRoomType = DSP_FOREST; + break; + case 13: + m_iRoomType = DSP_MOUNTAINS; + break; + case 14: + m_iRoomType = DSP_UNDERWATER; + break; + case 15: + m_iRoomType = DSP_UNDERWATER; + break; + case 16: + m_iRoomType = DSP_UNDERWATER; + break; + case 17: + m_iRoomType = DSP_PARKINGLOT; + break; + case 18: + m_iRoomType = DSP_CAVE; + break; + case 19: + m_iRoomType = DSP_ABANDONED; + break; + case 20: + m_iRoomType = DSP_CHAPEL; + break; + case 21: + m_iRoomType = DSP_CONCERTHALL; + break; + case 22: + m_iRoomType = DSP_MUSEUM; + break; + case 23: + m_iRoomType = DSP_CAVE; + break; + case 24: + m_iRoomType = DSP_CAVE; + break; + case 25: + m_iRoomType = DSP_CAVE; + break; + case 26: + m_iRoomType = DSP_DRUGGED; + break; + case 27: + m_iRoomType = DSP_DIZZY; + break; + case 28: + m_iRoomType = DSP_PSYCHOTIC; + break; } } @@ -296,15 +267,106 @@ void env_sound::SpawnKey(string strField, string strKey) } } +void DSP_SetEnvironment(int id) +{ + if (g_iDSP == id) { + return; + } + + g_iDSPold = g_iDSP; + g_iDSP = id; + g_flDSPTime = 0.0f; + print(sprintf("Environment changed to %i.\n", g_iDSP)); +} + +reverbinfo_t mix; +void DSP_Interpolate(int id) +{ + mix.flDensity = Math_Lerp(mix.flDensity, reverbPresets[id].flDensity, g_flDSPTime); + mix.flDiffusion = Math_Lerp(mix.flDiffusion, reverbPresets[id].flDiffusion, g_flDSPTime); + mix.flGain = Math_Lerp(mix.flGain, reverbPresets[id].flGain, g_flDSPTime); + mix.flGainHF = Math_Lerp(mix.flGainHF, reverbPresets[id].flGainHF, g_flDSPTime); + mix.flGainLF = Math_Lerp(mix.flGainLF, reverbPresets[id].flGainLF, g_flDSPTime); + mix.flDecayTime = Math_Lerp(mix.flDecayTime, reverbPresets[id].flDecayTime, g_flDSPTime); + mix.flDecayHFRatio = Math_Lerp(mix.flDecayHFRatio, reverbPresets[id].flDecayHFRatio, g_flDSPTime); + mix.flDecayLFRatio = Math_Lerp(mix.flDecayLFRatio, reverbPresets[id].flDecayLFRatio, g_flDSPTime); + mix.flReflectionsGain = Math_Lerp(mix.flReflectionsGain, reverbPresets[id].flReflectionsGain, g_flDSPTime); + mix.flReflectionsDelay = Math_Lerp(mix.flReflectionsDelay, reverbPresets[id].flReflectionsDelay, g_flDSPTime); + mix.flReflectionsPan[0] = Math_Lerp(mix.flReflectionsPan[0], reverbPresets[id].flReflectionsPan[0], g_flDSPTime); + mix.flReflectionsPan[1] = Math_Lerp(mix.flReflectionsPan[1], reverbPresets[id].flReflectionsPan[1], g_flDSPTime); + mix.flReflectionsPan[1] = Math_Lerp(mix.flReflectionsPan[2], reverbPresets[id].flReflectionsPan[2], g_flDSPTime); + mix.flLateReverbGain = Math_Lerp(mix.flLateReverbGain, reverbPresets[id].flLateReverbGain, g_flDSPTime); + mix.flLateReverbDelay = Math_Lerp(mix.flLateReverbDelay, reverbPresets[id].flLateReverbDelay, g_flDSPTime); + mix.flLateReverbPan[0] = Math_Lerp(mix.flLateReverbPan[0], reverbPresets[id].flLateReverbPan[0], g_flDSPTime); + mix.flLateReverbPan[1] = Math_Lerp(mix.flLateReverbPan[1], reverbPresets[id].flLateReverbPan[1], g_flDSPTime); + mix.flLateReverbPan[2] = Math_Lerp(mix.flLateReverbPan[2], reverbPresets[id].flLateReverbPan[2], g_flDSPTime); + mix.flEchoTime = Math_Lerp(mix.flEchoTime, reverbPresets[id].flEchoTime, g_flDSPTime); + mix.flEchoDepth = Math_Lerp(mix.flEchoDepth, reverbPresets[id].flEchoDepth, g_flDSPTime); + mix.flModulationTime = Math_Lerp(mix.flModulationTime, reverbPresets[id].flModulationTime, g_flDSPTime); + mix.flModulationDepth = Math_Lerp(mix.flModulationDepth, reverbPresets[id].flModulationDepth, g_flDSPTime); + mix.flAirAbsorptionGainHF = Math_Lerp(mix.flAirAbsorptionGainHF, reverbPresets[id].flAirAbsorptionGainHF, g_flDSPTime); + mix.flHFReference = Math_Lerp(mix.flHFReference, reverbPresets[id].flHFReference, g_flDSPTime); + mix.flLFReference = Math_Lerp(mix.flLFReference, reverbPresets[id].flLFReference, g_flDSPTime); + mix.flRoomRolloffFactor = Math_Lerp(mix.flRoomRolloffFactor, reverbPresets[id].flRoomRolloffFactor, g_flDSPTime); + mix.iDecayHFLimit = Math_Lerp(mix.iDecayHFLimit, reverbPresets[id].iDecayHFLimit, g_flDSPTime); +} + +var int autocvar_dsp_environments = TRUE; +void DSP_UpdateListener(void) +{ + vector vecPlayer; + + if (autocvar_dsp_environments == FALSE) { + return; + } + +#ifdef WASTES + vecPlayer = viewClient.vecPlayerOrigin; +#else + int s = (float)getproperty(VF_ACTIVESEAT); + pSeat = &seats[s]; + vecPlayer = pSeat->vPlayerOrigin; +#endif + + float bestdist = 999999; + for ( entity e = world; ( e = find( e, classname, "env_sound" ) ); ) { + env_sound scape = (env_sound)e; + + other = world; + traceline(scape.origin, vecPlayer, MOVE_OTHERONLY, scape); + if (trace_fraction < 1.0f) { + continue; + } + + float dist = vlen(e.origin - vecPlayer); + if (dist > scape.m_iRadius) { + continue; + } + + if (dist > bestdist) { + continue; + } + + bestdist = dist; + DSP_SetEnvironment(scape.m_iRoomType); + } + + if (g_flDSPTime < 1.0) { + DSP_Interpolate(g_iDSP); + setup_reverb(12, &mix, sizeof(reverbinfo_t)); + } + + makevectors(getproperty(VF_CL_VIEWANGLES)); + SetListener(getproperty(VF_ORIGIN), v_forward, v_right, v_up, 12); + g_flDSPTime += clframetime; +} + void DSP_Init(void) { g_iDSP = 0; + g_flDSPTime = 1.0f; + DSP_Interpolate(g_iDSP); + setup_reverb(12, &reverbPresets[g_iDSP], sizeof(reverbinfo_t)); setup_reverb(10, &reverbPresets[DSP_UNDERWATER], sizeof(reverbinfo_t)); } - -void DSP_UpdateListener(void) -{ - makevectors(getproperty(VF_CL_VIEWANGLES)); - SetListener(getproperty(VF_ORIGIN), v_forward, v_right, v_up, 12); -} diff --git a/src/gs-entbase/client/env_soundscape.cpp b/src/gs-entbase/client/env_soundscape.cpp index 575657e3..27631dc3 100644 --- a/src/gs-entbase/client/env_soundscape.cpp +++ b/src/gs-entbase/client/env_soundscape.cpp @@ -23,61 +23,34 @@ Client-side environmental soundscape modifier. float g_flSoundscapeCheck; int Sound_Precache(string shader); -entity g_entSoundScape; + +int g_scapes; class env_soundscape:CBaseEntity { + int m_iID; int m_iShader; int m_iRadius; float m_flVolume; void() env_soundscape; - virtual void() customphysics; virtual void(string, string) SpawnKey; }; -void env_soundscape::customphysics(void) -{ - vector vecPlayer; - -#ifdef WASTES - vecPlayer = viewClient.vecPlayerOrigin; -#else - int s = (float)getproperty(VF_ACTIVESEAT); - pSeat = &seats[s]; - vecPlayer = pSeat->vPlayerOrigin; -#endif - - if (checkpvs(vecPlayer, this) == FALSE) { - return; - } - - float fDist = vlen(vecPlayer - this.origin); - - if (g_flSoundscapeCheck > time) { - return; - } - - other = world; - traceline(this.origin, vecPlayer, MOVE_OTHERONLY, this); - - if (trace_fraction < 1.0f) { - return; - } - - if (fDist <= m_iRadius) { - if (g_entSoundScape == this) { - return; - } - g_entSoundScape = this; - } -} +env_soundscape g_entSoundScape; +env_soundscape g_entOldScape; void env_soundscape::SpawnKey(string strField, string strKey) { switch (strField) { case "shader": m_iShader = Sound_Precache(strKey); + + if (m_iShader == -1) { + think = Util_Destroy; + nextthink = time; + } + break; case "radius": m_iRadius = stoi(strKey); @@ -89,7 +62,10 @@ void env_soundscape::SpawnKey(string strField, string strKey) void env_soundscape::env_soundscape(void) { + g_scapes+=1; + m_iID = g_scapes; m_iRadius = 1024; + setorigin(this, origin); } void DSP_ResetSoundscape(void) @@ -97,21 +73,93 @@ void DSP_ResetSoundscape(void) g_entSoundScape = world; } +var int autocvar_dsp_soundscapes = TRUE; +env_soundscape g_ambientsound; void DSP_UpdateSoundscape(void) { - if (!g_entSoundScape) { + vector vecPlayer; + + if (autocvar_dsp_soundscapes == FALSE) { return; } +#ifdef WASTES + vecPlayer = viewClient.vecPlayerOrigin; +#else + int s = (float)getproperty(VF_ACTIVESEAT); + pSeat = &seats[s]; + vecPlayer = pSeat->vPlayerOrigin; +#endif + + float bestdist = 999999; + for ( entity e = world; ( e = find( e, classname, "env_soundscape" ) ); ) { + env_soundscape scape = (env_soundscape)e; + + other = world; + traceline(scape.origin, vecPlayer, MOVE_OTHERONLY, scape); + if (trace_fraction < 1.0f) { + continue; + } + + float dist = vlen(e.origin - vecPlayer); + if (dist > scape.m_iRadius) { + continue; + } + + if (dist > bestdist) { + continue; + } + + bestdist = dist; + g_entSoundScape = scape; + } + + /* fix? */ + if (g_entOldScape != world) { + /* if the shader isn't any different... don't bother changing it? */ + if (g_entOldScape.m_iShader == g_entSoundScape.m_iShader) { + g_entSoundScape = g_entOldScape; + } + } + g_entOldScape = g_entSoundScape; + + float newvol; for ( entity e = world; ( e = find( e, classname, "env_soundscape" ) ); ) { env_soundscape t = (env_soundscape)e; - if (t != g_entSoundScape) { - t.m_flVolume = bound(0, t.m_flVolume - clframetime, 1.0); - } else { - t.m_flVolume = bound(0, t.m_flVolume + clframetime, 1.0); + if (g_ambientsound) { + if (e == g_ambientsound) { + continue; + } } - Sound_Update(self, 10 + t.m_iShader, t.m_iShader, t.m_flVolume); + if (t != g_entSoundScape) { + newvol = bound(0, t.m_flVolume - clframetime, 1.0); + } else { + newvol = bound(0, t.m_flVolume + clframetime, 1.0); + } + + if (newvol != t.m_flVolume) { + t.m_flVolume = newvol; + Sound_Update(world, 10 + t.m_iID, t.m_iShader, t.m_flVolume); + } + } + + /* is a default ambientsound set in worldspawn? */ + if (!g_ambientsound) { + return; + } + + /* is no soundscape active? increase the default volume */ + if (g_entSoundScape == world) { + newvol = bound(0, g_ambientsound.m_flVolume + clframetime, 1.0); + } else{ + newvol = bound(0, g_ambientsound.m_flVolume - clframetime, 1.0); + } + + /* only call sound update when the volume changes. this works around a bug in the engine */ + if (newvol != g_ambientsound.m_flVolume) { + g_ambientsound.m_flVolume = newvol; + Sound_Update(world, 10, g_ambientsound.m_iShader, g_ambientsound.m_flVolume); } } diff --git a/src/gs-entbase/client/prop_dynamic.cpp b/src/gs-entbase/client/prop_dynamic.cpp index dd081d36..aeca2d26 100644 --- a/src/gs-entbase/client/prop_dynamic.cpp +++ b/src/gs-entbase/client/prop_dynamic.cpp @@ -14,8 +14,7 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -/*QUAKED prop_dynamic (1 0 0) (-8 -8 -8) (8 8 8) +/*QUAKED prop_dynamic (1 0 0) (-8 -8 -8) (8 8 8) SF_BASIC_COL "model" Model file that will be displayed by the entity. "modelscale" Scale modifier of the model. Default is '1'. "angles" Sets the pitch, yaw and roll angles of the model. @@ -24,13 +23,11 @@ Client-side decorative model entity. */ - class prop_dynamic:CBaseEntity { void() prop_dynamic; virtual void() Init; - virtual void() PhysicsFrame; virtual void(string, string) SpawnKey; }; @@ -55,6 +52,8 @@ void prop_dynamic::Init(void) precache_model(model); setmodel(this, model); setorigin(this, origin); + solid = SOLID_NOT; + movetype = MOVETYPE_NONE; setsize(this, mins * scale, maxs * scale); drawmask = MASK_ENGINE; } @@ -63,8 +62,3 @@ void prop_dynamic::prop_dynamic(void) { scale = 1.0f; } - -void prop_dynamic::PhysicsFrame(void) -{ - //angles[1] += clframetime * 60; -} diff --git a/src/gs-entbase/client/prop_rope.cpp b/src/gs-entbase/client/prop_rope.cpp index 43f9af59..4c175252 100644 --- a/src/gs-entbase/client/prop_rope.cpp +++ b/src/gs-entbase/client/prop_rope.cpp @@ -90,7 +90,7 @@ float prop_rope::predraw(void) return PREDRAW_NEXT; } - entity x = find(world, ::targetname, target); + entity x = find(world, CBaseEntity::targetname, target); if (!x) { print("prop_rope without target.\n"); diff --git a/src/gs-entbase/client/worldspawn.cpp b/src/gs-entbase/client/worldspawn.cpp index 36ff3414..7d2e9289 100644 --- a/src/gs-entbase/client/worldspawn.cpp +++ b/src/gs-entbase/client/worldspawn.cpp @@ -35,6 +35,10 @@ void worldspawn::SpawnKey(string strField, string strKey) case "skyname": Sky_Set(strKey); break; + case "ambientsound": + g_ambientsound = spawn(env_soundscape); + g_ambientsound.m_iShader = Sound_Precache(strKey); + break; default: break; } diff --git a/src/gs-entbase/server/baseentity.cpp b/src/gs-entbase/server/baseentity.cpp index 771ceb41..aac682ba 100644 --- a/src/gs-entbase/server/baseentity.cpp +++ b/src/gs-entbase/server/baseentity.cpp @@ -35,6 +35,7 @@ class CBaseEntity float m_rendermode; float m_renderamt; vector m_rendercolor; + string m_parent; void() CBaseEntity; virtual void() Respawn; diff --git a/src/gs-entbase/server/basephysics.cpp b/src/gs-entbase/server/basephysics.cpp index 200f8ab6..114562cc 100644 --- a/src/gs-entbase/server/basephysics.cpp +++ b/src/gs-entbase/server/basephysics.cpp @@ -21,22 +21,27 @@ class CBasePhysics:CBaseEntity void CBasePhysics::touch(void) { +#ifdef GS_BULLET_PHYSICS makevectors(vectoangles(origin - other.origin)); physics_addforce(this, v_forward * 128, other.origin); physics_enable(this, TRUE); +#endif } void CBasePhysics::vPain(entity eAttacker, int iType, int iDamage) { +#ifdef GS_BULLET_PHYSICS iDamage *= 5; makevectors(vectoangles(origin - trace_endpos)); physics_addforce(this, v_forward * iDamage, trace_endpos); health = 100000; physics_enable(this, TRUE); +#endif } void CBasePhysics::Respawn(void) { +#ifdef GS_BULLET_PHYSICS movetype = MOVETYPE_PHYSICS; solid = SOLID_PHYSICS_BOX + m_iShape; // SOLID_PHYSICS_TRIMESH setmodel(this, m_oldModel); @@ -44,6 +49,12 @@ void CBasePhysics::Respawn(void) physics_enable(this, FALSE); takedamage = DAMAGE_YES; health = 100000; +#else + movetype = MOVETYPE_NONE; + solid = SOLID_BBOX; + setmodel(this, m_oldModel); + setorigin(this, m_oldOrigin); +#endif } void CBasePhysics::CBasePhysics(void) diff --git a/src/gs-entbase/server/basetrigger.cpp b/src/gs-entbase/server/basetrigger.cpp index 1ddc8291..dadd26d0 100644 --- a/src/gs-entbase/server/basetrigger.cpp +++ b/src/gs-entbase/server/basetrigger.cpp @@ -37,8 +37,21 @@ class CBaseTrigger : CBaseEntity virtual void( float del ) UseTargets_Delay; virtual void() InitBrushTrigger; virtual void() InitPointTrigger; + virtual void() ParentUpdate; }; +void CBaseTrigger::ParentUpdate(void) +{ + entity p = find(world, CBaseTrigger::m_strTarget, m_parent); + + if (!p) { + return; + } + + setorigin(this, p.origin); + nextthink = time; +} + void CBaseTrigger :: UseTargets ( void ) { for ( entity eFind = world; ( eFind = find( eFind, CBaseTrigger::m_strTargetName, m_strTarget ) ); ) { @@ -147,6 +160,11 @@ void CBaseTrigger :: CBaseTrigger ( void ) case "master": m_strMaster = argv(i+1); break; + case "parentname": + m_parent = argv(i+1); + think = ParentUpdate; + nextthink = time; + break; default: break; } diff --git a/src/gs-entbase/server/defs.h b/src/gs-entbase/server/defs.h index 25d4abb1..93b5e560 100644 --- a/src/gs-entbase/server/defs.h +++ b/src/gs-entbase/server/defs.h @@ -14,7 +14,11 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -//#define GS_DEVELOPER +#define GS_DEVELOPER + +#ifdef WASTES +#define GS_BULLET_PHYSICS +#endif void Effect_CreateSpark(vector, vector); void Effect_BreakModel(int, vector, vector, vector, float); diff --git a/src/gs-entbase/server/func_breakable.cpp b/src/gs-entbase/server/func_breakable.cpp index 0346fee3..92ef30ff 100755 --- a/src/gs-entbase/server/func_breakable.cpp +++ b/src/gs-entbase/server/func_breakable.cpp @@ -39,7 +39,8 @@ enumflags { SF_TRIGGER, SF_TOUCH, - SF_PRESSURE + SF_PRESSURE, + SF_ISMODEL }; enum @@ -131,8 +132,6 @@ void func_breakable::vDeath (entity attacker, int type, int damage) return; } health = 0; - - print(sprintf("BREAK: %v [x] %v [=] %d\n", mins, maxs, vlen(mins - maxs))); /* This may seem totally absurd. That's because it is. It's very * unreliable but exploding breakables in close proximity it WILL cause @@ -194,10 +193,15 @@ void func_breakable::PlayerTouch(void) void func_breakable::Respawn(void) { - precache_model(m_oldModel); angles = [0,0,0]; movetype = MOVETYPE_NONE; - solid = SOLID_BSP; + + if (spawnflags & SF_ISMODEL) { + solid = SOLID_BBOX; + } else { + solid = SOLID_BSP; + } + setmodel(this, m_oldModel); setorigin(this, m_oldOrigin); touch = PlayerTouch; @@ -218,11 +222,18 @@ void func_breakable::Respawn(void) void func_breakable::func_breakable(void) { + precache_model(model); CBaseEntity::CBaseEntity(); func_breakable::Respawn(); for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { switch (argv(i)) { + case "vvm_model": + model = argv(i + 1); + m_oldModel = model; + precache_model(model); + spawnflags |= SF_ISMODEL; + break; case "material": m_iMaterial = stof(argv(i + 1)); break; @@ -237,3 +248,6 @@ void func_breakable::func_breakable(void) } } } + +CLASSEXPORT(func_physbox, func_breakable) +CLASSEXPORT(func_physbox_multiplayer, func_breakable) diff --git a/src/gs-entbase/server/func_door_rotating.cpp b/src/gs-entbase/server/func_door_rotating.cpp index 6a23a3de..3a62497e 100644 --- a/src/gs-entbase/server/func_door_rotating.cpp +++ b/src/gs-entbase/server/func_door_rotating.cpp @@ -71,8 +71,23 @@ class func_door_rotating:CBaseTrigger virtual void() SetMovementDirection; virtual void(vector angle, void() func) RotToDest; virtual void() RotToDest_End; + +#ifdef GS_BULLET_PHYSICS + virtual void() Unhinge; +#endif }; +#ifdef GS_BULLET_PHYSICS +void func_door_rotating::Unhinge(void) +{ + takedamage = DAMAGE_NO; + touch = think = __NULL__; + solid = SOLID_PHYSICS_BOX; + movetype = MOVETYPE_PHYSICS; + physics_enable(this, TRUE); +} +#endif + void func_door_rotating::Precache(void) { if (spawnflags & SF_DOOR_SILENT) { @@ -311,6 +326,12 @@ void func_door_rotating::Respawn(void) m_flDistance = 90; } +#ifdef GS_BULLET_PHYSICS + takedamage = DAMAGE_YES; + health = 100; + vDeath = func_door_rotating::Unhinge; +#endif + solid = SOLID_BSP; movetype = MOVETYPE_PUSH; setorigin(this, m_oldOrigin); diff --git a/src/gs-entbase/server/func_illusionary.cpp b/src/gs-entbase/server/func_illusionary.cpp index 5e170c64..cf003e79 100644 --- a/src/gs-entbase/server/func_illusionary.cpp +++ b/src/gs-entbase/server/func_illusionary.cpp @@ -31,6 +31,18 @@ class func_illusionary : CBaseEntity void func_illusionary :: func_illusionary ( void ) { CBaseEntity::CBaseEntity(); + + int nfields = tokenize( __fullspawndata ); + for ( int i = 1; i < ( nfields - 1 ); i += 2 ) { + switch ( argv( i ) ) { + case "color": + colormod = stov( argv( i + 1 ) ); + break; + default: + break; + } + } + precache_model( model ); //angles = '0 0 0'; movetype = MOVETYPE_PUSH; diff --git a/src/gs-entbase/server/func_train.cpp b/src/gs-entbase/server/func_train.cpp index 1eb5bdd8..9391138e 100644 --- a/src/gs-entbase/server/func_train.cpp +++ b/src/gs-entbase/server/func_train.cpp @@ -89,7 +89,19 @@ class func_train:CBaseTrigger void func_train::Blocked(void) { - Damage_Apply(other, this, m_flDamage, 0, DMG_CRUSH); + /* HACK: Make corpses gib instantly */ +//#ifdef WASTES + if (other.classname == "Corpse") { + Damage_Apply(other, this, 500, 0, DMG_EXPLODE); + return; + } +//#endif + + if (other.takedamage != DAMAGE_NO) { + Damage_Apply(other, this, m_flDamage, 0, DMG_CRUSH); + } else { + remove(other); + } } void diff --git a/src/gs-entbase/server/func_wall.cpp b/src/gs-entbase/server/func_wall.cpp index 7407e091..60c7c829 100644 --- a/src/gs-entbase/server/func_wall.cpp +++ b/src/gs-entbase/server/func_wall.cpp @@ -42,6 +42,3 @@ void func_wall :: Trigger ( void ) { frame = 1 - frame; } - -CLASSEXPORT(func_physbox, func_wall) -CLASSEXPORT(func_physbox_multiplayer, func_wall) diff --git a/src/gs-entbase/server/func_wall_toggle.cpp b/src/gs-entbase/server/func_wall_toggle.cpp index 14375418..1b335fbd 100644 --- a/src/gs-entbase/server/func_wall_toggle.cpp +++ b/src/gs-entbase/server/func_wall_toggle.cpp @@ -29,34 +29,44 @@ enumflags class func_wall_toggle:CBaseTrigger { + int m_oldmodelindex; + int m_iVisible; + void() func_wall_toggle; + virtual void() Respawn; virtual void() Trigger; }; -void func_wall_toggle::func_wall_toggle(void) +void func_wall_toggle::Trigger(void) +{ + m_iVisible = 1 - m_iVisible; + + if (m_iVisible) { + modelindex = m_oldmodelindex; + solid = SOLID_BSP; + } else { + modelindex = 0; + solid = SOLID_NOT; + } +} + +void func_wall_toggle::Respawn(void) { - precache_model(model); - //angles = '0 0 0'; movetype = MOVETYPE_PUSH; solid = SOLID_BSP; - setmodel(this, model); - CBaseTrigger::CBaseTrigger(); + setmodel(this, m_oldModel); setorigin(this, origin); - + m_iVisible = 1; + m_oldmodelindex = modelindex; + if (spawnflags & FTW_STARTHIDDEN) { Trigger(); } } -void func_wall_toggle::Trigger(void) +void func_wall_toggle::func_wall_toggle(void) { - if (solid == SOLID_BSP) { - solid = SOLID_NOT; - modelindex = 0; - model = ""; - } else { - solid = SOLID_BSP; - model = m_oldModel; - setmodel(this, model); - } + precache_model(model); + CBaseTrigger::CBaseTrigger(); + Respawn(); } diff --git a/src/menu-fn/w_modlist.cpp b/src/menu-fn/w_modlist.cpp index ae5618b7..fe0f07d6 100644 --- a/src/menu-fn/w_modlist.cpp +++ b/src/menu-fn/w_modlist.cpp @@ -52,7 +52,7 @@ void CModList::Draw(void) drawfill([g_menuofs[0] + m_x, g_menuofs[1] + m_y], [m_size[0], m_size[1]], [0,0,0], 1.0f); - visible = floor(m_size[1] / 15); + visible = floor(m_size[1] / 29) + 1; visible = bound(0, visible, gameinfo_count); pos = m_y; @@ -108,7 +108,7 @@ void CModList::Input(float type, float x, float y, float devid) int visible; int pos[2]; - visible = floor(m_size[1] / 29); + visible = floor(m_size[1] / 29) + 1; visible = bound(0, visible, gameinfo_count); pos[0] = m_x; diff --git a/src/menu-fn/w_scrollbar.cpp b/src/menu-fn/w_scrollbar.cpp index 40d0bcab..b009bfd4 100644 --- a/src/menu-fn/w_scrollbar.cpp +++ b/src/menu-fn/w_scrollbar.cpp @@ -78,7 +78,7 @@ void CScrollbar::Draw(void) [16,16], [1,1,1], 1.0f, 0); } - barheight = m_theight * (m_theight / (m_max * m_itemheight)); + barheight = 20 /*m_theight * (m_theight / (m_max * m_itemheight))*/; barstep = (m_scroll * m_itemheight) * (m_theight / (m_max * m_itemheight)); if (!m_hold) { @@ -129,7 +129,7 @@ void CScrollbar::Input(float type, float x, float y, float devid) SetScroll(m_scroll + 1); } - barheight = m_theight * (m_theight / (m_max * m_itemheight)); + barheight = 20 /*m_theight * (m_theight / (m_max * m_itemheight))*/; barstep = (m_scroll * m_itemheight) * (m_theight / (m_max * m_itemheight)); if (Util_CheckMouse(m_x, m_y + 16 + barstep, 16, barheight)) { diff --git a/src/server/scihunt/client.c b/src/server/scihunt/client.c index 5d3f9278..a7219c03 100644 --- a/src/server/scihunt/client.c +++ b/src/server/scihunt/client.c @@ -47,7 +47,7 @@ void Game_ClientDisconnect(void) void Game_ClientKill(void) { - Damage_Apply(self, self, self.health, self.origin, TRUE, 0); + Damage_Apply(self, self, self.health, WEAPON_NONE, DMG_SKIP_ARMOR); } void Game_PlayerPreThink(void) { diff --git a/src/shared/defs.h b/src/shared/defs.h index ca21bf5b..07d6ed97 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -126,3 +126,18 @@ void Empty(void) { } + +void Util_Destroy(void) +{ + remove(self); +} + +int Sound_Precache(string s) +{ + return -1; +} + +void Sound_Update(entity a, int b, int c, float d) +{ + +} diff --git a/src/shared/effects.c b/src/shared/effects.c index 1f7d355f..fc14fd86 100755 --- a/src/shared/effects.c +++ b/src/shared/effects.c @@ -379,37 +379,37 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float float fCount = 20; switch (fStyle) { - case MATERIAL_GLASS: - case MATERIAL_GLASS_UNBREAKABLE: + case GSMATERIAL_GLASS: + case GSMATERIAL_GLASS_UNBREAKABLE: sModel = "models/glassgibs.mdl"; fModelCount = 8; break; - case MATERIAL_WOOD: + case GSMATERIAL_WOOD: sModel = "models/woodgibs.mdl"; fModelCount = 3; break; - case MATERIAL_METAL: + case GSMATERIAL_METAL: sModel = "models/metalplategibs.mdl"; fModelCount = 13; break; - case MATERIAL_FLESH: + case GSMATERIAL_FLESH: sModel = "models/fleshgibs.mdl"; fModelCount = 4; break; - case MATERIAL_TILE: + case GSMATERIAL_TILE: sModel = "models/ceilinggibs.mdl"; fModelCount = 4; break; - case MATERIAL_COMPUTER: + case GSMATERIAL_COMPUTER: sModel = "models/computergibs.mdl"; fModelCount = 15; break; - case MATERIAL_ROCK: + case GSMATERIAL_ROCK: sModel = "models/rockgibs.mdl"; fModelCount = 3; break; default: - case MATERIAL_CINDER: + case GSMATERIAL_CINDER: sModel = "models/cindergibs.mdl"; fModelCount = 9; break; @@ -421,24 +421,24 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float vWorldPos[2] = vMins[2] + (0.5 * (vMaxs[2] - vMins[2])); switch (fStyle) { - case MATERIAL_GLASS: + case GSMATERIAL_GLASS: pointsound(vWorldPos, sprintf("debris/bustglass%d.wav", random(1, 4)), 1.0f, ATTN_NORM); break; - case MATERIAL_WOOD: + case GSMATERIAL_WOOD: pointsound(vWorldPos, sprintf("debris/bustcrate%d.wav", random(1, 4)), 1.0f, ATTN_NORM); break; - case MATERIAL_METAL: - case MATERIAL_COMPUTER: + case GSMATERIAL_METAL: + case GSMATERIAL_COMPUTER: pointsound(vWorldPos, sprintf("debris/bustmetal%d.wav", random(1, 3)), 1.0f, ATTN_NORM); break; - case MATERIAL_FLESH: + case GSMATERIAL_FLESH: pointsound(vWorldPos, sprintf("debris/bustflesh%d.wav", random(1, 3)), 1.0f, ATTN_NORM); break; - case MATERIAL_CINDER: - case MATERIAL_ROCK: + case GSMATERIAL_CINDER: + case GSMATERIAL_ROCK: pointsound(vWorldPos, sprintf("debris/bustconcrete%d.wav", random(1, 4)), 1.0f, ATTN_NORM); break; - case MATERIAL_TILE: + case GSMATERIAL_TILE: pointsound(vWorldPos, "debris/bustceiling.wav", 1.0f, ATTN_NORM); break; } @@ -463,7 +463,7 @@ void Effect_BreakModel(int count, vector vMins, vector vMaxs, vector vVel, float eGib.think = Effect_BreakModel_Remove; eGib.nextthink = time + 10; - if ((fStyle == MATERIAL_GLASS) || (fStyle == MATERIAL_GLASS_UNBREAKABLE)) { + if ((fStyle == GSMATERIAL_GLASS) || (fStyle == GSMATERIAL_GLASS_UNBREAKABLE)) { eGib.effects = EF_ADDITIVE; } diff --git a/src/shared/scihunt/w_chainsaw.c b/src/shared/scihunt/w_chainsaw.c index bc0f4842..4d8e49ab 100644 --- a/src/shared/scihunt/w_chainsaw.c +++ b/src/shared/scihunt/w_chainsaw.c @@ -94,7 +94,7 @@ void w_chainsaw_primary(void) pl.velocity = normalize(trace_ent.origin - pl.origin) * 240; } - Damage_Apply(trace_ent, self, 10, trace_endpos, FALSE, WEAPON_CHAINSAW); + Damage_Apply(trace_ent, self, 10, WEAPON_CHAINSAW, DMG_BLUNT); Weapons_PlaySound(pl, CHAN_WEAPON, "sh/chainsaw_cutintoflesh.wav", 1, ATTN_NORM); } else { Effect_CreateSpark(trace_endpos, trace_plane_normal); diff --git a/src/shared/scihunt/w_hammer.c b/src/shared/scihunt/w_hammer.c index 1ea37d1c..7f3af64e 100644 --- a/src/shared/scihunt/w_hammer.c +++ b/src/shared/scihunt/w_hammer.c @@ -41,7 +41,7 @@ void w_hammer_precache(void) void w_hammer_updateammo(player pl) { #ifdef SSQC - Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); + Weapons_UpdateAmmo(pl, -1, -1, -1); #endif } string w_hammer_pmodel(void) @@ -59,7 +59,7 @@ void w_hammer_draw(void) Weapons_ViewAnimation(HAMMER_DRAW); #ifdef SSQC player pl = (player)self; - Weapons_UpdateAmmo(pl, __NULL__, __NULL__, __NULL__); + Weapons_UpdateAmmo(pl, -1, -1, -1); #endif } @@ -120,9 +120,9 @@ void w_hammer_release(void) hitsound = floor(random(1, 4)); if (trace_ent.classname == "player") - Damage_Apply(trace_ent, self, 50, trace_endpos, FALSE, WEAPON_HAMMER); + Damage_Apply(trace_ent, self, 50, WEAPON_HAMMER, DMG_BLUNT); else - Damage_Apply(trace_ent, self, 100, trace_endpos, FALSE, WEAPON_HAMMER); + Damage_Apply(trace_ent, self, 100, WEAPON_HAMMER, DMG_BLUNT); if (trace_ent.classname == "monster_scientist") { trace_ent.movetype = MOVETYPE_TOSS; @@ -142,7 +142,7 @@ void w_hammer_release(void) #ifdef SSQC if (trace_ent.takedamage) { hitsound = floor(random(1, 4)); - Damage_Apply(trace_ent, self, 200, trace_endpos, FALSE, WEAPON_HAMMER); + Damage_Apply(trace_ent, self, 200, WEAPON_HAMMER, DMG_BLUNT); } else { if (trace_fraction < 1.0) { hitsound = 4;