Some fixes to get FreeHL to compile without TW.

This commit is contained in:
Marco Cawthorne 2019-11-09 02:09:17 +01:00
parent 7048e0add0
commit c5b0e0146f
24 changed files with 481 additions and 248 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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");

View File

@ -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;
}

View File

@ -35,6 +35,7 @@ class CBaseEntity
float m_rendermode;
float m_renderamt;
vector m_rendercolor;
string m_parent;
void() CBaseEntity;
virtual void() Respawn;

View File

@ -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)

View File

@ -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;
}

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -42,6 +42,3 @@ void func_wall :: Trigger ( void )
{
frame = 1 - frame;
}
CLASSEXPORT(func_physbox, func_wall)
CLASSEXPORT(func_physbox_multiplayer, func_wall)

View File

@ -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();
}

View File

@ -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;

View File

@ -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)) {

View File

@ -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)
{

View File

@ -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)
{
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;