Work towards making vehicles predicted, this is ongoing.

This commit is contained in:
Marco Cawthorne 2021-08-19 17:54:08 +02:00
parent 78de7b001a
commit d4fccac03f
22 changed files with 128 additions and 40 deletions

View File

@ -298,7 +298,15 @@ CSQC_UpdateView(float w, float h, float focus)
} else {
if (self.classname == "player") {
pl = (player)self;
if (pl.health) {
if (pl.flags & FL_INVEHICLE) {
CBaseVehicle veh = (CBaseVehicle)pl.vehicle;
pSeat->m_vecPredictedOrigin = veh.origin;
makevectors(view_angles);
vector vStart = [pSeat->m_vecPredictedOrigin[0], pSeat->m_vecPredictedOrigin[1], pSeat->m_vecPredictedOrigin[2] + 16] + (v_right * 4);
vector vEnd = vStart + (v_forward * -256) + [0,0,16] + (v_right * 4);
traceline(vStart, vEnd, FALSE, self);
setproperty(VF_ORIGIN, trace_endpos + (v_forward * 16));
} else if (pl.health) {
if (autocvar_cl_thirdperson == TRUE) {
makevectors(view_angles);
vector vStart = [pSeat->m_vecPredictedOrigin[0], pSeat->m_vecPredictedOrigin[1], pSeat->m_vecPredictedOrigin[2] + 16] + (v_right * 4);
@ -416,6 +424,13 @@ CSQC_UpdateView(float w, float h, float focus)
}
}
#if 1
if (pl.flags & FL_INVEHICLE) {
CBaseVehicle veh = (CBaseVehicle)pl.vehicle;
PointMessage_StringAtPos(veh.origin, sprintf("Speed: %d", vlen(veh.velocity)));
}
#endif
if (self.classname == "player")
Predict_PlayerPostFrame((player)self);
else if (self.classname == "spectator")

View File

@ -78,6 +78,12 @@ Predict_PlayerPreFrame(player pl)
* information. */
pl.PredictPreFrame();
if (pl.flags & FL_INVEHICLE)
if (pl.vehicle) {
CBaseVehicle veh = (CBaseVehicle)pl.vehicle;
veh.PredictPreFrame();
}
/* run physics code for all the input frames which we've not heard back
* from yet. This continues on in Player_ReceiveEntity! */
for (int i = pl.sequence + 1; i <= clientcommandframe; i++) {
@ -118,6 +124,12 @@ Predict_PlayerPostFrame(player pl)
/* give the game/mod a chance to roll back its values too */
pl.PredictPostFrame();
if (pl.flags & FL_INVEHICLE)
if (pl.vehicle) {
CBaseVehicle veh = (CBaseVehicle)pl.vehicle;
veh.PredictPostFrame();
}
/* update bounds */
setorigin(pl, pl.origin);
}

View File

@ -9,6 +9,7 @@ materials.h
client/defs.h
client/basefx.qc
shared/baseentity.qc
shared/basevehicle.qc
client/env_cubemap.qc
client/env_glow.qc
client/env_sun.qc

View File

@ -15,6 +15,7 @@
*/
#include "../shared/baseentity.h"
#include "../shared/basevehicle.h"
vector g_vecSunDir;

View File

@ -111,3 +111,17 @@ PointMessage_Draw(void)
}
}
}
void
PointMessage_StringAtPos(vector org, string message)
{
vector vecPlayer;
int s = (float)getproperty(VF_ACTIVESEAT);
pSeat = &g_seats[s];
vecPlayer = pSeat->m_vecPredictedOrigin;
drawfont = FONT_CON;
vector vTemp = project(org) - [(stringwidth(message, FALSE,[12,12]) / 2), 0];
drawstring(vTemp, message, [12,12], [1,1,1], 1.0f, 0);
}

View File

@ -12,7 +12,8 @@ server/basetrigger.qc
server/basemonster.qc
server/basenpc.qc
server/basephysics.qc
server/basevehicle.qc
shared/basevehicle.h
shared/basevehicle.qc
server/info_null.qc
server/info_notnull.qc
server/info_intermission.qc
@ -46,7 +47,6 @@ server/func_guntarget.qc
server/func_tracktrain.qc
server/func_tracktraincontrols.qc
server/func_tank.qc
server/func_tankmortar.qc
server/func_tankcontrols.qc
server/func_pushable.qc
server/func_wall_toggle.qc

View File

@ -348,7 +348,6 @@ func_vehicle::customphysics(void)
angles[0] = bound(-45, angles[0], 45);
angles[2] = bound(-45, angles[2], 45);
velocity[0] = bound(-1000, velocity[0], 1000);
velocity[1] = bound(-1000, velocity[1], 1000);
velocity[2] = bound(-1000, velocity[2], 1000);

