//======== (C) Copyright 2001 Charles G. Cleveland All rights reserved. =========
//
// The copyright to the contents herein is the property of Charles G. Cleveland.
// The contents may be used and/or copied only with the written permission of
// Charles G. Cleveland, or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose: 
//
// $Workfile: AvHConsoleCommands.cpp$
// $Date: 2002/11/22 21:28:16 $
//
//-------------------------------------------------------------------------------
// $Log: AvHConsoleCommands.cpp,v $
// Revision 1.31  2002/11/22 21:28:16  Flayra
// - mp_consistency changes
//
// Revision 1.30  2002/11/15 04:46:53  Flayra
// - Utility command
//
// Revision 1.29  2002/11/03 04:49:56  Flayra
// - Team balance fixes
//
// Revision 1.28  2002/10/28 20:33:55  Flayra
// - Added confirmation to auth command
//
// Revision 1.27  2002/10/24 21:22:40  Flayra
// - Commented out adjust score cheat for release (even with cheats on, this is abusive)
//
// Revision 1.26  2002/10/20 16:45:19  Flayra
// - Linux update
//
// Revision 1.25  2002/10/20 16:35:46  Flayra
// - Added hack code to create a fake client to test profiling
//
// Revision 1.24  2002/10/18 22:17:12  Flayra
// - Added redeem cheat
//
// Revision 1.23  2002/10/16 00:51:33  Flayra
// - Added auth command and setauth cheat
// - Require cheats for some dev commands (oops)
//
// Revision 1.22  2002/10/03 18:41:35  Flayra
// - Allow setskin to work without chets, for testing
//
// Revision 1.21  2002/09/23 22:11:46  Flayra
// - Regular update
//
// Revision 1.20  2002/09/09 19:49:25  Flayra
// - Added deathmessage cheat
//
// Revision 1.19  2002/08/16 02:33:32  Flayra
// - Added endgame cheat to end game for either team (to test endgame music)
//
// Revision 1.18  2002/08/09 00:56:11  Flayra
// - Added "adjustscore" cheat for testing new scoreboard
//
// Revision 1.17  2002/08/02 22:01:27  Flayra
// - Added some new cheats, refactored cheat names, changes for new alert system
//
// Revision 1.16  2002/07/10 14:39:24  Flayra
// - Added "overflow" cheat for debugging
//
// Revision 1.15  2002/07/08 16:49:34  Flayra
// - Unhacked this to fix some random bug
//
// Revision 1.14  2002/06/03 16:41:19  Flayra
// - Added "invul" cheat
//
// Revision 1.13  2002/05/23 02:34:00  Flayra
// - Post-crash checkin.  Restored @Backup from around 4/16.  Contains changes for last four weeks of development.
//
//===============================================================================
#include "util/nowarnings.h"
#include "dlls/extdll.h"
#include "dlls/util.h"
#include "dlls/cbase.h"
#include "dlls/player.h"
#include "dlls/weapons.h"
#include "mod/AvHGamerules.h"
#include "mod/AvHConstants.h"
#include "mod/AvHMarineEquipmentConstants.h"
#include "mod/AvHEntities.h"
#include "mod/AvHParticleTemplateServer.h"
#include "mod/AvHPlayer.h"
#include "dlls/client.h"
#include "dlls/game.h"
#include "dlls/util.h"
#include "mod/AvHServerUtil.h"
#include "mod/AvHServerVariables.h"
#include "mod/AvHMessage.h"
#include "mod/AvHSoundListManager.h"
#include "mod/AvHServerUtil.h"
#include "mod/AvHTitles.h"
#include "mod/AvHParticleSystemManager.h"
#include "mod/AvHMarineEquipment.h"
#include "mod/AvHMovementUtil.h"
#include "mod/AvHSharedUtil.h"
#include "textrep/TRFactory.h"
#include "mod/AvHEntities.h"
#include "mod/AvHScriptManager.h"
#include "mod/AvHCommandConstants.h"
#include "mod/AvHPlayerUpgrade.h"
#include <stdio.h>
#include "game_shared/voice_gamemgr.h"
#include "mod/AvHNetworkMessages.h"
#include "mod/AvHNexusServer.h"

extern AvHParticleTemplateListServer	gParticleTemplateList;
extern CVoiceGameMgr					g_VoiceGameMgr;
extern int								gCommanderPointsAwardedEventID;
extern cvar_t							allow_spectators;
extern cvar_t							avh_tournamentmode;
extern int                              kNumEntsProcessedForPlayerOne;

#ifdef WIN32
// this is the LINK_ENTITY_TO_CLASS function that creates a player (bot)
HINSTANCE h_Library = NULL;
typedef void (*LINK_ENTITY_FUNC)(entvars_t *);

void player( entvars_t *pev )
{
	if(!h_Library)
	{
		string libName = string(getModDirectory()) + "\\dlls\\ns.dll";
		h_Library = LoadLibrary(libName.c_str());
	}
	   
	static LINK_ENTITY_FUNC otherClassName = NULL;
	if (otherClassName == NULL)
		otherClassName = (LINK_ENTITY_FUNC)GetProcAddress(h_Library, "player");
	if (otherClassName != NULL)
	{
		(*otherClassName)(pev);
	}
}
#endif

//------------------------------------------------------------------
// begin future MapUtils.h / MapUtils.cpp
//------------------------------------------------------------------
typedef std::pair<string,int> EntityInfoNodeType;
typedef std::map<string,int> EntityInfoMapType;
typedef std::vector<EntityInfoNodeType> EntityInfoVectorType;

bool EntityInfoSortFunction(const EntityInfoNodeType& left,const EntityInfoNodeType& right)
{
	if(left.second > right.second)
	{ return true; }
	if(left.first.compare(right.first) < 0)
	{ return true; }
	return false;
}

bool EntityInfoShouldCount(const string& inClassName)
{
	bool theShouldCount = true;
	if(inClassName.empty()) // unassigned player slot
	{
		theShouldCount = false;
	}
	else if(inClassName.compare(0,7,"weapon_") == 0)
	{
		theShouldCount = false;
	}
	else if(inClassName.compare("bodyque") == 0)
	{
		theShouldCount = false;
	}
	else if(inClassName.compare("player") == 0)
	{
		theShouldCount = false;
	}
	return theShouldCount;
}

EntityInfoVectorType EntityInfoGetVector(void)
{
	EntityInfoMapType theMap;
	const char* theClassName;
	string theClassNameString;

	for(int index = 0; index < gpGlobals->maxEntities; ++index)
	{
		edict_t* theEdict = INDEXENT(index);
		if(!FNullEnt(theEdict))
		{
			theClassName = STRING(theEdict->v.classname);
			if(theClassName)
			{
				++theMap[string(theClassName)]; 
			}
		}
	}

	EntityInfoVectorType theVector;

	EntityInfoMapType::iterator end = theMap.end();
	for(EntityInfoMapType::iterator current = theMap.begin(); current != end; ++current)
	{
		if(EntityInfoShouldCount(current->first))
		{
			theVector.push_back(EntityInfoNodeType(current->first,current->second));
		}
	}

	//sort it
	sort(theVector.begin(),theVector.end(),EntityInfoSortFunction);

	return theVector;
}

int EntityInfoGetCount()
{
	int theCount = 0;
	EntityInfoVectorType theVector = EntityInfoGetVector();
	EntityInfoVectorType::iterator end = theVector.end();
	for(EntityInfoVectorType::iterator current = theVector.begin(); current != end; ++current)
	{
		theCount += current->second;
	}
	return theCount;
}
//------------------------------------------------------------------
// end future MapUtils.h / MapUtils.cpp
//------------------------------------------------------------------


void ReportPlayer(CBasePlayer* inPlayer, const char* inCommand)
{
	#ifdef AVH_PLAYTEST_BUILD
		// Tell the server that this player executed x message
		char* theMessage = UTIL_VarArgs("%s initiated command \"%s\"\n", STRING(inPlayer->pev->netname), inCommand);
		UTIL_ClientPrintAll(HUD_PRINTNOTIFY, theMessage);
		UTIL_LogPrintf(theMessage);
	#endif
}

BOOL AvHGamerules::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
{
//adding Nexus TunnelToClient functionality up here...
	if( strcmp( pcmd, "NexusData" ) == 0 )
	{
		const char* arg1 = CMD_ARGV(1);
		return AvHNexus::recv(pPlayer->pev,arg1,strlen(arg1));
	}
//non-Nexus signal handler down here...

	AvHPlayer*	theAvHPlayer = dynamic_cast<AvHPlayer*>(pPlayer);
	AvHTeam*	theTeam = NULL;
	bool		theSuccess = false;
	bool		theIsDeveloper = false;
	bool		theIsGuide = false;
	bool		theIsServerOp = false;
	bool		theIsPlaytester = false;
	bool		theIsPlayerHelper = false;
	bool		theIsPlaytest = false;
	bool		theReportPlayer = false;
	bool		theIsDedicatedServer = false;
	bool		theIsDebug = false;

	#ifdef DEBUG
	theIsDebug = true;
	#endif

	if(theAvHPlayer)
	{
		theTeam = theAvHPlayer->GetTeamPointer();
		theIsDeveloper = theAvHPlayer->GetIsMember(PLAYERAUTH_DEVELOPER);
		theIsGuide = theAvHPlayer->GetIsMember(PLAYERAUTH_GUIDE);
		theIsPlaytester = theAvHPlayer->GetIsMember(PLAYERAUTH_PLAYTESTER);
		theIsPlayerHelper = theIsDeveloper || theIsGuide || theIsPlaytester;

		#ifdef AVH_PLAYTEST_BUILD
		theIsPlaytest = theIsPlaytester || theIsDeveloper;
		#endif
	}
	else
	{
		theIsDedicatedServer = true;
	}

	if( !theAvHPlayer || theAvHPlayer->GetIsMember(PLAYERAUTH_SERVEROP) )
	{
		theIsServerOp = true;
	}

	if(g_VoiceGameMgr.ClientCommand(pPlayer, pcmd))
	{
		theSuccess = true;
	}
	else if ( FStrEq( pcmd, kcJoinTeamOne ) )
	{
		if(theAvHPlayer)
		{
			this->AttemptToJoinTeam(theAvHPlayer, TEAM_ONE, true);
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcJoinTeamTwo ) )
	{
		if(theAvHPlayer)
		{
			this->AttemptToJoinTeam(theAvHPlayer, TEAM_TWO, true);
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcJoinTeamThree ) )
	{
		if(theAvHPlayer)
		{
			this->AttemptToJoinTeam(theAvHPlayer, TEAM_THREE, true);
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcJoinTeamFour ) )
	{
		if(theAvHPlayer)
		{
			this->AttemptToJoinTeam(theAvHPlayer, TEAM_FOUR, true);
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcAutoAssign ) )
	{
		if(theAvHPlayer)
		{
			this->AutoAssignPlayer(theAvHPlayer);
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcReadyRoom ) )
	{
		if(theAvHPlayer)
		{
			if(!(theAvHPlayer->pev->flags & FL_FAKECLIENT))
			{
				if(!theAvHPlayer->GetIsBeingDigested())
				{
					// puzl: 984
					// Add a throttle on the readyroom key
					const static int kReadyRoomThrottleTimeout=2.0f;
					if ( (theAvHPlayer->GetTimeLastF4() == -1.0f) || 
						 (gpGlobals->time > theAvHPlayer->GetTimeLastF4() + kReadyRoomThrottleTimeout) )  
					{
						theAvHPlayer->SendMessage(kReadyRoomThrottleMessage);
						theAvHPlayer->SetTimeLastF4(gpGlobals->time);
					}
					else if ( gpGlobals->time < theAvHPlayer->GetTimeLastF4() + kReadyRoomThrottleTimeout )
					{
						theAvHPlayer->SetPlayMode(PLAYMODE_READYROOM, true);
					}
				}
				theSuccess = true;
			}
		}
		theSuccess = true;
	}
	else if (FStrEq(pcmd, kcStartGame))
	{
		if(this->GetCheatsEnabled())
		{
			this->SetGameStarted(true);
		}
		theSuccess = true;
	}
	else if(FStrEq(pcmd, kcSwitch))
	{
		if(this->GetCheatsEnabled() || theIsPlaytest)
		{
			AvHTeamNumber thePlayerTeam = theAvHPlayer->GetTeam();
			if(thePlayerTeam != TEAM_IND)
			{
				ReportPlayer(theAvHPlayer, kcSwitch);
				AvHTeamNumber teamA = GetGameRules()->GetTeamA()->GetTeamNumber();
				AvHTeamNumber teamB = GetGameRules()->GetTeamB()->GetTeamNumber();

				// Get other team
				AvHTeamNumber theOtherTeamNumber = (thePlayerTeam == teamA) ? teamB : teamA;
				
				// Remember current position
				Vector theCurrentPosition = theAvHPlayer->pev->origin;
				Vector theCurrentAngles = theAvHPlayer->pev->angles;

				// Switch teams
				theAvHPlayer->SetPlayMode(PLAYMODE_READYROOM, true);
				this->AttemptToJoinTeam(theAvHPlayer, theOtherTeamNumber, false);

				// tankefugl: 0001010 - Boost the player 32 units up to avoid sticking in the ground
				theCurrentPosition[2] += 32.0f;

				// Set our position again
				theAvHPlayer->pev->origin = theCurrentPosition;
				theAvHPlayer->pev->angles = theCurrentAngles;
				theAvHPlayer->pev->fixangle = 1;
			}

			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, "givexp"))
	{
		if(this->GetCheatsEnabled())
		{
			AvHPlayer* thePlayer = dynamic_cast<AvHPlayer*>(theAvHPlayer->GetSpectatingEntity());
			if(!thePlayer)
			{
				thePlayer = theAvHPlayer;
			}

			if(thePlayer && thePlayer->GetIsRelevant())
			{
				int theTargetLevel = 1;

				int theNumArgs = CMD_ARGC();
				if(theNumArgs == 2)
				{
					sscanf(CMD_ARGV(1), "%d", &theTargetLevel);
				}

				GetGameRules()->AwardExperience(thePlayer, theTargetLevel);

				theSuccess = true;
			}
		}
	}
	else if(FStrEq(pcmd, kcRestartRound) || FStrEq(pcmd, kcRestart))
	{
		if(!theAvHPlayer || theIsServerOp || theIsPlaytest || theIsDedicatedServer || theIsDebug || this->GetCheatsEnabled())
		{
            if(theAvHPlayer)
            {
                ReportPlayer(theAvHPlayer, pcmd);
            }

			// Reset game world
			this->ResetGame(true);
		}
		theSuccess = true;
	}
	#ifdef AVH_PLAYTEST_BUILD
	else if(FStrEq(pcmd, kcTournyMode))
	{
		if(theIsPlaytest)
		{
			char theCommand[128];
			sprintf(theCommand, "%s %d\n", kvTournamentMode, !((int)avh_tournamentmode.value));
			SERVER_COMMAND(theCommand);
			
			theSuccess = true;
		}
	}
	#endif
// puzl: 0001073
	#ifdef USE_OLDAUTH
	else if(FStrEq(pcmd, "forceuplink"))
	{
		if(theIsDeveloper || theIsDedicatedServer)
		{
			this->InitializeAuthentication();
			UTIL_SayText("Initialized authentication.", theAvHPlayer);
		}
		theSuccess = true;
	}
	# endif
	else if(FStrEq(pcmd, kcSetBalanceVar))
	{
		if( theAvHPlayer && theAvHPlayer->GetIsAuthorized(AUTH_ACTION_ADJUST_BALANCE,0) )
		{
			BalanceValueContainer* container = BalanceValueContainerFactory::get(BalanceValueContainerFactory::getDefaultFilename());
			int theNumArgs = CMD_ARGC();
			if( theNumArgs == 3 )
			{
				string name(CMD_ARGV(1));
				string value(CMD_ARGV(2));
				if( value.at(0) == '"' )
				{
					container->insert(name,value.substr(1,value.length()-1));
				}
				else if( value.at(value.length()-1) == 'f' || value.find('.') != string::npos )
				{
					float fvalue = (float)atof(value.c_str());
					container->insert(name,fvalue);
				}
				else
				{
					int ivalue = atoi(value.c_str());
					container->insert(name,ivalue);
				}
			}
		}
		
		theSuccess = true;
	}
	else if(FStrEq(pcmd, kcNSChangeLevel))
	{
		if(theIsServerOp || theIsPlaytest)
		{
			char theLevelName[1024];
			if(sscanf(CMD_ARGV(1), "%s", theLevelName) == 1)
			{
				ReportPlayer(theAvHPlayer, pcmd);
				CHANGE_LEVEL(theLevelName, NULL );
			}
			else
			{
				UTIL_SayText("Usage: changelevel <mapname>", theAvHPlayer);
			}
		}
		else
		{
			UTIL_SayText("You're not authorized to changelevel.", theAvHPlayer);
		}

		theSuccess = true;
	}
	else if (FStrEq(pcmd, kcTestEvent))
	{
		if(theAvHPlayer && this->GetCheatsEnabled())
		{
			vec3_t theOrigin = theAvHPlayer->pev->origin;
			theOrigin.z -= 500;
			int theFlags = 0;//FEV_GLOBAL;// | FEV_HOSTONLY;
			PLAYBACK_EVENT_FULL(theFlags, theAvHPlayer->edict(), gCommanderPointsAwardedEventID, 0, theOrigin, (float *)&g_vecZero, 0.0, 0.0, /*theWeaponIndex*/ 0, 0, 0, 0 );
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcGetNumPlayers))
	{
		if(theAvHPlayer && this->GetCheatsEnabled())
		{
			int theNumPlayers = GetGameRules()->GetNumberOfPlayers();
			char theMessage[128];
			sprintf(theMessage, "Num players: %d\n", theNumPlayers);
			UTIL_SayText(theMessage, theAvHPlayer);
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcAddCat))
	{
		if(theAvHPlayer && (this->GetCheatsEnabled() || theIsPlaytest))
		{
			AvHTeam* theTeam = theAvHPlayer->GetTeamPointer();
			if(theTeam && (theTeam->GetTeamType() == AVH_CLASS_TYPE_ALIEN))
			{
				ReportPlayer(theAvHPlayer, pcmd);

				int theCategory = 0;
				sscanf(CMD_ARGV(1), "%d", &theCategory);
				AvHAlienUpgradeCategory theUpgradeCategory = AvHAlienUpgradeCategory(theCategory);
				
				theTeam->AddTeamUpgrade(theUpgradeCategory);
				
				theSuccess = true;
			}
		}
	}
	else if (FStrEq(pcmd, kcSendMessage))
	{
		if(theAvHPlayer)
		{
			if(this->GetCheatsEnabled())
			{
				if(CMD_ARGC() >= 3)
				{
					char theTooltipText[512];
					sscanf(CMD_ARGV(1), "%s", theTooltipText);
					
					int theMode = 0;
					sscanf(CMD_ARGV(2), "%d", &theMode);

					if(theMode == 0)
					{
						UTIL_ShowMessage(theTooltipText, theAvHPlayer);
					}
					else if(theMode == 1)
					{
						UTIL_Error(theAvHPlayer, theTooltipText);
					}
					else
					{
						bool theIsToolTip = (theMode == 2);

						theAvHPlayer->SendMessage(theTooltipText, (theIsToolTip)?TOOLTIP:NORMAL);
					}
					
					theSuccess = true;
				}
			}
		}
	}
	else if (FStrEq(pcmd, kcTooltip))
	{
		if(theAvHPlayer && theIsPlayerHelper)
		{
			char thePlayerName[512];
			sscanf(CMD_ARGV(1), "%s", thePlayerName);

			// Read first word as target player
			AvHPlayer* theTargetPlayer = NULL;

			FOR_ALL_ENTITIES(kAvHPlayerClassName, AvHPlayer*)
				const char* thePlayerCStrName = STRING(theEntity->pev->netname);
				if(!strcmp(thePlayerCStrName, thePlayerName))
				{
					theTargetPlayer = theEntity;
				}
			END_FOR_ALL_ENTITIES(kAvHPlayerClassName)
			
			if(theTargetPlayer)
			{
				string theToolTip;
				theToolTip = string(STRING(theAvHPlayer->pev->netname));
				theToolTip += ":";

				int theNumArgs = CMD_ARGC();
				
				for(int i=0; i < theNumArgs - 2; i++)
				{
					theToolTip += string(" ");
					char theTooltipText[512];
					sscanf(CMD_ARGV(i+2), "%s ", theTooltipText);
					theToolTip += string(theTooltipText);

					// For some reason, some punctuation comes through as separate arguments
					//if(strcmp(theTooltipText, ","))
					//{
					//	theToolTip += string(" ");
					//}
				}
				
				theTargetPlayer->SendMessage(theToolTip.c_str(), TOOLTIP);
				theSuccess = true;
			}
			else
			{
				char theErrorMessage[1024];
				sprintf(theErrorMessage, "Player \"%s\" not found.  Usage: %s CaseSensitivePlayerName Message goes here.\n", thePlayerName, kcTooltip);
				UTIL_SayText(theErrorMessage, theAvHPlayer);
			}
		}
	}
	else if (FStrEq(pcmd, kcRemoveCat))
	{
		if(theAvHPlayer)
		{
			if(this->GetCheatsEnabled() || theIsPlaytest)
			{
				AvHTeam* theTeam = theAvHPlayer->GetTeamPointer();
				if(theTeam && (theTeam->GetTeamType() == AVH_CLASS_TYPE_ALIEN))
				{
					ReportPlayer(theAvHPlayer, pcmd);

					int theCategory = 0;
					sscanf(CMD_ARGV(1), "%d", &theCategory);
					AvHAlienUpgradeCategory theUpgradeCategory = AvHAlienUpgradeCategory(theCategory);
					
					theTeam->RemoveAlienUpgradeCategory(theUpgradeCategory);
					
					theSuccess = true;
				}
			}
		}
	}
	else if (FStrEq(pcmd, kcEndGame))
	{
		// Put this back in when doing larger scale playtesting
		if(this->GetCheatsEnabled() || theIsServerOp || theIsPlaytest)
		{
			ReportPlayer(theAvHPlayer, pcmd);

			string theCheat = kcEndGame1;
			
			int theTeam = 0;
			sscanf(CMD_ARGV(1), "%d", &theTeam);
			
			if(theTeam == 2)
			{
				theCheat = kcEndGame2;
			}
			
			this->SetCheatEnabled(theCheat);
			
			//this->mVictoryTeam = theTeamNumber;
			//this->mVictoryTime = gpGlobals->time;
			////this->mVictoryDraw = true;
		}
		theSuccess = true;
	}
	else if (FStrEq(pcmd, kcStartCommandMode))
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			if( theAvHPlayer->GetTeamPointer(true)->GetTeamType() != AVH_CLASS_TYPE_MARINE )
			{
				for( int counter = TEAM_ACTIVE_BEGIN; counter < TEAM_ACTIVE_END; ++counter )
				{
					AvHTeam* team = GetGameRules()->GetTeam((AvHTeamNumber)counter);
					if( team && team->GetTeamType() == AVH_CLASS_TYPE_MARINE )
					{ 
						this->AttemptToJoinTeam( theAvHPlayer, (AvHTeamNumber)counter );
					}
				}
			}
			
			// Find position of command station
			FOR_ALL_ENTITIES(kwsTeamCommand, AvHCommandStation*)
				if( theEntity->GetTeamNumber() == theAvHPlayer->pev->team )
				{
					Vector theCommandStationOrigin;
					theCommandStationOrigin.x = (theEntity->pev->absmax.x + theEntity->pev->absmin.x)/2.0f;
					theCommandStationOrigin.y = (theEntity->pev->absmax.y + theEntity->pev->absmin.y)/2.0f;
					theCommandStationOrigin.z = (theEntity->pev->absmax.z + theEntity->pev->absmin.z)/2.0f;
			
					// Circle the station, trying points around it to see if there's room
					for(int i = 0; i < 8; i++)
					{
						const int kDistance = 100;
						Vector theOffset;
						float theAngle = (i/(float)360)*2*M_PI;
						theOffset.x = cos(theAngle)*kDistance;
						theOffset.y = sin(theAngle)*kDistance;
						theOffset.z = 20;
						
						Vector thePosition = theCommandStationOrigin + theOffset;
						
						if(AvHSUGetIsEnoughRoomForHull(thePosition, AvHMUGetHull(false, theAvHPlayer->pev->iuser3), NULL))
						{
							// Teleport to this place
							theAvHPlayer->pev->origin = thePosition;
							theSuccess = true;
							break;
						}
					}
				}
			END_FOR_ALL_ENTITIES(kwsTeamCommand)
		}
	}
	else if (FStrEq(pcmd, kcHurt))
	{
		if(this->GetCheatsEnabled())
		{
			theAvHPlayer->TakeDamage(theAvHPlayer->pev, theAvHPlayer->pev, 100, DMG_GENERIC);
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcSetCullDistance))
	{
		if(this->GetCheatsEnabled())
		{
			float theCullDistance = 0.0f;
			if(sscanf(CMD_ARGV(1), "%f", &theCullDistance) == 1)
			{
				this->mMapExtents.SetTopDownCullDistance(theCullDistance);
				theSuccess = true;
			}
		}
	}
	else if (FStrEq(pcmd, kcSetGamma))
	{
		if(this->GetCheatsEnabled())
		{
			sscanf(CMD_ARGV(1), "%f", &this->mMapGamma);
		}
		theSuccess = true;
	}
	else if (FStrEq(pcmd, kcStopCommandMode))
	{
		// Fixes problem where players can bind "stopcommandermode" and execute in ready room or maybe as spectator to get weapon
		if(theAvHPlayer && theAvHPlayer->GetIsInTopDownMode())
		{
			theAvHPlayer->SetUser3(AVH_USER3_MARINE_PLAYER);
			
			// Cheesy way to make sure player class change is sent to everyone
			theAvHPlayer->EffectivePlayerClassChanged();
			
			theSuccess = true;
		}
		else
		{
			int a = 0;
		}
	}
	else if(FStrEq(pcmd, kcBigDig))
	{
		if(this->GetCheatsEnabled())
		{
			bool theNewState = !GetGameRules()->GetIsCheatEnabled(kcBigDig);
			GetGameRules()->SetCheatEnabled(kcBigDig, theNewState);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcLowCost))
	{
		if(this->GetCheatsEnabled())
		{
			bool theNewState = !GetGameRules()->GetIsCheatEnabled(kcLowCost);
			GetGameRules()->SetCheatEnabled(kcLowCost, theNewState);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcHighDamage))
	{
		if(this->GetCheatsEnabled())
		{
			GetGameRules()->SetCheatEnabled(kcHighDamage);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcHighTech))
	{
		if(this->GetCheatsEnabled())
		{
			GetGameRules()->SetCheatEnabled(kcHighTech);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcSlowResearch))
	{
		if(this->GetCheatsEnabled())
		{
			GetGameRules()->SetCheatEnabled(kcSlowResearch);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcDetectAll))
	{
		if(this->GetCheatsEnabled())
		{
			GetGameRules()->SetCheatEnabled(kcDetectAll);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcNumInfos))
	{
		if(this->GetCheatsEnabled())
		{
			int theNumInfos = this->mInfoLocations.size();

			char theNumInfosString[128];
			sprintf(theNumInfosString, "Num infos: %d\n", theNumInfos);
			UTIL_SayText(theNumInfosString, theAvHPlayer);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcNumSpawns))
	{
		if(this->GetCheatsEnabled())
		{
			int theNumSpawns = this->mSpawnList.size();
			
			char theNumSpawnsString[128];
			sprintf(theNumSpawnsString, "Num spawns: %d\n", theNumSpawns);
			UTIL_SayText(theNumSpawnsString, theAvHPlayer);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcEntityInfo) || FStrEq(pcmd, kcMapUtilEntityInfo))
	{
		if(this->GetCheatsEnabled())
		{
			EntityInfoVectorType theEntityInfo = EntityInfoGetVector();

			ALERT(at_console, "------------------------------------------------------\n");
			ALERT(at_logged, "------------------------------------------------------\nEntityInfo Report:\n------------------------------------------------------\n");
			
			char theEntityMessage[1024];
			EntityInfoVectorType::iterator end = theEntityInfo.end();
			for(EntityInfoVectorType::iterator current = theEntityInfo.begin(); current != end; ++current)
			{
				sprintf(theEntityMessage, "\t%3d \"%s\" entities\n", current->second, current->first.c_str());
				ALERT(at_console, theEntityMessage);
				ALERT(at_logged, theEntityMessage);
			}

			ALERT(at_console, "------------------------------------------------------\n");
			ALERT(at_logged, "------------------------------------------------------\n");

			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcInvul))
	{
		if(this->GetCheatsEnabled())
		{
			if(theAvHPlayer->pev->takedamage == DAMAGE_AIM)
			{
				theAvHPlayer->pev->takedamage = DAMAGE_NO;
				UTIL_SayText("Invul ON", theAvHPlayer);
			}
			else
			{
				theAvHPlayer->pev->takedamage = DAMAGE_AIM;
				UTIL_SayText("Invul OFF", theAvHPlayer);
			}
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcEditPS))
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			const char* theName = CMD_ARGV(1);
			uint32 theParticleIndex;
			if(gParticleTemplateList.GetTemplateIndexWithName(theName, theParticleIndex))
			{
				theAvHPlayer->SendMessage(kEditingParticleSystem, TOOLTIP);
				NetMsg_EditPS( theAvHPlayer->pev, theParticleIndex );
			}
			else
			{
				theAvHPlayer->SendMessage(kNoParticleSystem, TOOLTIP);
			}
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcListPS))
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			int theNumTemplates = gParticleTemplateList.GetNumberTemplates();
			
			for(int i = 0; i < theNumTemplates; i++)
			{
				string theTemplateName("<system not found>");
				const AvHParticleTemplate* theTemplate = gParticleTemplateList.GetTemplateAtIndex(i);
				if(theTemplate)
				{ theTemplateName = theTemplate->GetName(); }

				theTemplateName += "\n";
				NetMsg_ListPS( theAvHPlayer->pev, theTemplateName );
			}
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcRedeem))
	{
		if(this->GetCheatsEnabled())
		{
			theAvHPlayer->Redeem();
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcBuildMiniMap))
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			const char* theCStrLevelName = STRING(gpGlobals->mapname);
			if(theCStrLevelName && !FStrEq(theCStrLevelName, ""))
			{
				GetGameRules()->BuildMiniMap(theAvHPlayer);
				theSuccess = true;
			}
		}
	}
    else if(FStrEq(pcmd, "votemap"))
    {
        if(theAvHPlayer)
        {
            // If map number passed
            int theMapNumber = 0;
            if(sscanf(CMD_ARGV(1), "%d", &theMapNumber) == 1)
            {
                // Add vote to this map.  Server might change maps immediately.
                GetGameRules()->VoteMap(theAvHPlayer->entindex(), theMapNumber);
            }
            else
            {
                // Print the list of maps and votes to the player
                StringList theMapVoteList;
                GetGameRules()->GetMapVoteStrings(theMapVoteList);

                for(StringList::iterator theIter = theMapVoteList.begin(); theIter != theMapVoteList.end(); theIter++)
                {
                    ClientPrint(theAvHPlayer->pev, HUD_PRINTNOTIFY, theIter->c_str());
                }
            }
            
            theSuccess = true;
        }
    }
	else if(FStrEq(pcmd, "weapondebug"))
	{
		//                     ClientPrint(theAvHPlayer->pev, HUD_PRINTNOTIFY, theIter->c_str());
        if(theAvHPlayer)
        {
			ClientPrint(theAvHPlayer->pev, HUD_PRINTNOTIFY, "weapondebug\n");
			FOR_ALL_ENTITIES(kAvHPlayerClassName, AvHPlayer*)
				theEntity->PrintWeaponListToClient(theAvHPlayer);
			END_FOR_ALL_ENTITIES(kAvHPlayerClassName)
			theSuccess = true;
		}
	}
