Example #1
0
GUnitViewer* GUnitViewer::CreateUnitViewer(GnList<GUserHaveItem::Item>& cUnitItems)
{
	GetGameState()->SetGameScale( 0.7f );
	
	GUnitViewer* thisObject = GnNew GUnitViewer();	
	
	GnListIterator<GUserHaveItem::Item> iter = cUnitItems.GetIterator();
	gtint itemCount = 0;
	while( iter.Valid() )
	{
		guint32 unitIndex = iter.Item().mIndex;
		gchar idName[16] = { 0, };
		GetFileList()->GetForcesFileName( (gtuint)unitIndex, idName, sizeof( idName ) );
		GForcesController* controller = GForcesController::Create( idName, 1 );
		if( controller )
		{
			GnVector2 pos( 340.0f, 150.0f );
			if( itemCount == 0 )			
				pos.x -= 10.0f;
				
			controller->SetPosition( pos );
			controller->GetMesh()->SetVisible( false );
			thisObject->AddMeshToParentNode( controller->GetMesh() );
			controller->GetActor()->SetTargetAnimation( GAction::ANI_ATTACK );
			thisObject->AddActorCtlr( unitIndex, controller );
		}
		iter.Forth();
		++itemCount;
	}
	
	GetGameState()->SetGameScale( 1.0f );
	return thisObject;
}
//-----------------------------------------------------------------------------------
void TheGame::Render()
{
    Renderer::instance->ClearScreen(0.3f, 0.3f, 0.3f);
    Renderer::instance->BeginOrtho(Vector2::ZERO, Vector2(1600, 900));
    Renderer::instance->DrawText2D(Vector2(0, 0), GetStateString(GetGameState()), 5.0f, RGBA::VAPORWAVE, true, BitmapFont::CreateOrGetFontFromGlyphSheet("Runescape"));
    switch (GetGameState())
    {
    case GameState::GENERATION:
        Renderer::instance->ClearScreen(0.3f, 0.3f, 0.3f); 
        RenderGeneration();
        break;
    case GameState::MAIN_MENU:
        Renderer::instance->ClearScreen(RGBA::CORNFLOWER_BLUE);
        RenderMainMenu();
        break;
    case GameState::MAP_SELECTION:
        Renderer::instance->ClearScreen(RGBA::FOREST_GREEN);
        RenderMapSelection();
        break;
    case GameState::PLAYING:
        Renderer::instance->ClearScreen(RGBA::BLACK);
        RenderPlaying();
        break;
    case GameState::PAUSED:
        Renderer::instance->ClearScreen(RGBA::CORNFLOWER_BLUE);
        RenderPaused();
        break;
    }
    Renderer::instance->EndOrtho();
}
Example #3
0
	void CTetris::StartNewGame(void)
	{
		if (GetGameState() == GameRunning || GetGameState() == GamePaused)
			EndGame(false);
		m_curBrick = CreateRandomBrick();
		if (!m_gameMusicInstance.isPlaying())
				m_gameMusicInstance.play();
		SetGameState(GameRunning);
	}
Example #4
0
GDialog* GDialog::CreateModalColor(GnInterface* pDlgInterface, const guchar ucR, const guchar ucG
	, const guchar ucB, const guchar ucA)
{
	CCLayerColor* colorLayer = CCLayerColor::layerWithColorWidthHeight( ccc4(ucR, ucG, ucB, ucA)
		, GetGameState()->GetGameWidth(), GetGameState()->GetGameHeight() );
	
	GLayer* glayer = new GLayer();
	glayer->addChild( colorLayer, 0 );
	glayer->AddChild( pDlgInterface, 1 );
	
	GDialog* dlg = GnNew GDialog( pDlgInterface, glayer );
	return dlg;
}
Example #5
0
	void CTetris::EndGame(bool stopMusic)
	{
		if (GetGameState() == GameRunning || GetGameState() == GamePaused)
		{
			delete m_curBrick;
			m_curBrick = nullptr;
			m_board = std::vector<std::vector<int>>(22, std::vector<int>(10, 0));
			SetTimeSinceGravity(0.0f);
			m_points = 0;
			if (stopMusic)
				m_gameMusicInstance.stop();
			SetGameState(MainMenu);
		}
	}
Example #6
0
// Return true if can see the planted bomb
bool CCSBot::CanSeePlantedBomb() const
{
	if (TheCSBots()->GetScenario() != CCSBotManager::SCENARIO_DEFUSE_BOMB)
		return false;

	if (!GetGameState()->IsBombPlanted())
		return false;

	const Vector *bombPos = GetGameState()->GetBombPosition();
	if (bombPos && IsVisible(bombPos, CHECK_FOV))
		return true;

	return false;
}
Example #7
0
void Gn2DMeshObject::SetVectorExtraDataScale()
{
	float* point;
	GnVector2ExtraData* vector2Extra;
	for( gtuint i = 0; i < GetExtraDataSize(); i++ )
	{		
		vector2Extra = GnDynamicCast( GnVector2ExtraData, GetExtraData( i ) );
		if( vector2Extra )
		{
			point = vector2Extra->GetValue();
			point[0] *= GetGameState()->GetGameScale();
			point[1] *= GetGameState()->GetGameScale();
		}		
	}
}
Example #8
0
void GSceneSelector::ReleaseScene()
{
	if( mpCurrentScene == NULL )
		return;
	
	if( mpStartScene )
	{
		mpStartScene->release();
		mpStartScene = NULL;
	}
	if( mpStateScene )
	{
		mpStateScene->release();
		mpStateScene = NULL;
	}
	if( mpSelectStageScene )
	{
		mpSelectStageScene->release();
		mpSelectStageScene = NULL;
	}
	if( mpGameScene )
	{
		mpGameScene->release();
		mpGameScene = NULL;
		GetGameState()->SetGameScale( 1.0 );
	}
	
	CCTextureCache::sharedTextureCache()->removeAllTextures();
}
Example #9
0
bool Anonymize(char *name)
{
	if(GetGameState()!=GAMESTATE_INGAME || !pLocalPlayer)
		return 0;
	BOOL bisTarget = false;
	BOOL isRmember = false;
	BOOL isGmember = false;
	bool bChange = false;
	int ItsMe = _stricmp(((PSPAWNINFO)pLocalPlayer)->Name, name);
	if(ItsMe!=0)//well if it is me, then there is no point in checking if its a group member
		isGmember = IsGroupMember(name);
	if(!isGmember && ItsMe!=0)//well if it is me or a groupmember, then there is no point in checking if its a raid member
		isRmember = IsRaidMember(name);
	if (ItsMe != 0 && !isGmember && !isRmember) {
		//my target?
		if (pTarget && ((PSPAWNINFO)pTarget)->Type!=SPAWN_NPC) {
			if (!_stricmp(((PSPAWNINFO)pTarget)->Name, name)) {
				bisTarget = true;
			}
		}
	}
	if (ItsMe==0 || isGmember || isRmember || bisTarget) {
		int len = strlen(name);
		bChange = true;
		for (int i = 1; i < len - 1; i++) {
			name[i] = '*';
		}
	}
	return bChange;
}
Example #10
0
	void CTetris::Update(double dt)
	{
		VE::IEntity::Update(dt);
		
		if (GetGameState() == GameRunning)
			ProcessGameRunning(dt);
	}
/** This occurs when play begins */
void AMagicBattleSoccerBall::BeginPlay()
{
    Super::BeginPlay();

    if (Role < ROLE_Authority)
    {
        // The server manages the game state; the soccer ball will be replicated to us.

        // Physics however are not replicated. We will need to have the ball orientation
        // replicated to us. We need to turn off physics simulation and collision detection.
        UPrimitiveComponent *Root = Cast<UPrimitiveComponent>(GetRootComponent());
        Root->PutRigidBodyToSleep();
        Root->SetSimulatePhysics(false);
        Root->SetEnableGravity(false);
        SetActorEnableCollision(false);
    }
    else
    {
        // Servers should add this soccer ball to the game mode cache.
        // It will get replicated to clients for when they need to access
        // the ball itself to get information such as who possesses it.
        AMagicBattleSoccerGameState* GameState = GetGameState();
        GameState->SoccerBall = this;
    }
}
//-----------------------------------------------------------------------------------
void TheGame::Update(float deltaSeconds)
{
    if (InputSystem::instance->WasKeyJustPressed('D'))
    {
        g_renderDebug = !g_renderDebug;
    }
    if(InputSystem::instance->WasKeyJustPressed('1'))
    {
        SetGameState(GameState::MAIN_MENU);
    }
    else if (InputSystem::instance->WasKeyJustPressed('2'))
    {
        SetGameState(GameState::MAP_SELECTION);
    }
    else if (InputSystem::instance->WasKeyJustPressed('3'))
    {
        SetGameState(GameState::GENERATION);
    }
    else if (InputSystem::instance->WasKeyJustPressed('4'))
    {
        SetGameState(GameState::PLAYING);
    }
    else if (InputSystem::instance->WasKeyJustPressed('5'))
    {
        SetGameState(GameState::PAUSED);
    }

    switch(GetGameState())
    {
    case GameState::MAIN_MENU:
        UpdateMainMenu(deltaSeconds);
        break;
    case GameState::MAP_SELECTION:
        EnvironmentBlueprint::LoadEnvironmentBlueprints();
        UpdateMapSelection(deltaSeconds);
        break;
    case GameState::GENERATION:
        UpdateGeneration(deltaSeconds);
        break;
    case GameState::PLAYING:
        if (m_player == nullptr)
        {
            m_player = new Player();
            SpawnInGame(m_player);
            m_currentMap->UpdateFOVFrom(m_player->m_position, m_player->m_viewDistance);

            for (int i = 0; i < NPCFactory::s_NPCFactories.size(); ++i)
            {
                NPC* enemyPointer = NPCFactory::GetNPCAt(i); 
                SpawnInGame(enemyPointer);
            }
        }
        UpdatePlaying(deltaSeconds);
        break;
    case GameState::PAUSED:
        UpdatePaused(deltaSeconds);
        break;
    }
    MessageLog::instance->Update(deltaSeconds);
}
Example #13
0
GScene* GSceneSelector::CreateGameScene()
{
	bool success = false;
	mpGameScene = new GGameScene();
	do
	{
		if( mpGameScene->CreateScene( GetGameEnvironment()->GetStageInfo() ) == false )
			break;
		
		if( mpGameScene->InitEnvironment() == false )
			break;
		
		if( mpGameScene->CreateActorManager() == false )
			break;
		
		success = true;
		
	}while(false);
	

	GetGameState()->SetGameScale( 0.7 );

	if( success == false )
	{
		delete mpGameScene;
		mpGameScene = NULL;
		return NULL;
	}
	return mpGameScene;
}
Example #14
0
void CGame::DrawImageButton()
	{

	  for (int i=0;i<m_imageButton.size();i++)
	  {
	  switch (GetGameState())
	  {
		  case PREPARE:
			  m_dcImage.SelectObject(m_bit[10+i*2]);
			 
			  break;
		  case START:
			  m_dcImage.SelectObject(m_bit[17+i]);
			 
			  break;
	   
	  }
	  
	  if ((m_whoCallHost==PLAYER_B&&m_gameState==PREPARE)||(m_whoSendCard==PLAYER_B&&m_gameState==START))
	  {
	  m_dcMask.SelectObject(m_bit[11]);
	  m_dcBuffer.BitBlt(m_imageButton[i].s_rcet.left,m_imageButton[i].s_rcet.top,82,40,&m_dcMask,0,0,SRCAND);
	  m_dcBuffer.BitBlt(m_imageButton[i].s_rcet.left,m_imageButton[i].s_rcet.top,82,40,&m_dcImage,82*m_imageButton[i].index,0,SRCPAINT);
	  }
	 
	  }
	}
Example #15
0
void GameObject::Update()
{
     double reward = 0;
	if (!m_hasAgent) {
		return;
	}

	// reorder the game states
	if (m_oldGS != nullptr) {
		delete m_oldGS;
		m_oldGS = nullptr;
	}

	m_oldGS = m_newGS;
	m_newGS = new GameState;

	// construct the game state to pass to an agent
	GetGameState(*m_newGS);

	reward = 1 / std::max(1.d, m_newGS->m_distanceFromDestination);
	     
	// Discretize after reward calculation
	m_newGS->discretize();


	// get the agent for this object
	QLearningAgent *agent = m_gw.m_game.GetAgent(m_id);

	// Update the behaviors based on the last action
	if (m_oldGS != 0) {
	     agent->update(*m_oldGS, m_lastAction, *m_newGS, reward);
	}

	if (m_pathToDest.size() == 0) {
		Ogre::Vector3 a = GetLocation();
		WorldPos curr = {a.x, a.z, 0};
		m_gw.MakeMapPath(curr, m_pathToDest);
	}


	// here is where I'd pass the game state to an agent if we had one

	// layout: turn, acceleration
	m_lastAction = agent->getAction(*m_newGS);

	std::cout << "Action: " << m_lastAction.m_accelerateMagnitude << ", " << m_lastAction.m_turnMagnitude << std::endl;

	const dReal *quat = dBodyGetQuaternion(m_body);

	// do physics things
	if (quat[1] < 0.05f) {
		dBodyAddRelForce(m_body, 0, 0, m_lastAction.m_accelerateMagnitude * m_maxForward);
		dBodyAddTorque(m_body, 0, m_lastAction.m_turnMagnitude * m_maxTurn, 0);
	}

	// reset collision accumulator
	m_totalDamage += m_collisionAccum;
	m_collisionAccum = 0;
}
Example #16
0
	void CTetris::UnpauseGame(void)
	{
		if (GetGameState() == GamePaused)
		{
			SetGameState(GameRunning);
			m_gameMusicInstance.play();
		}
	}
Example #17
0
	void CTetris::PauseGame(void)
	{
		if (GetGameState() == GameRunning)
		{
			SetGameState(GamePaused);
			m_gameMusicInstance.stop();
		}
	}
Example #18
0
Gn2DMeshObject* Gn2DMeshObject::Create(bool bUseGn2DMeshData)
{
	Gn2DMeshObject* meshObject = NULL;
	if( bUseGn2DMeshData )
		meshObject = GnNew Gn2DMeshObject( new Gn2DMeshData() );
	else
		meshObject = GnNew Gn2DMeshObject( new GnReal2DMesh() );

	meshObject->GetMesh()->setScale( GetGameState()->GetGameScale() );
	meshObject->SetVisible( true );
	meshObject->mMeshSize = GnVector2( 0.0f, 0.0f );
	return meshObject;
}
Example #19
0
GOpeningLayer* GOpeningLayer::CreateOpeningLayer(gtuint uiPage)
{
	float width = GetGameState()->GetGameWidth();
	float height = GetGameState()->GetGameHeight();
	
	GOpeningLayer* openLayer = new GOpeningLayer();
	
	for( gtuint i = 0 ; i < gscLastPage ; i++ )
	{
		gchar fileName[GN_MAX_PATH] = { 0, };
		GnSprintf( fileName, sizeof( fileName ), "%d.png", uiPage + 1 );
		gstring fullFileName;
		GetFullPathFromWorkPath( fileName, fullFileName );
		CCSprite* bg = CCSprite::spriteWithFile( fullFileName.c_str() );
		bg->release();
	}

	gchar fileName[GN_MAX_PATH] = { 0, };
	GnSprintf( fileName, sizeof( fileName ), "%d.png", uiPage + 1 );
	gstring fullFileName;
	GetFullPathFromWorkPath( fileName, fullFileName );
	CCSprite* bg = CCSprite::spriteWithFile( fullFileName.c_str() );
	bg->setPosition( CCPointMake( width / 2, height / 2 ) );
	openLayer->addChild( bg );
	
	GnInterfaceGroup* group = GnNew GnInterfaceGroup();	
	group->SetRect( 0.0f, 0.0f, width, height );
	
	// next button
	GnIButton* buttons = GnNew GnIButton( "17_402.png" );
	SetUIPosition( buttons, 402.0f, 17.0f );
	group->AddChild( buttons );
	openLayer->AddChild( group, 1 );
	
	group->SubscribeClickedEvent( &openLayer->mInputEvent );
	openLayer->mCurrentPage = uiPage;
	return openLayer;
}
Example #20
0
void CNetGame::ProcessClientJoin(BYTE bytePlayerID)
{

	// Perform all init operations.
	if(GetGameState() == GAMESTATE_RUNNING) {
		m_pVehiclePool->InitForPlayer(bytePlayerID); // give them all the existing vehicles
		m_pPickupPool->InitForPlayer(bytePlayerID); // give them all the existing pickups
		m_pObjectPool->InitForPlayer(bytePlayerID); // give them all the existing map objects
		InitGameForPlayer(bytePlayerID);
		m_pPlayerPool->InitPlayersForPlayer(bytePlayerID); // let them know who's on the server
		m_pPlayerPool->InitSpawnsForPlayer(bytePlayerID); // spawn any existing players for them
		m_pMenuPool->ResetPlayer(bytePlayerID); // Mark them as requiring menus
		
		// Inform them of their VW as it doesn't actually work if called from OnPlayerConnect
		// The server is updated but they're not connected fully so don't get it, so resend it
		BYTE byteVW = m_pPlayerPool->GetPlayerVirtualWorld(bytePlayerID);
		/*RakNet::BitStream bsData;
		bsData.Write(bytePlayerID); // player id
		bsData.Write(byteVW); // VW id
		m_pRak->RPC(&RPC_ScrSetPlayerVirtualWorld, &bsData, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_PLAYER_ID, true, false, UNASSIGNED_NETWORK_ID, NULL);
	*/
	} 
	else if(GetGameState() == GAMESTATE_RESTARTING)
	{
		InitGameForPlayer(bytePlayerID);
		m_pPlayerPool->InitPlayersForPlayer(bytePlayerID); // let them know who's on the server
		// Tell them that the world is currently restarting.
		RakNet::BitStream bsParams;
		PlayerID sender = m_pRak->GetPlayerIDFromIndex(bytePlayerID);
		m_pRak->RPC(&RPC_GameModeRestart, &bsParams, HIGH_PRIORITY,
			RELIABLE,0,sender,false,false, UNASSIGNED_NETWORK_ID, NULL);
	}
	
	//GetGameLogic()->HandleClientJoin(bytePlayerID);
	//GetGameMode()->OnPlayerConnect(bytePlayerID);

}
Example #21
0
void CNetGame::Packet_AimSync(Packet *p)
{
	CPlayer * pPlayer = GetPlayerPool()->GetAt((BYTE)p->playerIndex);
	RakNet::BitStream bsPlayerSync(p->data, p->length, false);

	if(GetGameState() != GAMESTATE_RUNNING) return;

	BYTE			bytePacketID=0;
	AIM_SYNC_DATA	aimSync;
	
	bsPlayerSync.Read(bytePacketID);
	bsPlayerSync.Read((PCHAR)&aimSync,sizeof(AIM_SYNC_DATA));
		
	if(pPlayer)	{
		pPlayer->StoreAimSyncData(&aimSync);
	}
}
DWORD WINAPI GameStateWatcher::WorkerThread()
{
	for(;;)
	{
		eGameState gameState = GetGameState();

		if(gameState == GameStateRestartStory)
		{
			ExitProcess(0);
			return 0;
		}

		Sleep(50);
	}

	return 1;
}
Example #23
0
	void CTetris::HardDrop(void)
	{
		if (GetGameState() != GameRunning)
			return;

		for (size_t r = 0; r < m_board.size(); ++r)
		{
			if (LockCheck())
			{
				LockCurBrick();
				Update(GRAVITYTIME);
				m_dropSound.play(1,1,1,ALLEGRO_PLAYMODE_ONCE);
				break;
			}
			GetCurBrick()->SetCurRow(GetCurBrick()->GetCurRow() + 1);
		}
	}
