⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netstart.cpp

📁 Blood 2全套源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	s_bDontDisplaySettingsDialog = GetConsoleInt("DontDisplaySettingsDialog", 0);
	s_bHaveSettingInfo           = GetConsoleInt("HaveSettingInfo", 0);

	s_nNetAmmoLevel		  = GetConsoleInt("NetAmmoLevel", s_nNetAmmoLevel);
	s_nNetAmmoRespawn	  = GetConsoleInt("NetAmmoRespawn", s_nNetAmmoRespawn);
	s_nNetArmorLevel	  = GetConsoleInt("NetArmorLevel", s_nNetArmorLevel);
	s_nNetArmorRespawn	  = GetConsoleInt("NetArmorRespawn", s_nNetArmorRespawn);
	s_nNetHealthLevel	  = GetConsoleInt("NetHealthLevel", s_nNetHealthLevel);
	s_nNetHealthRespawn	  = GetConsoleInt("NetHealthRespawn", s_nNetHealthRespawn);
	s_nNetPowerupsLevel	  = GetConsoleInt("NetPowerupsLevel", s_nNetPowerupsLevel);
	s_nNetPowerupsRespawn = GetConsoleInt("NetPowerupsRespawn", s_nNetPowerupsRespawn);
	s_nNetHealingRate     = GetConsoleInt("NetHealingRate", s_nNetHealingRate);
	s_nNetTeam            = GetConsoleInt("NetTeam", s_nNetTeam);
	s_bNetFallDamage      = GetConsoleInt("NetFallDamage", s_bNetFallDamage);
	s_bNetFriendlyFire    = GetConsoleInt("NetFriendlyFire", s_bNetFriendlyFire);
	s_bNetNegTeamFrags    = GetConsoleInt("NetNegTeamFrags", s_bNetNegTeamFrags);
	s_bNetOnlyFlagScores  = GetConsoleInt("NetOnlyFlagScores", s_bNetOnlyFlagScores);
	s_bNetOnlyGoalScores  = GetConsoleInt("NetOnlyGoalScores", s_bNetOnlyGoalScores);
	s_bNetUseTeamSize     = GetConsoleInt("NetUseTeamSize", s_bNetUseTeamSize);
	s_nNetFlagValue		  = GetConsoleInt("NetFlagValue", s_nNetFlagValue);
	s_nNetGoalValue		  = GetConsoleInt("NetGoalValue", s_nNetGoalValue);
	s_nNetSocBallSkin	  = GetConsoleInt("NetSocBallSkin", s_nNetSocBallSkin);

	s_pServerOptions->m_fWorldTimeSpeed = GetConsoleFloat("NetWorldTimeSpeed", s_pServerOptions->m_fWorldTimeSpeed);
	s_pServerOptions->m_fRunSpeed       = GetConsoleFloat("NetRunSpeed", s_pServerOptions->m_fRunSpeed);
	s_pServerOptions->m_fMissileSpeed   = GetConsoleFloat("NetMissileSpeed", s_pServerOptions->m_fMissileSpeed);

	GetConsoleString("NetWorldNightColor", s_pServerOptions->m_sWorldNightColor, s_pServerOptions->m_sWorldNightColor);

#ifndef _ADDON
	if (s_nGameType == NGT_SOCCER) s_nGameType = NGT_DEATHMATCH;
#endif


	// Declare local variables we'll be using...

	int		nRet;
	HWND	hParentWnd = NULL;


	// Check if we were given connect info on the command line...

	s_nConnectType = NetStart_GetConnectCommands(pClient, pNetStart);

	if (s_nConnectType == CONNECT_TCPIP_HOST)
	{
		if (!NetStart_HostTcpIp(pClient)) return(FALSE);
		s_pNetStart->m_bHaveTcpIp = FALSE;
		goto PlayerDlg;
	}
	else if (s_nConnectType == CONNECT_TCPIP || s_nConnectType == CONNECT_TCPIP_QUICK)
	{
		if (!NetStart_DoSettingsDialog())
		{
			return(DFALSE);
		}

		goto FinishedDlg;
	}


	// Do the services dialog...

ServicesDlg:
	nRet = DialogBox(hInst, "NET_SERVICES", hParentWnd, (DLGPROC)NetDlg_Services);

	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the player dialog...