#ifdef DEBUG
    else if(FStrEq(pcmd, "catalyst"))
    {
        if(this->GetCheatsEnabled())
        {
            if(AvHCatalyst::GiveCatalyst(theAvHPlayer))
            {
                theSuccess = true;
            }
        }
    }
	else if(FStrEq(pcmd, "showmenu"))
	{
		short theSlots = 0x1f;
		char theDisplayTime = -1;
		bool theNeedMore = false;
		char* theString = NULL;
		
		char theMenuText[1024];
		if(sscanf(CMD_ARGV(1), "%s", theMenuText) == 1)
		{
			NetMsg_ShowMenu( theAvHPlayer->pev, theSlots, theDisplayTime, theNeedMore ? 1 : 0, string(theMenuText) );
		}
		
		theSuccess = true;
	}
    else if(FStrEq(pcmd, "calcxp"))
    {
        if(theAvHPlayer)
        {
            char theString[512];
			sprintf(theString, "Experience for levels:\n");
            
            for(int i=1; i <= 10; i++)
            {
                float theExperienceForLevel = AvHPlayerUpgrade::GetExperienceForLevel(i);
                char theExpString[128];
                sprintf(theExpString, "\t%d/%d\n", i, (int)theExperienceForLevel);
                strcat(theString, theExpString);
            }

            ALERT(at_logged, theString);
            theSuccess = true;
        }
    }
    else if(FStrEq(pcmd, "calcspawn"))
    {
        if(theAvHPlayer)
        {
            char theString[512];
            sprintf(theString, "Spawn times (marines):\n");

            char theResult[128];
            sprintf(theResult, "1v1 -> low: %f  high: %f\n", AvHSUCalcCombatSpawnTime(AVH_CLASS_TYPE_MARINE, 1, 0, 1), AvHSUCalcCombatSpawnTime(AVH_CLASS_TYPE_MARINE, 1, 9, 1));
            strcat(theString, theResult);

            sprintf(theResult, "16v16 -> low: %f  high: %f\n", AvHSUCalcCombatSpawnTime(AVH_CLASS_TYPE_MARINE, 16, 0, 1), AvHSUCalcCombatSpawnTime(AVH_CLASS_TYPE_MARINE, 16, 9, 1));
            strcat(theString, theResult);

            ALERT(at_logged, theString);
            theSuccess = true;
        }
    }
	else if(FStrEq(pcmd, "testscores"))
	{
		PlayerListType thePlayerList;
		
		FOR_ALL_ENTITIES(kAvHPlayerClassName, AvHPlayer*)
			if(UTIL_IsValidEntity(theEntity->edict()))
			{
				thePlayerList.push_back(theEntity);
			}
		END_FOR_ALL_ENTITIES(kAvHPlayerClassName);
			
		// Find random player
		if(thePlayerList.size() > 0)
		{
			AvHPlayer* thePlayer = thePlayerList[RANDOM_LONG(0, thePlayerList.size() - 1)];
			ASSERT(thePlayer);

			// Changes scores
			int theChangeType = RANDOM_LONG(0, 2);
			int theSign = RANDOM_LONG(0, 1) ? 1 : -1;
			int theAmount = RANDOM_LONG(0, 5);

			switch(theChangeType)
            {
            case 0:
                thePlayer->SetScore(thePlayer->GetScore() + theSign*theAmount);
                break;
            case 1:
                thePlayer->pev->frags += theSign*theAmount;
                break;
            case 2:
                thePlayer->m_iDeaths += theSign*theAmount;
                break;
			}

			thePlayer->EffectivePlayerClassChanged();

			theSuccess = true;
		}
	}
