Some fixes to get FreeHL to compile without TW.
This commit is contained in:
parent
7048e0add0
commit
c5b0e0146f
24 changed files with 481 additions and 248 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ class CBaseEntity
|
|||
float m_rendermode;
|
||||
float m_renderamt;
|
||||
vector m_rendercolor;
|
||||
string m_parent;
|
||||
|
||||
void() CBaseEntity;
|
||||
virtual void() Respawn;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -42,6 +42,3 @@ void func_wall :: Trigger ( void )
|
|||
{
|
||||
frame = 1 - frame;
|
||||
}
|
||||
|
||||
CLASSEXPORT(func_physbox, func_wall)
|
||||
CLASSEXPORT(func_physbox_multiplayer, func_wall)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue