CApplication::CApplication(int argc, char** argv) : CShell(argc, argv) { s_pApplication = this; srand((unsigned int)time(NULL)); mtsrand((size_t)time(NULL)); for (int i = 0; i < argc; i++) m_apszCommandLine.push_back(argv[i]); m_bIsOpen = false; m_bMultisampling = false; m_pRenderer = NULL; m_pConsole = NULL; SetMouseCursorEnabled(true); m_bMouseDownInGUI = false; m_flLastMousePress = -1; for (int i = 1; i < argc; i++) { if (m_apszCommandLine[i][0] == '+') CCommand::Run(&m_apszCommandLine[i][1]); } }
CShell::CShell(int argc, char** argv) { s_pShell = this; srand((unsigned int)time(NULL)); mtsrand((size_t)time(NULL)); for (int i = 0; i < argc; i++) m_apszCommandLine.push_back(argv[i]); m_sBinaryName = argv[0]; for (int i = 1; i < argc; i++) { if (m_apszCommandLine[i][0] == '+') CCommand::Run(&m_apszCommandLine[i][1]); } }
size_t CGameServer::CreateEntity(const tstring& sClassName, size_t iHandle, size_t iSpawnSeed) { if (CVar::GetCVarBool("net_debug")) TMsg(tstring("Creating entity: ") + sClassName + "\n"); auto it = CBaseEntity::GetEntityRegistration().find(sClassName); if (it == CBaseEntity::GetEntityRegistration().end()) { TAssert(!"Entity does not exist. Did you forget to REGISTER_ENTITY ?"); return ~0; } CBaseEntity::s_iOverrideEntityListIndex = iHandle; iHandle = it->second.m_pfnCreateCallback(); CBaseEntity::s_iOverrideEntityListIndex = ~0; CEntityHandle<CBaseEntity> hEntity(iHandle); hEntity->m_sClassName = sClassName; hEntity->SetSaveDataDefaults(); size_t iPostSeed = mtrand(); if (iSpawnSeed) hEntity->SetSpawnSeed(iSpawnSeed); else hEntity->SetSpawnSeed(mtrand()%99999); // Don't pick a number so large that it can't fit in (int) hEntity->SetSpawnTime(GameServer()->GetGameTime()); hEntity->Spawn(); mtsrand(iPostSeed); if (dynamic_cast<CGame*>(hEntity.GetPointer())) m_hGame = CEntityHandle<CGame>(hEntity->GetHandle()); return iHandle; }
// The Game Loop http://www.youtube.com/watch?v=c4b9lCfSDQM void CGame::GameLoop() { m_hPlayer = CreateCharacter(); // Initialize the box's position etc m_hPlayer->SetGlobalOrigin(Point(0, 0, 0)); m_hPlayer->m_vecMovement = Vector(0, 0, 0); m_hPlayer->m_vecMovementGoal = Vector(0, 0, 0); m_hPlayer->m_vecVelocity = Vector(0, 0, 0); m_hPlayer->m_vecGravity = Vector(0, -10, 0); m_hPlayer->m_flSpeed = 15; m_hPlayer->m_clrRender = Color(0.8f, 0.4f, 0.2f, 1.0f); m_hPlayer->m_bHitByTraces = false; m_hPlayer->m_aabbSize = AABB(-Vector(0.5f, 0, 0.5f), Vector(0.5f, 2, 0.5f)); m_hPlayer->m_bTakesDamage = true; Vector vecMonsterMin = Vector(-1, 0, -1); Vector vecMonsterMax = Vector(1, 2, 1); /*CCharacter* pTarget1 = CreateCharacter(); pTarget1->SetTransform(Vector(2, 2, 2), 0, Vector(0, 1, 0), Vector(6, 0, 6)); pTarget1->m_aabbSize.vecMin = vecMonsterMin; pTarget1->m_aabbSize.vecMax = vecMonsterMax; pTarget1->m_iBillboardTexture = m_iMonsterTexture; pTarget1->m_bEnemyAI = true; pTarget1->m_bTakesDamage = true; CCharacter* pTarget2 = CreateCharacter(); pTarget2->SetTransform(Vector(2, 2, 2), 0, Vector(0, 1, 0), Vector(6, 0, -6)); pTarget2->m_aabbSize.vecMin = vecMonsterMin; pTarget2->m_aabbSize.vecMax = vecMonsterMax; pTarget2->m_iBillboardTexture = m_iMonsterTexture; pTarget2->m_bEnemyAI = true; pTarget2->m_bTakesDamage = true; CCharacter* pTarget3 = CreateCharacter(); pTarget3->SetTransform(Vector(3, 3, 3), 0, Vector(0, 1, 0), Vector(-6, 0, 8)); pTarget3->m_aabbSize.vecMin = vecMonsterMin; pTarget3->m_aabbSize.vecMax = vecMonsterMax; pTarget3->m_iBillboardTexture = m_iMonsterTexture; pTarget3->m_bEnemyAI = true; pTarget3->m_bTakesDamage = true;*/ Vector vecPropMin = Vector(-.1f, 0, -.1f); Vector vecPropMax = Vector(.1f, .2f, .1f); mtsrand(0); for (int i = 0; i < 800; i++) { float rand1 = (float)(mtrand()%1000)/1000; // [0, 1] float rand2 = (float)(mtrand()%1000)/1000; // [0, 1] float theta = rand1 * 2.0f * (float)M_PI; float radius = sqrt(rand2); Vector position = Vector(radius * cos(theta), 0, radius * sin(theta)); position = position * 50; CCharacter* pProp = CreateCharacter(); pProp->SetTransform(Vector(1, 1, 1), 0, Vector(0, 1, 0), position); pProp->m_aabbSize.vecMin = vecPropMin; pProp->m_aabbSize.vecMax = vecPropMax; pProp->m_clrRender = Color(0.4f, 0.8f, 0.2f, 1.0f); pProp->m_iTexture = m_iCrateTexture; } CRenderingContext c(GetRenderer()); c.RenderBox(Vector(-1, 0, -1), Vector(1, 2, 1)); c.CreateVBO(m_iMeshVB, m_iMeshSize); float flPreviousTime = 0; float flCurrentTime = Application()->GetTime(); while (true) { // flCurrentTime will be lying around from last frame. It's now the previous time. flPreviousTime = flCurrentTime; flCurrentTime = Application()->GetTime(); float dt = flCurrentTime - flPreviousTime; // Keep dt from growing too large. if (dt > 0.15f) dt = 0.15f; Update(dt); Draw(); } }
void CGameServer::GenerateSaveCRC(size_t iInput) { mtsrand(m_iSaveCRC^iInput); m_iSaveCRC = mtrand(); }
CGameServer::CGameServer(IWorkListener* pWorkListener) { TAssert(!s_pGameServer); s_pGameServer = this; m_bAllowPrecaches = false; GameNetwork()->SetCallbacks(this, CGameServer::ClientConnectCallback, CGameServer::ClientEnterGameCallback, CGameServer::ClientDisconnectCallback); m_pWorkListener = pWorkListener; m_iMaxEnts = g_cfgEngine.read("MaxEnts", 1024); CBaseEntity::s_apEntityList.resize(m_iMaxEnts); m_pCameraManager = NULL; m_iSaveCRC = 0; m_bLoading = true; m_bRestartLevel = false; m_flHostTime = 0; m_flGameTime = 0; m_flFrameTime = 0; m_flTimeScale = 1; m_flNextClientInfoUpdate = 0; m_iFrame = 0; size_t iPostSeed = mtrand(); if (m_pWorkListener) m_pWorkListener->BeginProgress(); TMsg("Creating physics model... "); GamePhysics(); // Just make sure it exists. TMsg("Done.\n"); TMsg("Registering entities... "); if (m_pWorkListener) m_pWorkListener->SetAction("Registering entities", CBaseEntity::GetEntityRegistration().size()); tmap<tstring, bool> abRegistered; for (tmap<tstring, CEntityRegistration>::iterator it = CBaseEntity::GetEntityRegistration().begin(); it != CBaseEntity::GetEntityRegistration().end(); it++) abRegistered[it->first] = false; tvector<tstring> asRegisterStack; size_t i = 0; for (tmap<tstring, CEntityRegistration>::iterator it = CBaseEntity::GetEntityRegistration().begin(); it != CBaseEntity::GetEntityRegistration().end(); it++) { CEntityRegistration* pRegistration = &it->second; if (abRegistered[it->first]) continue; asRegisterStack.clear(); asRegisterStack.push_back(it->first); // Make sure I register all parent classes before I register this one. if (pRegistration->m_pszParentClass) { tstring sThisClass = it->first; tstring sParentClass = pRegistration->m_pszParentClass; while (!abRegistered[sParentClass]) { // Push to the top, we'll register from the top first. asRegisterStack.push_back(sParentClass); CEntityRegistration* pRegistration = &CBaseEntity::GetEntityRegistration()[sParentClass]; sThisClass = sParentClass; sParentClass = pRegistration->m_pszParentClass?pRegistration->m_pszParentClass:""; if (!sParentClass.length()) break; } } // The top of the stack is the highest entity on the tree that I must register first. while (asRegisterStack.size()) { CBaseEntity::GetEntityRegistration()[asRegisterStack.back()].m_pfnRegisterCallback(); abRegistered[asRegisterStack.back()] = true; asRegisterStack.pop_back(); } if (m_pWorkListener) m_pWorkListener->WorkProgress(++i); } TMsg("Done.\n"); mtsrand(iPostSeed); CBaseEntity::s_iNextEntityListIndex = 0; m_iPort = 0; m_iClient = NETWORK_LOCAL; m_bHalting = false; if (m_pWorkListener) m_pWorkListener->EndProgress(); }