#endif
	else if(FStrEq(pcmd, kcOrderSelf))
	{
		if(this->GetCheatsEnabled())
		{
			GetGameRules()->SetCheatEnabled(kcOrderSelf);
			theSuccess = true;
		}
	}
#ifdef DEBUG
	else if(FStrEq(pcmd, kcAdjustScore))
	{
		if(theAvHPlayer)
		{
			AvHTeam* theTeam = theAvHPlayer->GetTeamPointer();
			if(theTeam)
			{
				int theAmount = 0;
				sscanf(CMD_ARGV(1), "%d", &theAmount);
				
				theAvHPlayer->AddPoints(theAmount, TRUE);
				theAvHPlayer->EffectivePlayerClassChanged();
				
				theSuccess = true;
			}
		}
	}
	else if(FStrEq(pcmd, kcAttackCS))
	{
		if(this->GetCheatsEnabled())
		{
			FOR_ALL_ENTITIES(kwsTeamCommand, AvHCommandStation*)
				if(theEntity->pev->team == theAvHPlayer->pev->team)
				{
					GetGameRules()->TriggerAlert((AvHTeamNumber)theAvHPlayer->pev->team, ALERT_UNDER_ATTACK, theEntity->entindex());
					theSuccess = true;
					break;
				}
				END_FOR_ALL_ENTITIES(kwsTeamCommand);
		}
	}
	else if (FStrEq(pcmd, kcPlayHUDSound))
	{
		if(theAvHPlayer && GetGameRules()->GetCheatsEnabled())
		{
			AvHHUDSound theHUDSound = HUD_SOUND_INVALID;
			if(sscanf(CMD_ARGV(1), "%d", &theHUDSound) == 1)
			{
				theSuccess = theAvHPlayer->PlayHUDSound(theHUDSound);
			}
		}
	}
	else if(FStrEq(pcmd, kcHighSpeed))
	{
		if(this->GetCheatsEnabled())
		{
			// Toggle hispeed cheat
			bool theHiSpeedEnabled = GetGameRules()->GetIsCheatEnabled(kcHighSpeed);
			GetGameRules()->SetCheatEnabled(kcHighSpeed, !theHiSpeedEnabled);
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcCrash))
	{
		if(this->GetCheatsEnabled())
		{
			char* theCrashString = NULL;
			*theCrashString = 1;
		}
	}
	else if (FStrEq(pcmd, kcAssert))
	{
		if(this->GetCheatsEnabled())
		{
			ASSERT(false);
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcRun))
	{
		if(this->GetCheatsEnabled() /*|| theIsDeveloper*/)
		{
			const char* theScriptName = CMD_ARGV(1);
			if(theScriptName)
			{
				AvHScriptManager::Instance()->RunScript(theScriptName);
				theSuccess = true;
			}
		}
	}
	else if (FStrEq(pcmd, kcClientRun))
	{
		if(this->GetCheatsEnabled() /*|| theIsDeveloper*/)
		{
			const char* theScriptName = CMD_ARGV(1);
			if(theAvHPlayer && theScriptName)
			{
				theAvHPlayer->RunClientScript(theScriptName);
				theSuccess = true;
			}
		}
	}
	else if(FStrEq(pcmd, kcParasite))
	{
		if(this->GetCheatsEnabled())
		{
			SetUpgradeMask(&theAvHPlayer->pev->iuser4, MASK_PARASITED);
		}
	}
	else if(FStrEq( pcmd, kcStun) )
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			theAvHPlayer->SetIsStunned(true, 4.0f);
			theSuccess = true;
		}
	}
	else if (FStrEq(pcmd, kcWeb))
	{
		if(this->GetCheatsEnabled())
		{
			theAvHPlayer->SetEnsnareState(true);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcDigest))
	{
		if(this->GetCheatsEnabled())
		{
			int theDevourerIndex = 0;
			int theDevoureeIndex = 0;
			if((sscanf(CMD_ARGV(1), "%d", &theDevourerIndex) == 1) && (sscanf(CMD_ARGV(2), "%d", &theDevoureeIndex) == 1))
			{
				AvHPlayer* theDevourerPlayer = dynamic_cast<AvHPlayer*>(CBaseEntity::Instance(g_engfuncs.pfnPEntityOfEntIndex(theDevourerIndex)));
				AvHPlayer* theDevoureePlayer = dynamic_cast<AvHPlayer*>(CBaseEntity::Instance(g_engfuncs.pfnPEntityOfEntIndex(theDevoureeIndex)));
				if(theDevourerPlayer && theDevoureePlayer)
				{
					if(!theDevoureePlayer->GetIsBeingDigested())
					{
						theDevourerPlayer->StartDigestion(theDevoureePlayer->entindex());
					}
					else
					{
						theDevourerPlayer->StopDigestion(false);
					}
				}
			}
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcBoxes))
	{
		if(this->GetCheatsEnabled())
		{
			FOR_ALL_BASEENTITIES()
				AvHBaseBuildable* theBuildable = dynamic_cast<AvHBaseBuildable*>(theBaseEntity);
			if(theBuildable)
			{
				vec3_t theMinPosition = theBuildable->pev->origin + theBuildable->pev->mins;
				vec3_t theMaxPosition = theBuildable->pev->origin + theBuildable->pev->maxs;
				
				MESSAGE_BEGIN( MSG_BROADCAST, SVC_TEMPENTITY );
				
				WRITE_BYTE(TE_BOX);
				
				WRITE_COORD(theMinPosition.x);
				WRITE_COORD(theMinPosition.y);
				WRITE_COORD(theMinPosition.x);
				
				WRITE_COORD(theMaxPosition.x);
				WRITE_COORD(theMaxPosition.y);
				WRITE_COORD(theMaxPosition.z);
				
				WRITE_SHORT(100);
				
				WRITE_BYTE(0);
				WRITE_BYTE(255);
				WRITE_BYTE(0);
				
				MESSAGE_END();
			}
			
			END_FOR_ALL_BASEENTITIES();
			
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcOverflow))
	{
		if(this->GetCheatsEnabled())
		{
			// Force an overflow
			for(int i = 0; i < 100; i++)
			{
				theAvHPlayer->ForceClientDllUpdate();
			}
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcViewAll) )
	{
		// Allow even with cheats off right now, put this back in for first beta
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			GetGameRules()->SetCheatEnabled(kcViewAll);
			theSuccess = true;
		}
	}
	else if(FStrEq(pcmd, kcDeathMessage))
	{
		if(this->GetCheatsEnabled())
		{
			const char* theWeaponName = CMD_ARGV(1);
			
			NetMsg_DeathMsg( theAvHPlayer->entindex(), theAvHPlayer->entindex(), string(theWeaponName) );
		}
	}
	else if(FStrEq(pcmd, kcSetSkin))
	{
		if(this->GetCheatsEnabled())
		{
			int theSkin = 0;
			if(sscanf(CMD_ARGV(1), "%d", &theSkin) == 1)
			{
				theAvHPlayer->SetSkin(theSkin);
				
				theSuccess = true;
			}
		}
	}
	else if(FStrEq(pcmd, kcElectric))
	{
		if(this->GetCheatsEnabled())
		{
			bool theNewValue = !GetGameRules()->GetIsCheatEnabled(kcElectric);
			GetGameRules()->SetCheatEnabled(kcElectric, theNewValue);
		}
	}
	else if(FStrEq(pcmd, kcRoomType))
	{
		if(this->GetCheatsEnabled())
		{
			int theRoomType = 0;
			if(sscanf(CMD_ARGV(1), "%d", &theRoomType) == 1)
			{
				MESSAGE_BEGIN( MSG_ONE, SVC_ROOMTYPE, NULL, theAvHPlayer->pev);
				WRITE_SHORT( (short)theRoomType );
				MESSAGE_END();
				
				char theString[128];
				sprintf(theString, "Set room type to %d.\n", theRoomType);
				UTIL_SayText(theString, theAvHPlayer);
				
				theSuccess = true;
			}
		}
	}
	#ifdef WIN32
	else if(FStrEq(pcmd, "createfake"))
	{
		if(this->GetCheatsEnabled())
		{
			char theFakeClientName[256];
			sprintf(theFakeClientName, "Bot%d", RANDOM_LONG(0, 2000));
			edict_t* BotEnt = (*g_engfuncs.pfnCreateFakeClient)(theFakeClientName);
			
			// create the player entity by calling MOD's player function
			// (from LINK_ENTITY_TO_CLASS for player object)
			player( VARS(BotEnt) );
			
			char ptr[128];  // allocate space for message from ClientConnect
			ClientConnect( BotEnt, theFakeClientName, "127.0.0.1", ptr );
			
			// Pieter van Dijk - use instead of DispatchSpawn() - Hip Hip Hurray!
			ClientPutInServer( BotEnt );
			
			BotEnt->v.flags |= FL_FAKECLIENT;
		}
	}
	#endif
