Files
firestorm/Gameleap/code/mw4/Code/MW4/NetMovement.cpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
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.
2026-06-24 21:28:16 -05:00

753 lines
27 KiB
C++

//===========================================================================//
// File: NetMovement.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 "NetMovement.hpp"
#include "MWEntityManager.hpp"
#include "VehicleInterface.hpp"
#include "MWPlayer.hpp"
#include "Torso.hpp"
#include <Adept\Map.hpp>
#include "Adept\NetStatCollector.hpp"
#include "Sensor.hpp"
//##########################################################################
//########################### MechPositionUpdate
//##########################################################################
void MechWarrior4::NetMovementSecurityCheckStart()
{
_asm
{
nop
}
}
void MechPositionUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
{
Check_Object(memory_stream);
Check_Object(entity);
int current_bit = memory_stream->GetCurrentBitCount();
Mech *mech = Cast_Object(Mech*, entity);
const Mech::GameModel *model = mech->GetGameModel();
Check_Object(model);
Torso* torso = mech->GetTorso();
Check_Object(torso);
const Torso::GameModel *torso_model;
torso_model = torso->GetGameModel();
Check_Object(torso_model);
YawPitchRoll mech_rotation_local_to_world(YawPitchRoll::Identity);
Point3D mech_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);
int master_mech_on = 0; // jcem: critical error - should clear before ReadBits(...)...
memory_stream->ReadBits( &master_mech_on, 1);
int local_mech_on = (mech->executionState->GetState() != Mech::ExecutionStateEngine::NeverExecuteState)?1:0;
if (master_mech_on && !local_mech_on)
{
mech->TurnOn();
}
if (!master_mech_on && local_mech_on)
{
mech->TurnOff();
}
Scalar speed_demand;
Scalar yaw_deamand;
memory_stream->ReadBitsToScaledFloat(yaw_deamand, -1.01f, 1.01f, BitDepthManager::BitDepth(UpdateType,RotationDemandUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(speed_demand, -1.01f, 1.01f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
if (Stuff::Close_Enough(yaw_deamand ,0.0f,0.05f))
{
yaw_deamand = 0.0f;
}
if (Stuff::Close_Enough(speed_demand ,0.0f,0.05f))
{
speed_demand = 0.0f;
}
mech->yawDemand = yaw_deamand;
mech->speedDemand = speed_demand;
#if 0
memory_stream->ReadBitsToScaledFloat(torso->pitchDemand, -1.0, 1.0, BitDepthManager::BitDepth(UpdateType,TorsoPichDemandUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(torso->yawDemand, -1.0, 1.0, BitDepthManager::BitDepth(UpdateType,TorsoYawDemandUpdateEntryID));
if (Stuff::Close_Enough(torso->pitchDemand ,0.0f,0.05f))
{
torso->pitchDemand = 0.0f;
}
if (Stuff::Close_Enough(torso->yawDemand ,0.0f,0.05f))
{
torso->yawDemand = 0.0f;
}
#endif
int mech_state = 0; // jcem: critical error - should clear before ReadBits(...)...
memory_stream->ReadBits( &mech_state, 2);
switch (mech_state)
{
case DrivingState:
{
if (master_mech_on)
{
if (mech->executionState->GetState() != Mech::ExecutionStateEngine::DrivingMotionState)
{
mech->executionState->RequestState(Mech::ExecutionStateEngine::DrivingMotionState);
}
if (!mech->animStateEngine->IsTransitioning())
{
switch (mech->animStateEngine->GetState())
{
case MechAnimationStateEngine::FallForwardState:
case MechAnimationStateEngine::FallBackwardState:
case MechAnimationStateEngine::FallLeftState:
case MechAnimationStateEngine::FallRightState:
mech->animStateEngine->RequestState(MechAnimationStateEngine::StandState, Mech::NoBlend);
break;
}
}
}
Point3D current_speed = Point3D::Identity;
mech->queFallState = Mech::NoFallMode;
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_rotation_local_to_world.yaw.angle, -Stuff::Pi, Stuff::Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(current_speed.z, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
bool shutdown = 0;
bool crouch = 0;
memory_stream->ReadBit(shutdown);
memory_stream->ReadBit(crouch);
mech->ShutDownRequest(shutdown);
if (mech->IsCrouched() != crouch)
mech->CrouchRequest();
mech->SetNetworkCorretionPosition(mech_translation_local_to_world, mech_rotation_local_to_world, current_speed, speed_demand, packet_latency, rate);
mech->currentSpeedMPS = current_speed.z;
//SPEW(("jerryeds", "<%f:%f:%f>", mech_translation_local_to_world.x, mech_translation_local_to_world.y, mech_translation_local_to_world.z));
}
break;
case JumpingState:
{
if (master_mech_on && mech->executionState->GetState() != Mech::ExecutionStateEngine::FlyingMotionState)
{
mech->executionState->RequestState(Mech::ExecutionStateEngine::FlyingMotionState);
}
mech->queFallState = Mech::NoFallMode;
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_rotation_local_to_world.yaw.angle, -Stuff::Pi, Stuff::Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech->localSpaceVelocity.linearMotion.x, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentXVelocityEntryID));
memory_stream->ReadBitsToScaledFloat(mech->localSpaceVelocity.linearMotion.y, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentYVelocityEntryID));
memory_stream->ReadBitsToScaledFloat(mech->localSpaceVelocity.linearMotion.z, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentZVelocityEntryID));
mech->worldSpaceVelocity.linearMotion.Multiply(
mech->localSpaceVelocity.linearMotion,
mech->GetLocalToWorld()
);
Point3D speed(mech->localSpaceVelocity.linearMotion.x, mech->localSpaceVelocity.linearMotion.y, mech->localSpaceVelocity.linearMotion.z);
mech->SetNetworkCorretionPosition(mech_translation_local_to_world, mech_rotation_local_to_world, speed, mech->localSpaceVelocity.linearMotion.z, packet_latency, rate);
}
break;
case FallingState:
{
Point3D current_speed = Point3D::Identity;
mech->queFallState = 0; // may not be error but..., jcem: critical error - should clear before ReadBits(...)...
memory_stream->ReadBits(&mech->queFallState, 3);
if (master_mech_on && mech->executionState->GetState() != Mech::ExecutionStateEngine::FallingMotionState && mech->blockFallTimer > 2.0f)
{
switch(mech->queFallState)
{
case Mech::FallBackMode:
mech->animStateEngine->RequestState(MechAnimationStateEngine::FallBackwardState);
break;
case Mech::FallRightMode:
mech->animStateEngine->RequestState(MechAnimationStateEngine::FallRightState);
break;
case Mech::FallLeftMode:
mech->animStateEngine->RequestState(MechAnimationStateEngine::FallLeftState);
break;
case Mech::FallForwardMode:
mech->animStateEngine->RequestState(MechAnimationStateEngine::FallForwardState);
break;
}
mech->StartFall();
}
mech->fallDirection = mech->queFallState;
mech->queFallState = Mech::NoFallMode;
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(mech_rotation_local_to_world.yaw.angle, -Stuff::Pi, Stuff::Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(current_speed.z, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
mech->SetNetworkCorretionPosition(mech_translation_local_to_world, mech_rotation_local_to_world, current_speed, 0.0f, packet_latency,rate);
mech->currentSpeedMPS = current_speed.z;
}
break;
}
Scalar pitch_value;
Scalar yaw_value;
Sensor *sensor;
bool sensor_on = true;
memory_stream->ReadBit(sensor_on);
sensor = mech->GetSensor();
if(sensor)
{
if (sensor_on)
{
sensor->SetSensorMode(Sensor::ActiveMode, mech->DoesHaveBeagle());
}
else
{
sensor->SetSensorMode(Sensor::PassiveMode, mech->DoesHaveBeagle());
}
}
memory_stream->ReadBitsToScaledFloat(pitch_value, -torso_model->pitchRadius, torso_model->pitchRadius, BitDepthManager::BitDepth(UpdateType,CurrentTorsoPitchUpdateEntryID));
memory_stream->ReadBitsToScaledFloat(yaw_value, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,CurrentTorsoYawUpdateEntryID));
torso->oldYawValue = torso->yawValue;
torso->oldPitchValue = torso->pitchValue;
torso->pitchValueCorrection = pitch_value;
torso->yawValueCorrection = yaw_value;
torso->correctionCurTime = 0.0f;
torso->correctionTime = rate;
// MSL 5.04 Back View Added
int look_direction = 0; // jcem: critical error - should clear before ReadBits(...)...
memory_stream->ReadBits( &look_direction, 2);
if (look_direction == Torso::LookLeftDirection)
{
torso->LookLeft();
}
else if (look_direction == Torso::LookRightDirection)
{
torso->LookRight();
}
else if (look_direction == Torso::LookBackDirection)
{
torso->LookBack();
}
else if (look_direction == Torso::SurrenderDirection)
{
torso->LookSurrender();
}
else
{
torso->LookForward();
}
Network::GetInstance()->netStatCollector[Network::IncomingMechMovementBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechPositionUpdate::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();
int throwaway;
memory_stream->ReadBits( &throwaway, 1);
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,RotationDemandUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
#if 0
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,TorsoPichDemandUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,TorsoYawDemandUpdateEntryID));
#endif
int mech_state = 0; // jcem: critical error - should clear before ReadBits(...)...
memory_stream->ReadBits( &mech_state, 2);
switch (mech_state)
{
case DrivingState:
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
memory_stream->ReadBits(&throwaway, 1);
memory_stream->ReadBits(&throwaway, 1);
break;
case JumpingState:
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentXVelocityEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentYVelocityEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentZVelocityEntryID));
break;
case FallingState:
memory_stream->ReadBits(&throwaway, 3);
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
break;
}
bool throwaway_b;
memory_stream->ReadBit(throwaway_b);
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentTorsoPitchUpdateEntryID));
memory_stream->ReadBits(&throwaway, BitDepthManager::BitDepth(UpdateType,CurrentTorsoYawUpdateEntryID));
memory_stream->ReadBits(&throwaway, 2);
Network::GetInstance()->netStatCollector[Network::IncomingMechMovementBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int MechPositionUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
{
int current_bit = 0;
current_bit += BitDepthManager::BitDepth(UpdateType,RotationDemandUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID);
#if 0
current_bit += BitDepthManager::BitDepth(UpdateType,TorsoPichDemandUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,TorsoYawDemandUpdateEntryID);
#endif
current_bit += 4;
current_bit += BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentXVelocityEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentYVelocityEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentZVelocityEntryID);
current_bit += 1;
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentTorsoPitchUpdateEntryID);
current_bit += BitDepthManager::BitDepth(UpdateType,CurrentTorsoYawUpdateEntryID);
current_bit += 3;
current_bit += 2;
return current_bit;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechPositionUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
{
Check_Object(memory_stream);
Check_Object(entity);
int current_bit = memory_stream->GetCurrentBitCount();
Mech *mech = Cast_Object(Mech*, entity);
const Mech::GameModel *model = mech->GetGameModel();
Check_Object(model);
Torso* torso = mech->GetTorso();
Check_Object(torso);
const Torso::GameModel *torso_model;
torso_model = torso->GetGameModel();
Check_Object(torso_model);
YawPitchRoll mech_rotation_local_to_world;
Point3D mech_translation_local_to_world;
mech->GetNetworkPosition(mech_translation_local_to_world, mech_rotation_local_to_world);
Scalar min_z, max_z, min_x, max_x;
Map::GetInstance()->GetMapExtents(&min_z, &max_z, &min_x, &max_x);
int local_mech_on = (mech->executionState->GetState() != Mech::ExecutionStateEngine::NeverExecuteState)?1:0;
memory_stream->WriteBits( &local_mech_on, 1);
memory_stream->WriteScaledFloatToBits(mech->yawDemand, -1.01f, 1.01f, BitDepthManager::BitDepth(UpdateType,RotationDemandUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech->speedDemand, -1.01f, 1.01f, BitDepthManager::BitDepth(UpdateType,SpeedDemandUpdateEntryID));
#if 0
memory_stream->WriteScaledFloatToBits(torso->pitchDemand, -1.0, 1.0, BitDepthManager::BitDepth(UpdateType,TorsoPichDemandUpdateEntryID));
memory_stream->WriteScaledFloatToBits(torso->yawDemand, -1.0, 1.0, BitDepthManager::BitDepth(UpdateType,TorsoYawDemandUpdateEntryID));
#endif
int mech_state = DrivingState;
switch(mech->executionState->GetState())
{
case Mech::ExecutionStateEngine::DrivingMotionState:
mech_state = DrivingState;
break;
case Mech::ExecutionStateEngine::FlyingMotionState:
mech_state = JumpingState;
break;
case Mech::ExecutionStateEngine::FallingMotionState:
mech_state = FallingState;
break;
}
memory_stream->WriteBits( &mech_state, 2);
switch (mech_state)
{
case DrivingState:
{
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_rotation_local_to_world.yaw, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech->currentSpeedMPS, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
bool shutdown = mech->IsShutdown();
bool crouch = mech->IsCrouched();
memory_stream->WriteBit(shutdown);
memory_stream->WriteBit(crouch);
}
break;
case JumpingState:
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_rotation_local_to_world.yaw, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech->localSpaceVelocity.linearMotion.x, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentXVelocityEntryID));
memory_stream->WriteScaledFloatToBits(mech->localSpaceVelocity.linearMotion.y, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentYVelocityEntryID));
memory_stream->WriteScaledFloatToBits(mech->localSpaceVelocity.linearMotion.z, -300.0f, 300.0f, BitDepthManager::BitDepth(UpdateType,CurrentZVelocityEntryID));
break;
case FallingState:
memory_stream->WriteBits(&mech->fallDirection, 3);
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.x, min_x, max_x, BitDepthManager::BitDepth(UpdateType,XPositionUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.y, -2005.0f, 1005.0f, BitDepthManager::BitDepth(UpdateType,YAboveTerrainUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_translation_local_to_world.z, min_z, max_z, BitDepthManager::BitDepth(UpdateType,ZPositionUpdateUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech_rotation_local_to_world.yaw, -Pi, Pi, BitDepthManager::BitDepth(UpdateType,CurrentRotationUpdateEntryID));
memory_stream->WriteScaledFloatToBits(mech->currentSpeedMPS, model->maxReverseSpeed, model->maxSpeed*1.25f, BitDepthManager::BitDepth(UpdateType,CurrentSpeedUpdateEntryID));
break;
}
Sensor *sensor;
bool sensor_on = true;
sensor = mech->GetSensor();
if(sensor)
{
switch (sensor->GetSensorMode ())
{
case Sensor::ActiveMode:
sensor_on = true;
break;
case Sensor::PassiveMode:
sensor_on = false;
break;
}
}
memory_stream->WriteBit(sensor_on);
memory_stream->WriteScaledFloatToBits(torso->pitchValue, -torso_model->pitchRadius, torso_model->pitchRadius, BitDepthManager::BitDepth(UpdateType,CurrentTorsoPitchUpdateEntryID));
memory_stream->WriteScaledFloatToBits(torso->yawValue, -torso_model->twistRadius, torso_model->twistRadius, BitDepthManager::BitDepth(UpdateType,CurrentTorsoYawUpdateEntryID));
// MSL 5.04 Back View Added
// int look_direction = Torso::LookRightDirection;
int look_direction = Torso::LookForwardDirection;
// MSL 5.04 Back View Added
switch (torso->lookDirection)
{
case Torso::LookLeftDirection:
look_direction = torso->LookLeftDirection;
break;
case Torso::LookRightDirection:
look_direction = torso->LookRightDirection;
break;
case Torso::LookBackDirection:
look_direction = torso->LookBackDirection;
break;
case Torso::SurrenderDirection:
look_direction = torso->SurrenderDirection;
break;
case Torso::LookForwardDirection:
look_direction = torso->LookForwardDirection;
break;
// default:
// look_direction = Torso::LookForwardDirection;
// break;
}
memory_stream->WriteBits(&look_direction, 2);
Network::GetInstance()->netStatCollector[Network::OutgoingMechMovementBitSizeStat].AddToStatistic(connection,memory_stream->GetCurrentBitCount() - current_bit);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool MechPositionUpdate::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;
}
}
//SPEWALWAYS(("jerryeds","NOT ACTIVE???"));
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechWarrior4::NetMovementSecurityCheckStop()
{
_asm
{
nop
}
}
//##########################################################################
//########################### MechAnimationUpdate
//##########################################################################
void MechAnimationUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
{
Check_Object(memory_stream);
Check_Object(entity);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechAnimationUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
{
Check_Object(memory_stream);
//Check_Object(entity);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int MechAnimationUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
{
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechAnimationUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
{
Check_Object(memory_stream);
Check_Object(entity);
}
//##########################################################################
//########################### MechMovementUpdate
//##########################################################################
void MechMovemntUpdate::Decode(Entity *entity, MemoryStream *memory_stream, Time till, Scalar packet_latency, int connection, int debug_level, int bandwidth, Scalar rate)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechMovemntUpdate::Skip(MemoryStream *memory_stream, int size, Time till, int connection, int debug_level, int bandwidth)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
int MechMovemntUpdate::MaxSize(Entity *entity, int debug_level, int bandwidth)
{
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void MechMovemntUpdate::Encode(Entity *entity, DynamicMemoryStream *memory_stream, int connection, int debug_level, int bandwidth)
{
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool MechMovemntUpdate::MaintainActiveFlagFunction(Entity *entity,Point3D cull_location)
{
return false;
}
//##########################################################################
//########################### MechFirstPersonMovementUpdate
//##########################################################################