Work towards making vehicles predicted, this is ongoing.
This commit is contained in:
parent
78de7b001a
commit
d4fccac03f
22 changed files with 128 additions and 40 deletions
|
@ -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")
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#include "../shared/baseentity.h"
|
||||
#include "../shared/basevehicle.h"
|
||||
|
||||
vector g_vecSunDir;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -108,3 +108,5 @@ class CBaseEntity
|
|||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
class CBaseTrigger:CBaseEntity {};
|
||||
|
|
29
src/gs-entbase/shared/basevehicle.h
Normal file
29
src/gs-entbase/shared/basevehicle.h
Normal 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;
|
||||
};
|
|
@ -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;
|
|
@ -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
|
|
@ -67,14 +67,6 @@ enumflags
|
|||
DLIGHTFL_CHANGED_PATTERN
|
||||
};
|
||||
|
||||
#ifdef CLIENT
|
||||
class CBaseTrigger:CBaseEntity
|
||||
{
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
class light_dynamic:CBaseTrigger
|
||||
{
|
||||
vector m_vecLight;
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "spawn.h"
|
||||
#include "weapons.h"
|
||||
#include "plugins.h"
|
||||
#include "vehicles.h"
|
||||
#include "traceattack.h"
|
||||
#include "footsteps.h"
|
||||
|
||||
|
|
|
@ -13,7 +13,6 @@ traceattack.qc
|
|||
footsteps.qc
|
||||
vote.qc
|
||||
weapons.qc
|
||||
vehicles.qc
|
||||
modelevent.qc
|
||||
mapcycle.qc
|
||||
hlmaterials.qc
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "memory.h"
|
||||
#include "spectator.h"
|
||||
#include "platform.h"
|
||||
#include "vehicles.h"
|
||||
|
||||
#define BSPVER_PREREL 28
|
||||
#define BSPVER_Q1 29
|
||||
|
|
|
@ -6,4 +6,5 @@ sound.qc
|
|||
math.qc
|
||||
player.qc
|
||||
player_pmove.qc
|
||||
vehicles.qc
|
||||
#endlist
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__;
|
||||
}
|
||||
|
|
|
@ -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]);
|
||||
|
|
|
@ -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);
|
|
@ -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();
|
||||
}
|
||||
};
|
Loading…
Reference in a new issue