Example #24
0
// Return true if we are in a hurry
bool CCSBot::IsHurrying() const
{
	if (!m_hurryTimer.IsElapsed())
		return true;

	// if the bomb has been planted, we are in a hurry, CT or T (they could be defusing it!)
	if (TheCSBots()->GetScenario() == CCSBotManager::SCENARIO_DEFUSE_BOMB && TheCSBots()->IsBombPlanted())
		return true;

	// if we are a T and hostages are being rescued, we are in a hurry
	if (TheCSBots()->GetScenario() == CCSBotManager::SCENARIO_RESCUE_HOSTAGES
		&& m_iTeam == TERRORIST
		&& GetGameState()->AreAllHostagesBeingRescued())
		return true;

	return false;
}
Example #25
0
void CNetGame::Packet_SpectatorSync(Packet *p)
{
	CPlayer * pPlayer = GetPlayerPool()->GetAt((BYTE)p->playerIndex);
	RakNet::BitStream bsSpectatorSync(p->data, p->length, false);

	if(GetGameState() != GAMESTATE_RUNNING) return;

	BYTE bytePacketID=0;
	SPECTATOR_SYNC_DATA spSync;
	
	bsSpectatorSync.Read(bytePacketID);
	bsSpectatorSync.Read((PCHAR)&spSync,sizeof(SPECTATOR_SYNC_DATA));

	if(pPlayer)	{
	    pPlayer->StoreSpectatorFullSyncData(&spSync);
	}
}
Example #26
0
Gn2DMeshObject* Gn2DMeshObject::CreateFromTextureFile(const gchar* pcFilePath)
{
	gchar textureWorkPath[GN_MAX_PATH] = { 0, };
	GnStrcpy( textureWorkPath, GnSystem::GetWorkDirectory(), sizeof(textureWorkPath) );
	GnStrcat( textureWorkPath, pcFilePath, sizeof(textureWorkPath) );
	GnReal2DMesh* mesh = CCSprite::spriteWithFile( textureWorkPath );
	if( mesh == NULL )
	{
		mesh = CCSprite::spriteWithFile( pcFilePath );
		if( mesh == NULL )
			return NULL;
	}
	mesh->retain();
	Gn2DMeshObject* meshObject = GnNew Gn2DMeshObject( mesh );
	meshObject->GetMesh()->setScale( GetGameState()->GetGameScale() );
	meshObject->Create2DAVData( meshObject->GetSize() );
	CCSize size = mesh->getContentSize();
	meshObject->mMeshSize = GnVector2( size.width, size.height );
	return meshObject;
}
Example #27
0
void CNetGame::Packet_PassengerSync(Packet *p)
{
	CPlayer * pPlayer = GetPlayerPool()->GetAt((BYTE)p->playerIndex);
	RakNet::BitStream bsPassengerSync(p->data, p->length, false);

	if(GetGameState() != GAMESTATE_RUNNING) return;

	BYTE bytePacketID=0;
	PASSENGER_SYNC_DATA psSync;
	
	bsPassengerSync.Read(bytePacketID);
	bsPassengerSync.Read((PCHAR)&psSync,sizeof(PASSENGER_SYNC_DATA));

	if(pPlayer)	{
		if(psSync.VehicleID == 0xFFFF) {
			KickPlayer((BYTE)p->playerIndex);
			return;
		}
	    pPlayer->StorePassengerFullSyncData(&psSync);
	}
}
Example #28
0
DBOOL CBloodClientShell::SetGameState(int nState)
{
	// Sanity checks...

	if (!IsGameStateValid(nState)) return(DFALSE);


	// Transition between the old and new state...

	int nOldState = GetGameState();
	int nNewState = nState;

	if (!TransitionGameState(nOldState, nNewState))
	{
		return(DFALSE);
	}


	// All done...

	return(DTRUE);
}
Example #29
0
void CNetGame::Packet_VehicleSync(Packet *p)
{
	CPlayer * pPlayer = GetPlayerPool()->GetAt((BYTE)p->playerIndex);
	RakNet::BitStream bsVehicleSync(p->data, p->length, false);

	if(GetGameState() != GAMESTATE_RUNNING) return;

	BYTE		bytePacketID=0;
	INCAR_SYNC_DATA icSync;
	
	bsVehicleSync.Read(bytePacketID);
	bsVehicleSync.Read((PCHAR)&icSync,sizeof(INCAR_SYNC_DATA));

	if(pPlayer)	{
		if(icSync.VehicleID == 0xFFFF) {
			// Syncing a manually added/bad vehicle
			KickPlayer((BYTE)p->playerIndex);
			return;
		}
	    pPlayer->StoreInCarFullSyncData(&icSync);
	}
}
Example #30
0
VOID PluginsAddSpawn(PSPAWNINFO pNewSpawn)
{
    DWORD BodyType=GetBodyType(pNewSpawn);
    PluginDebug("PluginsAddSpawn(%s,%d,%d)",pNewSpawn->Name,pNewSpawn->mActorClient.Race,BodyType);
    if (!bPluginCS)
        return;
    if (GetGameState()>GAMESTATE_CHARSELECT)
        SetNameSpriteState(pNewSpawn,1);
    if (GetBodyTypeDesc(BodyType)[0]=='*')
    {
        WriteChatf("Spawn '%s' has unknown bodytype %d",pNewSpawn->Name,BodyType);
    }
    CAutoLock Lock(&gPluginCS);
    PMQPLUGIN pPlugin=pPlugins;
    while(pPlugin)
    {
        if (pPlugin->AddSpawn)
        {
            pPlugin->AddSpawn(pNewSpawn);
        }
        pPlugin=pPlugin->pNext;
    }
}