PMove: Added macros to let mods override a bunch of physics variables so

they keep their fingers out of pmove.c
This commit is contained in:
Marco Cawthorne 2020-12-08 12:00:10 +01:00
parent 8fc5ac9b17
commit c130ab2c38
16 changed files with 180 additions and 98 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -78,5 +78,9 @@ class base_player
int voted;
int step;
float step_time;
float underwater_time;
float underwater_dmg;
float pain_time;
#endif
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,78 @@
/*
* Copyright (c) 2016-2020 Marco Hladik <marco@icculus.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
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;
}
}