PlayerDlg:
	nRet = DialogBox(hInst, "NET_PLAYER", hParentWnd, (DLGPROC)NetDlg_Player);

	if (nRet == DLG_BACK) goto ServicesDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}

	if (s_pNetStart->m_bHost) goto GameDlg;
	if (s_pNetStart->m_bHaveTcpIp) goto FinishedDlg;


	// Do the sessions dialog...

	if (GetSelectedServiceFlags() & NETSERVICE_TCPIP)
	{
		nRet = DialogBox(hInst, "NET_SESSIONS_TCPIP", hParentWnd, (DLGPROC)NetDlg_SessionsTcpIp);
	}
	else
	{
		nRet = DialogBox(hInst, "NET_SESSIONS", hParentWnd, (DLGPROC)NetDlg_Sessions);
	}

	s_IpMgr.WriteIps();

	if (nRet == DLG_BACK) goto PlayerDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}

	goto FinishedDlg;


	// Do the game dialog (host only)...

GameDlg:

#ifdef _ADDON
	nRet = DialogBox(hInst, "NET_GAME_AO", hParentWnd, (DLGPROC)NetDlg_Game);
#else
	nRet = DialogBox(hInst, "NET_GAME", hParentWnd, (DLGPROC)NetDlg_Game);
#endif

	if (nRet == DLG_BACK) goto PlayerDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// If necessary, do the team options dialog...

TeamOptionsDlg:
	if (s_nGameType != NGT_TEAMS) goto CtfOptionsDlg;

	nRet = DialogBox(hInst, "NET_OPTIONS_TEAMS", hParentWnd, (DLGPROC)NetDlg_TeamOptions);

	if (nRet == DLG_BACK) goto GameDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// If necessary, do the ctf options dialog...

CtfOptionsDlg:
	if (s_nGameType != NGT_CAPTUREFLAG) goto SoccerOptionsDlg;

	nRet = DialogBox(hInst, "NET_OPTIONS_CTF", hParentWnd, (DLGPROC)NetDlg_CtfOptions);

	if (nRet == DLG_BACK) goto GameDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// If necessary, do the soccer options dialog...

SoccerOptionsDlg:
	if (s_nGameType != NGT_SOCCER) goto OptionsDlg;

	nRet = DialogBox(hInst, "NET_OPTIONS_SOCCER", hParentWnd, (DLGPROC)NetDlg_SoccerOptions);

	if (nRet == DLG_BACK) goto GameDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the game server options dialog (host only)...

OptionsDlg:
	nRet = DialogBox(hInst, "NET_OPTIONS", hParentWnd, (DLGPROC)NetDlg_Options);

	if (nRet == DLG_BACK)
	{
		if (s_nGameType == NGT_SOCCER) goto SoccerOptionsDlg;
		if (s_nGameType == NGT_CAPTUREFLAG) goto CtfOptionsDlg;
		if (s_nGameType == NGT_TEAMS) goto TeamOptionsDlg;
		goto GameDlg;
	}

	if (nRet == DLG_CANCEL) return(DFALSE);

	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the game items dialog (host only)...

GameItemsDlg:
	nRet = DialogBox(hInst, "NET_GAMEITEMS", hParentWnd, (DLGPROC)NetDlg_GameItems);

	if (nRet == DLG_BACK) goto OptionsDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the game damage dialog (host only)...

