diff --git a/src/client/entry.c b/src/client/entry.c index f25708d6..e6377753 100644 --- a/src/client/entry.c +++ b/src/client/entry.c @@ -166,6 +166,22 @@ CSQC_UpdateView(float w, float h, float focus) setproperty(VF_ENVMAP, "$whiteimage"); setproperty(VF_ORIGIN, g_vecCubePos); setproperty(VF_AFOV, 90); + if (g_skyscale != 0 && g_skypos) { + vector porg; + vector realpos; + + if (autocvar_dev_skyscale) { + realpos[0] = g_vecCubePos[0] / autocvar_dev_skyscale; + realpos[1] = g_vecCubePos[1] / autocvar_dev_skyscale; + realpos[2] = g_vecCubePos[2] / autocvar_dev_skyscale; + } else { + realpos[0] = g_vecCubePos[0] / g_skyscale; + realpos[1] = g_vecCubePos[1] / g_skyscale; + realpos[2] = g_vecCubePos[2] / g_skyscale; + } + setproperty(VF_SKYROOM_CAMERA, g_skypos + realpos); + } + renderscene(); return; } diff --git a/src/gs-entbase/shared/trigger_gravity.cpp b/src/gs-entbase/shared/trigger_gravity.cpp index 29b9892a..60b36894 100644 --- a/src/gs-entbase/shared/trigger_gravity.cpp +++ b/src/gs-entbase/shared/trigger_gravity.cpp @@ -80,7 +80,7 @@ trigger_gravity::trigger_gravity(void) #ifdef CLIENT void -trigger_gravity::Initialized (void) +trigger_gravity::Initialized(void) { setmodel(this, model); movetype = MOVETYPE_NONE; diff --git a/src/shared/cstrike/include.src b/src/shared/cstrike/include.src index 6b79a159..c5d84aba 100644 --- a/src/shared/cstrike/include.src +++ b/src/shared/cstrike/include.src @@ -48,5 +48,6 @@ ../../shared/cstrike/weapons.c ../../shared/valve/weapon_common.c ../../shared/cstrike/pmove.c +../../shared/valve/pmove_water.c ../../shared/cstrike/item_c4bomb.cpp #endlist diff --git a/src/shared/cstrike/pmove.c b/src/shared/cstrike/pmove.c index d4c743fb..89405415 100644 --- a/src/shared/cstrike/pmove.c +++ b/src/shared/cstrike/pmove.c @@ -14,6 +14,17 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define PMOVE_STEPHEIGHT 18 +#define PMOVE_AIRSTEPHEIGHT 18 +#define PMOVE_FRICTION 4 +#define PMOVE_EDGEFRICTION 1 +#define PMOVE_STOPSPEED 75 +#define PMOVE_GRAVITY 800 +#define PMOVE_AIRACCELERATE 10 +#define PMOVE_WATERACCELERATE 8 +#define PMOVE_ACCELERATE 4 +#define PMOVE_MAXSPEED 250 + .float waterlevel; .float watertype; diff --git a/src/shared/defs.h b/src/shared/defs.h index 5c4d0a76..65387a04 100644 --- a/src/shared/defs.h +++ b/src/shared/defs.h @@ -32,7 +32,7 @@ #define BSPVER_Q1 29 #define BSPVER_HL 30 #define BSPVER_Q2 38 -#define BSPVER_Q2W 69 +#define BSPVER_Q2W 69 #define BSPVER_Q3 46 #define BSPVER_RTCW 47 #define BSPVER_RBSP 1 diff --git a/src/shared/gearbox/include.src b/src/shared/gearbox/include.src index 3617f9b6..38985dd3 100644 --- a/src/shared/gearbox/include.src +++ b/src/shared/gearbox/include.src @@ -6,6 +6,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/valve/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/hunger/include.src b/src/shared/hunger/include.src index 6aafcace..2bc7a377 100644 --- a/src/shared/hunger/include.src +++ b/src/shared/hunger/include.src @@ -6,6 +6,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/valve/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/player.h b/src/shared/player.h index 679db50e..94e36ed8 100644 --- a/src/shared/player.h +++ b/src/shared/player.h @@ -78,5 +78,9 @@ class base_player int voted; int step; float step_time; + + float underwater_time; + float underwater_dmg; + float pain_time; #endif }; diff --git a/src/shared/pmove.c b/src/shared/pmove.c index ceaed191..c73e19a4 100644 --- a/src/shared/pmove.c +++ b/src/shared/pmove.c @@ -14,6 +14,54 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifndef PMOVE_STEPHEIGHT + #define PMOVE_STEPHEIGHT 18 +#endif + +#ifndef PMOVE_AIRSTEPHEIGHT + #define PMOVE_AIRSTEPHEIGHT 18 +#endif + +#ifndef PMOVE_FRICTION + #define PMOVE_FRICTION 4 +#endif + +#ifndef PMOVE_EDGEFRICTION + #define PMOVE_EDGEFRICTION 1 +#endif + +#ifndef PMOVE_STOPSPEED + #define PMOVE_STOPSPEED 75 +#endif + +#ifndef PMOVE_GRAVITY + #define PMOVE_GRAVITY 800 +#endif + +#ifndef PMOVE_AIRACCELERATE + #define PMOVE_AIRACCELERATE 10 +#endif + +#ifndef PMOVE_WATERACCELERATE + #define PMOVE_WATERACCELERATE 8 +#endif + +#ifndef PMOVE_ACCELERATE + #define PMOVE_ACCELERATE 8 +#endif + +#ifndef PMOVE_MAXSPEED + #define PMOVE_MAXSPEED 270 +#endif + +#ifndef PMOVE_STEP_WALKSPEED + #define PMOVE_STEP_WALKSPEED 135 +#endif + +#ifndef PMOVE_STEP_RUNSPEED + #define PMOVE_STEP_RUNSPEED 220 +#endif + /* FIXME: jumptime should use the time global, as time intervals are not * predictable - decrement it based upon input_timelength */ @@ -25,26 +73,16 @@ void PMove_Init(void) { #ifdef SERVER - localcmd("serverinfo phy_stepheight 18\n"); - localcmd("serverinfo phy_airstepheight 18\n"); - localcmd("serverinfo phy_friction 4\n"); - localcmd("serverinfo phy_edgefriction 1\n"); - localcmd("serverinfo phy_stopspeed 75\n"); - localcmd("serverinfo phy_gravity 800\n"); - localcmd("serverinfo phy_airaccelerate 10\n"); - localcmd("serverinfo phy_wateraccelerate 8\n"); - -#ifdef VALVE - localcmd("serverinfo phy_accelerate 8\n"); - localcmd("serverinfo phy_maxspeed 270\n"); -#elif CSTRIKE - localcmd("serverinfo phy_accelerate 4\n"); - localcmd("serverinfo phy_maxspeed 250\n"); -#else - localcmd("serverinfo phy_accelerate 8\n"); - localcmd("serverinfo phy_maxspeed 270\n"); -#endif - + readcmd(sprintf("serverinfo phy_stepheight %d\n", PMOVE_STEPHEIGHT)); + readcmd(sprintf("serverinfo phy_airstepheight %d\n", PMOVE_AIRSTEPHEIGHT)); + readcmd(sprintf("serverinfo phy_friction %d\n", PMOVE_FRICTION)); + readcmd(sprintf("serverinfo phy_edgefriction %d\n", PMOVE_EDGEFRICTION)); + readcmd(sprintf("serverinfo phy_stopspeed %d\n", PMOVE_STOPSPEED)); + readcmd(sprintf("serverinfo phy_gravity %d\n", PMOVE_GRAVITY)); + readcmd(sprintf("serverinfo phy_airaccelerate %d\n", PMOVE_AIRACCELERATE)); + readcmd(sprintf("serverinfo phy_wateraccelerate %d\n", PMOVE_WATERACCELERATE)); + readcmd(sprintf("serverinfo phy_accelerate %d\n", PMOVE_ACCELERATE)); + readcmd(sprintf("serverinfo phy_maxspeed %d\n", PMOVE_MAXSPEED)); #endif } @@ -152,76 +190,6 @@ PMove_Categorize(void) } } -/* this is technically run every frame, not just when we're in water */ -void -PMove_WaterMove(void) -{ - if (self.movetype == MOVETYPE_NOCLIP) { - return; - } - - /*if (self.health < 0) { - return; - }*/ - -#if 0 - CPlayer plPlayer = (CPlayer)self; - if (plPlayer.waterlevel != 3) { - if (plPlayer.m_flAirFinished < time) { - //sound (plPlayer, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM); - } else if (plPlayer.m_flAirFinished < time + 9) { - //sound (plPlayer, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM); - } - plPlayer.m_flAirFinished = time + 12; - plPlayer.dmg = 2; - } else if (plPlayer.m_flAirFinished < time) { - if (plPlayer.m_flPainFinished < time) { - plPlayer.dmg = plPlayer.dmg + 2; - if (plPlayer.dmg > 15) { - plPlayer.dmg = 10; - } - - Damage_Apply(plPlayer, world, plPlayer.dmg, DAMAGE_DROWNING, WEAPON_NONE); - plPlayer.m_flPainFinished = time + 1; - } - } -#endif - - if (!self.waterlevel){ - if (self.flags & FL_INWATER) { -#if 0 - //sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM); -#endif - self.flags &= ~FL_INWATER; - } - return; - } - -#if 0 - if (plPlayer.watertype == CONTENT_LAVA) { - if (plPlayer.m_flDamageTime < time) { - plPlayer.m_flDamageTime = time + 0.2; - Damage_Apply(plPlayer, world, 10*plPlayer.waterlevel, DAMAGE_BURN, WEAPON_NONE); - } - } else if (plPlayer.watertype == CONTENT_SLIME) { - if (plPlayer.m_flDamageTime < time) { - plPlayer.m_flDamageTime = time + 1; - Damage_Apply(plPlayer, world, 4*plPlayer.waterlevel, DAMAGE_ACID, WEAPON_NONE); - } - } -#endif - if (!(self.flags & FL_INWATER)) { -#if 0 - sound (self, CHAN_BODY, "player/land/slosh.wav", 1, ATTN_NORM); - plPlayer.m_flDamageTime = 0; -#endif - self.flags |= FL_INWATER; - } - - if (!(self.flags & FL_WATERJUMP)) { - self.velocity = self.velocity - 0.8 * self.waterlevel * input_timelength * self.velocity; - } -} /* spammed whenever we're near a ledge, getting out of a pool or something */ void @@ -734,7 +702,7 @@ PMove_Run(void) } /* establish which water elements we're dealing in */ - PMove_WaterMove(); + GamePMove_WaterMove(pl); /* we might need to apply extra-velocity to get out of water-volumes */ if (self.waterlevel >= 2) { diff --git a/src/shared/pmove.h b/src/shared/pmove.h index f1e350b2..4150ded1 100644 --- a/src/shared/pmove.h +++ b/src/shared/pmove.h @@ -26,7 +26,6 @@ void PMove_Init(void); int PMove_Contents(vector org); float PMove_Gravity(entity ent); void PMove_Categorize(void); -void PMove_WaterMove(void); void PMove_CheckWaterJump(void); int QPMove_IsStuck(entity eTarget, vector vOffset, vector vecMins, vector vecMaxs); void PMove_AccelToss(float move_time, float premove); diff --git a/src/shared/poke646/include.src b/src/shared/poke646/include.src index 56798da4..8d25c4c2 100644 --- a/src/shared/poke646/include.src +++ b/src/shared/poke646/include.src @@ -5,6 +5,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/valve/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/rewolf/include.src b/src/shared/rewolf/include.src index 59a21a92..2fc0f432 100644 --- a/src/shared/rewolf/include.src +++ b/src/shared/rewolf/include.src @@ -5,6 +5,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/valve/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/scihunt/include.src b/src/shared/scihunt/include.src index cdb276dc..b3bed42a 100644 --- a/src/shared/scihunt/include.src +++ b/src/shared/scihunt/include.src @@ -6,6 +6,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/scihunt/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/sound.c b/src/shared/sound.c index fd652357..7262a28e 100644 --- a/src/shared/sound.c +++ b/src/shared/sound.c @@ -315,14 +315,13 @@ Sound_Play(entity target, int chan, string shader) } if (g_sounds[sample].flags & SNDFL_STEP) { float s = vlen(target.velocity); - float m = target.maxspeed; if (target.flags & FL_CROUCHING) - m *= 2.0f; + s *= 2.0f; - if (s <= (m * 0.5f)) { + if (s < PMOVE_STEP_WALKSPEED) { return; - } else if (s < (m * 0.8f)) { + } else if (s < PMOVE_STEP_RUNSPEED) { volume = 0.35f; } else { volume = 0.75; diff --git a/src/shared/tfc/include.src b/src/shared/tfc/include.src index 2206d998..8145eb3e 100644 --- a/src/shared/tfc/include.src +++ b/src/shared/tfc/include.src @@ -5,6 +5,7 @@ ../../shared/valve/animations.h ../../shared/valve/animations.c ../../shared/valve/pmove.c +../../shared/valve/pmove_water.c ../../shared/valve/fx_blood.c ../../shared/valve/fx_breakmodel.c diff --git a/src/shared/valve/pmove_water.c b/src/shared/valve/pmove_water.c new file mode 100644 index 00000000..cec6cab0 --- /dev/null +++ b/src/shared/valve/pmove_water.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +void +GamePMove_WaterMove(player target) +{ + if (target.movetype == MOVETYPE_NOCLIP) { + return; + } + +#ifdef SERVER + if (target.health < 0) { + return; + } + + /* we've just exited water */ + if (target.waterlevel != 3) { + if (target.underwater_time < time) { + Sound_Play(target, CHAN_BODY, "player.gasplight"); + } else if (target.underwater_time < time + 9) { + Sound_Play(target, CHAN_BODY, "player.gaspheavy"); + } + target.underwater_time = time + 12; + } else if (target.underwater_time < time) { + /* we've been underwater... for too long. */ + if (target.pain_time < time) { + Damage_Apply(target, world, 5, DMG_DROWN, 0); + target.pain_time = time + 1; + } + } +#endif + + if (!target.waterlevel){ + if (target.flags & FL_INWATER) { +#ifdef SERVER + Sound_Play(target, CHAN_BODY, "player.waterexit"); +#endif + target.flags &= ~FL_INWATER; + } + return; + } + +#ifdef SERVER + if (target.watertype == CONTENT_LAVA) { + if (target.pain_time < time) { + target.pain_time = time + 0.2; + Damage_Apply(target, world, 10*target.waterlevel, DMG_BURN, 0); + } + } else if (target.watertype == CONTENT_SLIME) { + if (target.pain_time < time) { + target.pain_time = time + 1; + Damage_Apply(target, world, 4*target.waterlevel, DMG_ACID, 0); + } + } +#endif + + if (!(target.flags & FL_INWATER)) { +#ifdef SERVER + Sound_Play(target, CHAN_BODY, "player.waterenter"); + target.pain_time = 0; +#endif + target.flags |= FL_INWATER; + } +} +