View File

@ -12,6 +12,7 @@ shared/func_monitor.qc
shared/func_illusionary.qc
shared/func_ladder.qc
shared/func_wall.qc
shared/func_tankmortar.qc
shared/trigger_camera.qc
shared/trigger_gravity.qc
shared/info_particle_system.qc

View File

@ -108,3 +108,5 @@ class CBaseEntity
#endif
#endif
};
class CBaseTrigger:CBaseEntity {};

View File

@ -0,0 +1,29 @@
.int m_iVehNum;
class CBaseVehicle:CBaseTrigger
{
int m_iVehicleFlags;
int m_iMoveButtons;
vector m_vecMoveValues;
entity m_eDriver;
void(void) CBaseVehicle;
vector m_vecPlayerPos;
vector angles_net;
vector origin_net;
vector velocity_net;
#ifdef CLIENT
virtual void(void) PredictPreFrame;
virtual void(void) PredictPostFrame;
#endif
virtual void(void) PlayerUpdateFlags;
virtual void(void) PlayerAlign;
virtual void(base_player) PlayerEnter;
virtual void(base_player) PlayerLeave;
virtual void() PlayerInput;
};

View File

@ -20,21 +20,21 @@ enumflags
VHF_NOATTACK
};
class CBaseVehicle:CBaseTrigger
void
CBaseVehicle::PredictPreFrame(void)
{
int m_iVehicleFlags;
SAVE_STATE(angles);
SAVE_STATE(origin);
SAVE_STATE(velocity);
}
entity m_eDriver;
void(void) CBaseVehicle;
vector m_vecPlayerPos;
virtual void(void) PlayerUpdateFlags;
virtual void(void) PlayerAlign;
virtual void(base_player) PlayerEnter;
virtual void(base_player) PlayerLeave;
virtual void() PlayerInput;
};
void
CBaseVehicle::PredictPostFrame(void)
{
ROLL_BACK(angles);
ROLL_BACK(origin);
ROLL_BACK(velocity);
}
void
CBaseVehicle::PlayerInput(void)
@ -83,12 +83,14 @@ CBaseVehicle::PlayerEnter(base_player pl)
pl.movetype = MOVETYPE_NOCLIP;
m_eDriver = (entity)pl;
pl.vehicle = this;
pl.flags |= FL_INVEHICLE;
}
void
CBaseVehicle::PlayerLeave(base_player pl)
{
pl.movetype = MOVETYPE_WALK;
pl.flags &= ~FL_INVEHICLE;
if (m_iVehicleFlags & VHF_FROZEN)
pl.flags &= ~FL_FROZEN;

View File

@ -50,6 +50,7 @@ some random sprites needs to be treated additive.
This entity was introduced in Half-Life (1998).
*/
#ifdef SERVER
/* TODO: Implement these */
enumflags
{
@ -65,20 +66,20 @@ class func_tankmortar:CBaseVehicle
{
/* attributes */
float m_flYawRate;
float m_flYawRange; /* TODO */
float m_flPitchRate;
float m_flPitchRange; /* TODO */
vector m_vecTipPos;
float m_flFireRate;
int m_iDamage;
vector m_vecSpread; /* TODO: Needs checking */
string m_strSpriteSmoke;
string m_strSpriteFlash;
float m_flSpriteScale;
vector m_vecSpread; /* TODO: Needs checking */
string m_strSndRotate; /* TODO */
float m_flPersistance; /* TODO */
float m_flMinRange; /* TODO */
float m_flMaxRange; /* TODO */
float m_flYawRange; /* TODO */
float m_flPitchRange; /* TODO */
float m_flFireTime;
void(void) func_tankmortar;
@ -277,3 +278,4 @@ func_tankmortar::func_tankmortar(void)
if (m_strSpriteSmoke)
precache_model(m_strSpriteSmoke);
}
#endif

View File

@ -67,14 +67,6 @@ enumflags
DLIGHTFL_CHANGED_PATTERN
};
#ifdef CLIENT
class CBaseTrigger:CBaseEntity
{
};
#endif
class light_dynamic:CBaseTrigger
{
vector m_vecLight;

View File

@ -23,7 +23,6 @@
#include "spawn.h"
#include "weapons.h"
#include "plugins.h"
#include "vehicles.h"
#include "traceattack.h"
#include "footsteps.h"

View File

@ -13,7 +13,6 @@ traceattack.qc
footsteps.qc
vote.qc
weapons.qc
vehicles.qc
modelevent.qc
mapcycle.qc
hlmaterials.qc

View File

@ -28,6 +28,7 @@
#include "memory.h"
#include "spectator.h"
#include "platform.h"
#include "vehicles.h"
#define BSPVER_PREREL 28
#define BSPVER_Q1 29

View File

@ -6,4 +6,5 @@ sound.qc
math.qc
player.qc
player_pmove.qc
vehicles.qc
#endlist

View File

@ -17,6 +17,7 @@
#define PREDICTED_INT(x) int x; int x ##_net
#define PREDICTED_FLOAT(x) float x; float x ##_net
#define PREDICTED_VECTOR(x) vector x; vector x ##_net
#define PREDICTED_ENT(x) entity x; entity x ##_net
#define PREDICTED_INT_N(x) int x ##_net
#define PREDICTED_FLOAT_N(x) float x ##_net
@ -62,6 +63,9 @@ base_player
PREDICTED_INT(g_items);
PREDICTED_FLOAT(activeweapon);
/* vehicle info */
PREDICTED_ENT(vehicle);
/* these are NOT networked */
int a_ammo1;
int a_ammo2;
@ -70,9 +74,6 @@ base_player
/* any mods that use hooks */
entity hook;
/* vehicle info */
entity vehicle;
void(void) base_player;
virtual void(float) Physics_Fall;

View File

@ -89,6 +89,7 @@ base_player::ReceiveEntity(float new, float fl)
punchangle[0] = readfloat();
punchangle[1] = readfloat();
punchangle[2] = readfloat();
vehicle = findfloat(world, ::entnum, readentitynum());
}
/*
@ -126,6 +127,7 @@ base_player::PredictPreFrame(void)
SAVE_STATE(w_attack_next);
SAVE_STATE(w_idle_next);
SAVE_STATE(punchangle);
SAVE_STATE(vehicle);
}
/*
@ -164,6 +166,7 @@ base_player::PredictPostFrame(void)
ROLL_BACK(w_attack_next);
ROLL_BACK(w_idle_next);
ROLL_BACK(punchangle);
ROLL_BACK(vehicle);
}
#else
/*
@ -259,6 +262,7 @@ base_player::EvaluateEntity(void)
SAVE_STATE(w_attack_next);
SAVE_STATE(w_idle_next);
SAVE_STATE(punchangle);
SAVE_STATE(vehicle);
}
/*
@ -337,6 +341,11 @@ base_player::SendEntity(entity ePEnt, float fChanged)
WriteFloat(MSG_ENTITY, punchangle[1]);
WriteFloat(MSG_ENTITY, punchangle[2]);
if (vehicle)
WriteEntity(MSG_ENTITY, vehicle);
else
WriteEntity(MSG_ENTITY, __NULL__);
return (1);
}
#endif
@ -344,4 +353,5 @@ base_player::SendEntity(entity ePEnt, float fChanged)
void
base_player::base_player(void)
{
vehicle = __NULL__;
}

View File

@ -1,4 +1,6 @@
vector saved_input_movevalues;
int saved_input_buttons;
void
base_player::Physics_Fall(float flDownforce)
@ -262,9 +264,7 @@ base_player::Physics_InputPostMove(void)
Animation_PlayerUpdate((player)this);
/* allow vehicles to prevent weapon logic from happening */
#ifdef SERVER
Vehicle_Input();
#endif
Vehicle_Input(this);
/* weapon/item logic of what the player controls */
Game_Input();
@ -276,6 +276,9 @@ base_player::Physics_Run(void)
{
float flFallVel = (flags & FL_ONGROUND) ? 0 : -velocity[2];
saved_input_movevalues = input_movevalues;
saved_input_buttons = input_buttons;
/* maxspeed changes when crouching, TODO: make this game-specific */
maxspeed = Physics_MaxSpeed();
@ -316,6 +319,8 @@ base_player::Physics_Run(void)
Physics_Fall(flFallVel);
}
input_movevalues = saved_input_movevalues;
input_buttons = saved_input_buttons;
Physics_InputPostMove();
angles[0] = Math_FixDelta(angles[0]);

View File

@ -14,4 +14,4 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
void Vehicle_Input(void);
void Vehicle_Input(base_player);

View File

@ -15,12 +15,14 @@
*/
void
Vehicle_Input(void)
Vehicle_Input(base_player bp)
{
player pl = (player)self;
player pl = (player)bp;
if (pl.vehicle) {
CBaseVehicle veh = (CBaseVehicle)pl.vehicle;
veh.PlayerInput();
if (veh.PlayerInput)
veh.PlayerInput();
}
};