mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-19 20:24:49 +00:00
236 lines
7.6 KiB
C#
236 lines
7.6 KiB
C#
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Functions dealing with connecting to a server
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Server connection error
|
|
//-----------------------------------------------------------------------------
|
|
|
|
addMessageCallback( 'MsgConnectionError', handleConnectionErrorMessage );
|
|
|
|
function handleConnectionErrorMessage(%msgType, %msgString, %msgError)
|
|
{
|
|
// On connect the server transmits a message to display if there
|
|
// are any problems with the connection. Most connection errors
|
|
// are game version differences, so hopefully the server message
|
|
// will tell us where to get the latest version of the game.
|
|
$ServerConnectionErrorMessage = %msgError;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// GameConnection client callbacks
|
|
//----------------------------------------------------------------------------
|
|
|
|
function GameConnection::initialControlSet(%this)
|
|
{
|
|
echo ("*** Initial Control Object");
|
|
|
|
// The first control object has been set by the server
|
|
// and we are now ready to go.
|
|
|
|
// first check if the editor is active
|
|
if (!isToolBuild() || !Editor::checkActiveLoadDone())
|
|
{
|
|
if (Canvas.getContent() != PlayGui.getId())
|
|
{
|
|
Canvas.setContent(PlayGui);
|
|
ControlsHelpDlg.toggle();
|
|
}
|
|
}
|
|
}
|
|
|
|
function GameConnection::onControlObjectChange(%this)
|
|
{
|
|
echo ("*** Control Object Changed");
|
|
|
|
// Reset the current FOV to match the new object
|
|
// and turn off any current zoom.
|
|
resetCurrentFOV();
|
|
turnOffZoom();
|
|
}
|
|
|
|
function GameConnection::setLagIcon(%this, %state)
|
|
{
|
|
if (%this.getAddress() $= "local")
|
|
return;
|
|
LagIcon.setVisible(%state $= "true");
|
|
}
|
|
|
|
function GameConnection::onFlash(%this, %state)
|
|
{
|
|
if (isObject(FlashFx))
|
|
{
|
|
if (%state)
|
|
{
|
|
FlashFx.enable();
|
|
}
|
|
else
|
|
{
|
|
FlashFx.disable();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Called on the new connection object after connect() succeeds.
|
|
function GameConnection::onConnectionAccepted(%this)
|
|
{
|
|
// Called on the new connection object after connect() succeeds.
|
|
LagIcon.setVisible(false);
|
|
|
|
// Startup the physics world on the client before any
|
|
// datablocks and objects are ghosted over.
|
|
physicsInitWorld( "client" );
|
|
}
|
|
|
|
function GameConnection::onConnectionTimedOut(%this)
|
|
{
|
|
// Called when an established connection times out
|
|
disconnectedCleanup();
|
|
MessageBoxOK( "TIMED OUT", "The server connection has timed out.");
|
|
}
|
|
|
|
function GameConnection::onConnectionDropped(%this, %msg)
|
|
{
|
|
// Established connection was dropped by the server
|
|
disconnectedCleanup();
|
|
MessageBoxOK( "DISCONNECT", "The server has dropped the connection: " @ %msg);
|
|
}
|
|
|
|
function GameConnection::onConnectionError(%this, %msg)
|
|
{
|
|
// General connection error, usually raised by ghosted objects
|
|
// initialization problems, such as missing files. We'll display
|
|
// the server's connection error message.
|
|
disconnectedCleanup();
|
|
MessageBoxOK( "DISCONNECT", $ServerConnectionErrorMessage @ " (" @ %msg @ ")" );
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Connection Failed Events
|
|
//----------------------------------------------------------------------------
|
|
|
|
function GameConnection::onConnectRequestRejected( %this, %msg )
|
|
{
|
|
switch$(%msg)
|
|
{
|
|
case "CR_INVALID_PROTOCOL_VERSION":
|
|
%error = "Incompatible protocol version: Your game version is not compatible with this server.";
|
|
case "CR_INVALID_CONNECT_PACKET":
|
|
%error = "Internal Error: badly formed network packet";
|
|
case "CR_YOUAREBANNED":
|
|
%error = "You are not allowed to play on this server.";
|
|
case "CR_SERVERFULL":
|
|
%error = "This server is full.";
|
|
case "CHR_PASSWORD":
|
|
// XXX Should put up a password-entry dialog.
|
|
if ($Client::Password $= "")
|
|
MessageBoxOK( "REJECTED", "That server requires a password.");
|
|
else {
|
|
$Client::Password = "";
|
|
MessageBoxOK( "REJECTED", "That password is incorrect.");
|
|
}
|
|
return;
|
|
case "CHR_PROTOCOL":
|
|
%error = "Incompatible protocol version: Your game version is not compatible with this server.";
|
|
case "CHR_CLASSCRC":
|
|
%error = "Incompatible game classes: Your game version is not compatible with this server.";
|
|
case "CHR_INVALID_CHALLENGE_PACKET":
|
|
%error = "Internal Error: Invalid server response packet";
|
|
default:
|
|
%error = "Connection error. Please try another server. Error code: (" @ %msg @ ")";
|
|
}
|
|
disconnectedCleanup();
|
|
MessageBoxOK( "REJECTED", %error);
|
|
}
|
|
|
|
function GameConnection::onConnectRequestTimedOut(%this)
|
|
{
|
|
disconnectedCleanup();
|
|
MessageBoxOK( "TIMED OUT", "Your connection to the server timed out." );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Disconnect
|
|
//-----------------------------------------------------------------------------
|
|
|
|
function disconnect()
|
|
{
|
|
// We need to stop the client side simulation
|
|
// else physics resources will not cleanup properly.
|
|
physicsStopSimulation( "client" );
|
|
|
|
// Delete the connection if it's still there.
|
|
if (isObject(ServerConnection))
|
|
ServerConnection.delete();
|
|
|
|
disconnectedCleanup();
|
|
|
|
// Call destroyServer in case we're hosting
|
|
destroyServer();
|
|
}
|
|
|
|
function disconnectedCleanup()
|
|
{
|
|
// End mission, if it's running.
|
|
|
|
if( $Client::missionRunning )
|
|
clientEndMission();
|
|
|
|
// Disable mission lighting if it's going, this is here
|
|
// in case we're disconnected while the mission is loading.
|
|
|
|
$lightingMission = false;
|
|
$sceneLighting::terminateLighting = true;
|
|
|
|
// Clear misc script stuff
|
|
HudMessageVector.clear();
|
|
|
|
//
|
|
LagIcon.setVisible(false);
|
|
PlayerListGui.clear();
|
|
|
|
// Clear all print messages
|
|
clientCmdclearBottomPrint();
|
|
clientCmdClearCenterPrint();
|
|
|
|
// Back to the launch screen
|
|
if (isObject( MainMenuGui ))
|
|
Canvas.setContent( MainMenuGui );
|
|
else if (isObject( UnifiedMainMenuGui ))
|
|
Canvas.setContent( UnifiedMainMenuGui );
|
|
|
|
// Before we destroy the client physics world
|
|
// make sure all ServerConnection objects are deleted.
|
|
if(isObject(ServerConnection))
|
|
{
|
|
ServerConnection.deleteAllObjects();
|
|
}
|
|
|
|
// We can now delete the client physics simulation.
|
|
physicsDestroyWorld( "client" );
|
|
}
|