GameDamageDlg:
	nRet = DialogBox(hInst, "NET_GAMEDAMAGE", hParentWnd, (DLGPROC)NetDlg_GameDamage);

	if (nRet == DLG_BACK) goto GameItemsDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the game levels dialog (host only)...

	nRet = DialogBox(hInst, "NET_GAMELEVELS", hParentWnd, (DLGPROC)NetDlg_GameLevels);

	if (nRet == DLG_BACK) goto GameDamageDlg;
	if (nRet == DLG_CANCEL) return(DFALSE);
	if (nRet == DLG_ERROR)
	{
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Do the finished dialog...

FinishedDlg:


	// Write out some console values...

	if (s_pNetStart->m_bHost)
	{
		WriteConsoleString("NetSessionName", s_sSessionName);

		WriteConsoleInt("NetGameType", s_nGameType);
		WriteConsoleInt("NetGameEnd", s_nEndType);
		WriteConsoleInt("NetEndFrags", s_nEndFrags);
		WriteConsoleInt("NetEndTime", s_nEndTime);
		WriteConsoleInt("NetMaxPlayers", s_nMaxPlayers);

		WriteConsoleInt("NetAmmoLevel", s_nNetAmmoLevel);
		WriteConsoleInt("NetAmmoRespawn", s_nNetAmmoRespawn);
		WriteConsoleInt("NetArmorLevel", s_nNetArmorLevel);
		WriteConsoleInt("NetArmorRespawn", s_nNetArmorRespawn);
		WriteConsoleInt("NetHealthLevel", s_nNetHealthLevel);
		WriteConsoleInt("NetHealthRespawn", s_nNetHealthRespawn);
		WriteConsoleInt("NetPowerupsLevel", s_nNetPowerupsLevel);
		WriteConsoleInt("NetPowerupsRespawn", s_nNetPowerupsRespawn);
		WriteConsoleInt("NetHealingRate", s_nNetHealingRate);
		WriteConsoleInt("NetFallDamage", s_bNetFallDamage);
		WriteConsoleInt("NetFriendlyFire", s_bNetFriendlyFire);
		WriteConsoleInt("NetNegTeamFrags", s_bNetNegTeamFrags);
		WriteConsoleInt("NetOnlyFlagScores", s_bNetOnlyFlagScores);
		WriteConsoleInt("NetOnlyFlagScores", s_bNetOnlyGoalScores);
		WriteConsoleInt("NetUseTeamSize", s_bNetUseTeamSize);
		WriteConsoleInt("NetFlagValue", s_nNetFlagValue);
		WriteConsoleInt("NetGoalValue", s_nNetGoalValue);
		WriteConsoleInt("NetSocBallSkin", s_nNetSocBallSkin);

		WriteConsoleFloat("NetWorldTimeSpeed", s_pServerOptions->m_fWorldTimeSpeed);
		WriteConsoleFloat("NetRunSpeed", s_pServerOptions->m_fRunSpeed);
		WriteConsoleFloat("NetMissileSpeed", s_pServerOptions->m_fMissileSpeed);
		WriteConsoleString("NetWorldNightColor", s_pServerOptions->m_sWorldNightColor);
	}

	PostProcessName(s_sPlayerName);

	WriteConsoleString("NetPlayerName", s_sPlayerName);
	WriteConsoleString("NetConfigFile", s_sNetConfigFile);

	WriteConsoleInt("NetService", s_nNetService);
	WriteConsoleInt("NetJoinHost", s_nNetJoinHost);
	WriteConsoleInt("UpdateRate", s_nNetLatency);
	WriteConsoleInt("NetFpsLimit", s_nFpsLimit);
	WriteConsoleInt("NetLimitFps", s_bLimitFps);
	WriteConsoleInt("NetSaveLevels", s_bSaveLevels);
	WriteConsoleInt("NetTeam", s_nNetTeam);


	// All done...

	return(DTRUE);
}

NetPlayer* NetStart_GetPlayerStruct()
{
	return(&s_NetPlayer);
}

NetGame* NetStart_GetGameStruct()
{
	return(&s_NetGame);
}

NetClientData* NetStart_GetClientDataStruct()
{
	return(&s_NetClientData);
}

void NetStart_ClearGameStruct()
{
	memset(&s_NetGame, 0, sizeof(NetGame));
}

void GetConsoleString(char* sKey, char* sDest, char* sDefault)
{
	if (s_pClient)
	{
		HCONSOLEVAR hVar = s_pClient->GetConsoleVar(sKey);
		if (hVar)
		{
			char* sValue = s_pClient->GetVarValueString(hVar);
			if (sValue)
			{
				strcpy(sDest, sValue);
				return;
			}
		}
	}

	strcpy(sDest, sDefault);
}

int GetConsoleInt(char* sKey, int nDefault)
{
	if (s_pClient)
	{
		HCONSOLEVAR hVar = s_pClient->GetConsoleVar(sKey);
		if (hVar)
		{
			float fValue = s_pClient->GetVarValueFloat(hVar);
			return((int)fValue);
		}
	}

	return(nDefault);
}

DFLOAT GetConsoleFloat(char* sKey, DFLOAT fDefault)
{
	if (s_pClient)
	{
		HCONSOLEVAR hVar = s_pClient->GetConsoleVar(sKey);
		if (hVar)
		{
			float fValue = s_pClient->GetVarValueFloat(hVar);
			return(fValue);
		}
	}

	return(fDefault);
}

