From ba163d233e41b6641df8249c58e4cd9bbe69bf3b Mon Sep 17 00:00:00 2001 From: Gerhard Klassen Date: Sun, 29 Mar 2020 17:47:47 +0200 Subject: [PATCH] Minimap update + Colored Players + Colored Structures / Different colors for unbuild/build structures --- main/source/cl_dll/cl_dll.vcxproj | 2 +- main/source/dlls/Playtest/vc141.idb | Bin 4271104 -> 4271104 bytes main/source/dlls/client.cpp | 108 +- main/source/dlls/client.h | 3 +- main/source/dlls/game.cpp | 2 +- main/source/dlls/hl.vcxproj | 2 +- main/source/mod/AvHNetworkMessages.cpp | 3552 ++++++++++++------------ main/source/mod/AvHOverviewMap.cpp | 54 +- main/source/mod/AvHPlayer.cpp | 10 +- main/source/mod/AvHPlayer.h | 3 + main/source/mod/NetworkMeter.cpp | 2 + 11 files changed, 1905 insertions(+), 1833 deletions(-) diff --git a/main/source/cl_dll/cl_dll.vcxproj b/main/source/cl_dll/cl_dll.vcxproj index b682ae9c..603f4466 100644 --- a/main/source/cl_dll/cl_dll.vcxproj +++ b/main/source/cl_dll/cl_dll.vcxproj @@ -49,7 +49,7 @@ OnlyExplicitInline false $(SolutionDir);$(SolutionDir)\particles;$(SolutionDir)\includes\lpng1251;$(SolutionDir)\includes\zlib-1.2.8;$(SolutionDir)\includes\fmod\inc;$(SolutionDir)\includes\vgui\include;../public;../common;../external;../pm_shared;../game_shared;../mod;../util;../ui;../engine;../cl_dll;../dlls - NDEBUG;WIN32;_WINDOWS;AVH_CLIENT;USE_OLDAUTH;_X86_ + USE_NETWORK_METERING;NDEBUG;WIN32;_WINDOWS;AVH_CLIENT;USE_OLDAUTH;_X86_ true true diff --git a/main/source/dlls/Playtest/vc141.idb b/main/source/dlls/Playtest/vc141.idb index 4305d8b666785cfd72ec354c1b9ae080c1e6afd4..67a621f6eac79b2a574ee54b78041b94cba01a52 100644 GIT binary patch delta 100127 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 CnG|RM diff --git a/main/source/dlls/client.cpp b/main/source/dlls/client.cpp index 7704d0e7..af6c7271 100644 --- a/main/source/dlls/client.cpp +++ b/main/source/dlls/client.cpp @@ -163,7 +163,8 @@ extern int g_teamplay; vector playerReadyList; -vector playerList; +vector marinesPlayerList; +vector aliensPlayerList; /* * used by kill command and disconnect command * ROBIN: Moved here from player.cpp, to allow multiple player models @@ -368,38 +369,57 @@ void ClientPutInServer( edict_t *pEntity ) void Player_Ready(edict_t* pEntity, bool ready) { AvHPlayer* theTalkingPlayer = dynamic_cast(CBaseEntity::Instance(pEntity)); // Player is ready - if (ready){ - if (std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex()) == std::end(playerReadyList)) { - playerReadyList.push_back(theTalkingPlayer->entindex()); - g_engfuncs.pfnServerPrint(( "ADD playerReady " +std::to_string(theTalkingPlayer->entindex()) ).c_str()); - - } - } - else { // Player is not ready - if (std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex()) != std::end(playerReadyList)) { - playerReadyList.erase(std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex())); - g_engfuncs.pfnServerPrint(("REMOVE playerReady " + std::to_string(theTalkingPlayer->entindex())).c_str()); - } + //if (theTalkingPlayer->GetTeam == TEAM_ONE || theTalkingPlayer->GetTeam == TEAM_TWO) { + // if (ready) { + // if (std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex()) == std::end(playerReadyList)) { + // playerReadyList.push_back(theTalkingPlayer->entindex()); + // g_engfuncs.pfnServerPrint(("ADD playerReady " + std::to_string(theTalkingPlayer->entindex())).c_str()); - } + // } + // } + // else { // Player is not ready + // if (std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex()) != std::end(playerReadyList)) { + // playerReadyList.erase(std::find(std::begin(playerReadyList), std::end(playerReadyList), theTalkingPlayer->entindex())); + // g_engfuncs.pfnServerPrint(("REMOVE playerReady " + std::to_string(theTalkingPlayer->entindex())).c_str()); + // } - bool allready = true; - // check wether all players are ready - if (playerList.size() >= 12) { - for (int i : playerList) { - if (std::find(std::begin(playerReadyList), std::end(playerReadyList), i) != std::end(playerReadyList)) { - allready = false; - } - } - } - if (allready) { - AvHTeam* teamA = GetGameRules()->GetTeam(AvHTeamNumber::TEAM_ONE); - AvHTeam* teamB = GetGameRules()->GetTeam(AvHTeamNumber::TEAM_TWO); - teamA->SetIsReady(); - teamB->SetIsReady(); - } + + // Loop trough all players + //AvHPlayer* client = NULL; + //while (((client = (AvHPlayer*)UTIL_FindEntityByClassname(client, "player")) != NULL) && (!FNullEnt(client->edict()))) { + + // if (client->GetTeam == AvHTeamNumber::TEAM_ONE){ + // marinesPlayerList.push_back(client->entindex); + // + // } + // else if (client->GetTeam == AvHTeamNumber::TEAM_TWO) { + // aliensPlayerList.push_back(client->entindex); + + // } + + // // in case someone left the team remove him + // if (std::find(std::begin(aliensPlayerList), std::end(aliensPlayerList), client->entindex) != std::end(aliensPlayerList)) { + // aliensPlayerList.erase(std::find(std::begin(aliensPlayerList), std::end(aliensPlayerList), client->entindex)); + // } + // if (std::find(std::begin(marinesPlayerList), std::end(marinesPlayerList), client->entindex) != std::end(marinesPlayerList)) { + // marinesPlayerList.erase(std::find(std::begin(aliensPlayerList), std::end(aliensPlayerList), client->entindex)); + // } + //} + + + + //bool allready = true; + // check wether all players are ready + //if (marinesPlayerList.size() >= 12) { + // for (int i : marinesPlayerList) { + // if (std::find(std::begin(playerReadyList), std::end(playerReadyList), i) != std::end(playerReadyList)) { + // allready = false; + // } + // } + //} + } @@ -444,27 +464,27 @@ void Host_Say( edict_t *pEntity, int teamonly ) if(!strcmp(CMD_ARGV(1), kReadyNotification)) { - Player_Ready(pEntity, true); + //Player_Ready(pEntity, true); // Team is ready - /* + AvHTeam* theTeam = GetGameRules()->GetTeam((AvHTeamNumber)(pEntity->v.team)); if(theTeam && !theTeam->GetIsReady()) { theTeam->SetIsReady(); } - */ + } else if (!strcmp(CMD_ARGV(1), kNotReadyNotification)) { Player_Ready(pEntity, false); // Team is no longer ready - /* + AvHTeam* theTeam = GetGameRules()->GetTeam((AvHTeamNumber)(pEntity->v.team)); if(theTeam && theTeam->GetIsReady()) { theTeam->SetIsReady(false); } - */ + } } } @@ -555,25 +575,6 @@ void Host_Say( edict_t *pEntity, int teamonly ) bool theClientInReadyRoom = client->GetInReadyRoom(); - // Create a list of all players that are on Marine or Alien team - if (client->GetTeam()==TEAM_ONE || client->GetTeam() == TEAM_TWO) { - if (std::find(std::begin(playerList), std::end(playerList), client->entindex()) == std::end(playerList)) { - playerList.push_back(client->entindex()); - g_engfuncs.pfnServerPrint(("REMOVE playerList " + std::to_string(theTalkingPlayer->entindex())).c_str()); - } - } - else { - playerList.erase(std::find(std::begin(playerList), std::end(playerList), client->entindex())); - g_engfuncs.pfnServerPrint(("REMOVE playerList " + std::to_string(theTalkingPlayer->entindex())).c_str()); - // also remove from the ready lists if they are in... - if (std::find(std::begin(playerReadyList), std::end(playerReadyList), client->entindex()) != std::end(playerReadyList)) { - playerReadyList.erase(std::find(std::begin(playerReadyList), std::end(playerReadyList), client->entindex())); - g_engfuncs.pfnServerPrint(("REMOVE playerReady" + std::to_string(theTalkingPlayer->entindex())).c_str()); - } - } - - - if (theClientInReadyRoom != theTalkerInReadyRoom && !theClientIsHLTV) { continue; @@ -919,6 +920,7 @@ void ParmsChangeLevel( void ) if ( pSaveData ) pSaveData->connectionCount = BuildChangeList( pSaveData->levelList, MAX_LEVEL_CONNECTIONS ); + } void ShowMenu(entvars_s *pev, int ValidSlots, int DisplayTime, BOOL ShowLater, char Menu[500]) diff --git a/main/source/dlls/client.h b/main/source/dlls/client.h index df5c2a22..d6d98ff5 100644 --- a/main/source/dlls/client.h +++ b/main/source/dlls/client.h @@ -65,7 +65,8 @@ extern int AllowLagCompensation( void ); extern void Player_Ready(edict_t* pEntity, bool ready); extern vector playerReadyList; -extern vector playerList; +extern vector alienPlayersList; +extern vector marinePlayersList; //extern bool AvHClientCommand( edict_t *pEntity ); diff --git a/main/source/dlls/game.cpp b/main/source/dlls/game.cpp index 32fa9196..cadb7f1b 100644 --- a/main/source/dlls/game.cpp +++ b/main/source/dlls/game.cpp @@ -248,7 +248,7 @@ void GameDLLInit( void ) #ifdef USE_NETWORK_METERING CVAR_REGISTER (&avh_networkdebug); - CVAR_REGISTER (&avh_drawinvisible); +// CVAR_REGISTER (&avh_drawinvisible); #endif #ifdef PROFILE_BUILD diff --git a/main/source/dlls/hl.vcxproj b/main/source/dlls/hl.vcxproj index ca76535d..1981e109 100644 --- a/main/source/dlls/hl.vcxproj +++ b/main/source/dlls/hl.vcxproj @@ -195,7 +195,7 @@ Full AnySuitable true - NDEBUG;WIN32;_WINDOWS;QUIVER;VOXEL;QUAKE2;VALVE_DLL;AVH_SERVER;AVH_NO_NEXUS;USE_OLDAUTH + USE_NETWORK_METERING;NDEBUG;WIN32;_WINDOWS;QUIVER;VOXEL;QUAKE2;VALVE_DLL;AVH_SERVER;AVH_NO_NEXUS;USE_OLDAUTH true true MultiThreadedDLL diff --git a/main/source/mod/AvHNetworkMessages.cpp b/main/source/mod/AvHNetworkMessages.cpp index 7feaeea2..847e7f37 100644 --- a/main/source/mod/AvHNetworkMessages.cpp +++ b/main/source/mod/AvHNetworkMessages.cpp @@ -13,88 +13,88 @@ #ifdef AVH_SERVER int g_msgAmmoPickup = 0, g_msgAmmoX, g_msgBattery, g_msgCurWeapon, g_msgDamage, //5 - g_msgDeathMsg, g_msgFade, g_msgFlashlight, g_msgGeigerRange, g_msgHealth, //10 - g_msgHideWeapon, g_msgHudText, g_msgHudText2, g_msgInitHUD, g_msgItemPickup, - g_msgMOTD, g_msgResetHUD, g_msgSayText, g_msgScoreInfo, g_msgServerName, - g_msgSetFOV, g_msgShake, g_msgShowGameTitle, g_msgShowMenu, g_msgStatusText, - g_msgStatusValue, g_msgTeamInfo, g_msgTeamNames, g_msgTeamScore, g_msgTextMsg, - g_msgTrain, g_msgWeaponList, g_msgWeapPickup, g_msgAlienInfo, g_msgBalanceVar, - g_msgBlipList, g_msgBuildMiniMap, g_msgClientScripts, g_msgDebugCSP, g_msgEditPS, - g_msgFog, g_msgGameStatus, g_msgListPS, g_msgPlayHUDNotification, g_msgProgressBar, - g_msgServerVar, g_msgSetGammaRamp, g_msgSetOrder, g_msgSetParticleTemplates,g_msgDelParts, - g_msgSetSelect, g_msgSetRequest, g_msgSetSoundNames, g_msgSetTechNodes, g_msgSetTechSlots, - g_msgSetTopDown, g_msgSetupMap, g_msgUpdateCountdown, g_msgUpdateEntityHierarchy, g_msgDelEntityHierarchy, - g_msgProfileInfo, g_msgNexusBytes, g_msgIssueOrder, g_msgHUDSetUpgrades; +g_msgDeathMsg, g_msgFade, g_msgFlashlight, g_msgGeigerRange, g_msgHealth, //10 +g_msgHideWeapon, g_msgHudText, g_msgHudText2, g_msgInitHUD, g_msgItemPickup, +g_msgMOTD, g_msgResetHUD, g_msgSayText, g_msgScoreInfo, g_msgServerName, +g_msgSetFOV, g_msgShake, g_msgShowGameTitle, g_msgShowMenu, g_msgStatusText, +g_msgStatusValue, g_msgTeamInfo, g_msgTeamNames, g_msgTeamScore, g_msgTextMsg, +g_msgTrain, g_msgWeaponList, g_msgWeapPickup, g_msgAlienInfo, g_msgBalanceVar, +g_msgBlipList, g_msgBuildMiniMap, g_msgClientScripts, g_msgDebugCSP, g_msgEditPS, +g_msgFog, g_msgGameStatus, g_msgListPS, g_msgPlayHUDNotification, g_msgProgressBar, +g_msgServerVar, g_msgSetGammaRamp, g_msgSetOrder, g_msgSetParticleTemplates, g_msgDelParts, +g_msgSetSelect, g_msgSetRequest, g_msgSetSoundNames, g_msgSetTechNodes, g_msgSetTechSlots, +g_msgSetTopDown, g_msgSetupMap, g_msgUpdateCountdown, g_msgUpdateEntityHierarchy, g_msgDelEntityHierarchy, +g_msgProfileInfo, g_msgNexusBytes, g_msgIssueOrder, g_msgHUDSetUpgrades; void Net_InitializeMessages(void) { - if( g_msgAmmoPickup != 0 ) { return; } - g_msgAmmoPickup = REG_USER_MSG("AmmoPickup", 2 ); - g_msgAmmoX = REG_USER_MSG("AmmoX", 2 ); - g_msgBattery = REG_USER_MSG( "Battery", 2 ); - g_msgCurWeapon = REG_USER_MSG( "CurWeapon", 3 ); - g_msgDamage = REG_USER_MSG( "Damage", 12 ); - g_msgDeathMsg = REG_USER_MSG( "DeathMsg", -1 ); - g_msgFade = REG_USER_MSG( "ScreenFade", sizeof(ScreenFade) ); - g_msgFlashlight = REG_USER_MSG( "FLashlight", 2 ); - g_msgGeigerRange = REG_USER_MSG( "Geiger", 1 ); - g_msgHealth = REG_USER_MSG( "Health", 2 ); - g_msgHideWeapon = REG_USER_MSG( "HideWeapon", 1 ); - g_msgHudText = REG_USER_MSG( "HudText", -1 ); - g_msgHudText2 = REG_USER_MSG( "HudText2", -1 ); - g_msgInitHUD = REG_USER_MSG( "InitHUD", 0 ); - g_msgItemPickup = REG_USER_MSG( "ItemPickup", -1 ); - g_msgMOTD = REG_USER_MSG( "MOTD", -1 ); - g_msgResetHUD = REG_USER_MSG( "ResetHUD", 0 ); - g_msgSayText = REG_USER_MSG( "SayText", -1 ); + if (g_msgAmmoPickup != 0) { return; } + g_msgAmmoPickup = REG_USER_MSG("AmmoPickup", 2); + g_msgAmmoX = REG_USER_MSG("AmmoX", 2); + g_msgBattery = REG_USER_MSG("Battery", 2); + g_msgCurWeapon = REG_USER_MSG("CurWeapon", 3); + g_msgDamage = REG_USER_MSG("Damage", 12); + g_msgDeathMsg = REG_USER_MSG("DeathMsg", -1); + g_msgFade = REG_USER_MSG("ScreenFade", sizeof(ScreenFade)); + g_msgFlashlight = REG_USER_MSG("FLashlight", 2); + g_msgGeigerRange = REG_USER_MSG("Geiger", 1); + g_msgHealth = REG_USER_MSG("Health", 2); + g_msgHideWeapon = REG_USER_MSG("HideWeapon", 1); + g_msgHudText = REG_USER_MSG("HudText", -1); + g_msgHudText2 = REG_USER_MSG("HudText2", -1); + g_msgInitHUD = REG_USER_MSG("InitHUD", 0); + g_msgItemPickup = REG_USER_MSG("ItemPickup", -1); + g_msgMOTD = REG_USER_MSG("MOTD", -1); + g_msgResetHUD = REG_USER_MSG("ResetHUD", 0); + g_msgSayText = REG_USER_MSG("SayText", -1); // : 0001073 - g_msgScoreInfo = REG_USER_MSG( "ScoreInfo", -1 ); - g_msgServerName = REG_USER_MSG( "ServerName", -1 ); - g_msgSetFOV = REG_USER_MSG( "SetFOV", 1 ); - g_msgShake = REG_USER_MSG( "ScreenShake", 6 ); - g_msgShowGameTitle = REG_USER_MSG( "GameTitle", 1 ); - g_msgShowMenu = REG_USER_MSG( "ShowMenu", -1 ); - g_msgStatusText = REG_USER_MSG( "StatusText", -1 ); - g_msgStatusValue = REG_USER_MSG( "StatusValue", 3 ); - g_msgTeamInfo = REG_USER_MSG( "TeamInfo", -1 ); - g_msgTeamNames = REG_USER_MSG( "TeamNames", -1 ); - g_msgTeamScore = REG_USER_MSG( "TeamScore", -1 ); - g_msgTextMsg = REG_USER_MSG( "TextMsg", -1 ); - g_msgTrain = REG_USER_MSG( "Train", 1 ); - g_msgWeaponList = REG_USER_MSG( "WeaponList", -1 ); - g_msgWeapPickup = REG_USER_MSG( "WeapPickup", 1 ); - g_msgAlienInfo = REG_USER_MSG( "AlienInfo", -1 ); - g_msgBalanceVar = REG_USER_MSG( "BalanceVar", -1 ); - g_msgBlipList = REG_USER_MSG( "BlipList", -1 ); - g_msgBuildMiniMap = REG_USER_MSG( "MiniMap", -1 ); - g_msgClientScripts = REG_USER_MSG( "ClScript", -1 ); - g_msgDebugCSP = REG_USER_MSG( "DebugCSP", 14 ); - g_msgEditPS = REG_USER_MSG( "EditPS", 2 ); - g_msgFog = REG_USER_MSG( "Fog", -1 ); - g_msgGameStatus = REG_USER_MSG( "GameStatus", -1 ); - g_msgListPS = REG_USER_MSG( "ListPS", -1 ); - g_msgPlayHUDNotification = REG_USER_MSG( "PlayHUDNot", 6 ); - g_msgHUDSetUpgrades = REG_USER_MSG( "SetUpgrades", 1); - g_msgProgressBar = REG_USER_MSG( "Progress", -1 ); - g_msgServerVar = REG_USER_MSG( "ServerVar", -1 ); - g_msgSetGammaRamp = REG_USER_MSG( "SetGmma", 1 ); - g_msgSetOrder = REG_USER_MSG( "SetOrder", -1 ); - g_msgSetParticleTemplates = REG_USER_MSG( "Particles", -1 ); - g_msgDelParts = REG_USER_MSG( "DelParts", 0); - g_msgSetSelect = REG_USER_MSG( "SetSelect", -1 ); - g_msgSetRequest = REG_USER_MSG( "SetRequest", 2 ); - g_msgSetSoundNames = REG_USER_MSG( "SoundNames", -1 ); - g_msgSetTechNodes = REG_USER_MSG( "SetTech", 9 ); - g_msgSetTechSlots = REG_USER_MSG( "TechSlots", 1 + kNumTechSlots ); - g_msgSetTopDown = REG_USER_MSG( "SetTopDown", -1 ); - g_msgSetupMap = REG_USER_MSG( "SetupMap", -1 ); - g_msgUpdateCountdown = REG_USER_MSG( "Countdown", 1 ); - g_msgUpdateEntityHierarchy = REG_USER_MSG( "EntHier", -1 ); - g_msgDelEntityHierarchy = REG_USER_MSG( "DelEntHier", 0); - g_msgProfileInfo = REG_USER_MSG( "ProfileInfo", 8 ); - g_msgNexusBytes = REG_USER_MSG( "NexusBytes", -1 ); + g_msgScoreInfo = REG_USER_MSG("ScoreInfo", -1); + g_msgServerName = REG_USER_MSG("ServerName", -1); + g_msgSetFOV = REG_USER_MSG("SetFOV", 1); + g_msgShake = REG_USER_MSG("ScreenShake", 6); + g_msgShowGameTitle = REG_USER_MSG("GameTitle", 1); + g_msgShowMenu = REG_USER_MSG("ShowMenu", -1); + g_msgStatusText = REG_USER_MSG("StatusText", -1); + g_msgStatusValue = REG_USER_MSG("StatusValue", 3); + g_msgTeamInfo = REG_USER_MSG("TeamInfo", -1); + g_msgTeamNames = REG_USER_MSG("TeamNames", -1); + g_msgTeamScore = REG_USER_MSG("TeamScore", -1); + g_msgTextMsg = REG_USER_MSG("TextMsg", -1); + g_msgTrain = REG_USER_MSG("Train", 1); + g_msgWeaponList = REG_USER_MSG("WeaponList", -1); + g_msgWeapPickup = REG_USER_MSG("WeapPickup", 1); + g_msgAlienInfo = REG_USER_MSG("AlienInfo", -1); + g_msgBalanceVar = REG_USER_MSG("BalanceVar", -1); + g_msgBlipList = REG_USER_MSG("BlipList", -1); + g_msgBuildMiniMap = REG_USER_MSG("MiniMap", -1); + g_msgClientScripts = REG_USER_MSG("ClScript", -1); + g_msgDebugCSP = REG_USER_MSG("DebugCSP", 14); + g_msgEditPS = REG_USER_MSG("EditPS", 2); + g_msgFog = REG_USER_MSG("Fog", -1); + g_msgGameStatus = REG_USER_MSG("GameStatus", -1); + g_msgListPS = REG_USER_MSG("ListPS", -1); + g_msgPlayHUDNotification = REG_USER_MSG("PlayHUDNot", 6); + g_msgHUDSetUpgrades = REG_USER_MSG("SetUpgrades", 1); + g_msgProgressBar = REG_USER_MSG("Progress", -1); + g_msgServerVar = REG_USER_MSG("ServerVar", -1); + g_msgSetGammaRamp = REG_USER_MSG("SetGmma", 1); + g_msgSetOrder = REG_USER_MSG("SetOrder", -1); + g_msgSetParticleTemplates = REG_USER_MSG("Particles", -1); + g_msgDelParts = REG_USER_MSG("DelParts", 0); + g_msgSetSelect = REG_USER_MSG("SetSelect", -1); + g_msgSetRequest = REG_USER_MSG("SetRequest", 2); + g_msgSetSoundNames = REG_USER_MSG("SoundNames", -1); + g_msgSetTechNodes = REG_USER_MSG("SetTech", 9); + g_msgSetTechSlots = REG_USER_MSG("TechSlots", 1 + kNumTechSlots); + g_msgSetTopDown = REG_USER_MSG("SetTopDown", -1); + g_msgSetupMap = REG_USER_MSG("SetupMap", -1); + g_msgUpdateCountdown = REG_USER_MSG("Countdown", 1); + g_msgUpdateEntityHierarchy = REG_USER_MSG("EntHier", -1); + g_msgDelEntityHierarchy = REG_USER_MSG("DelEntHier", 0); + g_msgProfileInfo = REG_USER_MSG("ProfileInfo", 8); + g_msgNexusBytes = REG_USER_MSG("NexusBytes", -1); // : 0000971 - g_msgIssueOrder = REG_USER_MSG( "IssueOrder", 9); + g_msgIssueOrder = REG_USER_MSG("IssueOrder", 9); // : } #endif @@ -105,816 +105,816 @@ void Net_InitializeMessages(void) #define END_READ() ; #ifndef AVH_SERVER - void NetMsg_AmmoPickup( void* const buffer, const int size, int& index, int& count ) - { - BEGIN_READ( buffer, size ); - index = READ_BYTE(); - count = READ_BYTE(); - END_READ(); - } +void NetMsg_AmmoPickup(void* const buffer, const int size, int& index, int& count) +{ + BEGIN_READ(buffer, size); + index = READ_BYTE(); + count = READ_BYTE(); + END_READ(); +} #else - void NetMsg_AmmoPickup( entvars_t* const pev, const int index, const int count ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgAmmoPickup, NULL, pev ); - WRITE_BYTE( index ); - WRITE_BYTE( count ); - MESSAGE_END(); - } +void NetMsg_AmmoPickup(entvars_t* const pev, const int index, const int count) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgAmmoPickup, NULL, pev); + WRITE_BYTE(index); + WRITE_BYTE(count); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_AmmoX( void* const buffer, const int size, int& index, int& count ) - { - BEGIN_READ( buffer, size ); - index = READ_BYTE(); - count = READ_BYTE(); - END_READ(); - } +void NetMsg_AmmoX(void* const buffer, const int size, int& index, int& count) +{ + BEGIN_READ(buffer, size); + index = READ_BYTE(); + count = READ_BYTE(); + END_READ(); +} #else - void NetMsg_AmmoX( entvars_t *pev, const int index, const int count ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgAmmoX, NULL, pev ); - WRITE_BYTE( index ); - WRITE_BYTE( count ); - MESSAGE_END(); - } +void NetMsg_AmmoX(entvars_t* pev, const int index, const int count) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgAmmoX, NULL, pev); + WRITE_BYTE(index); + WRITE_BYTE(count); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Battery( void* const buffer, const int size, int& armor_amount ) - { - BEGIN_READ( buffer, size ); - armor_amount = READ_SHORT(); - END_READ(); - } +void NetMsg_Battery(void* const buffer, const int size, int& armor_amount) +{ + BEGIN_READ(buffer, size); + armor_amount = READ_SHORT(); + END_READ(); +} #else - void NetMsg_Battery( entvars_t* const pev, const int armor_amount ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgBattery, NULL, pev ); - WRITE_SHORT( armor_amount ); - MESSAGE_END(); - } +void NetMsg_Battery(entvars_t* const pev, const int armor_amount) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBattery, NULL, pev); + WRITE_SHORT(armor_amount); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_CurWeapon( void* const buffer, const int size, int& state, int& id, int& clip ) - { - BEGIN_READ( buffer, size ); - state = READ_BYTE(); - id = READ_BYTE(); - clip = READ_BYTE(); - END_READ(); - } +void NetMsg_CurWeapon(void* const buffer, const int size, int& state, int& id, int& clip) +{ + BEGIN_READ(buffer, size); + state = READ_BYTE(); + id = READ_BYTE(); + clip = READ_BYTE(); + END_READ(); +} #else - void NetMsg_CurWeapon( entvars_t* const pev, const int state, const int id, const int clip ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgCurWeapon, NULL, pev ); - WRITE_BYTE( state ); - WRITE_BYTE( id ); - WRITE_BYTE( clip ); - MESSAGE_END(); - } +void NetMsg_CurWeapon(entvars_t* const pev, const int state, const int id, const int clip) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgCurWeapon, NULL, pev); + WRITE_BYTE(state); + WRITE_BYTE(id); + WRITE_BYTE(clip); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Damage( void* const buffer, const int size, int& dmg_save, int& dmg_take, long& bits, float* origin ) - { - BEGIN_READ( buffer, size ); - dmg_save = READ_BYTE(); - dmg_take = READ_BYTE(); - bits = READ_LONG(); - origin[0] = READ_COORD(); - origin[1] = READ_COORD(); - origin[2] = READ_COORD(); - END_READ(); - } +void NetMsg_Damage(void* const buffer, const int size, int& dmg_save, int& dmg_take, long& bits, float* origin) +{ + BEGIN_READ(buffer, size); + dmg_save = READ_BYTE(); + dmg_take = READ_BYTE(); + bits = READ_LONG(); + origin[0] = READ_COORD(); + origin[1] = READ_COORD(); + origin[2] = READ_COORD(); + END_READ(); +} #else - void NetMsg_Damage( entvars_t* const pev, const int dmg_save, const int dmg_take, const long bits, const float* origin ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgDamage, NULL, pev ); - WRITE_BYTE( dmg_save ); - WRITE_BYTE( dmg_take ); - WRITE_LONG( bits ); - WRITE_COORD( origin[0] ); - WRITE_COORD( origin[1] ); - WRITE_COORD( origin[2] ); - MESSAGE_END(); - } +void NetMsg_Damage(entvars_t* const pev, const int dmg_save, const int dmg_take, const long bits, const float* origin) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgDamage, NULL, pev); + WRITE_BYTE(dmg_save); + WRITE_BYTE(dmg_take); + WRITE_LONG(bits); + WRITE_COORD(origin[0]); + WRITE_COORD(origin[1]); + WRITE_COORD(origin[2]); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_DeathMsg( void* const buffer, const int size, int& killer_index, int& victim_index, string& weapon_name ) - { - BEGIN_READ( buffer, size ); - killer_index = READ_BYTE(); - victim_index = READ_BYTE(); - weapon_name = READ_STRING(); - END_READ(); - } +void NetMsg_DeathMsg(void* const buffer, const int size, int& killer_index, int& victim_index, string& weapon_name) +{ + BEGIN_READ(buffer, size); + killer_index = READ_BYTE(); + victim_index = READ_BYTE(); + weapon_name = READ_STRING(); + END_READ(); +} #else - void NetMsg_DeathMsg( const int killer_index, const int victim_index, string& weapon_name ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgDeathMsg ); - WRITE_BYTE( killer_index ); - WRITE_BYTE( victim_index ); - WRITE_STRING( weapon_name.c_str() ); - MESSAGE_END(); - } +void NetMsg_DeathMsg(const int killer_index, const int victim_index, string& weapon_name) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgDeathMsg); + WRITE_BYTE(killer_index); + WRITE_BYTE(victim_index); + WRITE_STRING(weapon_name.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Fade( void* const buffer, const int size, ScreenFade& fade ) - { - BEGIN_READ( buffer, size ); - fade.duration = READ_SHORT(); - fade.holdTime = READ_SHORT(); - fade.fadeFlags = READ_SHORT(); - fade.r = READ_BYTE(); - fade.g = READ_BYTE(); - fade.b = READ_BYTE(); - fade.a = READ_BYTE(); - END_READ(); - } +void NetMsg_Fade(void* const buffer, const int size, ScreenFade& fade) +{ + BEGIN_READ(buffer, size); + fade.duration = READ_SHORT(); + fade.holdTime = READ_SHORT(); + fade.fadeFlags = READ_SHORT(); + fade.r = READ_BYTE(); + fade.g = READ_BYTE(); + fade.b = READ_BYTE(); + fade.a = READ_BYTE(); + END_READ(); +} #else - void NetMsg_Fade( entvars_t* const pev, const ScreenFade& fade ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgFade, NULL, pev ); // use the magic #1 for "one client" - WRITE_SHORT( fade.duration ); - WRITE_SHORT( fade.holdTime ); - WRITE_SHORT( fade.fadeFlags ); - WRITE_BYTE( fade.r ); - WRITE_BYTE( fade.g ); - WRITE_BYTE( fade.b ); - WRITE_BYTE( fade.a ); - MESSAGE_END(); - } +void NetMsg_Fade(entvars_t* const pev, const ScreenFade& fade) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgFade, NULL, pev); // use the magic #1 for "one client" + WRITE_SHORT(fade.duration); + WRITE_SHORT(fade.holdTime); + WRITE_SHORT(fade.fadeFlags); + WRITE_BYTE(fade.r); + WRITE_BYTE(fade.g); + WRITE_BYTE(fade.b); + WRITE_BYTE(fade.a); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Flashlight( void* const buffer, const int size, int& is_on, int& flash_battery ) - { - BEGIN_READ( buffer, size ); - is_on = READ_BYTE(); - flash_battery = READ_BYTE(); - END_READ(); - } +void NetMsg_Flashlight(void* const buffer, const int size, int& is_on, int& flash_battery) +{ + BEGIN_READ(buffer, size); + is_on = READ_BYTE(); + flash_battery = READ_BYTE(); + END_READ(); +} #else - void NetMsg_Flashlight( entvars_t* const pev, const int is_on, const int flash_battery ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgFlashlight, NULL, pev ); - WRITE_BYTE( is_on ); - WRITE_BYTE( flash_battery ); - MESSAGE_END(); - } +void NetMsg_Flashlight(entvars_t* const pev, const int is_on, const int flash_battery) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgFlashlight, NULL, pev); + WRITE_BYTE(is_on); + WRITE_BYTE(flash_battery); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_GeigerRange( void* const buffer, const int size, int& range ) - { - BEGIN_READ( buffer, size ); - range = READ_BYTE(); - END_READ(); - } +void NetMsg_GeigerRange(void* const buffer, const int size, int& range) +{ + BEGIN_READ(buffer, size); + range = READ_BYTE(); + END_READ(); +} #else - void NetMsg_GeigerRange( entvars_t* const pev, const int range ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgGeigerRange, NULL, pev ); - WRITE_BYTE( range ); - MESSAGE_END(); - } +void NetMsg_GeigerRange(entvars_t* const pev, const int range) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgGeigerRange, NULL, pev); + WRITE_BYTE(range); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Health( void* const buffer, const int size, int& health ) - { - BEGIN_READ( buffer, size ); - health = READ_SHORT(); - END_READ(); - } +void NetMsg_Health(void* const buffer, const int size, int& health) +{ + BEGIN_READ(buffer, size); + health = READ_SHORT(); + END_READ(); +} #else - void NetMsg_Health( entvars_t* const pev, const int health ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgHealth, NULL, pev ); - WRITE_SHORT( health ); - MESSAGE_END(); - } +void NetMsg_Health(entvars_t* const pev, const int health) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgHealth, NULL, pev); + WRITE_SHORT(health); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_HideWeapon( void* const buffer, const int size, int& hide ) - { - BEGIN_READ( buffer, size ); - hide = READ_BYTE(); - END_READ(); - } +void NetMsg_HideWeapon(void* const buffer, const int size, int& hide) +{ + BEGIN_READ(buffer, size); + hide = READ_BYTE(); + END_READ(); +} #else - void NetMsg_HideWeapon( entvars_t* const pev, const int hide ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgHideWeapon, NULL, pev ); - WRITE_BYTE( hide ); - MESSAGE_END(); - } +void NetMsg_HideWeapon(entvars_t* const pev, const int hide) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgHideWeapon, NULL, pev); + WRITE_BYTE(hide); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_HudText( void* const buffer, const int size, string& text ) - { - BEGIN_READ( buffer, size ); - text = READ_STRING(); - END_READ(); - } +void NetMsg_HudText(void* const buffer, const int size, string& text) +{ + BEGIN_READ(buffer, size); + text = READ_STRING(); + END_READ(); +} #else - void NetMsg_HudText( entvars_t* const pev, const string& text ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgHudText, NULL, pev ); - WRITE_STRING( text.c_str() ); - MESSAGE_END(); - } +void NetMsg_HudText(entvars_t* const pev, const string& text) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgHudText, NULL, pev); + WRITE_STRING(text.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_HudText2( void* const buffer, const int size, string& text, int& flags ) - { - BEGIN_READ( buffer, size ); - text = READ_STRING(); - flags = READ_BYTE(); - END_READ(); - } +void NetMsg_HudText2(void* const buffer, const int size, string& text, int& flags) +{ + BEGIN_READ(buffer, size); + text = READ_STRING(); + flags = READ_BYTE(); + END_READ(); +} #else - void NetMsg_HudText2( entvars_t* const pev, const string& text, const int flags ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgHudText2, NULL, pev ); - WRITE_STRING( text.c_str() ); - WRITE_BYTE( flags ); - MESSAGE_END(); - } +void NetMsg_HudText2(entvars_t* const pev, const string& text, const int flags) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgHudText2, NULL, pev); + WRITE_STRING(text.c_str()); + WRITE_BYTE(flags); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_InitHUD( void* const buffer, const int size ) - { - BEGIN_READ( buffer, size ); - END_READ(); - } +void NetMsg_InitHUD(void* const buffer, const int size) +{ + BEGIN_READ(buffer, size); + END_READ(); +} #else - void NetMsg_InitHUD( entvars_t* const pev ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgInitHUD, NULL, pev ); - MESSAGE_END(); - } +void NetMsg_InitHUD(entvars_t* const pev) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgInitHUD, NULL, pev); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ItemPickup( void* const buffer, const int size, string& item_name ) - { - BEGIN_READ( buffer, size ); - item_name = READ_STRING(); - END_READ(); - } +void NetMsg_ItemPickup(void* const buffer, const int size, string& item_name) +{ + BEGIN_READ(buffer, size); + item_name = READ_STRING(); + END_READ(); +} #else - void NetMsg_ItemPickup( entvars_t* const pev, const string& item_name ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgItemPickup, NULL, pev ); - WRITE_STRING( item_name.c_str() ); - MESSAGE_END(); - } +void NetMsg_ItemPickup(entvars_t* const pev, const string& item_name) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgItemPickup, NULL, pev); + WRITE_STRING(item_name.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_MOTD( void* const buffer, const int size, bool& is_finished, string& MOTD ) - { - BEGIN_READ( buffer, size ); - is_finished = (READ_BYTE() == 1); - MOTD = READ_STRING(); - END_READ(); - } +void NetMsg_MOTD(void* const buffer, const int size, bool& is_finished, string& MOTD) +{ + BEGIN_READ(buffer, size); + is_finished = (READ_BYTE() == 1); + MOTD = READ_STRING(); + END_READ(); +} #else - void NetMsg_MOTD( entvars_t* const pev, const bool is_finished, const string& MOTD ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgMOTD, NULL, pev ); - WRITE_BYTE( is_finished ? 1 : 0); - WRITE_STRING( MOTD.c_str() ); - MESSAGE_END(); - } +void NetMsg_MOTD(entvars_t* const pev, const bool is_finished, const string& MOTD) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgMOTD, NULL, pev); + WRITE_BYTE(is_finished ? 1 : 0); + WRITE_STRING(MOTD.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ResetHUD( void* const buffer, const int size ) - { - BEGIN_READ( buffer, size ); - END_READ(); - } +void NetMsg_ResetHUD(void* const buffer, const int size) +{ + BEGIN_READ(buffer, size); + END_READ(); +} #else - void NetMsg_ResetHUD( entvars_t* const pev ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgResetHUD, NULL, pev ); - MESSAGE_END(); - } +void NetMsg_ResetHUD(entvars_t* const pev) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgResetHUD, NULL, pev); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SayText( void* const buffer, const int size, int& entity_index, string& text, string& location ) - { - BEGIN_READ( buffer, size ); - entity_index = READ_BYTE(); - text = READ_STRING(); - location = READ_STRING(); - END_READ(); - } +void NetMsg_SayText(void* const buffer, const int size, int& entity_index, string& text, string& location) +{ + BEGIN_READ(buffer, size); + entity_index = READ_BYTE(); + text = READ_STRING(); + location = READ_STRING(); + END_READ(); +} #else //MESSAGE TO EVERYBODY - void NetMsg_SayText( const int entity_index, const string& text, const string& location ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgSayText, NULL ); - WRITE_BYTE( entity_index ); - WRITE_STRING( text.c_str() ); - WRITE_STRING( location.c_str() ); - MESSAGE_END(); - } +void NetMsg_SayText(const int entity_index, const string& text, const string& location) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgSayText, NULL); + WRITE_BYTE(entity_index); + WRITE_STRING(text.c_str()); + WRITE_STRING(location.c_str()); + MESSAGE_END(); +} - //MESSAGE TO ONE PERSON - void NetMsg_SayText( entvars_t* const pev, const int entity_index, const string& text, const string& location ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSayText, NULL, pev ); - WRITE_BYTE( entity_index ); - WRITE_STRING( text.c_str() ); - WRITE_STRING( location.c_str() ); - MESSAGE_END(); - } +//MESSAGE TO ONE PERSON +void NetMsg_SayText(entvars_t* const pev, const int entity_index, const string& text, const string& location) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSayText, NULL, pev); + WRITE_BYTE(entity_index); + WRITE_STRING(text.c_str()); + WRITE_STRING(location.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // : 0001073 #ifndef AVH_SERVER - void NetMsg_ScoreInfo( void* const buffer, const int size, ScoreInfo& info ) - { - BEGIN_READ( buffer, size ); - info.player_index = READ_BYTE(); - info.score = READ_SHORT(); - info.frags = READ_SHORT(); - info.deaths = READ_SHORT(); - info.extra = READ_SHORT(); - info.player_class = READ_BYTE(); - info.auth = READ_SHORT(); - info.team = READ_SHORT(); - info.health = READ_SHORT(); - char* theString = READ_STRING(); +void NetMsg_ScoreInfo(void* const buffer, const int size, ScoreInfo& info) +{ + BEGIN_READ(buffer, size); + info.player_index = READ_BYTE(); + info.score = READ_SHORT(); + info.frags = READ_SHORT(); + info.deaths = READ_SHORT(); + info.extra = READ_SHORT(); + info.player_class = READ_BYTE(); + info.auth = READ_SHORT(); + info.team = READ_SHORT(); + info.health = READ_SHORT(); + char* theString = READ_STRING(); #ifdef USE_OLDAUTH - if(info.auth & PLAYERAUTH_CUSTOM) - { - //clear the string (I dont think this array is reset anywhere else (since everything is set when the score info message is sent anyways) - //so just memset it here to prevent any possible problems. - memset(&g_PlayerExtraInfo[info.player_index].customicon, 0, sizeof(g_PlayerExtraInfo[info.player_index].customicon)); + if (info.auth & PLAYERAUTH_CUSTOM) + { + //clear the string (I dont think this array is reset anywhere else (since everything is set when the score info message is sent anyways) + //so just memset it here to prevent any possible problems. + memset(&g_PlayerExtraInfo[info.player_index].customicon, 0, sizeof(g_PlayerExtraInfo[info.player_index].customicon)); - // Read custom icon - + // Read custom icon - if(theString && strlen(theString) >= 4 && strlen(theString) <= CUSTOM_ICON_LENGTH+2)//make sure the string is within the right size. - strncpy(g_PlayerExtraInfo[info.player_index].customicon, theString, sizeof(g_PlayerExtraInfo[info.player_index].customicon)-1); - } + + if (theString && strlen(theString) >= 4 && strlen(theString) <= CUSTOM_ICON_LENGTH + 2)//make sure the string is within the right size. + strncpy(g_PlayerExtraInfo[info.player_index].customicon, theString, sizeof(g_PlayerExtraInfo[info.player_index].customicon) - 1); + } #endif - END_READ(); - } + END_READ(); +} #else - void NetMsg_ScoreInfo( const ScoreInfo& info ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgScoreInfo ); - WRITE_BYTE( info.player_index ); - WRITE_SHORT( info.score ); - WRITE_SHORT( info.frags ); - WRITE_SHORT( info.deaths ); - WRITE_SHORT( info.extra ); - WRITE_BYTE( info.player_class ); - WRITE_SHORT( info.auth ); - WRITE_SHORT( info.team ); - WRITE_SHORT( info.health ); - WRITE_STRING("0"); - MESSAGE_END(); - } - void NetMsgSpec_ScoreInfo( const ScoreInfo& info ) - { - MESSAGE_BEGIN( MSG_SPEC, g_msgScoreInfo ); - WRITE_BYTE( info.player_index ); - WRITE_SHORT( info.score ); - WRITE_SHORT( info.frags ); - WRITE_SHORT( info.deaths ); - WRITE_SHORT( info.extra ); - WRITE_BYTE( info.player_class ); - WRITE_SHORT( info.auth ); - WRITE_SHORT( info.team ); - WRITE_SHORT( info.health ); - WRITE_STRING("0"); - MESSAGE_END(); - } +void NetMsg_ScoreInfo(const ScoreInfo& info) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgScoreInfo); + WRITE_BYTE(info.player_index); + WRITE_SHORT(info.score); + WRITE_SHORT(info.frags); + WRITE_SHORT(info.deaths); + WRITE_SHORT(info.extra); + WRITE_BYTE(info.player_class); + WRITE_SHORT(info.auth); + WRITE_SHORT(info.team); + WRITE_SHORT(info.health); + WRITE_STRING("0"); + MESSAGE_END(); +} +void NetMsgSpec_ScoreInfo(const ScoreInfo& info) +{ + MESSAGE_BEGIN(MSG_SPEC, g_msgScoreInfo); + WRITE_BYTE(info.player_index); + WRITE_SHORT(info.score); + WRITE_SHORT(info.frags); + WRITE_SHORT(info.deaths); + WRITE_SHORT(info.extra); + WRITE_BYTE(info.player_class); + WRITE_SHORT(info.auth); + WRITE_SHORT(info.team); + WRITE_SHORT(info.health); + WRITE_STRING("0"); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ServerName( void* const buffer, const int size, string& name ) - { - BEGIN_READ( buffer, size ); - name = READ_STRING(); - END_READ(); - } +void NetMsg_ServerName(void* const buffer, const int size, string& name) +{ + BEGIN_READ(buffer, size); + name = READ_STRING(); + END_READ(); +} #else - void NetMsg_ServerName( entvars_t* const pev, const string& name ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgServerName, NULL, pev ); - WRITE_STRING( name.c_str() ); - MESSAGE_END(); - } +void NetMsg_ServerName(entvars_t* const pev, const string& name) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgServerName, NULL, pev); + WRITE_STRING(name.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetFOV( void* const buffer, const int size, int& fov ) - { - BEGIN_READ( buffer, size ); - fov = READ_BYTE(); - END_READ(); - } +void NetMsg_SetFOV(void* const buffer, const int size, int& fov) +{ + BEGIN_READ(buffer, size); + fov = READ_BYTE(); + END_READ(); +} #else - void NetMsg_SetFOV( entvars_t* const pev, const int fov ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetFOV, NULL, pev ); - WRITE_BYTE( fov ); - MESSAGE_END(); - } +void NetMsg_SetFOV(entvars_t* const pev, const int fov) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetFOV, NULL, pev); + WRITE_BYTE(fov); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Shake( void* const buffer, const int size, ScreenShake& shake ) - { - BEGIN_READ( buffer, size ); - shake.amplitude = READ_SHORT(); - shake.duration = READ_SHORT(); - shake.frequency = READ_SHORT(); - END_READ(); - } +void NetMsg_Shake(void* const buffer, const int size, ScreenShake& shake) +{ + BEGIN_READ(buffer, size); + shake.amplitude = READ_SHORT(); + shake.duration = READ_SHORT(); + shake.frequency = READ_SHORT(); + END_READ(); +} #else - void NetMsg_Shake( entvars_t* const pev, const ScreenShake& shake ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgShake, NULL, pev ); - WRITE_SHORT( shake.amplitude ); - WRITE_SHORT( shake.duration ); - WRITE_SHORT( shake.frequency ); - MESSAGE_END(); - } +void NetMsg_Shake(entvars_t* const pev, const ScreenShake& shake) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgShake, NULL, pev); + WRITE_SHORT(shake.amplitude); + WRITE_SHORT(shake.duration); + WRITE_SHORT(shake.frequency); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ShowGameTitle( void* const buffer, const int size ) - { - BEGIN_READ( buffer, size ); - END_READ(); - } +void NetMsg_ShowGameTitle(void* const buffer, const int size) +{ + BEGIN_READ(buffer, size); + END_READ(); +} #else - void NetMsg_ShowGameTitle( entvars_t* const pev ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgShowGameTitle, NULL, pev ); - MESSAGE_END(); - } +void NetMsg_ShowGameTitle(entvars_t* const pev) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgShowGameTitle, NULL, pev); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ShowMenu( void* const buffer, const int size, int& valid_slots, int& display_time, int& flags, string& content ) - { - BEGIN_READ( buffer, size ); - valid_slots = READ_SHORT(); - display_time = READ_CHAR(); - flags = READ_BYTE(); - content = READ_STRING(); - END_READ(); - } +void NetMsg_ShowMenu(void* const buffer, const int size, int& valid_slots, int& display_time, int& flags, string& content) +{ + BEGIN_READ(buffer, size); + valid_slots = READ_SHORT(); + display_time = READ_CHAR(); + flags = READ_BYTE(); + content = READ_STRING(); + END_READ(); +} #else - void NetMsg_ShowMenu( entvars_t* const pev, const int valid_slots, const int display_time, const int flags, const string& content ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgShowMenu, NULL, pev ); - WRITE_SHORT( valid_slots ); - WRITE_CHAR( display_time ); - WRITE_BYTE( flags ); - WRITE_STRING( content.c_str() ); - MESSAGE_END(); - } +void NetMsg_ShowMenu(entvars_t* const pev, const int valid_slots, const int display_time, const int flags, const string& content) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgShowMenu, NULL, pev); + WRITE_SHORT(valid_slots); + WRITE_CHAR(display_time); + WRITE_BYTE(flags); + WRITE_STRING(content.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_StatusText( void* const buffer, const int size, int& location, string& content ) - { - BEGIN_READ( buffer, size ); - location = READ_BYTE(); - content = READ_STRING(); - END_READ(); - } +void NetMsg_StatusText(void* const buffer, const int size, int& location, string& content) +{ + BEGIN_READ(buffer, size); + location = READ_BYTE(); + content = READ_STRING(); + END_READ(); +} #else - void NetMsg_StatusText( entvars_t* const pev, const int location, const string& content ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgStatusText, NULL, pev ); - WRITE_BYTE( location ); - WRITE_STRING( content.c_str() ); - MESSAGE_END(); - } +void NetMsg_StatusText(entvars_t* const pev, const int location, const string& content) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgStatusText, NULL, pev); + WRITE_BYTE(location); + WRITE_STRING(content.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_StatusValue( void* const buffer, const int size, int& location, int& state ) - { - BEGIN_READ( buffer, size ); - location = READ_BYTE(); - state = READ_SHORT(); - END_READ(); - } +void NetMsg_StatusValue(void* const buffer, const int size, int& location, int& state) +{ + BEGIN_READ(buffer, size); + location = READ_BYTE(); + state = READ_SHORT(); + END_READ(); +} #else - void NetMsg_StatusValue( entvars_t* const pev, const int location, const int state ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgStatusValue, NULL, pev ); - WRITE_BYTE( location ); - WRITE_SHORT( state ); - MESSAGE_END(); - } +void NetMsg_StatusValue(entvars_t* const pev, const int location, const int state) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgStatusValue, NULL, pev); + WRITE_BYTE(location); + WRITE_SHORT(state); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_TeamInfo( void* const buffer, const int size, int& player_index, string& team_id ) - { - BEGIN_READ( buffer, size ); - player_index = READ_BYTE(); - team_id = READ_STRING(); - END_READ(); - } +void NetMsg_TeamInfo(void* const buffer, const int size, int& player_index, string& team_id) +{ + BEGIN_READ(buffer, size); + player_index = READ_BYTE(); + team_id = READ_STRING(); + END_READ(); +} #else //MESSAGE TO EVERYBODY - void NetMsg_TeamInfo( const int player_index, const string& team_id ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgTeamInfo ); - WRITE_BYTE( player_index ); - WRITE_STRING( team_id.c_str() ); - MESSAGE_END(); - } +void NetMsg_TeamInfo(const int player_index, const string& team_id) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgTeamInfo); + WRITE_BYTE(player_index); + WRITE_STRING(team_id.c_str()); + MESSAGE_END(); +} - //MESSAGE TO SPECTATORS - void NetMsgSpec_TeamInfo( const int player_index, const string& team_id ) - { - MESSAGE_BEGIN( MSG_SPEC, g_msgTeamInfo ); - WRITE_BYTE( player_index ); - WRITE_STRING( team_id.c_str() ); - MESSAGE_END(); - } +//MESSAGE TO SPECTATORS +void NetMsgSpec_TeamInfo(const int player_index, const string& team_id) +{ + MESSAGE_BEGIN(MSG_SPEC, g_msgTeamInfo); + WRITE_BYTE(player_index); + WRITE_STRING(team_id.c_str()); + MESSAGE_END(); +} - //MESSAGE TO ONE PERSON - void NetMsg_TeamInfo( entvars_t* const pev, const int player_index, const string& team_id ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgTeamInfo, NULL, pev ); - WRITE_BYTE( player_index ); - WRITE_STRING( team_id.c_str() ); - MESSAGE_END(); - } +//MESSAGE TO ONE PERSON +void NetMsg_TeamInfo(entvars_t* const pev, const int player_index, const string& team_id) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgTeamInfo, NULL, pev); + WRITE_BYTE(player_index); + WRITE_STRING(team_id.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_TeamNames( void* const buffer, const int size, StringList& team_names ) +void NetMsg_TeamNames(void* const buffer, const int size, StringList& team_names) +{ + team_names.clear(); + BEGIN_READ(buffer, size); + int num_teams = READ_BYTE(); + for (int counter = 0; counter < num_teams; counter++) { - team_names.clear(); - BEGIN_READ( buffer, size ); - int num_teams = READ_BYTE(); - for( int counter = 0; counter < num_teams; counter++ ) - { - string name(READ_STRING()); - team_names.push_back(name); - } - END_READ(); + string name(READ_STRING()); + team_names.push_back(name); } + END_READ(); +} #else - void NetMsg_TeamNames( entvars_t* const pev, const StringList& team_names ) +void NetMsg_TeamNames(entvars_t* const pev, const StringList& team_names) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgTeamNames, NULL, pev); + WRITE_BYTE(team_names.size()); + for (int counter = 0; counter < team_names.size(); counter++) { - MESSAGE_BEGIN( MSG_ONE, g_msgTeamNames, NULL, pev ); - WRITE_BYTE( team_names.size() ); - for( int counter = 0; counter < team_names.size(); counter++ ) - { - WRITE_STRING( team_names[counter].c_str() ); - } - MESSAGE_END(); + WRITE_STRING(team_names[counter].c_str()); } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_TeamScore( void* const buffer, const int size, string& team_name, int& score, int& reset ) - { - BEGIN_READ( buffer, size ); - team_name = READ_STRING(); - score = READ_SHORT(); - reset = READ_SHORT(); - END_READ(); - } +void NetMsg_TeamScore(void* const buffer, const int size, string& team_name, int& score, int& reset) +{ + BEGIN_READ(buffer, size); + team_name = READ_STRING(); + score = READ_SHORT(); + reset = READ_SHORT(); + END_READ(); +} #else - void NetMsg_TeamScore( entvars_t* const pev, const string& team_name, const int score, const int reset ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgTeamScore, NULL, pev ); - WRITE_STRING( team_name.c_str() ); - WRITE_SHORT( score ); - WRITE_SHORT( reset ); - MESSAGE_END(); - } +void NetMsg_TeamScore(entvars_t* const pev, const string& team_name, const int score, const int reset) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgTeamScore, NULL, pev); + WRITE_STRING(team_name.c_str()); + WRITE_SHORT(score); + WRITE_SHORT(reset); + MESSAGE_END(); +} - void NetMsg_TeamScore( const string& team_name, const int score, const int reset ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgTeamScore ); - WRITE_STRING( team_name.c_str() ); - WRITE_SHORT( score ); - WRITE_SHORT( reset ); - MESSAGE_END(); - } +void NetMsg_TeamScore(const string& team_name, const int score, const int reset) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgTeamScore); + WRITE_STRING(team_name.c_str()); + WRITE_SHORT(score); + WRITE_SHORT(reset); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_TextMsg( void* const buffer, const int size, int& destination, StringList& message ) - { - message.clear(); - BEGIN_READ( buffer, size ); - destination = READ_BYTE(); - message.push_back( string( READ_STRING() ) ); - message.push_back( string( READ_STRING() ) ); - message.push_back( string( READ_STRING() ) ); - message.push_back( string( READ_STRING() ) ); - message.push_back( string( READ_STRING() ) ); - END_READ(); - } +void NetMsg_TextMsg(void* const buffer, const int size, int& destination, StringList& message) +{ + message.clear(); + BEGIN_READ(buffer, size); + destination = READ_BYTE(); + message.push_back(string(READ_STRING())); + message.push_back(string(READ_STRING())); + message.push_back(string(READ_STRING())); + message.push_back(string(READ_STRING())); + message.push_back(string(READ_STRING())); + END_READ(); +} #else //MESSAGE TO EVERYBODY - void NetMsg_TextMsg( const int destination, const StringList& message ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgTextMsg ); - WRITE_BYTE( destination ); - WRITE_STRING( message[0].c_str() ); - if( message.size() > 1 ) - WRITE_STRING( message[1].c_str() ); - if( message.size() > 2 ) - WRITE_STRING( message[2].c_str() ); - if( message.size() > 3 ) - WRITE_STRING( message[3].c_str() ); - if( message.size() > 4 ) - WRITE_STRING( message[4].c_str() ); - MESSAGE_END(); - } +void NetMsg_TextMsg(const int destination, const StringList& message) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgTextMsg); + WRITE_BYTE(destination); + WRITE_STRING(message[0].c_str()); + if (message.size() > 1) + WRITE_STRING(message[1].c_str()); + if (message.size() > 2) + WRITE_STRING(message[2].c_str()); + if (message.size() > 3) + WRITE_STRING(message[3].c_str()); + if (message.size() > 4) + WRITE_STRING(message[4].c_str()); + MESSAGE_END(); +} - //MESSAGE TO SPECTATORS - void NetMsgSpec_TextMsg( const int destination, const StringList& message ) - { - MESSAGE_BEGIN( MSG_SPEC, g_msgTextMsg ); - WRITE_BYTE( destination ); - WRITE_STRING( message[0].c_str() ); - if( message.size() > 1 ) - WRITE_STRING( message[1].c_str() ); - if( message.size() > 2 ) - WRITE_STRING( message[2].c_str() ); - if( message.size() > 3 ) - WRITE_STRING( message[3].c_str() ); - if( message.size() > 4 ) - WRITE_STRING( message[4].c_str() ); - MESSAGE_END(); - } +//MESSAGE TO SPECTATORS +void NetMsgSpec_TextMsg(const int destination, const StringList& message) +{ + MESSAGE_BEGIN(MSG_SPEC, g_msgTextMsg); + WRITE_BYTE(destination); + WRITE_STRING(message[0].c_str()); + if (message.size() > 1) + WRITE_STRING(message[1].c_str()); + if (message.size() > 2) + WRITE_STRING(message[2].c_str()); + if (message.size() > 3) + WRITE_STRING(message[3].c_str()); + if (message.size() > 4) + WRITE_STRING(message[4].c_str()); + MESSAGE_END(); +} - //MESSAGE TO ONE PERSON - void NetMsg_TextMsg( entvars_t* const pev, const int destination, const StringList& message ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgTextMsg, NULL, pev ); - WRITE_BYTE( destination ); - WRITE_STRING( message[0].c_str() ); - if( message.size() > 1 ) - WRITE_STRING( message[1].c_str() ); - if( message.size() > 2 ) - WRITE_STRING( message[2].c_str() ); - if( message.size() > 3 ) - WRITE_STRING( message[3].c_str() ); - if( message.size() > 4 ) - WRITE_STRING( message[4].c_str() ); - MESSAGE_END(); - } +//MESSAGE TO ONE PERSON +void NetMsg_TextMsg(entvars_t* const pev, const int destination, const StringList& message) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgTextMsg, NULL, pev); + WRITE_BYTE(destination); + WRITE_STRING(message[0].c_str()); + if (message.size() > 1) + WRITE_STRING(message[1].c_str()); + if (message.size() > 2) + WRITE_STRING(message[2].c_str()); + if (message.size() > 3) + WRITE_STRING(message[3].c_str()); + if (message.size() > 4) + WRITE_STRING(message[4].c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Train( void* const buffer, const int size, int& state ) - { - BEGIN_READ( buffer, size ); - state = READ_BYTE(); - END_READ(); - } +void NetMsg_Train(void* const buffer, const int size, int& state) +{ + BEGIN_READ(buffer, size); + state = READ_BYTE(); + END_READ(); +} #else - void NetMsg_Train( entvars_t* const pev, const int state ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgTrain, NULL, pev ); - WRITE_BYTE( state ); - MESSAGE_END(); - } +void NetMsg_Train(entvars_t* const pev, const int state) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgTrain, NULL, pev); + WRITE_BYTE(state); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_WeaponList( void* const buffer, const int size, WeaponList& weapon ) - { - BEGIN_READ( buffer, size ); - weapon.weapon_name = READ_STRING(); - weapon.ammo1_type = READ_CHAR(); - weapon.ammo1_max_amnt = READ_BYTE(); - weapon.ammo2_type = READ_CHAR(); - weapon.ammo2_max_amnt = READ_BYTE(); - weapon.bucket = READ_CHAR(); - weapon.bucket_pos = READ_CHAR(); - weapon.bit_index = READ_CHAR(); - weapon.flags = READ_BYTE(); - END_READ(); - } +void NetMsg_WeaponList(void* const buffer, const int size, WeaponList& weapon) +{ + BEGIN_READ(buffer, size); + weapon.weapon_name = READ_STRING(); + weapon.ammo1_type = READ_CHAR(); + weapon.ammo1_max_amnt = READ_BYTE(); + weapon.ammo2_type = READ_CHAR(); + weapon.ammo2_max_amnt = READ_BYTE(); + weapon.bucket = READ_CHAR(); + weapon.bucket_pos = READ_CHAR(); + weapon.bit_index = READ_CHAR(); + weapon.flags = READ_BYTE(); + END_READ(); +} #else - void NetMsg_WeaponList( entvars_t* const pev, const WeaponList& weapon ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgWeaponList, NULL, pev ); - WRITE_STRING( weapon.weapon_name.c_str() ); - WRITE_CHAR( weapon.ammo1_type ); - WRITE_BYTE( weapon.ammo1_max_amnt ); - WRITE_CHAR( weapon.ammo2_type ); - WRITE_BYTE( weapon.ammo2_max_amnt ); - WRITE_CHAR( weapon.bucket ); - WRITE_CHAR( weapon.bucket_pos ); - WRITE_CHAR( weapon.bit_index ); - WRITE_BYTE( weapon.flags ); - MESSAGE_END(); - } +void NetMsg_WeaponList(entvars_t* const pev, const WeaponList& weapon) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgWeaponList, NULL, pev); + WRITE_STRING(weapon.weapon_name.c_str()); + WRITE_CHAR(weapon.ammo1_type); + WRITE_BYTE(weapon.ammo1_max_amnt); + WRITE_CHAR(weapon.ammo2_type); + WRITE_BYTE(weapon.ammo2_max_amnt); + WRITE_CHAR(weapon.bucket); + WRITE_CHAR(weapon.bucket_pos); + WRITE_CHAR(weapon.bit_index); + WRITE_BYTE(weapon.flags); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_WeapPickup( void* const buffer, const int size, int& weapon_id ) - { - BEGIN_READ( buffer, size ); - weapon_id = READ_BYTE(); - END_READ(); - } +void NetMsg_WeapPickup(void* const buffer, const int size, int& weapon_id) +{ + BEGIN_READ(buffer, size); + weapon_id = READ_BYTE(); + END_READ(); +} #else - void NetMsg_WeapPickup( entvars_t* const pev , const int weapon_id ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgWeapPickup, NULL, pev ); - WRITE_BYTE( weapon_id ); - MESSAGE_END(); - } +void NetMsg_WeapPickup(entvars_t* const pev, const int weapon_id) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgWeapPickup, NULL, pev); + WRITE_BYTE(weapon_id); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -928,130 +928,136 @@ enum AlienInfo_ChangeFlags }; #ifndef AVH_SERVER - void NetMsg_AlienInfo( void* const buffer, const int size, bool& was_hive_info, AvHAlienUpgradeListType& upgrades, HiveInfoListType& hives ) +void NetMsg_AlienInfo(void* const buffer, const int size, bool& was_hive_info, AvHAlienUpgradeListType& upgrades, HiveInfoListType& hives) +{ + BEGIN_READ(buffer, size); + int status, type, header = READ_BYTE(); + was_hive_info = (header & 0x80) == 0; + if (was_hive_info) { - BEGIN_READ( buffer, size ); - int status, type, header = READ_BYTE(); - was_hive_info = (header & 0x80) == 0; - if( was_hive_info ) + int num_hives = header; + AlienInfo_ChangeFlags changes; + for (int counter = 0; counter < num_hives; counter++) + { + if (hives.size() <= counter) { - int num_hives = header; - AlienInfo_ChangeFlags changes; - for( int counter = 0; counter < num_hives; counter++ ) - { - if( hives.size() <= counter ) - { - AvHHiveInfo hive; - hives.push_back( hive ); - } + AvHHiveInfo hive; + hives.push_back(hive); + } - changes = (AlienInfo_ChangeFlags)READ_BYTE(); - if( changes & COORDS_CHANGED ) - { - hives[counter].mPosX = READ_COORD(); - hives[counter].mPosY = READ_COORD(); - hives[counter].mPosZ = READ_COORD(); - } - if( changes & STATUS_CHANGED ) - { - status = READ_BYTE(); - type = (status >> 3) & 0x03; - hives[counter].mUnderAttack = (status & 0x80) != 0; - hives[counter].mStatus = status & 0x07; - switch(type) - { - case 0: hives[counter].mTechnology = MESSAGE_NULL; break; - case 1: hives[counter].mTechnology = ALIEN_BUILD_DEFENSE_CHAMBER; break; - case 2: hives[counter].mTechnology = ALIEN_BUILD_SENSORY_CHAMBER; break; - case 3: hives[counter].mTechnology = ALIEN_BUILD_MOVEMENT_CHAMBER; break; - } - } - if( changes & HEALTH_CHANGED ) - { - hives[counter].mHealthPercentage = READ_BYTE(); - } - } - } - else + changes = (AlienInfo_ChangeFlags)READ_BYTE(); + if (changes & COORDS_CHANGED) { - int num_upgrades = READ_BYTE(); - upgrades.clear(); - for( int counter = 0; counter < num_upgrades; counter++ ) + hives[counter].mPosX = READ_COORD(); + hives[counter].mPosY = READ_COORD(); + hives[counter].mPosZ = READ_COORD(); + } + if (changes & STATUS_CHANGED) + { + status = READ_BYTE(); + type = (status >> 3) & 0x03; + hives[counter].mUnderAttack = (status & 0x80) != 0; + hives[counter].mStatus = status & 0x07; + switch (type) { - AvHAlienUpgradeCategory theUpgradeCategory = AvHAlienUpgradeCategory(READ_BYTE()); - upgrades.push_back(theUpgradeCategory); + case 0: hives[counter].mTechnology = MESSAGE_NULL; break; + case 1: hives[counter].mTechnology = ALIEN_BUILD_DEFENSE_CHAMBER; break; + case 2: hives[counter].mTechnology = ALIEN_BUILD_SENSORY_CHAMBER; break; + case 3: hives[counter].mTechnology = ALIEN_BUILD_MOVEMENT_CHAMBER; break; } } - END_READ(); + if (changes & HEALTH_CHANGED) + { + hives[counter].mHealthPercentage = READ_BYTE(); + } + } } + else + { + int num_upgrades = READ_BYTE(); + upgrades.clear(); + for (int counter = 0; counter < num_upgrades; counter++) + { + AvHAlienUpgradeCategory theUpgradeCategory = AvHAlienUpgradeCategory(READ_BYTE()); + upgrades.push_back(theUpgradeCategory); + } + } + END_READ(); +} #else - void NetMsg_AlienInfo_Upgrades( entvars_t* const pev, const AvHAlienUpgradeListType& upgrades ) +void NetMsg_AlienInfo_Upgrades(entvars_t* const pev, const AvHAlienUpgradeListType& upgrades) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgAlienInfo, NULL, pev); + WRITE_BYTE(0x80); //magic number for hive size field, upgrade info + WRITE_BYTE(upgrades.size()); + AvHAlienUpgradeListType::const_iterator current, end = upgrades.end(); + for (current = upgrades.begin(); current != end; ++current) { - MESSAGE_BEGIN( MSG_ONE, g_msgAlienInfo, NULL, pev ); - WRITE_BYTE( 0x80 ); //magic number for hive size field, upgrade info - WRITE_BYTE( upgrades.size() ); - AvHAlienUpgradeListType::const_iterator current, end = upgrades.end(); - for( current = upgrades.begin(); current != end; ++current ) - { - WRITE_BYTE( *current ); - } - MESSAGE_END(); + WRITE_BYTE(*current); } + MESSAGE_END(); +} - void NetMsg_AlienInfo_Hives( entvars_t* const pev, const HiveInfoListType& hives, const HiveInfoListType& client_hives ) +void NetMsg_AlienInfo_Hives(entvars_t* const pev, const HiveInfoListType& hives, const HiveInfoListType& client_hives) +{ + if (pev == NULL) + MESSAGE_BEGIN(MSG_SPEC, g_msgAlienInfo); + else + MESSAGE_BEGIN(MSG_ONE, g_msgAlienInfo, NULL, pev); + WRITE_BYTE(hives.size()); + HiveInfoListType::const_iterator current, end = hives.end(); + int status, tech, index = 0; + int change_flags = NO_CHANGE; + for (current = hives.begin(); current != end; ++current, ++index) { - if ( pev == NULL ) - MESSAGE_BEGIN( MSG_SPEC, g_msgAlienInfo); - else - MESSAGE_BEGIN( MSG_ONE, g_msgAlienInfo, NULL, pev ); - WRITE_BYTE( hives.size() ); - HiveInfoListType::const_iterator current, end = hives.end(); - int status, tech, index = 0; - int change_flags = NO_CHANGE; - for( current = hives.begin(); current != end; ++current, ++index ) + //put together change bitfield + if (client_hives.size() <= index || client_hives[index].mPosX != current->mPosX || + client_hives[index].mPosY != current->mPosY || client_hives[index].mPosZ != current->mPosZ) + { + change_flags |= COORDS_CHANGED; + } + + if (client_hives.size() <= index || client_hives[index].mStatus != current->mStatus || + client_hives[index].mUnderAttack != current->mUnderAttack || client_hives[index].mTechnology != current->mTechnology) + { + change_flags |= STATUS_CHANGED; + } + + if (client_hives.size() <= index || client_hives[index].mHealthPercentage != current->mHealthPercentage) + { + change_flags |= HEALTH_CHANGED; + } + WRITE_BYTE(change_flags); + + //send change data + if (change_flags & COORDS_CHANGED) + { + WRITE_COORD(current->mPosX); + WRITE_COORD(current->mPosY); + WRITE_COORD(current->mPosZ); + } + if (change_flags & STATUS_CHANGED) + { + status = current->mStatus & 0x07; // 3 bits + switch (current->mTechnology) // 2 bits { - //put together change bitfield - if( client_hives.size() <= index || client_hives[index].mPosX != current->mPosX || - client_hives[index].mPosY != current->mPosY || client_hives[index].mPosZ != current->mPosZ ) - { change_flags |= COORDS_CHANGED; } - - if( client_hives.size() <= index || client_hives[index].mStatus != current->mStatus || - client_hives[index].mUnderAttack != current->mUnderAttack || client_hives[index].mTechnology != current->mTechnology ) - { change_flags |= STATUS_CHANGED; } - - if( client_hives.size() <= index || client_hives[index].mHealthPercentage != current->mHealthPercentage ) - { change_flags |= HEALTH_CHANGED; } - WRITE_BYTE(change_flags); - - //send change data - if( change_flags & COORDS_CHANGED ) - { - WRITE_COORD(current->mPosX); - WRITE_COORD(current->mPosY); - WRITE_COORD(current->mPosZ); - } - if( change_flags & STATUS_CHANGED ) - { - status = current->mStatus & 0x07; // 3 bits - switch( current->mTechnology ) // 2 bits - { - case MESSAGE_NULL: tech = 0; break; - case ALIEN_BUILD_DEFENSE_CHAMBER: tech = 1; break; - case ALIEN_BUILD_SENSORY_CHAMBER: tech = 2; break; - case ALIEN_BUILD_MOVEMENT_CHAMBER: tech = 3; break; - default: tech = 0; break; - } - status |= tech << 3; - status |= current->mUnderAttack ? 0x80 : 0x00; // 1 bit - WRITE_BYTE(status); - } - if( change_flags & HEALTH_CHANGED ) - { - WRITE_BYTE(current->mHealthPercentage); - } + case MESSAGE_NULL: tech = 0; break; + case ALIEN_BUILD_DEFENSE_CHAMBER: tech = 1; break; + case ALIEN_BUILD_SENSORY_CHAMBER: tech = 2; break; + case ALIEN_BUILD_MOVEMENT_CHAMBER: tech = 3; break; + default: tech = 0; break; } - MESSAGE_END(); + status |= tech << 3; + status |= current->mUnderAttack ? 0x80 : 0x00; // 1 bit + WRITE_BYTE(status); + } + if (change_flags & HEALTH_CHANGED) + { + WRITE_BYTE(current->mHealthPercentage); + } } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1064,949 +1070,963 @@ union float_converter }; #ifndef AVH_SERVER - void NetMsg_BalanceVar( void* const buffer, const int size, string& name, BalanceMessageAction& action, int& ivalue, float& fvalue, string& svalue ) +void NetMsg_BalanceVar(void* const buffer, const int size, string& name, BalanceMessageAction& action, int& ivalue, float& fvalue, string& svalue) +{ + BEGIN_READ(buffer, size); + action = static_cast(READ_BYTE()); + switch (action) { - BEGIN_READ( buffer, size ); - action = static_cast(READ_BYTE()); - switch( action ) - { - case BALANCE_ACTION_INSERT_INT: - { - name = READ_STRING(); - ivalue = READ_LONG(); - break; - } - case BALANCE_ACTION_INSERT_FLOAT: - { - float_converter c; - name = READ_STRING(); - c.l = READ_LONG(); - fvalue = c.f; - break; - } - case BALANCE_ACTION_INSERT_STRING: - { - name = READ_STRING(); - svalue = READ_STRING(); - break; - } - case BALANCE_ACTION_REMOVE: - { - name = READ_STRING(); - break; - } - case BALANCE_ACTION_CLEAR: - case BALANCE_ACTION_NOTIFY_PENDING: - case BALANCE_ACTION_NOTIFY_FINISHED: - { - break; - } - default: - break; - //todo: error condition here? - } - END_READ(); - } -#else - void NetMsg_BalanceVarChangesPending( entvars_t* const pev, const bool pending ) + case BALANCE_ACTION_INSERT_INT: { - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( pending ? BALANCE_ACTION_NOTIFY_PENDING : BALANCE_ACTION_NOTIFY_FINISHED ); - MESSAGE_END(); + name = READ_STRING(); + ivalue = READ_LONG(); + break; } - - void NetMsg_BalanceVarInsertInt( entvars_t* const pev, const string& name, const int data ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( BALANCE_ACTION_INSERT_INT ); - WRITE_STRING( name.c_str() ); - WRITE_LONG( data ); - MESSAGE_END(); - } - - void NetMsg_BalanceVarInsertFloat( entvars_t* const pev, const string& name, const float data ) + case BALANCE_ACTION_INSERT_FLOAT: { float_converter c; - c.f = data; - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( BALANCE_ACTION_INSERT_FLOAT ); - WRITE_STRING( name.c_str() ); - WRITE_LONG( c.l ); - MESSAGE_END(); + name = READ_STRING(); + c.l = READ_LONG(); + fvalue = c.f; + break; } - - void NetMsg_BalanceVarInsertString( entvars_t* const pev, const string& name, const string& data ) + case BALANCE_ACTION_INSERT_STRING: { - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( BALANCE_ACTION_INSERT_STRING ); - WRITE_STRING( name.c_str() ); - WRITE_STRING( data.c_str() ); - MESSAGE_END(); + name = READ_STRING(); + svalue = READ_STRING(); + break; } - - void NetMsg_BalanceVarRemove( entvars_t* const pev, const string& name ) + case BALANCE_ACTION_REMOVE: { - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( BALANCE_ACTION_REMOVE ); - WRITE_STRING( name.c_str() ); - MESSAGE_END(); + name = READ_STRING(); + break; } - - void NetMsg_BalanceVarClear( entvars_t* const pev ) + case BALANCE_ACTION_CLEAR: + case BALANCE_ACTION_NOTIFY_PENDING: + case BALANCE_ACTION_NOTIFY_FINISHED: { - MESSAGE_BEGIN( MSG_ONE, g_msgBalanceVar, NULL, pev ); - WRITE_BYTE( BALANCE_ACTION_CLEAR ); - MESSAGE_END(); + break; } + default: + break; + //todo: error condition here? + } + END_READ(); +} +#else +void NetMsg_BalanceVarChangesPending(entvars_t* const pev, const bool pending) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(pending ? BALANCE_ACTION_NOTIFY_PENDING : BALANCE_ACTION_NOTIFY_FINISHED); + MESSAGE_END(); +} + +void NetMsg_BalanceVarInsertInt(entvars_t* const pev, const string& name, const int data) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(BALANCE_ACTION_INSERT_INT); + WRITE_STRING(name.c_str()); + WRITE_LONG(data); + MESSAGE_END(); +} + +void NetMsg_BalanceVarInsertFloat(entvars_t* const pev, const string& name, const float data) +{ + float_converter c; + c.f = data; + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(BALANCE_ACTION_INSERT_FLOAT); + WRITE_STRING(name.c_str()); + WRITE_LONG(c.l); + MESSAGE_END(); +} + +void NetMsg_BalanceVarInsertString(entvars_t* const pev, const string& name, const string& data) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(BALANCE_ACTION_INSERT_STRING); + WRITE_STRING(name.c_str()); + WRITE_STRING(data.c_str()); + MESSAGE_END(); +} + +void NetMsg_BalanceVarRemove(entvars_t* const pev, const string& name) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(BALANCE_ACTION_REMOVE); + WRITE_STRING(name.c_str()); + MESSAGE_END(); +} + +void NetMsg_BalanceVarClear(entvars_t* const pev) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBalanceVar, NULL, pev); + WRITE_BYTE(BALANCE_ACTION_CLEAR); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_BlipList( void* const buffer, const int size, bool& friendly_blips, AvHVisibleBlipList& list ) +void NetMsg_BlipList(void* const buffer, const int size, bool& friendly_blips, AvHVisibleBlipList& list) +{ + int blip_count; + int8 status, info; + float X, Y, Z; + list.Clear(); + BEGIN_READ(buffer, size); + int list_info = READ_BYTE(); + friendly_blips = (list_info & 0x80) != 0; + blip_count = (list_info & 0x7F); + for (int counter = 0; counter < blip_count; counter++) { - int blip_count; - int8 status, info; - float X, Y, Z; - list.Clear(); - BEGIN_READ( buffer, size ); - int list_info = READ_BYTE(); - friendly_blips = (list_info & 0x80) != 0; - blip_count = (list_info & 0x7F); - for( int counter = 0; counter < blip_count; counter++ ) - { - X = READ_COORD(); - Y = READ_COORD(); - Z = READ_COORD(); - status = READ_BYTE(); - info = friendly_blips ? READ_BYTE() : 0; - list.AddBlip( X, Y, Z, status, info ); - } - END_READ(); + X = READ_COORD(); + Y = READ_COORD(); + Z = READ_COORD(); + status = READ_BYTE(); + info = friendly_blips ? READ_BYTE() : 0; + list.AddBlip(X, Y, Z, status, info); } + END_READ(); +} #else - void NetMsg_BlipList( entvars_t* const pev, const bool friendly_blips, const AvHVisibleBlipList& list ) - { - int maxBlips = friendly_blips ? 20 : 25; - maxBlips = min ( list.mNumBlips, maxBlips ); +void NetMsg_BlipList(entvars_t* const pev, const bool friendly_blips, const AvHVisibleBlipList& list) +{ + int maxBlips = friendly_blips ? 20 : 25; + maxBlips = min(list.mNumBlips, maxBlips); - MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, g_msgBlipList, NULL, pev ); - //pack header - 7 bits for blip count (doesn't go over 40 in practice), 1 bit for Friend or Foe - unsigned char list_info = maxBlips | (friendly_blips ? 0x80 : 0); - WRITE_BYTE( list_info ); - //pack each blip - this could be optimized as follows once bit packer is implemented: - // convert X, Y to integer values ranging from 0 to 2047 (11 bits each) based on map extents - // convert Z to integer value ranging from 0 to 511 (9 bits) - // 4 bits for status (range 0-15, 1-9 currently used) - // 5 bits for info (range 1-32, refers to player number) - // total is 40 bits = 5 bytes for friendly, 35 bits for foe. - // savings would be 37.5% for friendly bytes. - // blip precision would be equal to double large minimap precision, with worst case of 4 unit X,Y separation for MT. - // because maps are much smaller vertically than horizontally as a rule, the worst case of 16 unit Z separation - // will very rarely occur. - for( int counter = 0; counter < maxBlips; counter++ ) - { - WRITE_COORD( list.mBlipPositions[counter][0] ); - WRITE_COORD( list.mBlipPositions[counter][1] ); - WRITE_COORD( list.mBlipPositions[counter][2] ); - WRITE_BYTE( list.mBlipStatus[counter] ); - if( friendly_blips ) { WRITE_BYTE( list.mBlipInfo[counter] ); } - } - MESSAGE_END(); + MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, g_msgBlipList, NULL, pev); + //pack header - 7 bits for blip count (doesn't go over 40 in practice), 1 bit for Friend or Foe + unsigned char list_info = maxBlips | (friendly_blips ? 0x80 : 0); + WRITE_BYTE(list_info); + //pack each blip - this could be optimized as follows once bit packer is implemented: + // convert X, Y to integer values ranging from 0 to 2047 (11 bits each) based on map extents + // convert Z to integer value ranging from 0 to 511 (9 bits) + // 4 bits for status (range 0-15, 1-9 currently used) + // 5 bits for info (range 1-32, refers to player number) + // total is 40 bits = 5 bytes for friendly, 35 bits for foe. + // savings would be 37.5% for friendly bytes. + // blip precision would be equal to double large minimap precision, with worst case of 4 unit X,Y separation for MT. + // because maps are much smaller vertically than horizontally as a rule, the worst case of 16 unit Z separation + // will very rarely occur. + for (int counter = 0; counter < maxBlips; counter++) + { + WRITE_COORD(list.mBlipPositions[counter][0]); + WRITE_COORD(list.mBlipPositions[counter][1]); + WRITE_COORD(list.mBlipPositions[counter][2]); + WRITE_BYTE(list.mBlipStatus[counter]); + if (friendly_blips) { WRITE_BYTE(list.mBlipInfo[counter]); } } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_BuildMiniMap( void* const buffer, const int size, string& name, int& num_samples, int& processed_samples, int& width, int& height, uint8** map, bool& finished ) +void NetMsg_BuildMiniMap(void* const buffer, const int size, string& name, int& num_samples, int& processed_samples, int& width, int& height, uint8** map, bool& finished) +{ + BEGIN_READ(buffer, size); + switch (READ_BYTE()) { - BEGIN_READ( buffer, size ); - switch( READ_BYTE() ) - { - case 0: - name = READ_STRING(); - num_samples = READ_LONG(); - processed_samples = 0; - width = READ_LONG(); - height = READ_LONG(); - *map = new uint8[num_samples]; - finished = false; - break; - case 1: - { - int packet_samples = READ_BYTE(); - for( int counter = 0; counter < packet_samples; counter++ ) - { - (*map)[processed_samples++] = READ_BYTE(); - } - finished = false; - break; - } - case 2: - finished = true; - break; - } - END_READ(); + case 0: + name = READ_STRING(); + num_samples = READ_LONG(); + processed_samples = 0; + width = READ_LONG(); + height = READ_LONG(); + *map = new uint8[num_samples]; + finished = false; + break; + case 1: + { + int packet_samples = READ_BYTE(); + for (int counter = 0; counter < packet_samples; counter++) + { + (*map)[processed_samples++] = READ_BYTE(); + } + finished = false; + break; } + case 2: + finished = true; + break; + } + END_READ(); +} #else - void NetMsg_BuildMiniMap_Initialize( entvars_t* const pev, const string& name, const int num_samples, const int width, const int height ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgBuildMiniMap, NULL, pev ); - WRITE_BYTE( 0 ); - WRITE_STRING( name.c_str() ); - WRITE_LONG( num_samples ); - WRITE_LONG( width ); - WRITE_LONG( height ); - MESSAGE_END(); - } +void NetMsg_BuildMiniMap_Initialize(entvars_t* const pev, const string& name, const int num_samples, const int width, const int height) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBuildMiniMap, NULL, pev); + WRITE_BYTE(0); + WRITE_STRING(name.c_str()); + WRITE_LONG(num_samples); + WRITE_LONG(width); + WRITE_LONG(height); + MESSAGE_END(); +} - void NetMsg_BuildMiniMap_Update( entvars_t* const pev, const int num_samples, const uint8* const samples ) +void NetMsg_BuildMiniMap_Update(entvars_t* const pev, const int num_samples, const uint8* const samples) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBuildMiniMap, NULL, pev); + WRITE_BYTE(1); + WRITE_BYTE(num_samples); + for (int counter = 0; counter < num_samples; counter++) { - MESSAGE_BEGIN( MSG_ONE, g_msgBuildMiniMap, NULL, pev ); - WRITE_BYTE( 1 ); - WRITE_BYTE( num_samples ); - for( int counter = 0; counter < num_samples; counter++ ) - { - WRITE_BYTE( samples[counter] ); - } - MESSAGE_END(); + WRITE_BYTE(samples[counter]); } + MESSAGE_END(); +} - void NetMsg_BuildMiniMap_Complete( entvars_t* const pev ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgBuildMiniMap, NULL, pev ); - WRITE_BYTE( 2 ); - MESSAGE_END(); - } +void NetMsg_BuildMiniMap_Complete(entvars_t* const pev) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgBuildMiniMap, NULL, pev); + WRITE_BYTE(2); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ClientScripts( void* const buffer, const int size, StringList& script_names ) +void NetMsg_ClientScripts(void* const buffer, const int size, StringList& script_names) +{ + script_names.clear(); + BEGIN_READ(buffer, size); + int num_scripts = READ_BYTE(); + while (script_names.size() < num_scripts) { - script_names.clear(); - BEGIN_READ( buffer, size ); - int num_scripts = READ_BYTE(); - while( script_names.size() < num_scripts ) - { - script_names.push_back( string( READ_STRING() ) ); - } - END_READ(); + script_names.push_back(string(READ_STRING())); } + END_READ(); +} #else - void NetMsg_ClientScripts( entvars_t* const pev, const StringList& script_names ) +void NetMsg_ClientScripts(entvars_t* const pev, const StringList& script_names) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgClientScripts, NULL, pev); + WRITE_BYTE(script_names.size()); + StringList::const_iterator current, end = script_names.end(); + for (current = script_names.begin(); current != end; ++current) { - MESSAGE_BEGIN( MSG_ONE, g_msgClientScripts, NULL, pev ); - WRITE_BYTE( script_names.size() ); - StringList::const_iterator current, end = script_names.end(); - for( current = script_names.begin(); current != end; ++current ) - { - WRITE_STRING( current->c_str() ); - } - MESSAGE_END(); - } -#endif - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -#ifndef AVH_SERVER - void NetMsg_DebugCSP( void* const buffer, const int size, weapon_data_t& weapon_data, float& next_attack ) - { - BEGIN_READ( buffer, size ); - weapon_data.m_iId = READ_LONG(); - weapon_data.m_iClip = READ_LONG(); - weapon_data.m_flNextPrimaryAttack = READ_COORD(); - weapon_data.m_flTimeWeaponIdle = READ_COORD(); - next_attack = READ_COORD(); - END_READ(); - } -#else - void NetMsg_DebugCSP( entvars_t* const pev, const weapon_data_t& weapon_data, const float next_attack ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgDebugCSP, NULL, pev ); - WRITE_LONG( weapon_data.m_iId ); - WRITE_LONG( weapon_data.m_iClip ); - WRITE_COORD( weapon_data.m_flNextPrimaryAttack ); - WRITE_COORD( weapon_data.m_flTimeWeaponIdle ); - WRITE_COORD( next_attack ); - MESSAGE_END(); + WRITE_STRING(current->c_str()); } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_EditPS( void* const buffer, const int size, int& particle_index ) - { - BEGIN_READ( buffer, size ); - particle_index = READ_SHORT(); - END_READ(); - } +void NetMsg_DebugCSP(void* const buffer, const int size, weapon_data_t& weapon_data, float& next_attack) +{ + BEGIN_READ(buffer, size); + weapon_data.m_iId = READ_LONG(); + weapon_data.m_iClip = READ_LONG(); + weapon_data.m_flNextPrimaryAttack = READ_COORD(); + weapon_data.m_flTimeWeaponIdle = READ_COORD(); + next_attack = READ_COORD(); + END_READ(); +} #else - void NetMsg_EditPS( entvars_t* const pev, const int particle_index ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgEditPS, NULL, pev ); - WRITE_SHORT( particle_index ); - MESSAGE_END(); - } +void NetMsg_DebugCSP(entvars_t* const pev, const weapon_data_t& weapon_data, const float next_attack) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgDebugCSP, NULL, pev); + WRITE_LONG(weapon_data.m_iId); + WRITE_LONG(weapon_data.m_iClip); + WRITE_COORD(weapon_data.m_flNextPrimaryAttack); + WRITE_COORD(weapon_data.m_flTimeWeaponIdle); + WRITE_COORD(next_attack); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_Fog( void* const buffer, const int size, bool& enabled, int& R, int& G, int& B, float& start, float& end ) - { - BEGIN_READ( buffer, size ); - enabled = (READ_BYTE() != 0); - if( enabled ) - { - R = READ_BYTE(); - G = READ_BYTE(); - B = READ_BYTE(); - start = READ_COORD(); - end = READ_COORD(); - } - END_READ(); - } +void NetMsg_EditPS(void* const buffer, const int size, int& particle_index) +{ + BEGIN_READ(buffer, size); + particle_index = READ_SHORT(); + END_READ(); +} #else - void NetMsg_Fog( entvars_t* const pev, const bool enabled, const int R, const int G, const int B, const float start, const float end ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgFog, NULL, pev ); - WRITE_BYTE( enabled ? 1 : 0 ); - if( enabled ) - { - WRITE_BYTE( R ); - WRITE_BYTE( G ); - WRITE_BYTE( B ); - WRITE_COORD( start ); - WRITE_COORD( end ); - } - MESSAGE_END(); - } +void NetMsg_EditPS(entvars_t* const pev, const int particle_index) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgEditPS, NULL, pev); + WRITE_SHORT(particle_index); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_GameStatus( void* const buffer, const int size, int& status_code, AvHMapMode& map_mode, int& game_time, int& timelimit, int& misc_data ) +void NetMsg_Fog(void* const buffer, const int size, bool& enabled, int& R, int& G, int& B, float& start, float& end) +{ + BEGIN_READ(buffer, size); + enabled = (READ_BYTE() != 0); + if (enabled) { - BEGIN_READ( buffer, size ); - status_code = READ_BYTE(); - map_mode = (AvHMapMode)READ_BYTE(); - switch( status_code ) - { - case kGameStatusReset: - case kGameStatusResetNewMap: - case kGameStatusEnded: - break; - case kGameStatusGameTime: - game_time = READ_SHORT(); - timelimit = READ_SHORT(); - misc_data = READ_BYTE(); - break; - case kGameStatusUnspentLevels: - misc_data = READ_BYTE(); - break; - } - END_READ(); + R = READ_BYTE(); + G = READ_BYTE(); + B = READ_BYTE(); + start = READ_COORD(); + end = READ_COORD(); } + END_READ(); +} #else - void NetMsg_GameStatus_State( const int status_code, const int map_mode ) +void NetMsg_Fog(entvars_t* const pev, const bool enabled, const int R, const int G, const int B, const float start, const float end) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgFog, NULL, pev); + WRITE_BYTE(enabled ? 1 : 0); + if (enabled) { - MESSAGE_BEGIN( MSG_ALL, g_msgGameStatus ); - WRITE_BYTE( status_code ); - WRITE_BYTE( map_mode ); - MESSAGE_END(); - } - - void NetMsg_GameStatus_State( entvars_t* const pev, const int status_code, const int map_mode ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgGameStatus, NULL, pev ); - WRITE_BYTE( status_code ); - WRITE_BYTE( map_mode ); - MESSAGE_END(); - } - - void NetMsg_GameStatus_Time( const int status_code, const int map_mode, const int game_time, const int timelimit, const int attacking_team_number, const bool is_reliable ) - { - int message_type = is_reliable ? MSG_ALL : MSG_BROADCAST; - MESSAGE_BEGIN( message_type, g_msgGameStatus ); - WRITE_BYTE( status_code ); - WRITE_BYTE( map_mode ); - WRITE_SHORT( game_time ); - WRITE_SHORT( timelimit ); - WRITE_BYTE( attacking_team_number ); - MESSAGE_END(); - } - - void NetMsg_GameStatus_UnspentLevels( entvars_t* const pev, const int status_code, const int map_mode, const int unspent_levels ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgGameStatus, NULL, pev ); - WRITE_BYTE( status_code ); - WRITE_BYTE( map_mode ); - WRITE_BYTE( unspent_levels ); - MESSAGE_END(); + WRITE_BYTE(R); + WRITE_BYTE(G); + WRITE_BYTE(B); + WRITE_COORD(start); + WRITE_COORD(end); } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ListPS( void* const buffer, const int size, string& system_name ) +void NetMsg_GameStatus(void* const buffer, const int size, int& status_code, AvHMapMode& map_mode, int& game_time, int& timelimit, int& misc_data) +{ + BEGIN_READ(buffer, size); + status_code = READ_BYTE(); + map_mode = (AvHMapMode)READ_BYTE(); + switch (status_code) { - BEGIN_READ( buffer, size ); - system_name = READ_STRING(); - END_READ(); + case kGameStatusReset: + case kGameStatusResetNewMap: + case kGameStatusEnded: + break; + case kGameStatusGameTime: + game_time = READ_SHORT(); + timelimit = READ_SHORT(); + misc_data = READ_BYTE(); + break; + case kGameStatusUnspentLevels: + misc_data = READ_BYTE(); + break; } + END_READ(); +} #else - void NetMsg_ListPS( entvars_t* const pev, const string& system_name ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgListPS, NULL, pev ); - WRITE_STRING( system_name.c_str() ); - MESSAGE_END(); - } +void NetMsg_GameStatus_State(const int status_code, const int map_mode) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgGameStatus); + WRITE_BYTE(status_code); + WRITE_BYTE(map_mode); + MESSAGE_END(); +} + +void NetMsg_GameStatus_State(entvars_t* const pev, const int status_code, const int map_mode) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgGameStatus, NULL, pev); + WRITE_BYTE(status_code); + WRITE_BYTE(map_mode); + MESSAGE_END(); +} + +void NetMsg_GameStatus_Time(const int status_code, const int map_mode, const int game_time, const int timelimit, const int attacking_team_number, const bool is_reliable) +{ + int message_type = is_reliable ? MSG_ALL : MSG_BROADCAST; + MESSAGE_BEGIN(message_type, g_msgGameStatus); + WRITE_BYTE(status_code); + WRITE_BYTE(map_mode); + WRITE_SHORT(game_time); + WRITE_SHORT(timelimit); + WRITE_BYTE(attacking_team_number); + MESSAGE_END(); +} + +void NetMsg_GameStatus_UnspentLevels(entvars_t* const pev, const int status_code, const int map_mode, const int unspent_levels) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgGameStatus, NULL, pev); + WRITE_BYTE(status_code); + WRITE_BYTE(map_mode); + WRITE_BYTE(unspent_levels); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_HUDSetUpgrades( void* const buffer, const int size, int& upgradeMask ) - { - BEGIN_READ( buffer, size ); - upgradeMask=READ_BYTE(); - END_READ(); - } +void NetMsg_ListPS(void* const buffer, const int size, string& system_name) +{ + BEGIN_READ(buffer, size); + system_name = READ_STRING(); + END_READ(); +} #else - void NetMsg_HUDSetUpgrades( int upgradeMask ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgHUDSetUpgrades); - WRITE_BYTE( upgradeMask ); - MESSAGE_END(); - } - void NetMsg_HUDSetUpgrades( entvars_t* const pev, int upgradeMask ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgHUDSetUpgrades, NULL, pev ); - WRITE_BYTE( upgradeMask ); - MESSAGE_END(); - } -#endif - -#ifndef AVH_SERVER - void NetMsg_PlayHUDNotification( void* const buffer, const int size, int& flags, int& sound, float& location_x, float& location_y ) - { - BEGIN_READ( buffer, size ); - flags = READ_BYTE(); - sound = READ_BYTE(); - location_x = READ_COORD(); - location_y = READ_COORD(); - END_READ(); - } -#else - void NetMsg_PlayHUDNotification( entvars_t* const pev, const int flags, const int sound, const float location_x, const float location_y ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgPlayHUDNotification, NULL, pev ); - WRITE_BYTE( flags ); - WRITE_BYTE( sound ); - WRITE_COORD( location_x ); - WRITE_COORD( location_y ); - MESSAGE_END(); - } +void NetMsg_ListPS(entvars_t* const pev, const string& system_name) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgListPS, NULL, pev); + WRITE_STRING(system_name.c_str()); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ProgressBar( void* const buffer, const int size, int& entity_number, int& progress, int& seconds) - { - BEGIN_READ( buffer, size ); - entity_number = READ_SHORT(); - progress = READ_BYTE(); - if ( progress == 5 ) - seconds=READ_BYTE(); - - END_READ(); - } +void NetMsg_HUDSetUpgrades(void* const buffer, const int size, int& upgradeMask) +{ + BEGIN_READ(buffer, size); + upgradeMask = READ_BYTE(); + END_READ(); +} #else - void NetMsg_ProgressBar( entvars_t* const pev, const int entity_number, const int progress, int seconds ) - { - MESSAGE_BEGIN( MSG_ONE_UNRELIABLE, g_msgProgressBar, NULL, pev ); - WRITE_SHORT( entity_number ); - WRITE_BYTE( progress ); - if ( progress == 5 ) - WRITE_BYTE( seconds ); - MESSAGE_END(); - } +void NetMsg_HUDSetUpgrades(int upgradeMask) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgHUDSetUpgrades); + WRITE_BYTE(upgradeMask); + MESSAGE_END(); +} +void NetMsg_HUDSetUpgrades(entvars_t* const pev, int upgradeMask) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgHUDSetUpgrades, NULL, pev); + WRITE_BYTE(upgradeMask); + MESSAGE_END(); +} +#endif + +#ifndef AVH_SERVER +void NetMsg_PlayHUDNotification(void* const buffer, const int size, int& flags, int& sound, float& location_x, float& location_y) +{ + BEGIN_READ(buffer, size); + flags = READ_BYTE(); + sound = READ_BYTE(); + location_x = READ_COORD(); + location_y = READ_COORD(); + END_READ(); +} +#else +void NetMsg_PlayHUDNotification(entvars_t* const pev, const int flags, const int sound, const float location_x, const float location_y) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgPlayHUDNotification, NULL, pev); + WRITE_BYTE(flags); + WRITE_BYTE(sound); + WRITE_COORD(location_x); + WRITE_COORD(location_y); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_ServerVar( void* const buffer, const int size, string& name, int& value ) - { - BEGIN_READ( buffer, size ); - name = READ_STRING(); - value = READ_SHORT(); - END_READ(); - } +void NetMsg_ProgressBar(void* const buffer, const int size, int& entity_number, int& progress, int& seconds) +{ + BEGIN_READ(buffer, size); + entity_number = READ_SHORT(); + progress = READ_BYTE(); + if (progress == 5) + seconds = READ_BYTE(); + + END_READ(); +} #else - void NetMsg_ServerVar( entvars_t* const pev, const string& name, const int& value ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgServerVar, NULL, pev ); - WRITE_STRING( name.c_str() ); - WRITE_SHORT( value ); - MESSAGE_END(); - } +void NetMsg_ProgressBar(entvars_t* const pev, const int entity_number, const int progress, int seconds) +{ + MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, g_msgProgressBar, NULL, pev); + WRITE_SHORT(entity_number); + WRITE_BYTE(progress); + if (progress == 5) + WRITE_BYTE(seconds); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetGammaRamp( void* const buffer, const int size, float& gamma ) - { - BEGIN_READ( buffer, size ); - gamma = READ_BYTE() / 128.0f; - END_READ(); - } +void NetMsg_ServerVar(void* const buffer, const int size, string& name, int& value) +{ + BEGIN_READ(buffer, size); + name = READ_STRING(); + value = READ_SHORT(); + END_READ(); +} #else - void NetMsg_SetGammaRamp( entvars_t* const pev, const float gamma ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetGammaRamp, NULL, pev ); - WRITE_BYTE( floor( min( max(gamma, 0.0f), 1.992f) * 128.0f) ); - MESSAGE_END(); - } - - void NetMsgSpec_SetGammaRamp( const float gamma ) - { - MESSAGE_BEGIN( MSG_SPEC, g_msgSetGammaRamp ); - WRITE_BYTE( floor( min( max(gamma, 0.0f), 1.992f) * 128.0f) ); - MESSAGE_END(); - } +void NetMsg_ServerVar(entvars_t* const pev, const string& name, const int& value) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgServerVar, NULL, pev); + WRITE_STRING(name.c_str()); + WRITE_SHORT(value); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetOrder( void* const buffer, const int size, AvHOrder& order ) - { - EntityListType players; - BEGIN_READ( buffer, size ); - order.SetReceiver( READ_BYTE() ); - order.SetOrderType( (AvHOrderType)READ_BYTE() ); - //order.SetOrderTargetType((AvHOrderTargetType)READ_BYTE()); //this is a redundant byte because SetOrderType automatically sets the target type as well. - switch( order.GetOrderTargetType() ) - { - case ORDERTARGETTYPE_LOCATION: - { - vec3_t location; - location.x = READ_COORD(); - location.y = READ_COORD(); - location.z = READ_COORD(); - order.SetLocation( location ); - break; - } - case ORDERTARGETTYPE_TARGET: - order.SetTargetIndex( READ_SHORT() ); - break; - } - order.SetUser3TargetType( (AvHUser3)READ_BYTE() ); - order.SetOrderCompleted( READ_BYTE() ); - // : 1050 - // Need to sync the order status as it is only manipulated by the serverside state machine - order.SetOrderStatus( READ_BYTE() ); - END_READ(); - } +void NetMsg_SetGammaRamp(void* const buffer, const int size, float& gamma) +{ + BEGIN_READ(buffer, size); + gamma = READ_BYTE() / 128.0f; + END_READ(); +} #else - void NetMsg_SetOrder( entvars_t* const pev, const AvHOrder& order ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetOrder, NULL, pev ); - WRITE_BYTE( order.GetReceiver() ); - WRITE_BYTE( order.GetOrderType() ); - //WRITE_BYTE( order.GetOrderTargetType() ); //this is a redundant byte because SetOrderType automatically sets the target type as well. - switch( order.GetOrderTargetType() ) - { - case ORDERTARGETTYPE_LOCATION: - { - vec3_t location; - order.GetLocation( location ); - WRITE_COORD( location.x ); - WRITE_COORD( location.y ); - WRITE_COORD( location.z ); - break; - } - case ORDERTARGETTYPE_TARGET: - WRITE_SHORT( order.GetTargetIndex() ); - break; - } - WRITE_BYTE( order.GetTargetUser3Type() ); - WRITE_BYTE( order.GetOrderCompleted() ); - // : 1050 - // Need to sync the order status as it is only manipulated by the serverside state machine - WRITE_BYTE( order.GetOrderStatus() ); - MESSAGE_END(); - } +void NetMsg_SetGammaRamp(entvars_t* const pev, const float gamma) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetGammaRamp, NULL, pev); + WRITE_BYTE(floor(min(max(gamma, 0.0f), 1.992f) * 128.0f)); + MESSAGE_END(); +} + +void NetMsgSpec_SetGammaRamp(const float gamma) +{ + MESSAGE_BEGIN(MSG_SPEC, g_msgSetGammaRamp); + WRITE_BYTE(floor(min(max(gamma, 0.0f), 1.992f) * 128.0f)); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_DelParts( void* const buffer, const int size) +void NetMsg_SetOrder(void* const buffer, const int size, AvHOrder& order) +{ + EntityListType players; + BEGIN_READ(buffer, size); + order.SetReceiver(READ_BYTE()); + order.SetOrderType((AvHOrderType)READ_BYTE()); + //order.SetOrderTargetType((AvHOrderTargetType)READ_BYTE()); //this is a redundant byte because SetOrderType automatically sets the target type as well. + switch (order.GetOrderTargetType()) { - BEGIN_READ( buffer, size ); - READ_BYTE(); - END_READ(); - } - void NetMsg_SetParticleTemplate( void* const buffer, const int size, int &index, AvHParticleTemplate& particle_template ) + case ORDERTARGETTYPE_LOCATION: { - ParticleParams gen_params, vel_params; - PSVector gravity; - BEGIN_READ( buffer, size ); - index=READ_SHORT(); - particle_template.SetName( string( READ_STRING() ) ); - particle_template.SetMaxParticles( READ_LONG() ); - particle_template.SetParticleSize( READ_COORD() ); - particle_template.SetSprite( string( READ_STRING() ) ); - particle_template.SetParticleSystemLifetime( READ_COORD() ); - particle_template.SetParticleLifetime( READ_COORD() ); - particle_template.SetAnimationSpeed( READ_COORD() ); - particle_template.SetNumSpriteFrames( READ_BYTE() ); - particle_template.SetParticleScaling( READ_COORD() ); - particle_template.SetRenderMode( READ_BYTE() ); - particle_template.SetGenerationRate( READ_LONG() ); - particle_template.SetGenerationShape( READ_BYTE() ); - for( int counter = 0; counter < 8; counter++ ) { gen_params[counter] = READ_LONG(); } - particle_template.SetGenerationParams( gen_params ); - particle_template.SetGenerationEntityIndex( READ_LONG() ); - particle_template.SetGenerationEntityParameter( READ_COORD() ); - particle_template.SetStartingVelocityShape( READ_BYTE() ); - for( int counter = 0; counter < 8; counter++ ) { vel_params[counter] = READ_LONG(); } - particle_template.SetStartingVelocityParams( vel_params ); - for( int counter = 0; counter < 3; counter++ ) { gravity[counter] = READ_COORD(); } - particle_template.SetGravity( gravity ); - particle_template.SetMaxAlpha( READ_COORD() ); - particle_template.SetParticleSystemIndexToGenerate( READ_LONG() ); - particle_template.SetFlags( READ_LONG() ); - END_READ(); + vec3_t location; + location.x = READ_COORD(); + location.y = READ_COORD(); + location.z = READ_COORD(); + order.SetLocation(location); + break; } + case ORDERTARGETTYPE_TARGET: + order.SetTargetIndex(READ_SHORT()); + break; + } + order.SetUser3TargetType((AvHUser3)READ_BYTE()); + order.SetOrderCompleted(READ_BYTE()); + // : 1050 + // Need to sync the order status as it is only manipulated by the serverside state machine + order.SetOrderStatus(READ_BYTE()); + END_READ(); +} #else - void NetMsg_SetParticleTemplate( entvars_t* const pev, const int index, const AvHParticleTemplate& particle_template ) +void NetMsg_SetOrder(entvars_t* const pev, const AvHOrder& order) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetOrder, NULL, pev); + WRITE_BYTE(order.GetReceiver()); + WRITE_BYTE(order.GetOrderType()); + //WRITE_BYTE( order.GetOrderTargetType() ); //this is a redundant byte because SetOrderType automatically sets the target type as well. + switch (order.GetOrderTargetType()) { - ParticleParams gen_params, vel_params; - PSVector gravity; - if ( pev ) - MESSAGE_BEGIN( MSG_ONE, g_msgSetParticleTemplates, NULL, pev ); + case ORDERTARGETTYPE_LOCATION: + { + vec3_t location; + order.GetLocation(location); + WRITE_COORD(location.x); + WRITE_COORD(location.y); + WRITE_COORD(location.z); + break; + } + case ORDERTARGETTYPE_TARGET: + WRITE_SHORT(order.GetTargetIndex()); + break; + } + WRITE_BYTE(order.GetTargetUser3Type()); + WRITE_BYTE(order.GetOrderCompleted()); + // : 1050 + // Need to sync the order status as it is only manipulated by the serverside state machine + WRITE_BYTE(order.GetOrderStatus()); + MESSAGE_END(); +} +#endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#ifndef AVH_SERVER +void NetMsg_DelParts(void* const buffer, const int size) +{ + BEGIN_READ(buffer, size); + READ_BYTE(); + END_READ(); +} +void NetMsg_SetParticleTemplate(void* const buffer, const int size, int& index, AvHParticleTemplate& particle_template) +{ + ParticleParams gen_params, vel_params; + PSVector gravity; + BEGIN_READ(buffer, size); + index = READ_SHORT(); + particle_template.SetName(string(READ_STRING())); + particle_template.SetMaxParticles(READ_LONG()); + particle_template.SetParticleSize(READ_COORD()); + particle_template.SetSprite(string(READ_STRING())); + particle_template.SetParticleSystemLifetime(READ_COORD()); + particle_template.SetParticleLifetime(READ_COORD()); + particle_template.SetAnimationSpeed(READ_COORD()); + particle_template.SetNumSpriteFrames(READ_BYTE()); + particle_template.SetParticleScaling(READ_COORD()); + particle_template.SetRenderMode(READ_BYTE()); + particle_template.SetGenerationRate(READ_LONG()); + particle_template.SetGenerationShape(READ_BYTE()); + for (int counter = 0; counter < 8; counter++) { gen_params[counter] = READ_LONG(); } + particle_template.SetGenerationParams(gen_params); + particle_template.SetGenerationEntityIndex(READ_LONG()); + particle_template.SetGenerationEntityParameter(READ_COORD()); + particle_template.SetStartingVelocityShape(READ_BYTE()); + for (int counter = 0; counter < 8; counter++) { vel_params[counter] = READ_LONG(); } + particle_template.SetStartingVelocityParams(vel_params); + for (int counter = 0; counter < 3; counter++) { gravity[counter] = READ_COORD(); } + particle_template.SetGravity(gravity); + particle_template.SetMaxAlpha(READ_COORD()); + particle_template.SetParticleSystemIndexToGenerate(READ_LONG()); + particle_template.SetFlags(READ_LONG()); + END_READ(); +} +#else +void NetMsg_SetParticleTemplate(entvars_t* const pev, const int index, const AvHParticleTemplate& particle_template) +{ + ParticleParams gen_params, vel_params; + PSVector gravity; + if (pev) + MESSAGE_BEGIN(MSG_ONE, g_msgSetParticleTemplates, NULL, pev); + else + MESSAGE_BEGIN(MSG_SPEC, g_msgSetParticleTemplates); + WRITE_SHORT(index); + WRITE_STRING(particle_template.GetName().c_str()); + WRITE_LONG(particle_template.GetMaxParticles()); + WRITE_COORD(particle_template.GetParticleSize()); + WRITE_STRING(particle_template.GetSprite().c_str()); + WRITE_COORD(particle_template.GetParticleSystemLifetime()); + WRITE_COORD(particle_template.GetParticleLifetime()); + WRITE_COORD(particle_template.GetAnimationSpeed()); + WRITE_BYTE(particle_template.GetNumSpriteFrames()); + WRITE_COORD(particle_template.GetParticleScaling()); + WRITE_BYTE(particle_template.GetRenderMode()); + WRITE_LONG(particle_template.GetGenerationRate()); + WRITE_BYTE(particle_template.GetGenerationShape()); + particle_template.GetGenerationParams(gen_params); + for (int counter = 0; counter < 8; counter++) { WRITE_LONG(gen_params[counter]); } + WRITE_LONG(particle_template.GetGenerationEntityIndex()); + WRITE_COORD(particle_template.GetGenerationEntityParameter()); + WRITE_BYTE(particle_template.GetStartingVelocityShape()); + particle_template.GetStartingVelocityParams(vel_params); + for (int counter = 0; counter < 8; counter++) { WRITE_LONG(vel_params[counter]); } + particle_template.GetGravity(gravity); + for (int counter = 0; counter < 3; counter++) { WRITE_COORD(gravity[counter]); } + WRITE_COORD(particle_template.GetMaxAlpha()); + WRITE_LONG(particle_template.GetParticleSystemIndexToGenerate()); + WRITE_LONG(particle_template.GetFlags()); + MESSAGE_END(); +} +void NetMsg_DelParts(entvars_t* const pev) +{ + if (pev) + MESSAGE_BEGIN(MSG_ONE, g_msgDelParts, NULL, pev); + else + MESSAGE_BEGIN(MSG_SPEC, g_msgDelParts); + MESSAGE_END(); +} +#endif + +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#ifndef AVH_SERVER +void NetMsg_SetSelect(void* const buffer, const int size, Selection& selection) +{ + selection.selected_entities.clear(); + BEGIN_READ(buffer, size); + selection.group_number = READ_BYTE(); + int num_entities = READ_BYTE(); + for (int counter = 0; counter < num_entities; counter++) + { + selection.selected_entities.push_back(READ_SHORT()); + } + switch (selection.group_number) + { + case 0: + selection.tracking_entity = (READ_BYTE() == 0) ? 0 : READ_SHORT(); + break; + case kSelectAllHotGroup: + break; + default: + selection.group_type = (AvHUser3)READ_BYTE(); + selection.group_alert = (AvHAlertType)READ_BYTE(); + break; + } + END_READ(); +} +#else +void NetMsg_SetSelect(entvars_t* const pev, Selection& selection) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetSelect, NULL, pev); + WRITE_BYTE(selection.group_number); + WRITE_BYTE(selection.selected_entities.size()); + EntityListType::const_iterator current, end = selection.selected_entities.end(); + for (current = selection.selected_entities.begin(); current != end; ++current) + { + WRITE_SHORT(*current); + } + switch (selection.group_number) + { + case 0: + if (selection.tracking_entity != 0) + { + WRITE_BYTE(1); + WRITE_SHORT(selection.tracking_entity); + } else - MESSAGE_BEGIN( MSG_SPEC, g_msgSetParticleTemplates); - WRITE_SHORT(index); - WRITE_STRING( particle_template.GetName().c_str() ); - WRITE_LONG( particle_template.GetMaxParticles() ); - WRITE_COORD( particle_template.GetParticleSize() ); - WRITE_STRING( particle_template.GetSprite().c_str() ); - WRITE_COORD( particle_template.GetParticleSystemLifetime() ); - WRITE_COORD( particle_template.GetParticleLifetime() ); - WRITE_COORD( particle_template.GetAnimationSpeed() ); - WRITE_BYTE( particle_template.GetNumSpriteFrames() ); - WRITE_COORD( particle_template.GetParticleScaling() ); - WRITE_BYTE( particle_template.GetRenderMode() ); - WRITE_LONG( particle_template.GetGenerationRate() ); - WRITE_BYTE( particle_template.GetGenerationShape() ); - particle_template.GetGenerationParams( gen_params ); - for( int counter = 0; counter < 8; counter++ ) { WRITE_LONG( gen_params[counter] ); } - WRITE_LONG( particle_template.GetGenerationEntityIndex() ); - WRITE_COORD( particle_template.GetGenerationEntityParameter() ); - WRITE_BYTE( particle_template.GetStartingVelocityShape() ); - particle_template.GetStartingVelocityParams( vel_params ); - for( int counter = 0; counter < 8; counter++ ) { WRITE_LONG( vel_params[counter] ); } - particle_template.GetGravity( gravity ); - for( int counter = 0; counter < 3; counter++ ) { WRITE_COORD( gravity[counter] ); } - WRITE_COORD( particle_template.GetMaxAlpha() ); - WRITE_LONG( particle_template.GetParticleSystemIndexToGenerate() ); - WRITE_LONG( particle_template.GetFlags() ); - MESSAGE_END(); - } - void NetMsg_DelParts( entvars_t* const pev ) - { - if ( pev ) - MESSAGE_BEGIN( MSG_ONE, g_msgDelParts, NULL, pev ); - else - MESSAGE_BEGIN( MSG_SPEC, g_msgDelParts); - MESSAGE_END(); + { + WRITE_BYTE(0); + } + break; + case kSelectAllHotGroup: + break; + default: + WRITE_BYTE(selection.group_type); + WRITE_BYTE(selection.group_alert); + break; } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetSelect( void* const buffer, const int size, Selection& selection ) - { - selection.selected_entities.clear(); - BEGIN_READ( buffer, size ); - selection.group_number = READ_BYTE(); - int num_entities = READ_BYTE(); - for(int counter = 0; counter < num_entities; counter++ ) - { selection.selected_entities.push_back( READ_SHORT() ); } - switch( selection.group_number ) - { - case 0: - selection.tracking_entity = (READ_BYTE() == 0) ? 0 : READ_SHORT(); - break; - case kSelectAllHotGroup: - break; - default: - selection.group_type = (AvHUser3)READ_BYTE(); - selection.group_alert = (AvHAlertType)READ_BYTE(); - break; - } - END_READ(); - } +void NetMsg_SetRequest(void* const buffer, const int size, int& request_type, int& request_count) +{ + BEGIN_READ(buffer, size); + request_type = READ_BYTE(); + request_count = READ_BYTE(); + END_READ(); +} #else - void NetMsg_SetSelect( entvars_t* const pev, Selection& selection ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetSelect, NULL, pev ); - WRITE_BYTE( selection.group_number ); - WRITE_BYTE( selection.selected_entities.size() ); - EntityListType::const_iterator current, end = selection.selected_entities.end(); - for( current = selection.selected_entities.begin(); current != end; ++current ) - { WRITE_SHORT( *current ); } - switch( selection.group_number ) - { - case 0: - if( selection.tracking_entity != 0 ) - { - WRITE_BYTE( 1 ); - WRITE_SHORT( selection.tracking_entity ); - } - else - { - WRITE_BYTE( 0 ); - } - break; - case kSelectAllHotGroup: - break; - default: - WRITE_BYTE( selection.group_type ); - WRITE_BYTE( selection.group_alert ); - break; - } - MESSAGE_END(); - } +void NetMsg_SetRequest(entvars_t* pev, const int request_type, const int request_count) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetRequest, NULL, pev); + WRITE_BYTE(request_type); + WRITE_BYTE(request_count); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetRequest( void* const buffer, const int size, int& request_type, int& request_count ) +void NetMsg_SetSoundNames(void* const buffer, const int size, bool& reset, string& sound_name) +{ + BEGIN_READ(buffer, size); + reset = (READ_BYTE() != 0) ? true : false; + if (!reset) { - BEGIN_READ( buffer, size ); - request_type = READ_BYTE(); - request_count = READ_BYTE(); - END_READ(); + sound_name = READ_STRING(); } + END_READ(); +} #else - void NetMsg_SetRequest( entvars_t* pev, const int request_type, const int request_count ) +void NetMsg_SetSoundNames(entvars_t* pev, const bool reset, const string& sound_name) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetSoundNames, NULL, pev); + WRITE_BYTE(reset ? 1 : 0); + if (!reset) { - MESSAGE_BEGIN( MSG_ONE, g_msgSetRequest, NULL, pev ); - WRITE_BYTE( request_type ); - WRITE_BYTE( request_count ); - MESSAGE_END(); + WRITE_STRING(sound_name.c_str()); } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetSoundNames( void* const buffer, const int size, bool& reset, string& sound_name ) - { - BEGIN_READ( buffer, size ); - reset = (READ_BYTE() != 0 ) ? true : false; - if( !reset ) - { sound_name = READ_STRING(); } - END_READ(); - } +void NetMsg_SetTechNode(void* const buffer, const int size, AvHTechNode*& node) +{ + BEGIN_READ(buffer, size); + node = new AvHTechNode((AvHMessageID)READ_BYTE()); + node->setTechID((AvHTechID)READ_BYTE()); + node->setPrereqTechID1((AvHTechID)READ_BYTE()); + node->setPrereqTechID2((AvHTechID)READ_BYTE()); + node->setCost(READ_SHORT()); + node->setBuildTime(READ_SHORT()); + int flags = READ_BYTE(); + node->setAllowMultiples((flags & 0x01) != 0); + node->setResearchState((flags & 0x04) != 0); + node->setResearchable((flags & 0x02) != 0); + END_READ(); +} #else - void NetMsg_SetSoundNames( entvars_t* pev, const bool reset, const string& sound_name ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetSoundNames, NULL, pev ); - WRITE_BYTE( reset ? 1 : 0 ); - if( !reset ) - { WRITE_STRING( sound_name.c_str() ); } - MESSAGE_END(); - } +void NetMsg_SetTechNode(entvars_t* pev, const AvHTechNode* node) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetTechNodes, NULL, pev); + WRITE_BYTE(node->getMessageID()); + WRITE_BYTE(node->getTechID()); + WRITE_BYTE(node->getPrereqTechID1()); + WRITE_BYTE(node->getPrereqTechID2()); + WRITE_SHORT(node->getCost()); + WRITE_SHORT(node->getBuildTime()); + int flags = 0; + if (node->getAllowMultiples()) { flags |= 0x01; } + if (node->getIsResearchable()) { flags |= 0x02; } + if (node->getIsResearched()) { flags |= 0x04; } + WRITE_BYTE(flags); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetTechNode( void* const buffer, const int size, AvHTechNode*& node ) +void NetMsg_SetTechSlots(void* const buffer, const int size, AvHTechSlots& tech_slots) +{ + BEGIN_READ(buffer, size); + tech_slots.mUser3 = (AvHUser3)READ_BYTE(); + for (int counter = 0; counter < kNumTechSlots; counter++) { - BEGIN_READ( buffer, size ); - node = new AvHTechNode( (AvHMessageID)READ_BYTE() ); - node->setTechID( (AvHTechID)READ_BYTE() ); - node->setPrereqTechID1( (AvHTechID)READ_BYTE() ); - node->setPrereqTechID2( (AvHTechID)READ_BYTE() ); - node->setCost( READ_SHORT() ); - node->setBuildTime( READ_SHORT() ); - int flags = READ_BYTE(); - node->setAllowMultiples( (flags & 0x01) != 0 ); - node->setResearchState( (flags & 0x04) != 0 ); - node->setResearchable( (flags & 0x02) != 0 ); - END_READ(); + tech_slots.mTechSlots[counter] = (AvHMessageID)READ_BYTE(); } + END_READ(); +} #else - void NetMsg_SetTechNode( entvars_t* pev, const AvHTechNode* node ) +void NetMsg_SetTechSlots(entvars_t* pev, const AvHTechSlots& tech_slots) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetTechSlots, NULL, pev); + WRITE_BYTE(tech_slots.mUser3); + for (int counter = 0; counter < kNumTechSlots; counter++) { - MESSAGE_BEGIN( MSG_ONE, g_msgSetTechNodes, NULL, pev ); - WRITE_BYTE( node->getMessageID() ); - WRITE_BYTE( node->getTechID() ); - WRITE_BYTE( node->getPrereqTechID1() ); - WRITE_BYTE( node->getPrereqTechID2() ); - WRITE_SHORT( node->getCost() ); - WRITE_SHORT( node->getBuildTime() ); - int flags = 0; - if( node->getAllowMultiples() ) { flags |= 0x01; } - if( node->getIsResearchable() ) { flags |= 0x02; } - if( node->getIsResearched() ) { flags |= 0x04; } - WRITE_BYTE( flags ); - MESSAGE_END(); + WRITE_BYTE(tech_slots.mTechSlots[counter]); } + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetTechSlots( void* const buffer, const int size, AvHTechSlots& tech_slots ) +void NetMsg_SetTopDown(void* const buffer, const int size, bool& is_menu_tech, bool& is_top_down, float* position, int& tech_slots) +{ + BEGIN_READ(buffer, size); + is_menu_tech = (READ_BYTE() != 0); + if (is_menu_tech) { - BEGIN_READ( buffer, size ); - tech_slots.mUser3 = (AvHUser3)READ_BYTE(); - for( int counter = 0; counter < kNumTechSlots; counter++ ) - { tech_slots.mTechSlots[counter] = (AvHMessageID)READ_BYTE(); } - END_READ(); + tech_slots = READ_LONG(); } + else + { + is_top_down = (READ_BYTE() != 0); + position[0] = READ_COORD(); + position[1] = READ_COORD(); + position[2] = READ_COORD(); + } + END_READ(); +} #else - void NetMsg_SetTechSlots( entvars_t* pev, const AvHTechSlots& tech_slots ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetTechSlots, NULL, pev ); - WRITE_BYTE( tech_slots.mUser3 ); - for( int counter = 0; counter < kNumTechSlots; counter++ ) - { WRITE_BYTE( tech_slots.mTechSlots[counter] ); } - MESSAGE_END(); - } +void NetMsg_SetTopDown_Position(entvars_t* const pev, const bool is_top_down, const float* const position) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetTopDown, NULL, pev); + WRITE_BYTE(0); + WRITE_BYTE(is_top_down ? 1 : 0); + WRITE_COORD(position[0]); + WRITE_COORD(position[1]); + WRITE_COORD(position[2]); + MESSAGE_END(); +} + +void NetMsg_SetTopDown_TechSlots(entvars_t* const pev, const int tech_slots) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetTopDown, NULL, pev); + WRITE_BYTE(1); + WRITE_LONG(tech_slots); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetTopDown( void* const buffer, const int size, bool& is_menu_tech, bool& is_top_down, float* position, int& tech_slots ) +void NetMsg_SetupMap(void* const buffer, const int size, bool& is_location, string& name, float* min_extents, float* max_extents, bool& draw_background) +{ + BEGIN_READ(buffer, size); + is_location = (READ_BYTE() != 0); + name = READ_STRING(); + if (is_location) { - BEGIN_READ( buffer, size ); - is_menu_tech = (READ_BYTE() != 0); - if( is_menu_tech ) - { tech_slots = READ_LONG(); } - else - { - is_top_down = (READ_BYTE() != 0); - position[0] = READ_COORD(); - position[1] = READ_COORD(); - position[2] = READ_COORD(); - } - END_READ(); + max_extents[0] = READ_COORD(); + max_extents[1] = READ_COORD(); + min_extents[0] = READ_COORD(); + min_extents[1] = READ_COORD(); } + else + { + min_extents[2] = READ_COORD(); + max_extents[2] = READ_COORD(); + min_extents[0] = READ_COORD(); + min_extents[1] = READ_COORD(); + max_extents[0] = READ_COORD(); + max_extents[1] = READ_COORD(); + draw_background = (READ_BYTE() != 0); + } +} #else - void NetMsg_SetTopDown_Position( entvars_t* const pev, const bool is_top_down, const float* const position ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetTopDown, NULL, pev ); - WRITE_BYTE( 0 ); - WRITE_BYTE( is_top_down ? 1 : 0 ); - WRITE_COORD( position[0] ); - WRITE_COORD( position[1] ); - WRITE_COORD( position[2] ); - MESSAGE_END(); - } +void NetMsg_SetupMap_Extents(entvars_t* const pev, const string& name, const float* const min_extents, const float* const max_extents, const bool draw_background) +{ + if (pev) + MESSAGE_BEGIN(MSG_ONE, g_msgSetupMap, NULL, pev); + else + MESSAGE_BEGIN(MSG_SPEC, g_msgSetupMap); + WRITE_BYTE(0); + WRITE_STRING(name.c_str()); + WRITE_COORD(min_extents[2]); + WRITE_COORD(max_extents[2]); + WRITE_COORD(min_extents[0]); + WRITE_COORD(min_extents[1]); + WRITE_COORD(max_extents[0]); + WRITE_COORD(max_extents[1]); + WRITE_BYTE(draw_background ? 1 : 0); + MESSAGE_END(); +} - void NetMsg_SetTopDown_TechSlots( entvars_t* const pev, const int tech_slots ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetTopDown, NULL, pev ); - WRITE_BYTE( 1 ); - WRITE_LONG( tech_slots ); - MESSAGE_END(); - } +void NetMsg_SetupMap_Location(entvars_t* const pev, const string& name, const float* const min_extents, const float* const max_extents) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgSetupMap, NULL, pev); + WRITE_BYTE(1); + WRITE_STRING(name.c_str()); + WRITE_COORD(max_extents[0]); + WRITE_COORD(max_extents[1]); + WRITE_COORD(min_extents[0]); + WRITE_COORD(min_extents[1]); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #ifndef AVH_SERVER - void NetMsg_SetupMap( void* const buffer, const int size, bool& is_location, string& name, float* min_extents, float* max_extents, bool& draw_background ) - { - BEGIN_READ( buffer, size ); - is_location = (READ_BYTE() != 0); - name = READ_STRING(); - if( is_location ) - { - max_extents[0] = READ_COORD(); - max_extents[1] = READ_COORD(); - min_extents[0] = READ_COORD(); - min_extents[1] = READ_COORD(); - } - else - { - min_extents[2] = READ_COORD(); - max_extents[2] = READ_COORD(); - min_extents[0] = READ_COORD(); - min_extents[1] = READ_COORD(); - max_extents[0] = READ_COORD(); - max_extents[1] = READ_COORD(); - draw_background = (READ_BYTE() != 0); - } - } +void NetMsg_UpdateCountdown(void* const buffer, const int size, int& countdown) +{ + BEGIN_READ(buffer, size); + countdown = READ_BYTE(); + END_READ(); +} #else - void NetMsg_SetupMap_Extents( entvars_t* const pev, const string& name, const float* const min_extents, const float* const max_extents, const bool draw_background ) - { - if ( pev) - MESSAGE_BEGIN( MSG_ONE, g_msgSetupMap, NULL, pev ); - else - MESSAGE_BEGIN( MSG_SPEC, g_msgSetupMap); - WRITE_BYTE( 0 ); - WRITE_STRING( name.c_str() ); - WRITE_COORD( min_extents[2] ); - WRITE_COORD( max_extents[2] ); - WRITE_COORD( min_extents[0] ); - WRITE_COORD( min_extents[1] ); - WRITE_COORD( max_extents[0] ); - WRITE_COORD( max_extents[1] ); - WRITE_BYTE( draw_background ? 1 : 0 ); - MESSAGE_END(); - } - - void NetMsg_SetupMap_Location( entvars_t* const pev, const string& name, const float* const min_extents, const float* const max_extents ) - { - MESSAGE_BEGIN( MSG_ONE, g_msgSetupMap, NULL, pev ); - WRITE_BYTE( 1 ); - WRITE_STRING( name.c_str() ); - WRITE_COORD( max_extents[0] ); - WRITE_COORD( max_extents[1] ); - WRITE_COORD( min_extents[0] ); - WRITE_COORD( min_extents[1] ); - MESSAGE_END(); - } -#endif - -//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -#ifndef AVH_SERVER - void NetMsg_UpdateCountdown( void* const buffer, const int size, int& countdown ) - { - BEGIN_READ( buffer, size ); - countdown = READ_BYTE(); - END_READ(); - } -#else - void NetMsg_UpdateCountdown( const int countdown ) - { - MESSAGE_BEGIN( MSG_ALL, g_msgUpdateCountdown ); - WRITE_BYTE( countdown ); - MESSAGE_END(); - } +void NetMsg_UpdateCountdown(const int countdown) +{ + MESSAGE_BEGIN(MSG_ALL, g_msgUpdateCountdown); + WRITE_BYTE(countdown); + MESSAGE_END(); +} #endif //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -2016,10 +2036,10 @@ const int kStatusMask = 0x3F; const int kNumTeamBits = 2; const int kTeamMask = 0x03; const int kNumPositionCoordinateBits = 12; -const int kPositionCoordinateMask = 0xFFF; +const int kPositionCoordinateMask = 0xFFF; const int kPositionCoordinateOffset = 4096; const float kPositionCoordinateScale = 0.5f; -const int kNumPositionBits = kNumPositionCoordinateBits*2; +const int kNumPositionBits = kNumPositionCoordinateBits * 2; const int kNumSquadBits = 3; const int kSquadMask = 0x07; @@ -2031,226 +2051,226 @@ const int kNumIndexBits = 14; const int kIndexMask = 0x3FFF; const int kNumFlagBits = 3; const int kFlagMask = 0x07; -const int kEntHierFlagPlayer = 0x01; -const int kEntHierFlagDeletion = 0x02; +const int kEntHierFlagPlayer = 0x01; +const int kEntHierFlagDeletion = 0x02; const int kEntHierFlagUnderAttack = 0x04; #ifndef AVH_SERVER - //TODO : replace OldItems with vector - void ReadEntHier( MapEntityMap& NewItems, EntityListType& OldItems, int short_data, int long_data ); - float UnpackageCoord( const int packaged_coord ); - void NetMsg_DelEntityHierarchy(void* const buffer, const int size ) { - BEGIN_READ( buffer, size ); - END_READ(); - } - void NetMsg_UpdateEntityHierarchy( void* const buffer, const int size, MapEntityMap& NewItems, EntityListType& OldItems ) +//TODO : replace OldItems with vector +void ReadEntHier(MapEntityMap& NewItems, EntityListType& OldItems, int short_data, int long_data); +float UnpackageCoord(const int packaged_coord); +void NetMsg_DelEntityHierarchy(void* const buffer, const int size) { + BEGIN_READ(buffer, size); + END_READ(); +} +void NetMsg_UpdateEntityHierarchy(void* const buffer, const int size, MapEntityMap& NewItems, EntityListType& OldItems) +{ + NewItems.clear(); + OldItems.clear(); + int amnt_read = 0; + int short_data, long_data = 0; + BEGIN_READ(buffer, size); + while (amnt_read < size) { - NewItems.clear(); - OldItems.clear(); - int amnt_read = 0; - int short_data, long_data = 0; - BEGIN_READ( buffer, size ); - while( amnt_read < size ) - { - short_data = READ_SHORT(); - amnt_read += 2; - if( (short_data & kEntHierFlagDeletion) == 0 ) - { - long_data = READ_LONG(); - amnt_read += 4; - } - ReadEntHier( NewItems, OldItems, short_data, long_data ); - } - END_READ(); + short_data = READ_SHORT(); + amnt_read += 2; + if ((short_data & kEntHierFlagDeletion) == 0) + { + long_data = READ_LONG(); + amnt_read += 4; + } + ReadEntHier(NewItems, OldItems, short_data, long_data); } + END_READ(); +} - void ReadEntHier( MapEntityMap& NewItems, EntityListType& OldItems, int short_data, int long_data ) +void ReadEntHier(MapEntityMap& NewItems, EntityListType& OldItems, int short_data, int long_data) +{ + int flags = short_data & kFlagMask; + short_data >>= kNumFlagBits; + + if ((flags & kEntHierFlagDeletion) == kEntHierFlagDeletion) // Deletion (player or otherwise) { - int flags = short_data & kFlagMask; - short_data >>= kNumFlagBits; - - if( (flags & kEntHierFlagDeletion) == kEntHierFlagDeletion ) // Deletion (player or otherwise) - { - OldItems.push_back( short_data & kIndexMask ); - return; - } - - MapEntity ent; - int index = 0; - - ent.mUnderAttack = ((flags & kEntHierFlagUnderAttack) == kEntHierFlagUnderAttack ); - ent.mUser3 = (AvHUser3)(long_data & kStatusMask); - long_data >>= kNumStatusBits; - ent.mTeam = (AvHTeamNumber)(long_data & kTeamMask); - long_data >>= kNumTeamBits; - ent.mY = UnpackageCoord(long_data & kPositionCoordinateMask); - long_data >>= kNumPositionCoordinateBits; - ent.mX = UnpackageCoord(long_data & kPositionCoordinateMask); - - - - if( (flags & kEntHierFlagPlayer) == kEntHierFlagPlayer ) // Player added/changed - { - index = short_data & kPlayerIndexMask; - short_data >>= kNumPlayerIndexBits; - ent.mAngle = (short_data & kAngleMask) * 22.5f; - short_data >>= kNumAngleBits; - ent.mSquadNumber = short_data & kSquadMask; - } - else // Other item added/changed - { - index = short_data & kIndexMask; - short_data >>= kNumIndexBits; - ent.mSquadNumber = 0; - ent.mAngle = 0; - } - - NewItems.insert( MapEntityMap::value_type( index, ent ) ); + OldItems.push_back(short_data & kIndexMask); + return; } - float UnpackageCoord( const int packaged_coord ) + MapEntity ent; + int index = 0; + + ent.mUnderAttack = ((flags & kEntHierFlagUnderAttack) == kEntHierFlagUnderAttack); + ent.mUser3 = (AvHUser3)(long_data & kStatusMask); + long_data >>= kNumStatusBits; + ent.mTeam = (AvHTeamNumber)(long_data & kTeamMask); + long_data >>= kNumTeamBits; + ent.mY = UnpackageCoord(long_data & kPositionCoordinateMask); + long_data >>= kNumPositionCoordinateBits; + ent.mX = UnpackageCoord(long_data & kPositionCoordinateMask); + + + + if ((flags & kEntHierFlagPlayer) == kEntHierFlagPlayer) // Player added/changed { - float returnVal = packaged_coord; - returnVal /= kPositionCoordinateScale; - returnVal -= kPositionCoordinateOffset; - return returnVal; + index = short_data & kPlayerIndexMask; + short_data >>= kNumPlayerIndexBits; + ent.mAngle = (short_data & kAngleMask) * 22.5f; + short_data >>= kNumAngleBits; + ent.mSquadNumber = short_data & kSquadMask; } + else // Other item added/changed + { + index = short_data & kIndexMask; + short_data >>= kNumIndexBits; + ent.mSquadNumber = 0; + ent.mAngle = 0; + } + + NewItems.insert(MapEntityMap::value_type(index, ent)); +} + +float UnpackageCoord(const int packaged_coord) +{ + float returnVal = packaged_coord; + returnVal /= kPositionCoordinateScale; + returnVal -= kPositionCoordinateOffset; + return returnVal; +} #else - void WriteEntHier( const int index, const MapEntity& ent, bool delete_flag, int& short_data, int& long_data ); - int PackageCoord( const float coord ); - void NetMsg_DelEntityHierarchy( entvars_t* const pev ) - { - if ( pev == NULL ) { - MESSAGE_BEGIN( MSG_SPEC, g_msgDelEntityHierarchy); - } - else { - MESSAGE_BEGIN( MSG_ONE, g_msgDelEntityHierarchy, NULL, pev ); - } - MESSAGE_END(); +void WriteEntHier(const int index, const MapEntity& ent, bool delete_flag, int& short_data, int& long_data); +int PackageCoord(const float coord); +void NetMsg_DelEntityHierarchy(entvars_t* const pev) +{ + if (pev == NULL) { + MESSAGE_BEGIN(MSG_SPEC, g_msgDelEntityHierarchy); } + else { + MESSAGE_BEGIN(MSG_ONE, g_msgDelEntityHierarchy, NULL, pev); + } + MESSAGE_END(); +} - void NetMsg_UpdateEntityHierarchy( entvars_t* const pev, const MapEntityMap& NewItems, const EntityListType& OldItems, bool specMsg ) +void NetMsg_UpdateEntityHierarchy(entvars_t* const pev, const MapEntityMap& NewItems, const EntityListType& OldItems, bool specMsg) +{ + const int kMaxUpdatesPerPacket = 30; + if (NewItems.empty() && OldItems.empty()) { return; } //nothing to send! + + MapEntityMap::const_iterator new_current, new_end = NewItems.end(); + MapEntity temp; + EntityListType::const_iterator old_current, old_end = OldItems.end(); + int short_data, long_data, count = 1; + if (specMsg) { + MESSAGE_BEGIN(MSG_SPEC, g_msgUpdateEntityHierarchy); + } + else { + MESSAGE_BEGIN(MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev); + } + for (new_current = NewItems.begin(); new_current != new_end; ++new_current, ++count) { - const int kMaxUpdatesPerPacket = 30; - if( NewItems.empty() && OldItems.empty() ) { return; } //nothing to send! - - MapEntityMap::const_iterator new_current, new_end = NewItems.end(); - MapEntity temp; - EntityListType::const_iterator old_current, old_end = OldItems.end(); - int short_data, long_data, count = 1; - if ( specMsg ) { - MESSAGE_BEGIN( MSG_SPEC, g_msgUpdateEntityHierarchy); - } - else { - MESSAGE_BEGIN( MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev ); - } - for( new_current = NewItems.begin(); new_current != new_end; ++new_current, ++count ) + if (count % kMaxUpdatesPerPacket == 0) { - if( count % kMaxUpdatesPerPacket == 0 ) - { - MESSAGE_END(); - if ( specMsg ) { - MESSAGE_BEGIN( MSG_SPEC, g_msgUpdateEntityHierarchy); - } - else - MESSAGE_BEGIN( MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev ); + MESSAGE_END(); + if (specMsg) { + MESSAGE_BEGIN(MSG_SPEC, g_msgUpdateEntityHierarchy); } - WriteEntHier( new_current->first, new_current->second, false, short_data, long_data ); - WRITE_SHORT(short_data); - WRITE_LONG(long_data); + else + MESSAGE_BEGIN(MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev); } - for( old_current = OldItems.begin(); old_current != old_end; ++old_current, ++count ) - { - if( count % kMaxUpdatesPerPacket == 0 ) - { - MESSAGE_END(); - if ( specMsg ) { - MESSAGE_BEGIN( MSG_SPEC, g_msgUpdateEntityHierarchy); - } - else - MESSAGE_BEGIN( MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev ); - } - WriteEntHier( *old_current, temp, true, short_data, long_data ); - WRITE_SHORT(short_data); - } - MESSAGE_END(); + WriteEntHier(new_current->first, new_current->second, false, short_data, long_data); + WRITE_SHORT(short_data); + WRITE_LONG(long_data); } - - void WriteEntHier( const int index, const MapEntity& ent, bool delete_flag, int& short_data, int& long_data ) + for (old_current = OldItems.begin(); old_current != old_end; ++old_current, ++count) { - if( delete_flag ) + if (count % kMaxUpdatesPerPacket == 0) { - ASSERT( (index & ~kIndexMask) == 0 ); - short_data = index; - short_data <<= kNumFlagBits; - ASSERT( (short_data & kFlagMask) == 0 ); - short_data |= kEntHierFlagDeletion; - return; - } - - long_data = PackageCoord(ent.mX); - long_data <<= kNumPositionCoordinateBits; - ASSERT((long_data & kPositionCoordinateMask) == 0); - long_data |= PackageCoord(ent.mY); - long_data <<= kNumTeamBits; - ASSERT((long_data & kTeamMask) == 0); - ASSERT((ent.mTeam & ~kTeamMask) == 0); - long_data |= ent.mTeam & kTeamMask; - long_data <<= kNumStatusBits; - ASSERT((long_data & kStatusMask) == 0); - ASSERT((ent.mUser3 & ~kStatusMask) == 0); - long_data |= ent.mUser3 & kStatusMask; - - - switch( ent.mUser3 ) - { - case AVH_USER3_MARINE_PLAYER: case AVH_USER3_COMMANDER_PLAYER: - case AVH_USER3_ALIEN_PLAYER1: case AVH_USER3_ALIEN_PLAYER2: - case AVH_USER3_ALIEN_PLAYER3: case AVH_USER3_ALIEN_PLAYER4: - case AVH_USER3_ALIEN_PLAYER5: case AVH_USER3_ALIEN_EMBRYO: - case AVH_USER3_HEAVY: - { - ASSERT( (ent.mSquadNumber & ~kSquadMask) == 0 ); - short_data = ent.mSquadNumber; - short_data <<= kNumAngleBits; - int angle = WrapFloat(ent.mAngle,0,360); - angle /= 22.5f; - ASSERT( (short_data & kAngleMask) == 0); - ASSERT( (angle & ~kAngleMask) == 0); - short_data |= angle & kAngleMask; - short_data <<= kNumPlayerIndexBits; - ASSERT( ( short_data & kPlayerIndexMask ) == 0 ); - ASSERT( ( index & ~kPlayerIndexMask ) == 0 ); - short_data |= index & kIndexMask; - short_data <<= kNumFlagBits; - ASSERT( ( short_data & kFlagMask ) == 0 ); - short_data |= kEntHierFlagPlayer; - if ( ent.mUnderAttack ) short_data |= kEntHierFlagUnderAttack; - break; - } - default: - ASSERT( ( index & ~kIndexMask ) == 0 ); - short_data = index & kIndexMask; - short_data <<= kNumFlagBits; - ASSERT( (short_data & kFlagMask) == 0 ); - if ( ent.mUnderAttack ) { - short_data |= kEntHierFlagUnderAttack; + MESSAGE_END(); + if (specMsg) { + MESSAGE_BEGIN(MSG_SPEC, g_msgUpdateEntityHierarchy); } + else + MESSAGE_BEGIN(MSG_ONE, g_msgUpdateEntityHierarchy, NULL, pev); } + WriteEntHier(*old_current, temp, true, short_data, long_data); + WRITE_SHORT(short_data); + } + MESSAGE_END(); +} + +void WriteEntHier(const int index, const MapEntity& ent, bool delete_flag, int& short_data, int& long_data) +{ + if (delete_flag) + { + ASSERT((index & ~kIndexMask) == 0); + short_data = index; + short_data <<= kNumFlagBits; + ASSERT((short_data & kFlagMask) == 0); + short_data |= kEntHierFlagDeletion; + return; } - int PackageCoord( const float coord ) + long_data = PackageCoord(ent.mX); + long_data <<= kNumPositionCoordinateBits; + ASSERT((long_data & kPositionCoordinateMask) == 0); + long_data |= PackageCoord(ent.mY); + long_data <<= kNumTeamBits; + ASSERT((long_data & kTeamMask) == 0); + ASSERT((ent.mTeam & ~kTeamMask) == 0); + long_data |= ent.mTeam & kTeamMask; + long_data <<= kNumStatusBits; + ASSERT((long_data & kStatusMask) == 0); + ASSERT((ent.mUser3 & ~kStatusMask) == 0); + long_data |= ent.mUser3 & kStatusMask; + + + switch (ent.mUser3) { - float adjustedCoord = coord; - adjustedCoord += kPositionCoordinateOffset; - adjustedCoord *= kPositionCoordinateScale; - int returnVal = adjustedCoord; - ASSERT( (returnVal & ~kPositionCoordinateMask) == 0); - returnVal &= kPositionCoordinateMask; - return returnVal; + case AVH_USER3_MARINE_PLAYER: case AVH_USER3_COMMANDER_PLAYER: + case AVH_USER3_ALIEN_PLAYER1: case AVH_USER3_ALIEN_PLAYER2: + case AVH_USER3_ALIEN_PLAYER3: case AVH_USER3_ALIEN_PLAYER4: + case AVH_USER3_ALIEN_PLAYER5: case AVH_USER3_ALIEN_EMBRYO: + case AVH_USER3_HEAVY: + { + ASSERT((ent.mSquadNumber & ~kSquadMask) == 0); + short_data = ent.mSquadNumber; + short_data <<= kNumAngleBits; + int angle = WrapFloat(ent.mAngle, 0, 360); + angle /= 22.5f; + ASSERT((short_data & kAngleMask) == 0); + ASSERT((angle & ~kAngleMask) == 0); + short_data |= angle & kAngleMask; + short_data <<= kNumPlayerIndexBits; + ASSERT((short_data & kPlayerIndexMask) == 0); + ASSERT((index & ~kPlayerIndexMask) == 0); + short_data |= index & kIndexMask; + short_data <<= kNumFlagBits; + ASSERT((short_data & kFlagMask) == 0); + short_data |= kEntHierFlagPlayer; + if (ent.mUnderAttack) short_data |= kEntHierFlagUnderAttack; + break; } + default: + ASSERT((index & ~kIndexMask) == 0); + short_data = index & kIndexMask; + short_data <<= kNumFlagBits; + ASSERT((short_data & kFlagMask) == 0); + if (ent.mUnderAttack) { + short_data |= kEntHierFlagUnderAttack; + } + } +} + +int PackageCoord(const float coord) +{ + float adjustedCoord = coord; + adjustedCoord += kPositionCoordinateOffset; + adjustedCoord *= kPositionCoordinateScale; + int returnVal = adjustedCoord; + ASSERT((returnVal & ~kPositionCoordinateMask) == 0); + returnVal &= kPositionCoordinateMask; + return returnVal; +} #endif @@ -2258,22 +2278,22 @@ const int kEntHierFlagUnderAttack = 0x04; // : 0000971 #ifndef AVH_SERVER - void NetMsg_IssueOrder( void* const buffer, const int size, int& ordertype, int& ordersource, int& ordertarget ) - { - BEGIN_READ( buffer, size ); - ordertype = READ_BYTE(); - ordersource = READ_LONG(); - ordertarget = READ_LONG(); - END_READ(); - } +void NetMsg_IssueOrder(void* const buffer, const int size, int& ordertype, int& ordersource, int& ordertarget) +{ + BEGIN_READ(buffer, size); + ordertype = READ_BYTE(); + ordersource = READ_LONG(); + ordertarget = READ_LONG(); + END_READ(); +} #else - void NetMsg_IssueOrder( entvars_t* const pev, const int ordertype, const int ordersource, const int ordertarget) - { - MESSAGE_BEGIN( MSG_ONE, g_msgIssueOrder, NULL, pev ); - WRITE_BYTE( ordertype ); - WRITE_LONG( ordersource ); - WRITE_LONG( ordertarget ); - MESSAGE_END(); - } +void NetMsg_IssueOrder(entvars_t* const pev, const int ordertype, const int ordersource, const int ordertarget) +{ + MESSAGE_BEGIN(MSG_ONE, g_msgIssueOrder, NULL, pev); + WRITE_BYTE(ordertype); + WRITE_LONG(ordersource); + WRITE_LONG(ordertarget); + MESSAGE_END(); +} #endif -// : +// : \ No newline at end of file diff --git a/main/source/mod/AvHOverviewMap.cpp b/main/source/mod/AvHOverviewMap.cpp index 5933a066..29e242a4 100644 --- a/main/source/mod/AvHOverviewMap.cpp +++ b/main/source/mod/AvHOverviewMap.cpp @@ -253,7 +253,9 @@ void AvHOverviewMap::GetColorForEntity(const DrawableEntity& entity, float& outR } else if (entity.mTeam == mTeam && !isStructure) { - thePlayerId = entity.mPlayerSlot; + + cl_entity_s* theEntity = gEngfuncs.GetEntityByIndex(entity.mEntityNumber); + thePlayerId = theEntity->curstate.number; string test = to_string(entity.mPlayerSlot) + '\n'; //ConsolePrint(test.c_str()); if (gHUD.GetServerVariableFloat(kvTournamentMode)) { @@ -355,7 +357,7 @@ void AvHOverviewMap::GetColorForEntity(const DrawableEntity& entity, float& outR }*/ } else { - if (entity.mTeam == TEAM_ONE) { + /* if (entity.mTeam == TEAM_ONE) { outR = 0.33; outG = 0.95; outB = 1.0; @@ -386,17 +388,51 @@ void AvHOverviewMap::GetColorForEntity(const DrawableEntity& entity, float& outR outR = 0.0; outG = 0.0; outB = 0.0; - } + }*/ if (isStructure) { + cl_entity_s* theStructEntity = gEngfuncs.GetEntityByIndex(entity.mEntityNumber); + int health = theStructEntity->curstate.health; + int solid = theStructEntity->curstate.solid; + int f1 = theStructEntity->curstate.fuser1; + int f2 = theStructEntity->curstate.fuser2; + int f3 = theStructEntity->curstate.fuser3; + int f4 = theStructEntity->curstate.fuser4; + ConsolePrint("--------------------------------\n"); + ConsolePrint(("ENTITY ID : " + to_string(entity.mEntityNumber)).c_str()); + ConsolePrint("--------------------------------\n"); + ConsolePrint(("health " +to_string(health)+"\n").c_str()); + ConsolePrint(("solid " + to_string(solid) + "\n").c_str()); + ConsolePrint(("f1 " + to_string(f1) + "\n").c_str()); + ConsolePrint(("f2 " + to_string(f2) + "\n").c_str()); + ConsolePrint(("f3 " + to_string(f4) + "\n").c_str()); + ConsolePrint(("f4 " + to_string(f4) + "\n").c_str()); + ConsolePrint("--------------------------------\n"); + + if (entity.mTeam == TEAM_ONE) { - outR = 0.43; - outG = 0.70; - outB = 1.0; + if (f1 == 1000) { + outR = 0.43; //110 + outG = 0.70; //180 + outB = 1.0; //255 + } + else { + outR = 200.0/255.0; //110 + outG = 200.0/255.0; //180 + outB = 255; //255 + } } else if (entity.mTeam == TEAM_TWO) { - outR = 0.88; - outG = 0.45; - outB = 0.00; + if (f1 == 1000) { + outR = 0.88; + outG = 0.45; + outB = 0.00; + } + else { + outR = 255.0 / 255.0; //110 + outG = 200.0 / 255.0; //180 + outB = 200.0; //255 + } + } } } diff --git a/main/source/mod/AvHPlayer.cpp b/main/source/mod/AvHPlayer.cpp index 458e31e8..3c4aca5d 100644 --- a/main/source/mod/AvHPlayer.cpp +++ b/main/source/mod/AvHPlayer.cpp @@ -269,7 +269,7 @@ extern int gNumFullPackCalls; extern int gWeaponAnimationEventID; extern int gMetabolizeSuccessEventID; extern int gPhaseInEventID; - +extern bool mIsReady; // for tournamentmode, if player is ready // Yucky globals extern AvHParticleTemplateListServer gParticleTemplateList; extern AvHSoundListManager gSoundListManager; @@ -298,6 +298,14 @@ AvHPlayer::AvHPlayer() this->InitBalanceVariables(); } +void AvHPlayer::setReady(bool ready) { + mIsReady = ready; +} + +bool AvHPlayer::getReadyStatus() { + return mIsReady; +} + void AvHPlayer::AddDebugEnemyBlip(float inX, float inY, float inZ) { this->mEnemyBlips.AddBlip(inX, inY, inZ); diff --git a/main/source/mod/AvHPlayer.h b/main/source/mod/AvHPlayer.h index 505b4a52..2a08d67b 100644 --- a/main/source/mod/AvHPlayer.h +++ b/main/source/mod/AvHPlayer.h @@ -603,6 +603,9 @@ private: void balanceValueRemoved(const string& name, const int old_value) const; void balanceValueRemoved(const string& name, const string& old_value) const; + void setReady(bool ready); + bool getReadyStatus(); + float mResources; bool mFirstUpdate; diff --git a/main/source/mod/NetworkMeter.cpp b/main/source/mod/NetworkMeter.cpp index 4c78df62..9cad6c04 100644 --- a/main/source/mod/NetworkMeter.cpp +++ b/main/source/mod/NetworkMeter.cpp @@ -52,10 +52,12 @@ void NetworkMeterMessageBegin(int msg_dest, int msg_type, const float* pOrigin, if(ns_cvar_float(&avh_networkdebug) > 0) networkDebug=true; #endif + networkDebug = true; if(networkDebug) { char theDebugString[512]; sprintf(theDebugString, "MessageBegin(%d, %d...)\n", msg_dest, msg_type); + UTIL_LogPrintf(theDebugString, "MessageBegin(%d, %d...)\n", msg_dest, msg_type); ALERT(at_logged, theDebugString); }