Tài liệu 3D Game Programming All in One- P12 doc

30 312 0
Tài liệu 3D Game Programming All in One- P12 doc

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Exec("./server/missionDownload.cs"); Exec("./server/clientConnection.cs"); Exec("./server/kickban.cs"); Exec("./server/game.cs"); } // package Common { function DisplayHelp() { Parent::DisplayHelp(); Error( "Common Mod options:\n"@ " -fullscreen Starts game in full screen mode\n"@ " -windowed Starts game in windowed mode\n"@ " -autoVideo Auto detect video, but prefers OpenGL\n"@ " -openGL Force OpenGL acceleration\n"@ " -directX Force DirectX acceleration\n"@ " -voodoo2 Force Voodoo2 acceleration\n"@ " -noSound Starts game without sound\n"@ " -prefs <configFile> Exec the config file\n" ); } function ParseArgs() { Parent::ParseArgs(); // Arguments override defaults for (%i = 1; %i < $Game::argc ; %i++) { %arg = $Game::argv[%i]; %nextArg = $Game::argv[%i+1]; %hasNextArg = $Game::argc - %i > 1; switch$ (%arg) { // case "-fullscreen": $pref::Video::fullScreen = 1; $argUsed[%i]++; Game Initialization 237 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. // case "-windowed": $pref::Video::fullScreen = 0; $argUsed[%i]++; // case "-noSound": error("no support yet"); $argUsed[%i]++; // case "-openGL": $pref::Video::displayDevice = "OpenGL"; $argUsed[%i]++; // case "-directX": $pref::Video::displayDevice = "D3D"; $argUsed[%i]++; // case "-voodoo2": $pref::Video::displayDevice = "Voodoo2"; $argUsed[%i]++; // case "-autoVideo": $pref::Video::displayDevice = ""; $argUsed[%i]++; // case "-prefs": $argUsed[%i]++; if (%hasNextArg) { Exec(%nextArg, true, true); $argUsed[%i+1]++; %i++; } else Error("Error: Missing Command Line argument. Usage: -prefs <path/script.cs>"); } Chapter 7 ■ Common Scripts238 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. } } function OnStart() { Parent::OnStart(); Echo("\n Initializing MOD: Common "); InitCommon(); } function OnExit() { Echo("Exporting client prefs"); Export("$pref::*", "./client/prefs.cs", False); Echo("Exporting server prefs"); Export("$Pref::Server::*", "./server/prefs.cs", False); BanList::Export("./server/banlist.cs"); OpenALShutdown(); Parent::OnExit(); } }; // Common package activatePackage(Common); Two key things that happen during game initialization are calls to InitBaseServer and InitBaseClient , both of which are defined in common/main.cs. These are critical func- tions, and yet their actual activities are not that exciting to behold. function InitBaseServer() { Exec("./server/audio.cs"); Exec("./server/server.cs"); Exec("./server/message.cs"); Exec("./server/commands.cs"); Exec("./server/missionInfo.cs"); Exec("./server/missionLoad.cs"); Exec("./server/missionDownload.cs"); Exec("./server/clientConnection.cs"); Exec("./server/kickban.cs"); Exec("./server/game.cs"); } Game Initialization 239 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. function InitBaseClient() { Exec("./client/message.cs"); Exec("./client/mission.cs"); Exec("./client/missionDownload.cs"); Exec("./client/actionMap.cs"); Exec("./editor/editor.cs"); Exec("./client/scriptDoc.cs"); } As you can see, both are nothing more than a set of script loading calls. All of the scripts loaded are part of the common code base. We will look at selected key modules from these calls in the rest of this section. Selected Common Server Modules Next, we will take a close look at some of the common code server modules. The modules selected are the ones that will best help illuminate how Torque operates. The Server Module InitBaseServer loads the common server module, server.cs. When we examine this mod- ule we see the following functions: PortInit CreateServer DestroyServer ResetServerDefaults AddToServerGuidList RemoveFromServerGuidList OnServerInfoQuery It's not hard to get the sense from that list that this is a pretty critical module! PortInit tries to seize control of the assigned TCP/IP port, and if it can't, it starts incre- menting the port number until it finds an open one it can use. CreateServer does the obvious, but it also does some interesting things along the way. First, it makes a call to DestroyServer! This is not as wacky as it might seem; while DestroyServer does release and disable resources, it does so only after making sure the resources exist. So there's no danger of referencing something that doesn't exist, which would thus cause a crash. You need to specify the server type (single- [default] or multi- player) and the mission name. The PortInit function is called from here, if the server will Chapter 7 ■ Common Scripts240 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. be a multiplayer server. The last, but certainly not the least, thing that CreateServer does is call LoadMission . This call kicks off a long and somewhat involved chain of events that we will cover in a later section. DestroyServer releases and disables resources, as mentioned, and also game mechanisms. It stops further connections from happening and deletes any existing ones; turns off the heartbeat processing; deletes all of the server objects in MissionGroup , MissionCleanup , and ServerGroup ; and finally, purges all datablocks from memory. ResetServerDefaults is merely a convenient mechanism for reloading the files in which the server default variable initializations are stored. AddToServerGuidList and RemoveFromServerGuidList are two functions for managing the list of clients that are connected to the server. OnServerInfoQuery is a message handler for handling queries from a master server. It merely returns the string "Doing OK" . The master server, if there is one, will see this and know that the server is alive. It could say anything—there could even be just a single-space character in the string. The important point is that if the server is not doing okay, then the function will not even be called, so the master server would never see the message, would time out, and then would take appropriate action (such as panicking or something useful like that). The Message Module InitBaseServer loads the common server-side message module, message.cs. Most of this module is dedicated to providing in-game chat capabilities for players. MessageClient MessageTeam MessageTeamExcept MessageAll MessageAllExcept ChatMessageClient ChatMessageTeam ChatMessageAll SpamAlert GameConnection::SpamMessageTimeout GameConnection::SpamReset The first five functions in the preceding list are for sending server-type messages to indi- vidual clients, all clients on a team, and all clients in a game. There are also exception mes- sages where everyone is sent the message except a specified client. Selected Common Server Modules 241 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Next are the three chat message functions. These are linked to the chat interfaces that play- ers will use to communicate with each other. These functions all use the CommandToServer (see Chapter 6) function internally. It is impor- tant to note that there will need to be message handlers for these functions on the client side. The three spam control functions are used in conjunction with the chat message func- tions. SpamAlert is called just before each outgoing chat message is processed for sending. Its purpose is to detect if a player is swamping the chat window with messages—this action is called spamming the chat window. If there are too many messages in a short time frame as determined by the SpamMessageTimeout method, then the offending message is suppressed, and an alert message is sent to the client saying something like this: "Enough already! Take a break." Well, you could say it more diplomatically than that, but you get the idea. SpamReset merely sets the client's spam state back to normal after an appropri- ately silent interval. The MissionLoad Module Torque has a concept of mission that corresponds to what many other games, especially those of the first-person shooter genre, call maps. A mission is defined in a mission file that has the extension of .mis. Mission files contain the information that specifies objects in the game world, as well as their placement in the world. Everything that appears in the game world is defined there: items, players, spawn points, triggers, water definitions, sky definitions, and so on. Missions are downloaded from the server to the client at mission start time or when a client joins a mission already in progress. In this way the server has total control over what the client sees and experiences in the mission. Here are the contents of the common/server/missionload.cs module. // // Torque Game Engine // // Copyright (c) 2001 GarageGames.com // Portions Copyright (c) 2001 by Sierra Online, Inc. // // // Server mission loading // // On every mission load except the first, there is a pause after // the initial mission info is downloaded to the client. Chapter 7 ■ Common Scripts242 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. $MissionLoadPause = 5000; function LoadMission( %missionName, %isFirstMission ) { EndMission(); Echo("*** LOADING MISSION: " @ %missionName); Echo("*** Stage 1 load"); // Reset all of these ClearCenterPrintAll(); ClearBottomPrintAll(); // increment the mission sequence (used for ghost sequencing) $missionSequence++; $missionRunning = false; $Server::MissionFile = %missionName; // Extract mission info from the mission file, // including the display name and stuff to send // to the client. BuildLoadInfo( %missionName ); // Download mission info to the clients %count = ClientGroup.GetCount(); for( %cl = 0; %cl < %count; %cl++ ) { %client = ClientGroup.GetObject( %cl ); if (!%client.IsAIControlled()) SendLoadInfoToClient(%client); } // if this isn't the first mission, allow some time for the server // to transmit information to the clients: if( %isFirstMission || $Server::ServerType $= "SinglePlayer" ) LoadMissionStage2(); else schedule( $MissionLoadPause, ServerGroup, LoadMissionStage2 ); } function LoadMissionStage2() { // Create the mission group off the ServerGroup Echo("*** Stage 2 load"); Selected Common Server Modules 243 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. $instantGroup = ServerGroup; // Make sure the mission exists %file = $Server::MissionFile; if( !IsFile( %file ) ) { Error( "Could not find mission " @ %file ); return; } // Calculate the mission CRC. The CRC is used by the clients // to cache mission lighting. $missionCRC = GetFileCRC( %file ); // Exec the mission, objects are added to the ServerGroup Exec(%file); // If there was a problem with the load, let's try another mission if( !IsObject(MissionGroup) ) { Error( "No 'MissionGroup' found in mission \"" @ $missionName @ "\"." ); schedule( 3000, ServerGroup, CycleMissions ); return; } // Mission cleanup group new SimGroup( MissionCleanup ); $instantGroup = MissionCleanup; // Construct MOD paths PathOnMissionLoadDone(); // Mission loading done Echo("*** Mission loaded"); // Start all the clients in the mission $missionRunning = true; for( %clientIndex = 0; %clientIndex < ClientGroup.GetCount(); %clientIndex++ ) ClientGroup.GetObject(%clientIndex).LoadMission(); // Go ahead and launch the game OnMissionLoaded(); PurgeResources(); Chapter 7 ■ Common Scripts244 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. } function EndMission() { if (!IsObject( MissionGroup )) return; Echo("*** ENDING MISSION"); // Inform the game code we're done. OnMissionEnded(); // Inform the clients for( %clientIndex = 0; %clientIndex < ClientGroup.GetCount(); %clientIndex++ ) { // clear ghosts and paths from all clients %cl = ClientGroup.GetObject( %clientIndex ); %cl.EndMission(); %cl.ResetGhosting(); %cl.ClearPaths(); } // Delete everything MissionGroup.Delete(); MissionCleanup.Delete(); $ServerGroup.Delete(); $ServerGroup = new SimGroup(ServerGroup); } function ResetMission() { Echo("*** MISSION RESET"); // Remove any temporary mission objects MissionCleanup.Delete(); $instantGroup = ServerGroup; new SimGroup( MissionCleanup ); $instantGroup = MissionCleanup; // OnMissionReset(); } Selected Common Server Modules 245 Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. Here are the mission loading–oriented functions on the server contained in this module: LoadMission LoadMissionStage2 EndMission ResetMission LoadMission , as we saw in an earlier section, is called in the CreateServer function. It kicks off the process of loading a mission onto the server. Mission information is assembled from the mission file and sent to all the clients for display to their users. After the mission file loads, LoadMissionStage2 is called. In this function, the server calcu- lates the CRC value for the mission and saves it for later use. Once the mission is successfully loaded onto the server, each client is sent the mission via a call to its GameConnection object's LoadMission method. EndMission releases resources and disables other mission-related mechanisms, clearing the server to load a new mission when tasked to do so. ResetMission can be called from the EndGame function in the control/server/misc/game.cs module to prepare the server for a new mission if you are using mission cycling techniques. The MissionDownload Module Here are the contents of the common/server/missiondownload.cs module. Chapter 7 ■ Common Scripts246 What's a CRC Value, and Why Should I Care? We use a Cyclic Redundancy Check (CRC) when transmitting data over potentially error-prone media. Networking protocols use CRCs at a low level to verify that the sent data is the same data that was received. A CRC is a mathematical computation performed on data that arrives at a number that represents both the content of the data and how it's arranged. The point is that the number, called a checksum , uniquely identifies the set of data, like a fingerprint. By comparing the checksum of a set of data to another data set's checksum, you can decide if the two data sets are identical. Why should you care? Well, in addition to the simple goal of maintaining data integrity, CRCs are another arrow in your anticheat quiver. You can use CRCs to ensure that files stored on the clients are the same as the files on the server and, in this regard, that all the clients have the same files— the result is that the playing field is level. Team LRN Please purchase PDF Split-Merge on www.verypdf.com to remove this watermark. [...]... Disable mission lighting if it's going; this is here // in case the mission ends while we are in the process // of loading it $lightingMission = false; $sceneLighting::terminateLighting = true; } ClientCmdMissionStart is a stub routine—not much to say here other than this routine gets called immediately before the client-player finds himself in the game This is a handy place for last-minute client-side... the lighting is not finished It can tell if the lighting is finished by checking the variable $lightingMission If it is true, then lighting is still under way UpdateLightingProgress SceneLightingComplete is the completion callback passed to LightScene When SceneLightingComplete is called, lighting has completed, so it sets the variable $lightingMission to false, which will eventually, within a millisecond... variable is passed in as a string that sets the window's title If we can't create the window, we quit because there is no point continuing without any means to display our game Following that, there is a series of OpenGL settings, again using global preference variables See Table 7.1 for an explanation of these settings Team LRN Selected Common Code Client Modules Table 7.1 OpenGL Settings Module Function... be a superAdmin Then we add the client to the user ID list that the server maintains After that there are a slew of game play client settings we can initialize Next, we start a series of notifications First, we tell all clients that the player has joined the server Then we tell the joining player that he is indeed welcome here, despite possible rumors to the contrary Finally, we tell all the client-players... game- play // function StartGame() { //stub } function EndGame() { //stub } The following functions and GameConnection methods are defined in the Game module: OnServerCreated OnServerDestroyed OnMissionLoaded Team LRN 257 258 Chapter 7 Common Scripts ■ OnMissionEnded OnMissionReset StartGame EndGame GameConnection::OnClientEnterGame GameConnection::OnClientLeaveGame... { Canvas.Repaint(); } } InitCanvas is obviously VideoSetGammaCorrection the main function in this module When it is called, it first calls using a global preferences variable If the value passed is 0 or undefined, then there is no change in the gamma correction (see Table 7.1) Then we attempt to create the canvas, which is an abstracted call to the Windows API to create a window The %windowName variable... critical for game play, we can take the risk of client-side computation without risking someone modifying the code to cheat Someone could modify the code, but it wouldn't gain him any online advantage Next we call the function LightScene to perform the scene's terrain and interior lighting passes We pass the completion callback function SceneLightingComplete, which will be called when the lighting calculations... such—whatever you feel like! After all the glad-handing is done, we start downloading the mission data to the client starting the chain of events depicted back there in Figure 7.2 does some interesting name manipulation First, it tidies up any messy names that have leading or trailing spaces We don't like names that are too short (trying to hide something?), so we don't allow those names Then we make sure... OnServerCreated—anything you do there should be undone in this function The function OnMissionLoaded is called by LoadMission once a mission has finished loading This is a great location to initialize mission-based game play features, like perhaps calculating weather effects based on a rotating mission scheme is called by EndMission just before it is destroyed; this is where you should undo anything you did in OnMissionLoaded... ClientConnection module: GameConnection::OnConnectRequest GameConnection::OnConnect GameConnection::SetPlayerName Team LRN Selected Common Server Modules IsNameUnique GameConnection::OnDrop GameConnection::StartMission GameConnection::EndMission GameConnection::SyncClock GameConnection::IncScore The method GameConnection::OnConnectRequest is the server-side destination of the clientside GameConnection::Connect . package activatePackage(Common); Two key things that happen during game initialization are calls to InitBaseServer and InitBaseClient , both of which are defined in common/main.cs. These. contain the information that specifies objects in the game world, as well as their placement in the world. Everything that appears in the game world is defined

Ngày đăng: 21/01/2014, 23:20

Tài liệu cùng người dùng

Tài liệu liên quan