#endif
    else if( FStrEq( pcmd, kcGiveUpgrade) )
    {
        // Allow even with cheats off right now, put this back in for first beta
        if(this->GetCheatsEnabled())
        {
            ReportPlayer(theAvHPlayer, pcmd);
            
            int theUpgrade = 0;
            sscanf(CMD_ARGV(1), "%d", &theUpgrade);
            AvHMessageID theNewUpgrade = AvHMessageID(theUpgrade);
            
            AvHTeam* theVisibleTeam = theAvHPlayer->GetTeamPointer(true);
            if(theVisibleTeam)
            {
                theVisibleTeam->GetTechNodes().SetResearchDone(theNewUpgrade);
                this->ProcessTeamUpgrade(theNewUpgrade, theAvHPlayer->GetTeam(true), 0, true);
            }	
            theSuccess = true;
        }
    }
    else if( FStrEq( pcmd, kcRemoveUpgrade) )
    {
        // Allow even with cheats off right now, put this back in for first beta
        if(this->GetCheatsEnabled())
        {
            ReportPlayer(theAvHPlayer, pcmd);
            
            int theUpgrade = 0;
            sscanf(CMD_ARGV(1), "%d", &theUpgrade);
            AvHMessageID theNewUpgrade = AvHMessageID(theUpgrade);
            
            AvHTeam* theVisibleTeam = theAvHPlayer->GetTeamPointer(true);
            if(theVisibleTeam)
            {
                theVisibleTeam->GetTechNodes().SetResearchDone(theNewUpgrade, false);
                this->ProcessTeamUpgrade(theNewUpgrade, theAvHPlayer->GetTeam(true), 0, false);
            }
            
            theSuccess = true;
        }
    }
	else if ( FStrEq( pcmd, kcSpectate ) )
	{
		if(theAvHPlayer)
		{
			if( !theAvHPlayer->GetIsAuthorized(AUTH_ACTION_JOIN_TEAM, TEAM_SPECT) )
			{
				AvHNexus::handleUnauthorizedJoinTeamAttempt(theAvHPlayer->edict(),TEAM_SPECT);
			}
// puzl: 0001073
#ifdef USE_OLDAUTH			 
			else if(allow_spectators.value && GetGameRules()->PerformHardAuthorization(theAvHPlayer))
#else
			else if(allow_spectators.value)
#endif
			{
				if(theAvHPlayer->GetPlayMode() == PLAYMODE_READYROOM)
				{
					theAvHPlayer->SetPlayMode(PLAYMODE_OBSERVER);
					//this->PutPlayerIntoSpectateMode(theAvHPlayer);
				}
			}
			else
			{
				theAvHPlayer->SendMessage(kSpectatorsNotAllowed, TOOLTIP);
			}
			theSuccess = true;
		}
	}
	else if ( FStrEq( pcmd, kcGivePoints) )
	{
		// Allow even with cheats off right now, put this back in for first beta
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			int theAmount = 20;

			theAvHPlayer->SetResources(theAvHPlayer->GetResources() + theAmount, true);

			if(theTeam)
			{
				theTeam->AddResourcesGathered(theAmount);
			}

			theSuccess = true;
		}
	}
	else if(FStrEq( pcmd, kcKillCS) )
	{
		if(this->GetCheatsEnabled())
		{
			if(theTeam)
			{
				theTeam->KillCS();
				theSuccess = true;
			}
		}
	}
	else if(FStrEq( pcmd, kcKillHive) )
	{
		if(this->GetCheatsEnabled() || theIsPlaytest)
		{
			if(theTeam)
			{
				ReportPlayer(theAvHPlayer, pcmd);
				theTeam->KillHive();
				theSuccess = true;
			}
		}
	}
	else if(FStrEq( pcmd, kcSpawnHive) )
	{
		if(this->GetCheatsEnabled() || theIsPlaytest)
		{
			AvHTeam* theHiveTeam = theAvHPlayer->GetTeamPointer(true);
			if( theHiveTeam->GetTeamType() != AVH_CLASS_TYPE_ALIEN )
			{
				for( int counter = TEAM_ACTIVE_BEGIN; counter < TEAM_ACTIVE_END; ++counter )
				{
					theHiveTeam = GetGameRules()->GetTeam((AvHTeamNumber)counter);
					if( theHiveTeam && theHiveTeam->GetTeamType() == AVH_CLASS_TYPE_ALIEN )
					{ break; }
				}
			}
			
			if(theHiveTeam)
			{
				ReportPlayer(theAvHPlayer, pcmd);
				theHiveTeam->SpawnHive();
				theSuccess = true;
			}
		}
	}
	else if(FStrEq( pcmd, kcAlert) )
	{
		if(this->GetCheatsEnabled() && theAvHPlayer)
		{
			AvHTeam* theTeam = theAvHPlayer->GetTeamPointer(true);
			if(theTeam)
			{
				if(theTeam->GetTeamType() == AVH_CLASS_TYPE_ALIEN)
				{
					// Look for random hive, set it under attack
					AvHHive* theHive = AvHSUGetRandomActiveHive(theTeam->GetTeamNumber());
					if(theHive)
					{
                        AvHAlertType theRandomAlert = (RANDOM_LONG(0, 1) == 0) ? ALERT_HIVE_DYING : ALERT_UNDER_ATTACK;
						GetGameRules()->TriggerAlert(theTeam->GetTeamNumber(), theRandomAlert, theHive->entindex());
					}
				}
				else
				{
					if(this->GetIsCombatMode())
					{
						// Find Command station, trigger alert (to test for soldiers on ground)
						int theCCEntityIndex = 0;
						FOR_ALL_ENTITIES(kwsTeamCommand, AvHCommandStation*)
							theCCEntityIndex = theEntity->entindex();
							break;
						END_FOR_ALL_ENTITIES(kwsTeamCommand);

						if(theCCEntityIndex > 0)
						{
							this->TriggerAlert(theTeam->GetTeamNumber(), ALERT_UNDER_ATTACK, theCCEntityIndex);
						}
					}
					else
					{
						int theRandomEntity = RANDOM_LONG(1, 500);
						
						AvHAlertType theRandomAlert = AvHAlertType(RANDOM_LONG(0, ALERT_MAX_ALERTS-1));
						GetGameRules()->TriggerAlert(theTeam->GetTeamNumber(), theRandomAlert, theRandomEntity);
					}
				}
				
				theSuccess = true;
			}
		}
	}
	else if(FStrEq( pcmd, kcKillAll) )
	{
		if(this->GetCheatsEnabled())
		{
			FOR_ALL_ENTITIES(kAvHPlayerClassName, AvHPlayer*)
				theEntity->TakeDamage(theAvHPlayer->pev, theAvHPlayer->pev, 2000, DMG_GENERIC | DMG_ALWAYSGIB);
			END_FOR_ALL_ENTITIES(kAvHPlayerClassName);
			
			theSuccess = true;
		}
	}
