void CGameServer::ClientEnterGame(int iClient) { TMsg(sprintf(tstring("Client %d (") + GameNetwork()->GetClientNickname(iClient) + ") entering game.\n", iClient)); if (GetGame()) GetGame()->OnClientEnterGame(iClient); for (size_t i = 0; i < GameServer()->GetMaxEntities(); i++) { CBaseEntity* pEntity = CBaseEntity::GetEntity(i); if (!pEntity) continue; ::CreateEntity.RunCommand(sprintf(tstring("%s %d %d"), pEntity->GetClassName(), pEntity->GetHandle(), pEntity->GetSpawnSeed()), iClient); } CGameServerNetwork::UpdateNetworkVariables(iClient, true); // Update entities after all creations have been run, so we don't refer to entities that haven't been created yet. for (size_t i = 0; i < GameServer()->GetMaxEntities(); i++) { CBaseEntity* pEntity = CBaseEntity::GetEntity(i); if (!pEntity) continue; pEntity->ClientUpdate(iClient); } GameNetwork()->CallFunction(iClient, "EnterGame"); GameNetwork()->CallFunction(iClient, "LoadingDone"); }
void CGameServerNetwork::UpdateNetworkVariables(int iClient, bool bForceAll) { if (!GameNetwork()->IsConnected()) return; double flTime = GameServer()->GetGameTime(); size_t iMaxEnts = GameServer()->GetMaxEntities(); for (size_t i = 0; i < iMaxEnts; i++) { CBaseEntity* pEntity = CBaseEntity::GetEntity(i); if (!pEntity) continue; const tchar* pszClassName = pEntity->GetClassName(); CEntityRegistration* pRegistration = NULL; do { pRegistration = pEntity->GetRegisteredEntity(pszClassName); TAssert(pRegistration); if (!pRegistration) break; size_t iNetVarsSize = pRegistration->m_aNetworkVariables.size(); for (size_t j = 0; j < iNetVarsSize; j++) { CNetworkedVariableData* pVarData = &pRegistration->m_aNetworkVariables[j]; CNetworkedVariableBase* pVariable = pVarData->GetNetworkedVariableBase(pEntity); if (!bForceAll) { if (!pVariable->IsDirty()) continue; if (flTime - pVariable->m_flLastUpdate < pVarData->m_flUpdateInterval) continue; } // For one, m_flLastUpdate needs to be a double pVariable->m_flLastUpdate = (float)flTime; // For two, it's shit. TUnimplemented(); // Try some testing or something. CNetworkParameters p; p.ui1 = pEntity->GetHandle(); size_t iDataSize; void* pValue = pVariable->Serialize(iDataSize); if (net_replication_debug.GetBool()) { if (iDataSize >= 4) TMsg(tstring("Updating ") + pVarData->GetName() + sprintf(tstring(" (%x) (%f) (%d)\n"), *(unsigned int*)pValue, *(float*)pValue, *(int*)pValue)); else TMsg(tstring("Updating ") + pVarData->GetName() + "\n"); } p.CreateExtraData(iDataSize + strlen(pVarData->GetName())+1); strcpy((char*)p.m_pExtraData, pVarData->GetName()); memcpy((unsigned char*)(p.m_pExtraData) + strlen(pVarData->GetName())+1, pValue, iDataSize); // UV stands for UpdateValue GameNetwork()->CallFunctionParameters(iClient, "UV", &p); // Only reset the dirty flag if all clients got the message. if (iClient == NETWORK_TOCLIENTS) pVariable->SetDirty(false); } pszClassName = pRegistration->m_pszParentClass; } while (pszClassName); } }