GS-EntBase: Fix crash with vehicles by networking them separately
from CBaseEntity, which will assign the needed client-side input method for prediction
This commit is contained in:
parent
4952e7fbe0
commit
34505bcacf
4 changed files with 124 additions and 3 deletions
|
@ -941,6 +941,9 @@ CSQC_Ent_Update(float new)
|
||||||
}
|
}
|
||||||
me.ReceiveEntity(readfloat());
|
me.ReceiveEntity(readfloat());
|
||||||
break;
|
break;
|
||||||
|
case ENT_VEHICLE:
|
||||||
|
basevehicle_readentity(new);
|
||||||
|
break;
|
||||||
case ENT_PLAYER:
|
case ENT_PLAYER:
|
||||||
player pl = (player)self;
|
player pl = (player)self;
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,9 @@ class CBaseVehicle:CBaseTrigger
|
||||||
#ifdef CLIENT
|
#ifdef CLIENT
|
||||||
virtual void(void) PredictPreFrame;
|
virtual void(void) PredictPreFrame;
|
||||||
virtual void(void) PredictPostFrame;
|
virtual void(void) PredictPostFrame;
|
||||||
|
virtual void(float, float) ReadEntity;
|
||||||
|
#else
|
||||||
|
virtual float(entity, float) SendEntity;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
virtual void(void) PlayerUpdateFlags;
|
virtual void(void) PlayerUpdateFlags;
|
||||||
|
|
|
@ -20,6 +20,7 @@ enumflags
|
||||||
VHF_NOATTACK
|
VHF_NOATTACK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CLIENT
|
||||||
void
|
void
|
||||||
CBaseVehicle::PredictPreFrame(void)
|
CBaseVehicle::PredictPreFrame(void)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +37,106 @@ CBaseVehicle::PredictPostFrame(void)
|
||||||
ROLL_BACK(velocity);
|
ROLL_BACK(velocity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CBaseVehicle::ReadEntity(float fChanged, float new)
|
||||||
|
{
|
||||||
|
m_eDriver = findfloat(world, ::entnum, readentitynum());
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_ORIGIN) {
|
||||||
|
origin[0] = readcoord();
|
||||||
|
origin[1] = readcoord();
|
||||||
|
origin[2] = readcoord();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_ANGLES) {
|
||||||
|
angles[0] = readshort() / (32767 / 360);
|
||||||
|
angles[1] = readshort() / (32767 / 360);
|
||||||
|
angles[2] = readshort() / (32767 / 360);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_MODELINDEX) {
|
||||||
|
setmodelindex(this, readshort());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_SOLID) {
|
||||||
|
solid = readbyte();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_MOVETYPE) {
|
||||||
|
movetype = readbyte();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_SIZE) {
|
||||||
|
mins[0] = readcoord();
|
||||||
|
mins[1] = readcoord();
|
||||||
|
mins[2] = readcoord();
|
||||||
|
maxs[0] = readcoord();
|
||||||
|
maxs[1] = readcoord();
|
||||||
|
maxs[2] = readcoord();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_VELOCITY) {
|
||||||
|
velocity[0] = readfloat();
|
||||||
|
velocity[1] = readfloat();
|
||||||
|
velocity[2] = readfloat();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (new)
|
||||||
|
drawmask = MASK_ENGINE;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
float
|
||||||
|
CBaseVehicle::SendEntity(entity ePEnt, float fChanged)
|
||||||
|
{
|
||||||
|
WriteByte(MSG_ENTITY, ENT_VEHICLE);
|
||||||
|
WriteFloat(MSG_ENTITY, fChanged);
|
||||||
|
|
||||||
|
WriteEntity(MSG_ENTITY, m_eDriver);
|
||||||
|
|
||||||
|
/* really trying to get our moneys worth with 23 bits of mantissa */
|
||||||
|
if (fChanged & BASEFL_CHANGED_ORIGIN) {
|
||||||
|
WriteCoord(MSG_ENTITY, origin[0]);
|
||||||
|
WriteCoord(MSG_ENTITY, origin[1]);
|
||||||
|
WriteCoord(MSG_ENTITY, origin[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_ANGLES) {
|
||||||
|
WriteShort(MSG_ENTITY, angles[0] * 32767 / 360);
|
||||||
|
WriteShort(MSG_ENTITY, angles[1] * 32767 / 360);
|
||||||
|
WriteShort(MSG_ENTITY, angles[2] * 32767 / 360);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_MODELINDEX) {
|
||||||
|
WriteShort(MSG_ENTITY, modelindex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_SOLID) {
|
||||||
|
WriteByte(MSG_ENTITY, solid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_MOVETYPE) {
|
||||||
|
WriteByte(MSG_ENTITY, movetype);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_SIZE) {
|
||||||
|
WriteCoord(MSG_ENTITY, mins[0]);
|
||||||
|
WriteCoord(MSG_ENTITY, mins[1]);
|
||||||
|
WriteCoord(MSG_ENTITY, mins[2]);
|
||||||
|
WriteCoord(MSG_ENTITY, maxs[0]);
|
||||||
|
WriteCoord(MSG_ENTITY, maxs[1]);
|
||||||
|
WriteCoord(MSG_ENTITY, maxs[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fChanged & BASEFL_CHANGED_VELOCITY) {
|
||||||
|
WriteFloat(MSG_ENTITY, velocity[0]);
|
||||||
|
WriteFloat(MSG_ENTITY, velocity[1]);
|
||||||
|
WriteFloat(MSG_ENTITY, velocity[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
CBaseVehicle::PlayerInput(void)
|
CBaseVehicle::PlayerInput(void)
|
||||||
{
|
{
|
||||||
|
@ -83,14 +184,14 @@ CBaseVehicle::PlayerEnter(base_player pl)
|
||||||
pl.movetype = MOVETYPE_NOCLIP;
|
pl.movetype = MOVETYPE_NOCLIP;
|
||||||
m_eDriver = (entity)pl;
|
m_eDriver = (entity)pl;
|
||||||
pl.vehicle = this;
|
pl.vehicle = this;
|
||||||
pl.flags |= FL_INVEHICLE;
|
//pl.flags |= FL_INVEHICLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
CBaseVehicle::PlayerLeave(base_player pl)
|
CBaseVehicle::PlayerLeave(base_player pl)
|
||||||
{
|
{
|
||||||
pl.movetype = MOVETYPE_WALK;
|
pl.movetype = MOVETYPE_WALK;
|
||||||
pl.flags &= ~FL_INVEHICLE;
|
//pl.flags &= ~FL_INVEHICLE;
|
||||||
|
|
||||||
if (m_iVehicleFlags & VHF_FROZEN)
|
if (m_iVehicleFlags & VHF_FROZEN)
|
||||||
pl.flags &= ~FL_FROZEN;
|
pl.flags &= ~FL_FROZEN;
|
||||||
|
@ -107,3 +208,16 @@ CBaseVehicle::CBaseVehicle(void)
|
||||||
{
|
{
|
||||||
CBaseEntity::CBaseEntity();
|
CBaseEntity::CBaseEntity();
|
||||||
}
|
}
|
||||||
|
#ifdef CLIENT
|
||||||
|
void
|
||||||
|
basevehicle_readentity(float isnew)
|
||||||
|
{
|
||||||
|
CBaseVehicle veh = (CBaseVehicle)self;
|
||||||
|
float flags = readfloat();
|
||||||
|
|
||||||
|
if (isnew)
|
||||||
|
spawnfunc_CBaseVehicle();
|
||||||
|
|
||||||
|
veh.ReadEntity(flags, isnew);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -31,7 +31,8 @@ enum
|
||||||
ENT_DECAL,
|
ENT_DECAL,
|
||||||
ENT_OLDCAMERA,
|
ENT_OLDCAMERA,
|
||||||
ENT_MONITOR,
|
ENT_MONITOR,
|
||||||
ENT_SEPARATOR
|
ENT_VEHICLE,
|
||||||
|
ENT_SEPARATOR,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* entity update flags */
|
/* entity update flags */
|
||||||
|
|
Loading…
Reference in a new issue