Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
731 lines
27 KiB
C++
731 lines
27 KiB
C++
//===========================================================================//
|
|
// File: NetVehicleMovement.cpp
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 01/06/2000 JSE Inital coding
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1998, Microsoft Corp. //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
|
|
#include "MW4Headers.hpp"
|
|
|
|
#include "NetVehicleMovement.hpp"
|
|
#include "MWEntityManager.hpp"
|
|
|
|
#include "Airplane.hpp"
|
|
#include "Boat.hpp"
|
|
#include "Dropship.hpp"
|
|
#include "Helicopter.hpp"
|
|
#include "Hovercraft.hpp"
|
|
#include "Tank.hpp"
|
|
#include "Truck.hpp"
|
|
#include "Turret.hpp"
|
|
#include "Torso.hpp"
|
|
|
|
#include <Adept\Map.hpp>
|
|
#include <Adept\NetStatCollector.hpp>
|
|
|
|
//====================================================================================================================================================
|
|
//
|
|
|
|
void AirMovementUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
Vehicle *vehicle = Cast_Object(Vehicle*, entity);
|
|
const Vehicle::GameModel *model = vehicle->GetGameModel();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
int local_vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
//bug fix #4820
|
|
if (vehicle_on && !local_vehicle_on)
|
|
{
|
|
vehicle->TurnOn();
|
|
vehicle->executionState->RequestState(Airplane::ExecutionStateEngine::FlyingMotionState);
|
|
}
|
|
if (!vehicle_on && local_vehicle_on)
|
|
{
|
|
vehicle->TurnOff();
|
|
}
|
|
|
|
if (vehicle_on)
|
|
{
|
|
|
|
YawPitchRoll vehicle_rotation_local_to_world(YawPitchRoll::Identity);
|
|
Point3D vehicle_translation_local_to_world(Point3D::Identity);
|
|
|
|
Scalar min_z, max_z, min_x, max_x;
|
|
Map::GetInstance()->GetMapExtents(&min_z, &max_z, &min_x, &max_x);
|
|
|
|
Point3D current_speed = Point3D::Identity;
|
|
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_rotation_local_to_world.yaw.angle, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_rotation_local_to_world.pitch.angle, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,PitchPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_rotation_local_to_world.roll.angle, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,RollPositionUpdateEntryID));
|
|
|
|
memory_stream->ReadBitsToScaledFloat(current_speed.z, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->speedDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->yawDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->pitchDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,PitchDemandUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->rollDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,RollDemandUpdateEntryID));
|
|
|
|
|
|
vehicle->SetNetworkCorretionPosition(vehicle_translation_local_to_world, vehicle_rotation_local_to_world, current_speed, current_speed.z, packet_latency, rate);
|
|
vehicle->currentSpeedMPS = current_speed.z;
|
|
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void AirMovementUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
if (vehicle_on)
|
|
{
|
|
int throw_away;
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,PitchPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,RollPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,PitchDemandUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,RollDemandUpdateEntryID));
|
|
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int AirMovementUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
|
|
{
|
|
|
|
int current_bit = 0;
|
|
|
|
current_bit += 1;
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,PitchPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,RollPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,PitchDemandUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,RollDemandUpdateEntryID);
|
|
|
|
return current_bit;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
bool AirMovementUpdate::MaintainActiveFlagFunction(Entity *entity,Point3D cull_location)
|
|
{
|
|
Point3D entity_location;
|
|
entity_location = entity->GetLocalToWorld();
|
|
|
|
Point3D distance;
|
|
distance.Subtract(cull_location, entity_location);
|
|
|
|
// if the mech is within 1200 meters and is on than it is active
|
|
if (distance.GetLengthSquared() < 1440000.0f)
|
|
{
|
|
|
|
if (entity->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)
|
|
{
|
|
return true;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return false;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void AirMovementUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
Vehicle *vehicle = Cast_Object(Vehicle*, entity);
|
|
const Vehicle::GameModel *model = vehicle->GetGameModel();
|
|
Check_Object(model);
|
|
|
|
int vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
|
|
if (vehicle_on)
|
|
{
|
|
memory_stream->WriteBit(true);
|
|
|
|
Point3D vehicle_translation_local_to_world;
|
|
YawPitchRoll vehicle_rotation_local_to_world;
|
|
|
|
vehicle->GetNetworkPosition(vehicle_translation_local_to_world, vehicle_rotation_local_to_world);
|
|
|
|
|
|
Scalar min_z, max_z, min_x, max_x;
|
|
Map::GetInstance()->GetMapExtents(&min_z, &max_z, &min_x, &max_x);
|
|
|
|
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_rotation_local_to_world.yaw, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_rotation_local_to_world.pitch, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,PitchPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_rotation_local_to_world.roll, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,RollPositionUpdateEntryID));
|
|
|
|
memory_stream->WriteScaledFloatToBits(vehicle->currentSpeedMPS, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->speedDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->yawDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->pitchDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,PitchDemandUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->rollDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,RollDemandUpdateEntryID));
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
memory_stream->WriteBit(false);
|
|
}
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection, memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
//====================================================================================================================================================
|
|
//
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void GroundMovementUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
|
|
Vehicle *vehicle = Cast_Object(Vehicle*, entity);
|
|
const Vehicle::GameModel *model = vehicle->GetGameModel();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
int local_vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
if (vehicle_on && !local_vehicle_on)
|
|
{
|
|
vehicle->TurnOn();
|
|
}
|
|
if (!vehicle_on && local_vehicle_on)
|
|
{
|
|
vehicle->TurnOff();
|
|
}
|
|
|
|
if (vehicle_on)
|
|
{
|
|
|
|
YawPitchRoll vehicle_rotation_local_to_world(YawPitchRoll::Identity);
|
|
Point3D vehicle_translation_local_to_world(Point3D::Identity);
|
|
|
|
Scalar min_z, max_z, min_x, max_x;
|
|
Map::GetInstance()->GetMapExtents(&min_z, &max_z, &min_x, &max_x);
|
|
|
|
|
|
|
|
Point3D current_speed = Point3D::Identity;
|
|
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle_rotation_local_to_world.yaw.angle, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(current_speed.z, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->speedDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(vehicle->yawDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
|
|
|
|
vehicle->SetNetworkCorretionPosition(vehicle_translation_local_to_world, vehicle_rotation_local_to_world, current_speed, current_speed.z, packet_latency, rate);
|
|
|
|
vehicle->currentSpeedMPS = current_speed.z;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void GroundMovementUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
if (vehicle_on)
|
|
{
|
|
int throw_away;
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
|
|
}
|
|
else
|
|
{
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int GroundMovementUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
|
|
{
|
|
|
|
int current_bit = 0;
|
|
|
|
current_bit += 1;
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID);
|
|
|
|
return current_bit;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
bool GroundMovementUpdate::MaintainActiveFlagFunction(Entity *entity,Point3D cull_location)
|
|
{
|
|
Point3D entity_location;
|
|
entity_location = entity->GetLocalToWorld();
|
|
|
|
Point3D distance;
|
|
distance.Subtract(cull_location, entity_location);
|
|
|
|
// if the mech is within 1200 meters and is on than it is active
|
|
if (distance.GetLengthSquared() < 1440000.0f)
|
|
{
|
|
|
|
if (entity->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)
|
|
{
|
|
return true;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return false;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void GroundMovementUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
|
|
Vehicle *vehicle = Cast_Object(Vehicle*, entity);
|
|
const Vehicle::GameModel *model = vehicle->GetGameModel();
|
|
Check_Object(model);
|
|
|
|
int vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
|
|
if (vehicle_on)
|
|
{
|
|
memory_stream->WriteBit(true);
|
|
|
|
Point3D vehicle_translation_local_to_world;
|
|
YawPitchRoll vehicle_rotation_local_to_world;
|
|
|
|
vehicle->GetNetworkPosition(vehicle_translation_local_to_world, vehicle_rotation_local_to_world);
|
|
|
|
|
|
Scalar min_z, max_z, min_x, max_x;
|
|
Map::GetInstance()->GetMapExtents(&min_z, &max_z, &min_x, &max_x);
|
|
|
|
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle_rotation_local_to_world.yaw, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,YawPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->currentSpeedMPS, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->speedDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(vehicle->yawDemand, -1.0f, 1.0f, BitDepthManager::BitDepth(UpdateType,YawDemandUpdateEntryID));
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
memory_stream->WriteBit(false);
|
|
}
|
|
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection, memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
//====================================================================================================================================================
|
|
//
|
|
|
|
void TurretMovementUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
|
|
Turret *vehicle = Cast_Object(Turret*, entity);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
int local_vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
if (vehicle_on && !local_vehicle_on)
|
|
{
|
|
vehicle->TurnOn();
|
|
}
|
|
if (!vehicle_on && local_vehicle_on)
|
|
{
|
|
vehicle->TurnOff();
|
|
}
|
|
|
|
|
|
if (vehicle_on)
|
|
{
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void TurretMovementUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
if (vehicle_on)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int TurretMovementUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
|
|
{
|
|
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
bool TurretMovementUpdate::MaintainActiveFlagFunction(Entity *entity,Point3D cull_location)
|
|
{
|
|
Point3D entity_location;
|
|
entity_location = entity->GetLocalToWorld();
|
|
|
|
Point3D distance;
|
|
distance.Subtract(cull_location, entity_location);
|
|
|
|
// if the mech is within 1200 meters and is on than it is active
|
|
if (distance.GetLengthSquared() < 1440000.0f)
|
|
{
|
|
|
|
if (entity->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)
|
|
{
|
|
return true;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return false;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void TurretMovementUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
MWObject *vehicle = Cast_Object(MWObject*, entity);
|
|
|
|
|
|
|
|
|
|
int vehicle_on = (vehicle->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
|
|
if (vehicle_on)
|
|
{
|
|
memory_stream->WriteBit(true);
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
memory_stream->WriteBit(false);
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection, memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
//====================================================================================================================================================
|
|
//
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void TorsoMovementUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
Torso *torso = Cast_Object(Torso*, entity);
|
|
Check_Object(torso);
|
|
const Torso::GameModel *torso_model;
|
|
torso_model = torso->GetGameModel();
|
|
Check_Object(torso_model);
|
|
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
|
|
if (vehicle_on)
|
|
{
|
|
|
|
Scalar pitch_value;
|
|
Scalar yaw_value;
|
|
|
|
memory_stream->ReadBitsToScaledFloat(pitch_value, -torso_model->pitchRadius, torso_model->pitchRadius,BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(yaw_value, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,YawTorsoPositionUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(torso->pitchDemand, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,PitchTorsoDemandUpdateEntryID));
|
|
memory_stream->ReadBitsToScaledFloat(torso->yawDemand, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,YawTorsoDemandUpdateEntryID));
|
|
|
|
torso->oldYawValue = torso->yawValue;
|
|
torso->oldPitchValue = torso->pitchValue;
|
|
torso->pitchValueCorrection = pitch_value;
|
|
torso->yawValueCorrection = yaw_value;
|
|
torso->correctionTime = rate;
|
|
torso->correctionCurTime = 0.0f;
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void TorsoMovementUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
bool vehicle_on;
|
|
memory_stream->ReadBit(vehicle_on);
|
|
|
|
if (vehicle_on)
|
|
{
|
|
int throw_away;
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,PitchTorsoDemandUpdateEntryID));
|
|
memory_stream->ReadBits(&throw_away, BitDepthManager::BitDepth(UpdateType,YawTorsoDemandUpdateEntryID));
|
|
}
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
int TorsoMovementUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
|
|
{
|
|
|
|
int current_bit = 0;
|
|
|
|
current_bit += 1;
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,PitchTorsoDemandUpdateEntryID);
|
|
current_bit += BitDepthManager::BitDepth(UpdateType,YawTorsoDemandUpdateEntryID);
|
|
|
|
|
|
return current_bit;
|
|
}
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
void TorsoMovementUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
|
|
{
|
|
Check_Object(entity);
|
|
Check_Object(memory_stream);
|
|
|
|
int current_bit = memory_stream->GetCurrentBitCount();
|
|
|
|
Torso *torso = Cast_Object(Torso*, entity);
|
|
Check_Object(torso);
|
|
const Torso::GameModel *torso_model;
|
|
torso_model = torso->GetGameModel();
|
|
Check_Object(torso_model);
|
|
|
|
int vehicle_on = (torso->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)?1:0;
|
|
|
|
if (vehicle_on)
|
|
{
|
|
memory_stream->WriteBit(true);
|
|
|
|
memory_stream->WriteScaledFloatToBits(torso->pitchValue, -torso_model->pitchRadius, torso_model->pitchRadius, BitDepthManager::BitDepth(UpdateType,PitchTorsoPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(torso->yawValue, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,YawTorsoPositionUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(torso->pitchDemand, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,PitchTorsoDemandUpdateEntryID));
|
|
memory_stream->WriteScaledFloatToBits(torso->yawDemand, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,YawTorsoDemandUpdateEntryID));
|
|
|
|
}
|
|
else
|
|
{
|
|
memory_stream->WriteBit(false);
|
|
}
|
|
|
|
|
|
Network::GetInstance()->netStatCollector[Network::VehicleBitSizeStat].AddToStatistic(connection, memory_stream->GetCurrentBitCount() - current_bit);
|
|
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
|
|
bool TorsoMovementUpdate::MaintainActiveFlagFunction(Entity *entity,Point3D cull_location)
|
|
{
|
|
Torso *torso = Cast_Object(Torso*, entity);
|
|
Check_Object(torso);
|
|
|
|
Point3D entity_location;
|
|
entity_location = torso->GetParentEntity()->GetLocalToWorld();
|
|
|
|
Point3D distance;
|
|
distance.Subtract(cull_location, entity_location);
|
|
|
|
// if the mech is within 1200 meters and is on than it is active
|
|
if (distance.GetLengthSquared() < 1440000.0f)
|
|
{
|
|
|
|
if (entity->executionState->GetState() != Entity::ExecutionStateEngine::NeverExecuteState)
|
|
{
|
|
return true;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return false;
|
|
}
|