Files
firestorm/Gameleap/code/mw4/Code/MW4/MWEntityManager.hpp
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

350 lines
8.3 KiB
C++

//===========================================================================//
// File: EntityUpdateManager.hpp
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 07/26/1999 JSE Inital coding
//---------------------------------------------------------------------------//
// Copyright (C) 1998, Microsoft Corp. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
/*
Future enhancements:
multiple dictionaries need a way to share the updates which means
that all active pages must run together and then post their data
then the dictionaries run and pull the data that they need.
This will allow for us to tailor messages to each persons bandwidth.
It will also allow us to optimize messages based off of a broadcast server.
If a broadcast server exsists then we will just send all the mech data in one
packet as well as sending first person updates to the individual player.
If there is not a broadcast server then each player receives everyone elses
vehicles but not his own in the uber updates.
It is possible that doubling the full position update and completly removing the
partial updates will be a better solution.
It is also possible that we need to double the control update to 1/2 a second or
even higher under high bandwidth games
*/
#pragma once
#include "MW4.hpp"
#include <Adept\EntityManager.hpp>
#include "NetConstants.hpp"
#include "Dictionary.hpp"
#include "NetUpdateManager.hpp"
#include "NetMovement.hpp"
#include "NetSubsystems.hpp"
#include "NetWeapon.hpp"
#include "NetGenericMessages.hpp"
#include "NetDamage.hpp"
#include "NetClientServerController.hpp"
#include "NetVehicleMovement.hpp"
#include "NetBitDepths.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"
namespace MechWarrior4
{
class VehicleCommand;
//##########################################################################
//########################### MWEntityManager
//##########################################################################
class MWEntityManager:
public Adept::EntityManager
{
public:
static void
InitializeClass();
static void
TerminateClass();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction and destruction
//
public:
MWEntityManager();
~MWEntityManager();
void
TestInstance() const;
static MWEntityManager*
GetInstance()
{
return reinterpret_cast<MWEntityManager *>(GlobalPointers::GetGlobalPointer(EntityManagerGlobalPointerIndex));
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Client Server Stuff
//
BitDepthManager *bitManager;
static BYTE *Packet_Buffer;
enum {
ToMechOffset=0,
ToGroundOffset,
ToServerOffset,
ToNoTargetOffset
};
enum {
DictionaryIndexMessageID = Network::FirstDictionaryPageMessageID,
FirstPersonControlMessageID,
FirstPersonObserverControlMessageID,
FirstPersonSmallConfirmationMessageID,
FirstPersonFullConfirmationMessageID,
StartFirstPersonWeaponMessageID,
FirstPersonWeaponToMechCommandMessageID = StartFirstPersonWeaponMessageID,
FirstPersonWeaponToGroundCommandMessageID,
FirstPersonWeaponToServerObjectCommandMessageID,
FirstPersonWeaponNoTargetCommandMessageID,
EndFirstPersonWeaponMessageID = FirstPersonWeaponNoTargetCommandMessageID,
StartThirdPersonWeaponMessageID,
ThirdPersonWeaponToMechCommandMessageID = StartThirdPersonWeaponMessageID,
ThirdPersonWeaponToGroundCommandMessageID,
ThirdPersonWeaponToServerObjectCommandMessageID,
ThirdPersonWeaponNoTargetCommandMessageID,
EndThirdPersonWeaponMessageID = ThirdPersonWeaponNoTargetCommandMessageID,
StartAIWeaponMessageID,
AIWeaponCommandToMechtMessageID = StartAIWeaponMessageID,
AIWeaponCommandToGroundtMessageID,
AIWeaponCommandToServerObjectMessageID,
AIWeaponCommandToNoTargetMessageID,
EndAIWeaponMessageID = AIWeaponCommandToNoTargetMessageID,
WeaponBundleMessageID,
DictionaryPage0MessageID,
DictionaryPageMaxMessageID = DictionaryPage0MessageID + MaximumPages
};
void
UpdateEntities();
void
ServeLocalEntities(Time till);
void
ResetActivityFlags();
void
UpdateClientEntites(int connection, int message_type, Stuff::MemoryStream *message);
void
CreateWeaponEffect(WeaponUpdate &weapon_packet);
void
AddMover(Mover *mover);
void
RemoveMover(Mover *mover);
void
BuildTileBoundDamageList();
void
AddPlayerVehicle(Mover *mover);
void
RemovePlayerVehicle(Mover *mover);
void
UpdateDictionaries(void);
void
UpdateDictionaries(int connection);
void
MakeDictionaryPages(Dictionary *dictionary);
void SetPlayerReady(Entity *entity);
Stuff::Scalar
GetTimeSlice(Stuff::Time till)
{
Stuff::Scalar slice = static_cast<Stuff::Scalar>(till - lastExecuted);
return slice;
}
void
StartUpdates();
void
EndUpdates();
void RespawnClient(int connection_id, Point3D trans);
void StartClient();
void StopClient();
void StartServer();
void StopServer();
void Reset();
void PreCollisionNetworkEvents();
public:
ChainOf<WeaponUpdate*>
weaponUpdates;
void
PlayerWeaponUpdate(WeaponUpdate *weapon);
void
AIWeaponUpdate(WeaponUpdate *weapon);
ChainOf<VehicleCommand*> quedCommands;
int commandCount;
void QueCommand(int command);
// these are the incomming weapon ques
ChainOf<WeaponUpdate*>
networkWeaponsQue;
void
QueWeapon(WeaponUpdate *weapon);
DictionaryManager *
GetDictionaryManager(int connection)
{return dictionaryManager[connection];}
void
SetDirtyFlag()
{dictionaryDirtyFlag = true;}
void
SetDirtyFlag(bool flag)
{dictionaryDirtyFlag = flag;}
bool
GetDirtyFlag()
{return dictionaryDirtyFlag;}
protected:
bool
dictionaryDirtyFlag;
DictionaryManager
*dictionaryManager[Maximum_Players];
public:
SortedChainOf<Mech*, Adept::ReplicatorID>
servedMechs;
ChainOf<Mech*> servedRespawnLances; // jcem - for delayed lancemate respawn
ChainOf<Airplane*>
servedAirplanes;
ChainOf<Boat*>
servedBoats;
ChainOf<Dropship*>
servedDropships;
ChainOf<Helicopter*>
servedHelicopters;
ChainOf<Hovercraft*>
servedHovercraft;
ChainOf<Tank*>
servedTanks;
ChainOf<Truck*>
servedTrucks;
ChainOf<Turret*>
servedTurrets;
Time
lastExecuted;
Time
lastScore;
Time
lastWeapon;
Time
lastActiveReset;
int
maximumNearBuildings,
maximumMidBuildings,
maximumFarBuildings;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public:
Vehicle *playerVehicle[Maximum_Players];
Scalar FindGroundHeight(Stuff::Scalar x_position, Stuff::Scalar z_position);
ServerController *serverController;
ClientController *clientController;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static bool IsNumberAhead(int value, int position, int number_ahead, int wrap_around_number);
static bool IsNumberBehind(int value, int position, int number_behind, int wrap_around_number);
static bool IsNumberWithin(int value, int positoin, int number_within, int wrap_around_number);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
public:
unsigned int m_uPostDeathFlags;
public:
void QueRespawnLancemate(Mech* lancemateMech); // jcem - for delayed lancemate respawn
};
};