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

1710 lines
42 KiB
C++

#pragma once
#include "MW4.hpp"
#include <Adept\Application.hpp>
#include <Stuff\Scalar.hpp>
// ngLog addition
#include "MechLabHeaders.h"
#include "InputTrainer.hpp"
#include "MemoryDiffKiller.hpp"
#define MAX_LANCEMATES 16
namespace NetMissionParameters
{
class TeamParameters
{
public:
int m_maxPlayersOnTeam;
int m_minimumTonnage;
int m_maximumTonnage;
int m_maximumTotalTonnage;
Stuff::Scalar m_currentTotalTonnage;
int m_skin;
int m_alignment;
DWORD m_allowedMech[2];
DWORD m_allowedBeam[2];
DWORD m_allowedMissile[2];
DWORD m_allowedProjectile[2];
DWORD m_allowedSubsystem[2];
TeamParameters();
void ResetParameters(int index);
void SaveParameters(Stuff::DynamicMemoryStream *stream);
void LoadParameters(Stuff::MemoryStream *stream);
void SaveParameters(Stuff::NotationFile *notefile);
void LoadParameters(Stuff::NotationFile *notefile);
};
class MWNetMissionParameters:
public AdeptNetMissionParameters
{
public:
int m_joinInProgress;
int m_joinInProgressCutOff;
int m_joinInProgressCutOffTime;
int m_heatOn;
int m_killLimit;
int m_killLimitNumber;
int m_respawnLimit;
int m_respawnLimitNumber;
int m_forceRespawn;
int m_splashOn;
int m_weaponjamOn;
int m_ammobayfireOn;
// MSL 5.05 Advance Mode
int m_advancemodeOn;
// MSL 5.06 Armor Mode
int m_armormodeOn;
int m_splashPercentage;
int m_unlimitedAmmo;
int m_friendlyFirePercentage;
int m_allowZoom;
int m_allow3rdPerson;
int m_allowAutoAim;
int m_allowDeadToChat;
int m_invulnerableDrop;
int m_isNight;
int m_weather;
int m_reportStats;
int m_serverConnection;
int m_serverBandwidth;
int m_radarMode;
int m_onlyStockMech;
int m_minimumTonnage;
int m_maximumTonnage;
int m_gameLength;
int m_serverRecycle;
int m_recycleDelay;
int m_playMissionReview;
int m_ruleType;
int m_deadMechCantSee;
int m_deadMechCantSeeOtherTeam;
int m_allowdecaltransfer;
int m_useMapCycle;
int m_pureMapCycle;
DWORD m_allowedMech[2];
DWORD m_allowedBeam[2];
DWORD m_allowedMissile[2];
DWORD m_allowedProjectile[2];
DWORD m_allowedSubsystem[2];
// there are always 8 teams,
// but sometimes a team won't allow players
int m_teamAllowed;
int m_teamCount;
TeamParameters m_teamParams[8];
int m_maxPlayers;
int m_maxBots;
int m_mapID;
char m_mapName[128];
char m_scenarioName[128];
char m_scenarioPath[128];
char m_serverName[256];
char m_serverIP[256];
char m_serverCPU[256];
char m_scriptName[256];
char m_scenarioText[1024];
__int64 m_mapClientCRC;
MWNetMissionParameters();
void ResetParameters(void);
void SaveParameters(Stuff::DynamicMemoryStream *stream);
void LoadParameters(Stuff::MemoryStream *stream);
void SaveParameters(Stuff::NotationFile *notefile);
void LoadParameters(Stuff::NotationFile *notefile);
void LoadOverideParameters(Stuff::NotationFile *notefile);
void SaveServerParameters(NotationFile *notefile);
};
};
namespace MechWarrior4
{
class MWObject;
class MWPlayer;
class Team;
class MWTable;
class MWOptions;
class Mech;
class MissionReview;
const char DefaultSkinPrefix=static_cast<char>('_');
enum { Maximum_Lancemates = MAX_LANCEMATES };
struct SWeaponInfo
{
Stuff::Scalar m_HudEffect;
};
extern SWeaponInfo g_aWIs[];
//##########################################################################
//######################### HermitEntry ##############################
//##########################################################################
class HermitEntry
{
public:
HermitEntry(short file_id, WORD record_id, const Stuff::Point3D& position, const Stuff::YawPitchRoll& rotation)
: m_rotation(rotation)
, m_position(position)
{
m_fileID = file_id;
m_recordID = record_id;
};
HermitEntry()
{
m_fileID = 0;
m_recordID = 0;
m_rotation = Stuff::YawPitchRoll::Identity;
m_position = Stuff::Point3D::Identity;
};
short m_fileID;
WORD m_recordID;
Stuff::Point3D m_position;
Stuff::YawPitchRoll m_rotation;
};
//##########################################################################
//######################### DecalEntry ##############################
//##########################################################################
class DecalEntry:
public Stuff::Plug
{
public:
int refCount;
int index;
Stuff::MString decalName;
DecalEntry():
Stuff::Plug(DefaultData)
{
refCount = 0;
}
};
//##########################################################################
//######################### ServedConnectionData #####################
//##########################################################################
class ServedConnectionData
{
public:
// ip
// dplay id
bool
clientConnected, // they are connected to the server
clientVehicleAccepted, // they have a vehicle choosen and accepted
clientReady, // they are ready to load
clientLaunched, // they have been sent the load command
clientLoaded, // they are done with the load command
clientReadyForPrerender,// they are ready to preload
clientSentScoreFormat, // if they have recieved the score format
clientAllowTransfer, // if the client allows transfers of decals
clientSquelched, // if the client is squelched
clientStreamingReview, // if the client is getting a mission review log
clientQuedForLaunch, // if the client is ready to be launched
clientQuedForKick;
bool
waitingForClientShutdownConfirmation;
int
pilotTeam, // the team the pilot is on
pilotDecals, // the index of their pilot decal
teamDecals, // the index of their team decal
mechChasisID, // what mech they are in
nextReviewPacket; // which mission review packet they have received last
char
pilotSkins; // the skin prefix
Stuff::Point3D
vehiclePosition; // the last position of their vehicle
Stuff::YawPitchRange
vehicleRotation; // the last rotation of their vehicle
Adept::ResourceFile*
clientCustomResource; // the pointer to their custom mech resource
bool
customResourceCRCFail; // the resource didn't pass the hash test. bad little hacker.
Stuff::MemoryStream
*vehicleCreateMessage; // the creation message of their vehicle
MWPlayer*
clientPlayer; // pointer to their player object
const char *
pilotName; // the players name
char *
clanName;
// connection status
Stuff::Scalar
effectivePing; // thier effective ping taking into account frame rates
AverageOf<Stuff::Scalar>
averagePing;
int
clientConnectionRate, // their reported connection rate
clientConnectionType, // their reported connection type
packetLoss; // not used yet
int
bandwidthThrottle;
Scalar
timeSinceLastThrottleTest;
Stuff::AverageOf<Stuff::Scalar>
chatTimeLog; // time total of last 20 chats used for overflow
Stuff::Time
lastChat; // the last chat time
ServedConnectionData();
~ServedConnectionData();
void Recycle();
void Disconnect();
GUID
clientKey; // unique client key
DWORD
clientISP; // clients c-class ip address uses this mask 0xffffff00
#if !defined(NO_LOG)
// ngLog additions
// Need to make the sizes hardcoded to account for
// non-weapon damage given/received (like Ramming).
// Assuming # of weapons will be < 200 during the entire
// making of the game, so I shove all non-bound weapon
// stuff above 200.
enum {
NumWeaponsTracked=221
};
int
stats_update; // Stats update flag (for logging)
int
wep_atts[NumWeaponsTracked], // # of shot attempts for a particular damage type.
wep_hits[NumWeaponsTracked]; // # of hits for a particular damage type.
float
dmg_given[NumWeaponsTracked], // Amount of damage given per client
dmg_rcvd[NumWeaponsTracked]; // Amount of damage received per client
float
pdmg_given[Adept::Maximum_Players+Maximum_Lancemates], // Damage given to another player
pdmg_rcvd[Adept::Maximum_Players+Maximum_Lancemates]; // Damage received from another player
int
comp_inf[Adept::Maximum_Players+Maximum_Lancemates], // # of inflicted internal components that have been destroyed
comp_rcv[Adept::Maximum_Players+Maximum_Lancemates]; // # of received internal components that have been destroyed
GUID
ngLogID; // Client name/password hash
#endif // !defined(NO_LOG)
Stuff::Scalar tonnage;
public: // jcem
Mech* GetMech() const;
ReplicatorID GetReplicatorID() const;
};
//##########################################################################
//######################### ServedConnectionData #####################
//##########################################################################
// bots and lancemates...
class LancemateConnectionData
{
public:
LancemateConnectionData();
~LancemateConnectionData();
void Recycle();
void Disconnect();
// all this stuff is transmitted at differing times...
Stuff::MemoryStream
*lancemateCreateMessage;
Adept::ResourceFile*
lancemateCustomResource;
bool
customResourceCRCFail;
Mech *lancemateMech;
char lancemateName[256];
char lancemateClan[256];
bool lancemateConnected;
bool lancemateVehicleAccepted;
bool buildName;
int pilotTeam;
int mechChasisID;
// used by server, never transmitted by wire...
char scriptName[256];
Adept::ResourceID aiModel;
int pilotSkill;
int gunnerySkill;
int eliteSkill;
int minHeatSkill;
int maxheatSkill;
int sensorSkill;
int blindFightSkill;
int longRangeGunSkill;
int shortRangeGunSkill;
Adept::ObjectID dropZone;
#if !defined(NO_LOG)
// ngLog additions
// Need to make the sizes hardcoded to account for
// non-weapon damage given/received (like Ramming).
// Assuming # of weapons will be < 200 during the entire
// making of the game, so I shove all non-bound weapon
// stuff above 200.
enum {
NumWeaponsTracked=221
};
int
stats_update; // Stats update flag (for logging)
int
wep_atts[NumWeaponsTracked], // # of shot attempts for a particular damage type.
wep_hits[NumWeaponsTracked]; // # of hits for a particular damage type.
float
dmg_given[NumWeaponsTracked], // Amount of damage given per client
dmg_rcvd[NumWeaponsTracked]; // Amount of damage received per client
float
pdmg_given[Adept::Maximum_Players+Maximum_Lancemates], // Damage given to another player
pdmg_rcvd[Adept::Maximum_Players+Maximum_Lancemates]; // Damage received from another player
int
comp_inf[Adept::Maximum_Players+Maximum_Lancemates], // # of inflicted internal components that have been destroyed
comp_rcv[Adept::Maximum_Players+Maximum_Lancemates]; // # of received internal components that have been destroyed
#endif // !defined(NO_LOG)
Stuff::Scalar tonnage;
public: // jcem
Mech* GetMech() const;
ReplicatorID GetReplicatorID() const;
};
//##########################################################################
//######################## MWApplication #############################
//##########################################################################
const int ResourceIDType=static_cast<int>(0);
const int ResourceStreamType=static_cast<int>(1);
const int CreationMessageType=static_cast<int>(2);
class SMechInfo;
typedef SMechInfo* PMechInfo;
class SMechInfo : public ReplicatorID
{
public:
Mech* m_pMech;
const char* m_pcszName;
bool m_bBOT;
int m_nTeam;
public:
void SetInfo(Mech* pMech, const char* pcszName, bool bBOT, int nTeam);
};
class MWApplication;
#define MAX_TEAMORDER_COUNT 10
struct STeamOrderCommand;
typedef STeamOrderCommand* PTeamOrderCommand;
struct STeamOrderCommand
{
public:
int m_nType; // -1 - to player, 0 - invalid, 0 < : bot & count...
Stuff::Time m_fArrived;
WORD m_waBots[16]; // bots to be ordered
int m_nFrom; // from...
int m_nMsgIndex;
ReplicatorID m_Target;
};
struct STeamOrderCommandArray
{
public:
int m_nCurTOC;
int m_nMaxTOC;
STeamOrderCommand m_aTOCs[MAX_TEAMORDER_COUNT];
public:
void ClearTOC();
STeamOrderCommand& DoReserveTOC(int nType, int nFrom, int nMsgIndex);
int NormalizeIndex(int nIndex) const;
STeamOrderCommand& GetTOC(int nIndex) const;
void CopyTOC(int nDest, int nSrc);
void DoTOC(MWApplication& app);
void DoRemoveTOCs(int connection);
void AdvanceHead();
};
class MWApplication:
public Adept::Application
{
public:
static void
InitializeClass();
static void
TerminateClass();
/*
static void __stdcall MW4GetFileForGOS(
const char* filename,
BYTE** memory,
DWORD* size
);
static bool __stdcall MW4FindFileForGOS(const char* filename);
*/
static bool __stdcall TranslateMissionNameIfNecessary(Stuff::MString & res_name);
static bool __stdcall TranslateMissionNameBackIfNecessary(Stuff::MString & res_name);
static MWApplication*
GetInstance()
{
return reinterpret_cast<MWApplication *>( GlobalPointers::GetGlobalPointer(ApplicationGlobalPointerIndex));
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction
public:
MWApplication(ClassData *class_data,
bool display_gui);
~MWApplication();
void
Initialize();
void
Terminate();
void
TestInstance() const;
//--------------------------------------------------------------------------
// Flood Prevention and message senders
public:
Stuff::Time
timeFromLastParameterSend;
Stuff::Time
timeFromLastLobbyStatus;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// auto recycle support
public:
Stuff::Time recycleStartTime;
bool recycleTimerOn;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Localization Support
public:
char *
GetLocString(int index);
DWORD
langResources;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Lookup table support
public:
void
LoadLookupTables();
MWTable
*m_mechTable;
MWTable
*m_subsystemTable;
MWTable
*m_mechChassisTable;
MWTable
*m_weaponsTable;
MWTable
*m_skinsTable;
MWTable
*m_missionsRenameTable;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Options Support
public:
void
InitializeOptions(MWOptions *new_options);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Pilot support
public:
Stuff::MString
m_currentMissionName;
int
m_currentMissionStatus;
Stuff::MString
m_pilotName;
int
m_lastMissionKills,
m_lastMissionDeaths;
bool
m_campaignIsComplete;
bool
m_isMasterTrial;
int
m_lastMechID;
Stuff::MString
m_lastMechName;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Gui Support
public:
bool
DisplayGUI() const;
private:
const bool m_DisplayGUI;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Adept Message support
public:
void
PauseGameMessageHandler(const Adept::ReceiverDataMessageOf<int> *message);
virtual void
EnterStoppingGameState(void* data);
virtual void
EnterRunningGameState(void* data);
virtual void
EnterPreRenderState(void* data);
virtual void
EnterLoadingGameState(void* data);
virtual void
EnterRecyclingGameState(void* data);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Startup/Run/Shutdown support
public:
static void _stdcall
DoShellLogic();
static void _stdcall
StartUpDoShellLogic();
static void _stdcall
DoGameLogic();
static void _stdcall UpdateDisplay();
bool
GetMechResourceID(int player_id, Adept::ResourceID &vehicle_id, Stuff::MemoryStream *message);
virtual Adept::Entity::CreateMessage *
MakePlayerCreationMessage(int player_id);
virtual Adept::Entity::CreateMessage *
MakeLancemateCreationMessage(int lancemate_index);
void
ConstructEgg(
const char* contents_file
);
void
StartGame();
void
StartNetGame();
void
StartCampaignGame();
void
StopGame();
void
LaunchGame();
void
LogPlayerConnect(int i);
void
LogBotConnect(void);
void
LaunchPlayer(int connection);
void
BroadcastAddNewPlayer(int connection_id);
void
InitializeInstantAction();
void
InitializeCampaignGame();
void
InitializeWaveGame(int waves, int bots, int lancemates, int player_lives);
void
InitializeTrainingMission();
void
QueRespawnPlayer()
{Check_Object(this); quedPlayerRespawn = true;}
void
UnQuePlayerRespawn()
{Check_Object(this); quedPlayerRespawn = false;}
bool
QuedForPlayerRespawn()
{Check_Object(this); return quedPlayerRespawn;}
void
QueStopGame(bool no_recycle = false)
{Check_Object(this); quedStop = true; noRecycle = no_recycle;}
protected:
bool
quedPlayerRespawn;
bool
noRecycle;
public:
static char
*GameFile;
static char
*NetGameName;
static char
*NetPlayerName;
static char
*NetPassword;
static bool
SaveGameStats,
DemoMode,
AutoLaunchServerGame,
AutoLaunchClientGame,
RunFromLobby,
SecureNetGame,
DplayNetGame,
Win32DedicatedServer;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// alignment
public:
enum AlignmentSchema
{
SINGLE_PLAYER,
MP_NON_TEAMPLAY,
MP_TEAMPLAY
};
static AlignmentSchema GetAlignmentSchema();
#ifdef LAB_ONLY
static bool
ReKeyResources;
#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Animation load support
public:
Stuff::ChainOf<MWObject*>
animationScriptsLoadQue;
void AddToAnimationLoadQue(MWObject *object)
{
animationScriptsLoadQue.Add(object);
}
void MWApplication::LoadAnimations();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Dynamic decal support
enum
{
MaxDecalSize = 5120
};
const char*
GetDecalName(int decal_index);
Stuff::SortedChainOf<DecalEntry*, int>
decalNames;
int
AddDecal(const char *decal);
void
AddDecal(const char *decal, int index);
DecalEntry*
FindDecal(const char *decal);
void
RemoveDecal(int decal_index);
bool
IsDecalOnDisk(const char *decal);
bool
IsStockDecalOnDisk(const char *decal);
void
SendDecalQuery(int connection);
int
AllowDecalTransfer;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Network Support
void
ConnectClient(int connection,Adept::Connection *con);
void
DisconnectClient(int connection,Adept::Connection *con);
void
RecycleNetworking();
void
StopNetworking();
void
ConnectServer();
bool
CullWhackedMessages(int connection, int message_type);
void
ReceiveDirectMessage(int connection, int message_type, Stuff::MemoryStream *message);
void
RunTimeOuts();
bool validDrop;
bool
CheckValidDrop(Point3D position);
static void CollisionCallBack(Adept::Entity *entity, Adept::Entity *original_caller, const Stuff::Sphere &sphere);
static int
MoveItAndShakeIt;
MemoryDiffKiller
memoryDiffKiller;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Single Player Game Support
public:
enum{
DefaultGameType = 0,
WaveBattleGameType
};
enum{
LanceConnectionStart = 0,
BotConnectionStart = 3
};
enum{
MaxWaveLanceCount = 3,
MaxWaveBotCount = 4
};
int
m_iaDisplayGameType;
int
m_iaGameType;
int
m_numberOfWaves;
int
m_numberOfCompletedWaves;
int
m_numberOfEnemiesPerWave;
int
m_numberOfLancematesPerWave;
int
m_numberQuedLancemates;
int
m_numberQuedBots;
int
m_lancemateRespawnQueue[MaxWaveLanceCount];
int
m_botRespawnQueue[MaxWaveBotCount];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Direct Network Message Support
// for the most part these are in the order that they will be received.
// apart from score, respawn and chat messages which will be received many
// times during the game.
public:
enum {
RequestConnectionMessageID = Adept::Network::FirstDirectApplicationMessageID, // client asks to join the game - this is pre-game lobby join and CRC's
DenyRequestConnectionMessageID, // server tells the client it is out of date and it must now piss off.
AcceptConnectionMessageID, // server tells the client he may join and gives him any info he may need, like player authentication, cookies, xor codes game numbers and such.
LoadGameMessageID, // tells the client to load the mission
LoadPersitantHermitObjectsID, // tells the client to load non updated entites (hermits) that were not created at the start of the game, but created as side effects.
AddPlayerMessageID, // adds a player and his vehicle
RemovePlayerMessageID, // removes a player and his vehicle
RequestPlayerVehicleMessageID, // client sends vehicle to be accepted or denied
AcceptPlayerVehicleMessageID, // server replies yes request is valid
DenyPlayerVehicleMessageID, // server replies no request is denied
AddLancemateMessageID, // adds a lancemate
ReadyToLaunchMessageID, // client tells server it is ready to launch
ClientLoadedMessageID, // client tells server that the mission/map/vehicle is loaded
RunGameMessageID, // tells the client to start running state
ScoreMessageID, // current score and mission parameters
RequestRespawnMessageID, // player requests to be respawned
RespawnMessageID, // player is respawned
ChatMessageID, // chat message
StopMissionMessageID, // tells the client the mission is over
PlayerLeavingMessageID, // tells the server that the client is going to the shell,
RequestMissionParameterMessageID, // request the mission parameters
MissionParameterMessageID, // the mission parameters
ScoreFormatMessageID, // this is the format of the buckets
RequestMapInfoMessageID, // this request info on the map
MapInfoMessageID, // this is the maps info file
SwitchToCameraMessageID, // this switches the player to a camera
DecalLayoutMessageID, // asks if the client has decals
RequestDecalsMessageID, // request transfer of decal
DecalPayLoadMessageID, // transfer message of decal
AddTeamMessageID, // add a team
LobbyStatusMessageID, // server is telling clients what each players status is ( ready, mech chasis, team )
RequestTeamMessageID, // client is requsting a team
RequestPreRenderMessageID, // requests a preload message
PreRenderMessageID, // gives a preload message, includes drop
MissionReviewAvailableMessageID, // tells the client the server has a review to watch
RequestMissionReviewMessageID, // asks for the last review
CancelMissionReviewMessageID, // asks to stop receiving the review
MissionReviewPartMessageID, // a piece of the review
RespawnFlagsMessageID, // respawn all flags
PlayerClanMessageID, // the player clans
RespawnLancemateMessageID, // respawn a lancemate
UnreadyLaunchMessageID, // unreadies the launch button
StopMissionConfirmationMessageID, // from clients to confirm shutdown
RequestNewDictionaryMessageID, // client is confused and would like a new dictionary
KickPlayerMessageID, // kick the client from the game
TeamBettyMessageID, // for special team Betty sounds
StartMusicMessageID, // for allowing the host to start music on the clients
TeamSetNavMessageID, // for setting team nav points
RequestScoreFormatMessageID, // request the score format
RespawnMissionMessageID, // respawn the map
RespawnIndexMessageID, // sends the respawn counts of players and lancemates
// team order
TeamOrderMessageID,
svrTeamOrderMessageID,
RepTeamOrderMessageID,
svrRepTeamOrderMessageID,
// team order
LastMessageID
};
enum {
ServerAllowedRule = 0,
ClientAllowedRule,
WaitingForGameAllowedRule,
LoadingGameAllowedRule,
PreRenderAllowedRule,
RunningGameAllowedRule,
StoppingGameAllowedRule,
RecycleGameAllowedRule,
AllowedRuleCount
};
static int MessageRules[LastMessageID-Adept::Network::FirstDirectApplicationMessageID][AllowedRuleCount];
enum {
ServerResolution = 0,
ClientResolution
};
enum {
SilentResolution = 0,
WarnResolution,
ShellClientResolution
};
static int MessageResolution[LastMessageID-Adept::Network::FirstDirectApplicationMessageID][2];
void
RequestConnectionMessageHandler(int connection, Stuff::MemoryStream *message);
void
DenyRequestConnectionMessageHandler(int connection, Stuff::MemoryStream *message);
void
AcceptConnectionMessageHandler(int connection, Stuff::MemoryStream *message);
virtual void
LoadGameMessageHandler(int connection, Stuff::MemoryStream *message);
void
LoadPersitantHermitObjectsMessageHandler(int connection, Stuff::MemoryStream *message);
void
AddPlayerMessageHandler(int connection, Stuff::MemoryStream *message);
void
RemovePlayerMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestPlayerVehicleMessageHandler(int connection, Stuff::MemoryStream *message);
void
AcceptPlayerVehicleMessageHandler(int connection, Stuff::MemoryStream *message);
void
DenyPlayerVehicleMessageHandler(int connection, Stuff::MemoryStream *message);
void
AddLancemateMessageHandler(int connection, Stuff::MemoryStream* message);
void
ReadyToLaunchMessageHandler(int connection, Stuff::MemoryStream *message);
void
ClientLoadedMessageHandler(int connection, Stuff::MemoryStream *message);
void
RunGameMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestRespawnMessageHandler(int connection, Stuff::MemoryStream *message);
void
RespawnMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestMissionParametersMessageHandler(int connection, Stuff::MemoryStream *message);
void
MissionParametersMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestScoreFormatMessageHandler(int connection, Stuff::MemoryStream *message);
void
ScoreMessageHandler(int connection, Stuff::MemoryStream *message);
void
ChatMessageHandler(int connection, Stuff::MemoryStream *message);
void
StopMissionMessageHandler(int connection, Stuff::MemoryStream *message);
void
PlayerLeavingMessageHandler(int connection, Stuff::MemoryStream *message);
void
ScoreFormatMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestMapInfoMessageHandler(int connection, Stuff::MemoryStream *message);
void
MapInfoMessageHandler(int connection, Stuff::MemoryStream *message);
void
SwitchToCameraMessage(int connection, Stuff::MemoryStream *message);
void
DecalLayoutMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestDecalsMessageHandler(int connection, Stuff::MemoryStream *message);
void
DecalPayLoadMessageHandler(int connection, Stuff::MemoryStream *message);
void
AddTeamMessageHandler(int connection, Stuff::MemoryStream *message);
void
LobbyStatusMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestTeamMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestPreRenderMessageHandler(int connection, Stuff::MemoryStream *message);
void
PreRenderMessageHandler(int connection, Stuff::MemoryStream *message);
void
MissionReviewAvailableMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestMissionReviewMessageHandler(int connection, Stuff::MemoryStream *message);
void
CancelMissionReviewMessageHandler(int connection, Stuff::MemoryStream *message);
void
RespawnFlagsMessageHandler(int connection, Stuff::MemoryStream *message);
void
MissionReviewPartMessageHandler(int connection, Stuff::MemoryStream *message);
void
PlayerClanMessageHandler(int connection, Stuff::MemoryStream *message);
void
RespawnLancemateMessageHandler(int connection, Stuff::MemoryStream *message);
void
UnreadyLaunchMessageHandler(int connection, Stuff::MemoryStream *message);
void
StopMissionConfirmationMessageHandler(int connection, Stuff::MemoryStream *message);
void
RequestNewDictionaryMessageHandler(int connection, Stuff::MemoryStream *message);
void
KickPlayerMessageHandler(int connection, Stuff::MemoryStream *message);
void
TeamBettyMessageHandler(int connection, Stuff::MemoryStream *message);
void
StartMusicMessageHandler(int connection, Stuff::MemoryStream *message);
void
TeamSetNavMessageHandler(int connection, Stuff::MemoryStream *message);
void
RespawnMissionMessageHandler(int connection, Stuff::MemoryStream *message);
void
RespawnIndexMessageHandler(int connection, Stuff::MemoryStream *message);
// add message to here and switch/case stmt and id above
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Connection Denial types
public:
enum {
NoError = 0,
ExecutableOutOfDate,
ExecutablesDoNotMatch,
ResourcesOutOfDate,
ResourcesDoNotMatch,
VersionsDoNotMatch,
BannedClient
};
void
SendRequestConnectionMessage();
__int64 CalculateExecutableDateCRC();
__int64 CalculateExecutableCRC();
__int64 CalculateVersionNumber();
__int64 CalculateMapMissionCRC(const char *map_name);
__int64 lastMapCRC;
bool haveNetworkMap;
#if !defined(NO_MR)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mission review support;
void SetMissionReviewWeaponFired(int player);
void SetMissionReviewTakeDamage(int player);
MissionReview *m_recordLog;
MissionReview *m_playLog;
int totalReviewPackets;
Stuff::DynamicMemoryStream *reviewPackets;
bool missionReviewAvailable;
bool playingMissionReview;
#endif // !defined(NO_MR)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Chat support
public:
typedef void
(*ChatCallback)(
void *data,
BYTE from,
BYTE type,
BYTE player_sent_to,
char *message
);
void *
chatCallbackData;
ChatCallback
chatCallback;
void
RegisterChatCallback(void *data, ChatCallback callback)
{
Check_Pointer(callback);
Check_Pointer(data);
chatCallbackData = data;
chatCallback = callback;
}
enum {
SystemBroadcast,
ObserverBroadcast,
AliveBroadcast,
DeadBroadcast,
TeamAliveBroadcast,
TeamDeadBroadcast,
PrivateBroadcast,
LobbyBroadcast,
LobbyTeamBroadcast
};
int motdLength; //max 5
char motd[5][Adept::MaxChatSize];
void
LoadMOTD();
bool
CullChat(BYTE from, BYTE type, BYTE player_sent_to, BYTE local_connection);
BYTE
TypeCheckChat(BYTE from, BYTE type, BYTE &player_sent_to);
void
SendChat(BYTE from, BYTE type, BYTE player_sent_to, char *message);
void
DisplayChat(BYTE from, BYTE type, BYTE player_sent_to, char *message);
void
DisplayShellChat(BYTE from, BYTE type, BYTE player_sent_to, char *message);
void
HandleHUDInput(bool team_chat, bool dead, bool observer, BYTE from, char* message);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Difficulty Data support
//
public:
enum { EASY_DIFFICULTY,MEDIUM_DIFFICULTY,HARD_DIFFICULTY,IMPOSSIBLE_DIFFICULTY };
protected:
int m_DifficultyLevel;
public:
void
SetDifficultyLevel(int new_level)
{Check_Object(this); m_DifficultyLevel = new_level;}
int
GetDifficultyLevel (void) const
{Check_Object(this); return m_DifficultyLevel;}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Message Senders
bool
scoreSaved;
void
SaveScore();
void
SendScoreFormat();
void
SendScoreFormat(int connection);
void
SendScore();
void
SendPersitantHermitObjects(int connection);
void
SendTeams(int connection);
void
SendTeamRequest(int team);
void
SendLobbyStatus();
void
SendPlayerClanMessage();
void
SendRunGameMessage(int connection_id);
void
SendPreRenderMessage(int connection_id);
void
SendVehicleRequest();
void
SendCampaignVehicleRequest();
void
SendCampaignLancemateRequests();
int GetClientReady();
void
SetClientReady();
Scalar timeSinceLastUnready;
void
SetClientUnready();
void
ServerGameOver();
void
SendStopGameMessage();
void
SendPlayerLeavingMessage(); // player sends this to server when he leaves
void
SendRemovePlayerMessage(int connection); // server sends this to everyone when player leaves
void
SendRequestNewDictionaryMessage();
void
AddReplicatedHermit(Adept::Entity *entity)
{
replicatedHermits.Add(entity);
}
void
SendEveryoneRespawnIndex();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Client Server Stuff
//
public:
enum {
NoExitCode,
KickedExitCode,
BannedExitCode,
BadServerExitCode,
UnknownExitCode
};
int networkExitCode;
void
SessionLost()
{Check_Object(this);networkExitCode = UnknownExitCode; }
// dead reckoned timers for shell and hud...
// server updates these values in real time
// messages send them out
bool lockTimer;
Stuff::Scalar lockTimerVal;
bool gameTimer;
Stuff::Scalar gameTimerVal;
bool recycleTimer;
Stuff::Scalar recycleTimerVal;
bool
waitingForRunMessage;
BYTE
m_isNight;
bool
missionReady;
int
localVehicelAccepted;
ServedConnectionData
servedConnectionData[Adept::Maximum_Players];
enum { Maximum_Teams = 8 };
enum { No_Team = 8 };
Stuff::SlotOf<Team *>
*teams[8];
static int
NameToTeamNumber(char* name);
bool
TeamHasAnyPlayers(int team_number);
char*
GetTeamCount();
char *
missionName;
Stuff::ChainOf<Adept::Entity*>
replicatedHermits;
void
VerifyAllPlayerVehicles();
void
ReverifyDeniedVehicles();
void
RemovePlayersFromTeam();
void
UnreadyPlayers();
enum {
MaxBuildErrorCount=255
};
int
lastErrors[MaxBuildErrorCount];
int
lastErrorsParameter[MaxBuildErrorCount];
int
lastErrorCount;
int
lastBotErrors[MaxBuildErrorCount];
int
lastBotErrorsParameter[MaxBuildErrorCount];
int
lastBotErrorCount;
void
UpdateAllTeamTotalTonnages();
Stuff::Scalar
GetCurrentTeamTotalTonage(int team);
void
VerifyPlayerVehicle(int connection);
void
VerifyLancemateVehicle(int connection);
virtual bool
VerifyPlayerVehicle(int connection, Stuff::MemoryStream *message);
int CheckAllowedChasis(int type, DWORD allowed_flags[2]);
int CheckAllowedBeam(int type, DWORD allowed_flags[2]);
int CheckAllowedMissile(int type, DWORD allowed_flags[2]);
int CheckAllowedProjectile(int type, DWORD allowed_flags[2]);
int CheckAllowedSubsystem(int type, DWORD allowed_flags[2]);
void
SetVehicleCreationMessage(int player_id, Stuff::MemoryStream *vehicle_message);
void
ClearVehicleCreationMessage(int player_id);
Stuff::MemoryStream *
GetVehicleCreationmessage(int player_id);
// FWang:: Hack for BRB 6/16/00
Stuff::MemoryStream *
GetBRBVehicleCreationmessage(int player_id);
void DeleteLancemateData();
void
SetMissionName(const char *name);
const char *
GetMissionName();
bool
TeamsAreFriendly(const Adept::ReplicatorID& inficting_id, const Adept::ReplicatorID& victim_id);
void
ResetMission();
void
RespawnMission();
void
RespawnConnection(int connection);
void
RespawnLancemate(int connection);
void
QueRespawnLancemate(int connection);
bool
BotsAllowed();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Lancemate stuff
enum { Maximum_Lancemates = MAX_LANCEMATES };
LancemateConnectionData
lancemateConnectionData[Maximum_Lancemates];
void
SetLancemateCreationMessage(int lancemate_index, Stuff::MemoryStream* lancemate_message);
Stuff::MemoryStream*
GetLancemateCreationMessage(int lancemate_index);
int
GetNextLancemateID();
void
RequestLancemateTeam(int bot, int team);
void
RequestLancemateMech(int bot, Adept::ResourceID mech_id, Stuff::MString &mech_name);
void
ClearLancemateCreationMessage(int bot);
bool
VerifyLancemateVehicle(int bot, Stuff::MemoryStream *stream);
bool
GetLanceMateResourceID(int bot_id, Adept::ResourceID &vehicle_id, Stuff::MemoryStream *stream);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ----------------------------SECURITY-------------------------------------
void
SquelchPlayer(int conneciton);
void
KickPlayer(int connection, bool print_msg = true);
void
BanPlayer(int connection);
void
BanPlayersISP(int connection);
bool IsPlayerBanned(const GUID& unique_key, const GUID& ngstat_id, DWORD isp);
void LoadBans();
GUID
GetUniqueKey();
GUID
localKey;
int ngLogBanCount;
int keyBanCount;
int ispBanCount;
GUID
*ngLogBans;
GUID
*keyBans;
DWORD
*ispBans;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Network Options
//
public:
enum Bandwidth_Type{
c_14_4kbps = 0,
c_28_8kbps,
c_56_6kbps,
c_64_kbps,
c_128_kbps,
c_384_kbps,
c_768_kbps,
c_1500_kbps,
c_10_Mbps,
c_100_Mbps
};
enum Connection_Type{
Modem = 0,
ISDN,
xDSL,
Cable,
LAN
};
static Bandwidth_Type
MyConnectionSpeed;
static Connection_Type
MyConnectionType;
static int
NetworkDebugLevel;
static int
DefaultPacketSize;
static int
ForceConnectionSpeed;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mission Parameter Support
bool
parametersDirty;
void
SendMissonParameters(int connection);
void
ReceiveMissionParameters(Stuff::MemoryStream *message);
void
BroadcastMissionParameters();
NetMissionParameters::MWNetMissionParameters *
GetLocalNetParams() const
{
return (NetMissionParameters::MWNetMissionParameters *)m_localMissionParameters;
}
NetMissionParameters::MWNetMissionParameters *
GetServerNetParams() const
{
return (NetMissionParameters::MWNetMissionParameters *)m_serverMissionParameters;
}
void
SaveServerOptions();
void
LoadServerOptions();
int
GetGameType();
int
GetTeamAlignment(int team);
void
SaveGameLog();
protected:
static const MessageEntry
MessageEntries[];
InputTrainer
m_InputTrainer;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Verification functions
public:
static bool
ValidateName(char *pszData, bool fCheckBSlash);
static bool
ValidatePath(char *pszData, bool fDirectory);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
public:
static void
OpenResources(
bool read_only,
DWORD content_version
);
virtual void
LoadMissionResources(const char *mission_name);
public: // jcem
STeamOrderCommandArray m_aPTOCs; // to player...
STeamOrderCommandArray m_aBTOCs; // to bots...
void ClearTOC();
void DoTOCs();
void EndTOC(bool bAutoDeny = false);
void DoRemoveTOCs(int connection);
public: // jcem
void CTCL_CheckRunningStart();
void CTCL_GoRunningState();
void CTCL_DoEndMission();
void SendSound(const Adept::ReplicatorID& inflicting_id, int nSound);
// team order
bool IsTeamAllowed() const;
int GetMechInfos(int nMode, SMechInfo aMechInfos[16], int& nOthers) const;
void TeamOrderMessageHandler(int connection, Stuff::MemoryStream *message);
void svrTeamOrderMessageHandler(int connection, Stuff::MemoryStream *message);
void RepTeamOrderMessageHandler(int connection, Stuff::MemoryStream *message);
void svrRepTeamOrderMessageHandler(int connection, Stuff::MemoryStream *message);
void DoTeamOrderSoundPlay(int nFrom, int nMsgIndex);
// team order
public:
static ClassData
*DefaultData;
public: // jcem
int m_nCamp_Stage;
int m_nCamp_Score, m_nCamp_Kills, m_nCamp_Deaths;
int m_nCamp_Time, m_nCamp_Mech, m_bCamp_Success;
virtual int CheckCampaign(int nType) const;
void CheckCampaignEnd();
};
extern STeamOrderCommand* g_pCurTOC;
}
MWObject* MWObjectFromRepId(const Adept::ReplicatorID& id);
Mech* MechFromRepId(const Adept::ReplicatorID& id);