// puzl: 0001073
#ifdef USE_OLDAUTH
    #ifndef AVH_SECURE_PRERELEASE_BUILD
	else if(FStrEq(pcmd, kcAuth))
	{
		// Toggle auth mask
		bool theNewState = !theAvHPlayer->GetAllowAuth();
		theAvHPlayer->SetAllowAuth(theNewState);

		if(theNewState)
		{
			UTIL_SayText("Authentication ON\n", theAvHPlayer);
		}
		else
		{
			UTIL_SayText("Authentication OFF\n", theAvHPlayer);
		}
		
		theSuccess = true;
	}
    #endif
#endif
	else if(FStrEq(pcmd, kcNumEnts))
	{
        bool theEnableNumEnts = GetGameRules()->GetCheatsEnabled();

        if(theEnableNumEnts)
        {
			if(theAvHPlayer)
			{
				ReportPlayer(theAvHPlayer, pcmd);
			}

			int theEntityCount = this->GetNumEntities();

		    char theNumEntsString[1024];
		    sprintf(theNumEntsString, "Total entity count: %d\n", theEntityCount);
            ALERT(at_console, theNumEntsString);
            ALERT(at_logged, theNumEntsString);
		}

        theSuccess = true;
	}
	else if(FStrEq(pcmd, kcMapUtilNumEnts))
	{
        if(GetGameRules()->GetCheatsEnabled())
        {
			int theEntityCount = EntityInfoGetCount();

		    char theNumEntsString[1024];
		    sprintf(theNumEntsString, "Total map related entity count: %d\n", theEntityCount);
            ALERT(at_console, theNumEntsString);
            ALERT(at_logged, theNumEntsString);
        }

        theSuccess = true;
    }

    return theSuccess;
}