void WriteConsoleString(char* sKey, char* sValue)
{
	if (s_pClient)
	{
		char sTemp[256];
		wsprintf(sTemp, "+%s \"%s\"", sKey, sValue);
		s_pClient->RunConsoleString(sTemp);
	}
}

void WriteConsoleInt(char* sKey, int nValue)
{
	if (s_pClient)
	{
		char sTemp[256];
		wsprintf(sTemp, "+%s %i", sKey, nValue);
		s_pClient->RunConsoleString(sTemp);
	}
}

void WriteConsoleFloat(char* sKey, DFLOAT fValue)
{
	if (s_pClient)
	{
		char sTemp[256];
		sprintf(sTemp, "+%s %f", sKey, fValue);
		s_pClient->RunConsoleString(sTemp);
	}
}

void NetStart_DisplayError(HINSTANCE hInst)
{
	char sError[256];

	if (LoadString(hInst, s_nErrorString, sError, 254) == 0)
	{
		strcpy(sError, "ERROR - Unable to setup the network game.");
	}

#ifdef _DEMO
	MessageBox(NULL, sError, "Blood2 Demo", MB_OK);
#else
	MessageBox(NULL, sError, "Blood2", MB_OK);
#endif
}


// ----------------------------------------------------------------------- //
//
//	ROUTINE:	NetStart_DoLobbyLaunchWizard
//
//	PURPOSE:	Does the net start wizard for a lobby launched game
//
// ----------------------------------------------------------------------- //

DBOOL NetStart_DoLobbyLaunchWizard(CClientDE* pClient)
{
	// Sanity checks...

	if (!pClient) return(DFALSE);


	// Declare local variables we'll be using...

	int			nRet;
	HWND		hParentWnd = NULL;
	NetStart	ns;


	// Set our static pointers...

	s_pClient        = pClient;
	s_pNetStart      = &ns;
	s_pServerOptions = &g_ServerOptions;

	s_bLobbyLaunch = TRUE;


	// Fill in the default server options...

	memset(s_pServerOptions, 0, sizeof(ServerOptions));

	s_pServerOptions->m_fWorldTimeSpeed = -1.0f;
	s_pServerOptions->m_fRunSpeed       = 1.3f;
	s_pServerOptions->m_fMissileSpeed   = 1.0;

	strcpy(s_pServerOptions->m_sWorldNightColor, "0.5 0.5 0.5");


	// Init the net game info manager...

	s_NinfoMgr.Term();
	s_NinfoMgr.Init(s_pClient);


	// Clear the NetStart structure...

	memset(s_pNetStart, 0, sizeof(NetStart));


	// Clear our static player and game structures...

	memset(&s_NetPlayer, 0, sizeof(NetPlayer));
	memset(&s_NetGame, 0, sizeof(NetGame));


	// Get the module handle...

	HINSTANCE hInst;

	void* hModule;
	g_pClientDE->GetEngineHook("cres_hinstance",&hModule);
	hInst = (HINSTANCE)hModule;
	if (!hInst) return (DFALSE);

	s_hInst = hInst;


	// Init the engine's networking...

	DRESULT dr = pClient->InitNetworking(NULL, 0);
	if (dr != LT_OK)
	{
		s_nErrorString = IDS_NETERR_INIT;
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}


	// Get the lobby launch info...

	void* pLobbyLaunchInfo = NULL;

	dr = pClient->GetLobbyLaunchInfo("dplay2", &pLobbyLaunchInfo);
	if (dr != LT_OK)
	{
		s_nErrorString = IDS_NETERR_INIT;
		NetStart_DisplayError(hInst);
		return(DFALSE);
	}

	LPDPLCONNECTION pDplConn = (LPDPLCONNECTION)pLobbyLaunchInfo;


	// Read some default values from the console...

	GetConsoleString("NetPlayerName", s_sPlayerName, "Caleb");
	PostProcessName(s_sPlayerName);

#ifdef _DEMO
	GetConsoleString("NetSessionName", s_sSessionName, "Multiplayer Blood2 Demo");
#else
	GetConsoleString("NetSessionName", s_sSessionName, "Multiplayer Blood2");
#endif

	s_nGameType    = GetConsoleInt("NetGameType", NGT_DEATHMATCH);
	s_nEndType     = GetConsoleInt("NetGameEnd", NGE_FRAGS);
	s_nEndFrags    = GetConsoleInt("NetEndFrags", 25);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -