2004-03-16 22:34:48 +00:00
|
|
|
#include "global.h"
|
|
|
|
|
#include "NetworkSyncManager.h"
|
2004-08-28 05:30:23 +00:00
|
|
|
#include "NetworkSyncServer.h"
|
2005-02-25 03:15:39 +00:00
|
|
|
#include "LuaManager.h"
|
2004-08-28 23:25:13 +00:00
|
|
|
#include "LuaFunctions.h"
|
2005-05-08 04:42:33 +00:00
|
|
|
#include "crypto/CryptMD5.h"
|
2004-06-15 02:21:16 +00:00
|
|
|
|
|
|
|
|
NetworkSyncManager *NSMAN;
|
|
|
|
|
|
2004-06-20 17:42:58 +00:00
|
|
|
#if defined(WITHOUT_NETWORKING)
|
2005-01-01 21:44:00 +00:00
|
|
|
NetworkSyncManager::NetworkSyncManager( LoadingWindow *ld ) { useSMserver=false; isSMOnline = false; }
|
2004-06-15 02:21:16 +00:00
|
|
|
NetworkSyncManager::~NetworkSyncManager () { }
|
|
|
|
|
void NetworkSyncManager::CloseConnection() { }
|
2004-09-06 21:02:55 +00:00
|
|
|
void NetworkSyncManager::PostStartUp(const CString& ServerIP ) { }
|
2004-06-15 02:21:16 +00:00
|
|
|
bool NetworkSyncManager::Connect(const CString& addy, unsigned short port) { return false; }
|
2004-12-03 00:24:42 +00:00
|
|
|
CString NetworkSyncManager::GetServerName() { return ""; }
|
2004-09-03 15:33:00 +00:00
|
|
|
void NetworkSyncManager::ReportNSSOnOff(int i) { }
|
2004-08-10 23:46:24 +00:00
|
|
|
void NetworkSyncManager::ReportTiming(float offset, int PlayerNumber) { }
|
2004-06-15 02:21:16 +00:00
|
|
|
void NetworkSyncManager::ReportScore(int playerID, int step, int score, int combo) { }
|
|
|
|
|
void NetworkSyncManager::ReportSongOver() { }
|
2004-08-16 06:55:21 +00:00
|
|
|
void NetworkSyncManager::ReportStyle() {}
|
2004-07-22 22:19:14 +00:00
|
|
|
void NetworkSyncManager::StartRequest(short position) { }
|
2004-06-15 02:21:16 +00:00
|
|
|
void NetworkSyncManager::DisplayStartupStatus() { }
|
|
|
|
|
void NetworkSyncManager::Update( float fDeltaTime ) { }
|
2004-08-18 00:16:00 +00:00
|
|
|
bool NetworkSyncManager::ChangedScoreboard(int Column) { return false; }
|
2004-09-06 21:02:55 +00:00
|
|
|
void NetworkSyncManager::SendChat(const CString& message) { }
|
2004-08-28 03:37:52 +00:00
|
|
|
void NetworkSyncManager::SelectUserSong() { }
|
2005-05-08 09:15:06 +00:00
|
|
|
CString NetworkSyncManager::MD5Hex( const CString &sInput ) { return ""; }
|
2005-05-08 08:49:01 +00:00
|
|
|
int NetworkSyncManager::GetSMOnlineSalt() { return 0; }
|
2004-06-15 02:21:16 +00:00
|
|
|
#else
|
|
|
|
|
#include "ezsockets.h"
|
2004-04-14 20:39:58 +00:00
|
|
|
#include "ProfileManager.h"
|
2004-03-16 22:34:48 +00:00
|
|
|
#include "RageLog.h"
|
2004-04-15 20:21:39 +00:00
|
|
|
#include "StepMania.h"
|
2004-04-17 22:26:37 +00:00
|
|
|
#include "ScreenManager.h"
|
2004-04-17 23:09:15 +00:00
|
|
|
#include "song.h"
|
2004-07-15 16:17:41 +00:00
|
|
|
#include "Course.h"
|
2004-04-17 22:26:37 +00:00
|
|
|
#include "GameState.h"
|
2005-02-16 03:25:45 +00:00
|
|
|
#include "StatsManager.h"
|
2004-05-05 03:46:28 +00:00
|
|
|
#include "Steps.h"
|
2004-08-13 20:57:04 +00:00
|
|
|
#include "PrefsManager.h"
|
2004-08-16 06:55:21 +00:00
|
|
|
#include "ProductInfo.h"
|
2004-08-18 01:02:06 +00:00
|
|
|
#include "ScreenMessage.h"
|
2004-09-03 15:33:00 +00:00
|
|
|
#include "GameManager.h"
|
2004-08-18 02:08:43 +00:00
|
|
|
#include "arch/LoadingWindow/LoadingWindow.h"
|
2004-12-20 06:25:59 +00:00
|
|
|
#include "PlayerState.h"
|
2004-04-15 20:21:39 +00:00
|
|
|
|
2005-03-28 08:01:36 +00:00
|
|
|
AutoScreenMessage( SM_AddToChat )
|
|
|
|
|
AutoScreenMessage( SM_ChangeSong );
|
|
|
|
|
AutoScreenMessage( SM_GotEval );
|
|
|
|
|
AutoScreenMessage( SM_UsersUpdate );
|
|
|
|
|
AutoScreenMessage( SM_SMOnlinePack );
|
2004-08-18 01:02:06 +00:00
|
|
|
|
2005-05-08 08:49:01 +00:00
|
|
|
int NetworkSyncManager::GetSMOnlineSalt()
|
|
|
|
|
{
|
|
|
|
|
return m_iSalt;
|
|
|
|
|
}
|
2004-08-18 01:02:06 +00:00
|
|
|
|
2004-08-18 01:29:51 +00:00
|
|
|
NetworkSyncManager::NetworkSyncManager( LoadingWindow *ld )
|
2004-03-16 22:34:48 +00:00
|
|
|
{
|
2004-08-28 22:12:56 +00:00
|
|
|
LANserver = NULL; //So we know if it has been created yet
|
2004-11-21 07:05:18 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
if( GetCommandlineArgument( "runserver" ))
|
|
|
|
|
{
|
2005-02-02 21:35:13 +00:00
|
|
|
ld->SetText("Initializing server...");
|
2004-08-28 05:30:23 +00:00
|
|
|
LANserver = new StepManiaLanServer;
|
|
|
|
|
isLanServer = true;
|
|
|
|
|
GetCommandlineArgument( "runserver", &LANserver->servername );
|
|
|
|
|
}
|
2004-09-06 21:02:55 +00:00
|
|
|
else
|
|
|
|
|
isLanServer = false;
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2005-02-02 21:35:13 +00:00
|
|
|
ld->SetText("Initializing Client Network...");
|
2004-03-17 06:05:52 +00:00
|
|
|
NetPlayerClient = new EzSockets;
|
2004-07-04 05:06:55 +00:00
|
|
|
NetPlayerClient->blocking = false;
|
2004-03-25 15:08:07 +00:00
|
|
|
m_ServerVersion = 0;
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2004-04-15 15:31:59 +00:00
|
|
|
useSMserver = false;
|
2004-11-21 07:05:18 +00:00
|
|
|
isSMOnline = false;
|
2005-01-12 05:40:23 +00:00
|
|
|
FOREACH_PlayerNumber(pn)
|
|
|
|
|
isSMOLoggedIn[pn] = false;
|
2004-11-21 07:05:18 +00:00
|
|
|
|
2004-04-29 01:03:28 +00:00
|
|
|
m_startupStatus = 0; //By default, connection not tried.
|
2004-03-25 15:08:07 +00:00
|
|
|
|
2004-08-29 17:15:10 +00:00
|
|
|
m_ActivePlayers = 0;
|
|
|
|
|
|
2004-04-15 20:21:39 +00:00
|
|
|
StartUp();
|
2004-04-15 15:31:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NetworkSyncManager::~NetworkSyncManager ()
|
|
|
|
|
{
|
|
|
|
|
//Close Connection to server nicely.
|
|
|
|
|
if (useSMserver)
|
|
|
|
|
NetPlayerClient->close();
|
|
|
|
|
delete NetPlayerClient;
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
if( isLanServer )
|
|
|
|
|
{
|
2004-08-28 05:30:23 +00:00
|
|
|
LANserver->ServerStop();
|
|
|
|
|
delete LANserver;
|
|
|
|
|
}
|
2004-04-15 15:31:59 +00:00
|
|
|
}
|
2004-04-14 20:39:58 +00:00
|
|
|
|
2004-04-30 04:34:39 +00:00
|
|
|
void NetworkSyncManager::CloseConnection()
|
2004-04-15 15:31:59 +00:00
|
|
|
{
|
2004-04-30 04:34:39 +00:00
|
|
|
if (!useSMserver)
|
|
|
|
|
return ;
|
|
|
|
|
m_ServerVersion = 0;
|
|
|
|
|
useSMserver = false;
|
2005-01-25 07:22:31 +00:00
|
|
|
isSMOnline = false;
|
2005-01-12 05:40:23 +00:00
|
|
|
FOREACH_PlayerNumber(pn)
|
|
|
|
|
isSMOLoggedIn[pn] = false;
|
2004-04-30 04:34:39 +00:00
|
|
|
m_startupStatus = 0;
|
|
|
|
|
NetPlayerClient->close();
|
|
|
|
|
}
|
2004-04-29 01:03:28 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
void NetworkSyncManager::PostStartUp(const CString& ServerIP)
|
2004-04-30 04:34:39 +00:00
|
|
|
{
|
2005-02-01 06:22:19 +00:00
|
|
|
CString sAddress;
|
2005-02-03 02:41:17 +00:00
|
|
|
short iPort;
|
2005-02-01 06:22:19 +00:00
|
|
|
|
|
|
|
|
int cLoc = ServerIP.Find( ":" );
|
|
|
|
|
if ( ServerIP.Find( ":" ) > 0 )
|
|
|
|
|
{
|
2005-02-03 02:41:17 +00:00
|
|
|
iPort = (short) atoi( ServerIP.substr( cLoc + 1 ).c_str() );
|
2005-02-01 06:22:19 +00:00
|
|
|
sAddress = ServerIP.substr( 0, cLoc );
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
iPort = 8765;
|
|
|
|
|
sAddress = ServerIP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG->Info( "Attempting to connect to: %s, Port: %d", sAddress.c_str(), iPort );
|
|
|
|
|
|
2004-04-30 04:34:39 +00:00
|
|
|
CloseConnection();
|
|
|
|
|
if( ServerIP!="LISTEN" )
|
2004-04-15 20:21:39 +00:00
|
|
|
{
|
2005-02-01 06:22:19 +00:00
|
|
|
if( !Connect(sAddress.c_str(), iPort) )
|
2004-04-15 15:31:59 +00:00
|
|
|
{
|
2004-04-29 01:03:28 +00:00
|
|
|
m_startupStatus = 2;
|
2004-04-15 20:21:39 +00:00
|
|
|
LOG->Warn( "Network Sync Manager failed to connect" );
|
|
|
|
|
return;
|
2004-04-14 20:39:58 +00:00
|
|
|
}
|
2004-09-06 21:02:55 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2005-02-01 06:22:19 +00:00
|
|
|
if( !Listen(iPort) )
|
2004-04-15 20:21:39 +00:00
|
|
|
{
|
2004-04-29 01:03:28 +00:00
|
|
|
m_startupStatus = 2;
|
2004-05-25 10:39:23 +00:00
|
|
|
LOG->Warn( "Listen() failed" );
|
2004-04-15 20:21:39 +00:00
|
|
|
return;
|
2004-04-14 20:39:58 +00:00
|
|
|
}
|
2004-04-15 20:21:39 +00:00
|
|
|
}
|
|
|
|
|
|
2005-01-12 05:40:23 +00:00
|
|
|
FOREACH_PlayerNumber(pn)
|
|
|
|
|
isSMOLoggedIn[pn] = false;
|
2005-01-07 22:00:08 +00:00
|
|
|
|
2004-04-15 20:21:39 +00:00
|
|
|
useSMserver = true;
|
|
|
|
|
|
2005-04-02 16:29:29 +00:00
|
|
|
m_startupStatus = 1; //Connection attepmpt successful
|
2004-04-15 20:21:39 +00:00
|
|
|
|
|
|
|
|
// If network play is desired and the connection works,
|
|
|
|
|
// halt until we know what server version we're dealing with
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCHello ); //Hello Packet
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1(NETPROTOCOLVERSION);
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT(CString(PRODUCT_NAME_VER));
|
2004-08-13 20:57:04 +00:00
|
|
|
|
2004-07-04 05:06:55 +00:00
|
|
|
//Block until responce is received
|
|
|
|
|
//Move mode to blocking in order to give CPU back to the
|
|
|
|
|
//system, and not wait.
|
|
|
|
|
|
2004-08-14 05:29:03 +00:00
|
|
|
bool dontExit = true;
|
2004-08-28 05:30:23 +00:00
|
|
|
|
|
|
|
|
//Don't block if the server is running
|
2004-09-06 21:02:55 +00:00
|
|
|
if( isLanServer )
|
2004-08-28 05:30:23 +00:00
|
|
|
NetPlayerClient->blocking = false;
|
2004-09-06 21:02:55 +00:00
|
|
|
else
|
2004-08-28 05:30:23 +00:00
|
|
|
NetPlayerClient->blocking = true;
|
2004-08-16 07:40:22 +00:00
|
|
|
|
|
|
|
|
//Following packet must get through, so we block for it.
|
2004-08-28 05:30:23 +00:00
|
|
|
//If we are serving we do not block for this.
|
2004-08-16 07:40:22 +00:00
|
|
|
NetPlayerClient->SendPack((char*)m_packet.Data,m_packet.Position);
|
|
|
|
|
|
2004-08-28 05:30:23 +00:00
|
|
|
//If we are serving, do this so we properly connect
|
|
|
|
|
//to the server.
|
2004-09-06 21:02:55 +00:00
|
|
|
if( isLanServer )
|
2004-08-28 05:30:23 +00:00
|
|
|
LANserver->ServerUpdate();
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-08-16 07:40:22 +00:00
|
|
|
|
2004-08-13 21:03:22 +00:00
|
|
|
while (dontExit)
|
|
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-08-13 21:03:22 +00:00
|
|
|
if (NetPlayerClient->ReadPack((char *)&m_packet, NETMAXBUFFERSIZE)<1)
|
|
|
|
|
dontExit=false; // Also allow exit if there is a problem on the socket
|
2004-09-07 00:13:15 +00:00
|
|
|
if (m_packet.Read1() == (NSServerOffset + NSCHello))
|
2004-08-13 21:03:22 +00:00
|
|
|
dontExit=false;
|
|
|
|
|
//Only allow passing on handshake.
|
|
|
|
|
//Otherwise scoreboard updates and such will confuse us.
|
|
|
|
|
}
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2004-08-14 05:29:03 +00:00
|
|
|
NetPlayerClient->blocking = false;
|
2004-11-21 07:05:18 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_ServerVersion = m_packet.Read1();
|
2004-11-21 07:05:18 +00:00
|
|
|
if ( m_ServerVersion >= 128 )
|
|
|
|
|
isSMOnline = true;
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_ServerName = m_packet.ReadNT();
|
2005-05-08 04:42:33 +00:00
|
|
|
m_iSalt = m_packet.Read4();
|
2004-06-30 07:16:44 +00:00
|
|
|
LOG->Info("Server Version: %d %s", m_ServerVersion, m_ServerName.c_str());
|
2004-03-16 22:34:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2004-04-30 04:34:39 +00:00
|
|
|
void NetworkSyncManager::StartUp()
|
|
|
|
|
{
|
|
|
|
|
CString ServerIP;
|
|
|
|
|
|
2004-08-28 13:41:22 +00:00
|
|
|
if( isLanServer )
|
2004-09-06 21:02:55 +00:00
|
|
|
if (!LANserver->ServerStart())
|
|
|
|
|
{
|
2004-08-28 13:41:22 +00:00
|
|
|
//If the server happens to not start when told,
|
|
|
|
|
//Print to log and release the memory where the
|
|
|
|
|
//server was held.
|
|
|
|
|
isLanServer = false;
|
|
|
|
|
LOG->Warn("Server failed to start.");
|
|
|
|
|
delete LANserver;
|
|
|
|
|
}
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2004-04-30 04:34:39 +00:00
|
|
|
if( GetCommandlineArgument( "netip", &ServerIP ) )
|
|
|
|
|
PostStartUp(ServerIP);
|
|
|
|
|
else if( GetCommandlineArgument( "listen" ) )
|
|
|
|
|
PostStartUp("LISTEN");
|
2004-08-28 05:30:23 +00:00
|
|
|
|
2004-04-30 04:34:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2004-03-17 13:31:42 +00:00
|
|
|
bool NetworkSyncManager::Connect(const CString& addy, unsigned short port)
|
2004-03-16 22:34:48 +00:00
|
|
|
{
|
2004-03-30 20:13:22 +00:00
|
|
|
LOG->Info("Beginning to connect");
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2005-02-02 21:35:13 +00:00
|
|
|
NetPlayerClient->create(); // Initialize Socket
|
2004-03-17 13:31:42 +00:00
|
|
|
useSMserver = NetPlayerClient->connect(addy, port);
|
|
|
|
|
|
|
|
|
|
return useSMserver;
|
2004-03-16 22:34:48 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-30 20:13:22 +00:00
|
|
|
|
|
|
|
|
//Listen (Wait for connection in-bound)
|
|
|
|
|
//NOTE: Right now, StepMania cannot connect back to StepMania!
|
|
|
|
|
|
|
|
|
|
bool NetworkSyncManager::Listen(unsigned short port)
|
|
|
|
|
{
|
|
|
|
|
LOG->Info("Beginning to Listen");
|
|
|
|
|
|
|
|
|
|
EzSockets * EZListener = new EzSockets;
|
|
|
|
|
|
|
|
|
|
EZListener->create();
|
2005-02-02 21:35:13 +00:00
|
|
|
NetPlayerClient->create(); // Initialize Socket
|
2004-03-30 20:13:22 +00:00
|
|
|
|
|
|
|
|
EZListener->bind(8765);
|
|
|
|
|
|
|
|
|
|
useSMserver = EZListener->listen();
|
2004-05-25 10:39:23 +00:00
|
|
|
useSMserver = EZListener->accept( *NetPlayerClient ); //Wait for someone to connect
|
2004-03-30 20:13:22 +00:00
|
|
|
|
|
|
|
|
EZListener->close(); //Kill Listener
|
|
|
|
|
delete EZListener;
|
|
|
|
|
|
2004-03-31 04:18:44 +00:00
|
|
|
//LOG->Info("Accept Responce: ",useSMserver);
|
2004-03-30 20:13:22 +00:00
|
|
|
useSMserver=true;
|
|
|
|
|
return useSMserver;
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 15:33:00 +00:00
|
|
|
void NetworkSyncManager::ReportNSSOnOff(int i)
|
|
|
|
|
{
|
|
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCSMS );
|
2004-09-06 04:33:31 +00:00
|
|
|
m_packet.Write1( (uint8_t) i );
|
2004-09-05 05:11:44 +00:00
|
|
|
NetPlayerClient->SendPack((char*)m_packet.Data, m_packet.Position);
|
2004-09-03 15:33:00 +00:00
|
|
|
}
|
2004-03-30 20:13:22 +00:00
|
|
|
|
2004-10-19 06:15:42 +00:00
|
|
|
CString NetworkSyncManager::GetServerName()
|
|
|
|
|
{
|
|
|
|
|
return m_ServerName;
|
|
|
|
|
}
|
|
|
|
|
|
2004-08-10 06:39:25 +00:00
|
|
|
void NetworkSyncManager::ReportTiming(float offset, int PlayerNumber)
|
|
|
|
|
{
|
|
|
|
|
m_lastOffset[PlayerNumber] = offset;
|
|
|
|
|
}
|
2004-03-30 20:13:22 +00:00
|
|
|
|
2004-03-17 06:05:52 +00:00
|
|
|
void NetworkSyncManager::ReportScore(int playerID, int step, int score, int combo)
|
2004-03-16 22:34:48 +00:00
|
|
|
{
|
2004-03-17 13:31:42 +00:00
|
|
|
if (!useSMserver) //Make sure that we are using the network
|
2004-03-17 06:05:52 +00:00
|
|
|
return;
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCGSU );
|
2005-05-22 05:44:56 +00:00
|
|
|
uint8_t ctr = (uint8_t) (playerID * 16 + step - ( TNS_MISS - 1 ) );
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1(ctr);
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2005-02-16 03:25:45 +00:00
|
|
|
ctr = uint8_t( STATSMAN->m_CurStageStats.m_player[playerID].GetGrade()*16 );
|
2004-05-05 05:41:51 +00:00
|
|
|
|
2005-02-16 03:25:45 +00:00
|
|
|
if ( STATSMAN->m_CurStageStats.m_player[playerID].bFailedEarlier )
|
2004-09-06 21:19:18 +00:00
|
|
|
ctr = uint8_t( 112 ); //Code for failed (failed constant seems not to work)
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1(ctr);
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write4(score);
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write2((uint16_t) combo);
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write2((uint16_t) m_playerLife[playerID]);
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-10 06:39:25 +00:00
|
|
|
//Offset Info
|
|
|
|
|
//Note: if a 0 is sent, then disregard data.
|
|
|
|
|
//
|
|
|
|
|
//ASSUMED: No step will be more than 16 seconds off center
|
|
|
|
|
//If assumption false: read 16 seconds either direction
|
|
|
|
|
int iOffset = int((m_lastOffset[playerID]+16.384)*2000.0);
|
|
|
|
|
|
|
|
|
|
if (iOffset>65535)
|
|
|
|
|
iOffset=65535;
|
|
|
|
|
if (iOffset<1)
|
|
|
|
|
iOffset=1;
|
|
|
|
|
|
|
|
|
|
//Report 0 if hold, or miss (don't forget mines should report)
|
|
|
|
|
if (((step<TNS_BOO)||(step>TNS_MARVELOUS))&&(step!=TNS_HIT_MINE))
|
|
|
|
|
iOffset = 0;
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write2((uint16_t) iOffset);
|
2004-08-10 06:39:25 +00:00
|
|
|
|
2004-06-30 07:16:44 +00:00
|
|
|
NetPlayerClient->SendPack((char*)m_packet.Data, m_packet.Position);
|
2004-03-30 05:50:36 +00:00
|
|
|
|
2004-03-16 22:34:48 +00:00
|
|
|
}
|
2004-03-31 04:18:44 +00:00
|
|
|
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-03-17 06:05:52 +00:00
|
|
|
void NetworkSyncManager::ReportSongOver()
|
2004-03-16 22:34:48 +00:00
|
|
|
{
|
2004-03-17 13:31:42 +00:00
|
|
|
if (!useSMserver) //Make sure that we are using the network
|
2004-03-16 22:34:48 +00:00
|
|
|
return ;
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCGON );
|
2004-05-05 03:46:28 +00:00
|
|
|
|
2004-06-30 07:16:44 +00:00
|
|
|
NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position);
|
2004-03-16 22:34:48 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2004-08-16 06:55:21 +00:00
|
|
|
void NetworkSyncManager::ReportStyle()
|
|
|
|
|
{
|
2004-10-13 06:42:53 +00:00
|
|
|
LOG->Trace( "Sending \"Style\" to server" );
|
|
|
|
|
|
2004-08-19 02:47:08 +00:00
|
|
|
if (!useSMserver)
|
|
|
|
|
return;
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCSU );
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1( (int8_t) GAMESTATE->GetNumPlayersEnabled() );
|
2004-08-16 06:55:21 +00:00
|
|
|
|
|
|
|
|
FOREACH_EnabledPlayer( pn )
|
|
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1((uint8_t) pn );
|
|
|
|
|
m_packet.WriteNT(GAMESTATE->GetPlayerDisplayName(pn) );
|
2004-08-16 06:55:21 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-19 00:22:29 +00:00
|
|
|
NetPlayerClient->SendPack( (char*)&m_packet.Data, m_packet.Position );
|
2004-08-16 06:55:21 +00:00
|
|
|
}
|
|
|
|
|
|
2004-07-15 16:17:41 +00:00
|
|
|
void NetworkSyncManager::StartRequest(short position)
|
2004-03-16 22:34:48 +00:00
|
|
|
{
|
2004-08-19 00:22:29 +00:00
|
|
|
if( !useSMserver )
|
|
|
|
|
return;
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-08-19 00:22:29 +00:00
|
|
|
if( GAMESTATE->m_bDemonstrationOrJukebox )
|
|
|
|
|
return;
|
2004-04-28 01:25:44 +00:00
|
|
|
|
2004-04-17 03:28:31 +00:00
|
|
|
LOG->Trace("Requesting Start from Server.");
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCGSR );
|
2004-05-05 03:46:28 +00:00
|
|
|
|
2004-06-30 07:16:44 +00:00
|
|
|
unsigned char ctr=0;
|
2004-05-05 03:46:28 +00:00
|
|
|
|
|
|
|
|
Steps * tSteps;
|
2004-08-31 15:44:19 +00:00
|
|
|
tSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
|
|
|
|
|
if ((tSteps!=NULL) && (GAMESTATE->IsPlayerEnabled(PLAYER_1)))
|
2004-07-07 19:28:32 +00:00
|
|
|
ctr = uint8_t(ctr+tSteps->GetMeter()*16);
|
2004-05-05 03:46:28 +00:00
|
|
|
|
2004-08-31 15:44:19 +00:00
|
|
|
tSteps = GAMESTATE->m_pCurSteps[PLAYER_2];
|
|
|
|
|
if ((tSteps!=NULL) && (GAMESTATE->IsPlayerEnabled(PLAYER_2)))
|
2004-07-07 19:28:32 +00:00
|
|
|
ctr = uint8_t(ctr+tSteps->GetMeter());
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1(ctr);
|
2004-09-01 17:16:01 +00:00
|
|
|
|
|
|
|
|
ctr=0;
|
|
|
|
|
|
|
|
|
|
tSteps = GAMESTATE->m_pCurSteps[PLAYER_1];
|
|
|
|
|
if ((tSteps!=NULL) && (GAMESTATE->IsPlayerEnabled(PLAYER_1)))
|
|
|
|
|
ctr = uint8_t(ctr + (int) tSteps->GetDifficulty()*16);
|
|
|
|
|
|
|
|
|
|
tSteps = GAMESTATE->m_pCurSteps[PLAYER_2];
|
|
|
|
|
if ((tSteps!=NULL) && (GAMESTATE->IsPlayerEnabled(PLAYER_2)))
|
|
|
|
|
ctr = uint8_t(ctr + (int) tSteps->GetDifficulty());
|
|
|
|
|
|
|
|
|
|
m_packet.Write1(ctr);
|
2004-07-15 16:17:41 +00:00
|
|
|
|
|
|
|
|
//Notify server if this is for sync or not.
|
2004-07-16 23:48:51 +00:00
|
|
|
ctr = char(position*16);
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.Write1(ctr);
|
2004-07-15 16:17:41 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
if (GAMESTATE->m_pCurSong != NULL)
|
|
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT(GAMESTATE->m_pCurSong->m_sMainTitle);
|
|
|
|
|
m_packet.WriteNT(GAMESTATE->m_pCurSong->m_sSubTitle);
|
|
|
|
|
m_packet.WriteNT(GAMESTATE->m_pCurSong->m_sArtist);
|
2004-09-06 21:02:55 +00:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT("");
|
|
|
|
|
m_packet.WriteNT("");
|
|
|
|
|
m_packet.WriteNT("");
|
2004-07-15 16:17:41 +00:00
|
|
|
}
|
2004-03-16 22:34:48 +00:00
|
|
|
|
2004-07-15 16:17:41 +00:00
|
|
|
if (GAMESTATE->m_pCurCourse != NULL)
|
2005-05-23 00:38:09 +00:00
|
|
|
m_packet.WriteNT(GAMESTATE->m_pCurCourse->GetDisplayFullTitle());
|
2004-07-15 16:17:41 +00:00
|
|
|
else
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT(CString(""));
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-22 08:03:19 +00:00
|
|
|
//Send Player (and song) Options
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT(GAMESTATE->m_SongOptions.GetString());
|
2004-08-22 08:03:19 +00:00
|
|
|
|
|
|
|
|
int players=0;
|
|
|
|
|
FOREACH_PlayerNumber (p)
|
|
|
|
|
{
|
2004-09-06 21:02:55 +00:00
|
|
|
++players;
|
2004-12-20 06:25:59 +00:00
|
|
|
m_packet.WriteNT(GAMESTATE->m_pPlayerState[p]->m_PlayerOptions.GetString());
|
2004-08-22 08:03:19 +00:00
|
|
|
}
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<2-players; ++i)
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.WriteNT(""); //Write a NULL if no player
|
2004-08-22 08:03:19 +00:00
|
|
|
|
2004-09-01 04:09:36 +00:00
|
|
|
//This needs to be reset before ScreenEvaluation could possibly be called
|
2004-12-08 05:35:03 +00:00
|
|
|
m_EvalPlayerData.clear();
|
2004-08-22 08:03:19 +00:00
|
|
|
|
2004-03-16 22:34:48 +00:00
|
|
|
//Block until go is recieved.
|
2004-07-04 05:06:55 +00:00
|
|
|
//Switch to blocking mode (this is the only
|
|
|
|
|
//way I know how to get precievably instantanious results
|
2004-08-13 20:20:10 +00:00
|
|
|
|
|
|
|
|
bool dontExit=true;
|
2004-08-28 05:30:23 +00:00
|
|
|
|
|
|
|
|
//Don't block if we are server.
|
2004-09-06 21:02:55 +00:00
|
|
|
if (isLanServer)
|
2004-08-28 05:30:23 +00:00
|
|
|
NetPlayerClient->blocking=false;
|
2004-09-06 21:02:55 +00:00
|
|
|
else
|
2004-08-28 05:30:23 +00:00
|
|
|
NetPlayerClient->blocking=true;
|
2004-08-16 07:40:22 +00:00
|
|
|
|
|
|
|
|
//The following packet HAS to get through, so we turn blocking on for it as well
|
2004-08-28 05:30:23 +00:00
|
|
|
//Don't block if we are serving
|
2004-08-16 07:40:22 +00:00
|
|
|
NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position);
|
|
|
|
|
|
|
|
|
|
LOG->Trace("Waiting for RECV");
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-08-16 07:40:22 +00:00
|
|
|
|
2004-10-13 06:42:53 +00:00
|
|
|
|
2004-08-13 20:20:10 +00:00
|
|
|
while (dontExit)
|
|
|
|
|
{
|
2004-08-28 16:47:05 +00:00
|
|
|
//Keep the server going during the loop.
|
|
|
|
|
if (isLanServer)
|
|
|
|
|
LANserver->ServerUpdate();
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-08-13 20:20:10 +00:00
|
|
|
if (NetPlayerClient->ReadPack((char *)&m_packet, NETMAXBUFFERSIZE)<1)
|
2004-09-06 21:02:55 +00:00
|
|
|
if (!isLanServer)
|
2004-08-28 16:47:05 +00:00
|
|
|
dontExit=false; // Also allow exit if there is a problem on the socket
|
|
|
|
|
// Only do if we are not the server, otherwise the sync
|
|
|
|
|
// gets hosed up due to non blocking mode.
|
2004-09-07 00:13:15 +00:00
|
|
|
if (m_packet.Read1() == (NSServerOffset + NSCGSR))
|
2004-08-13 20:20:10 +00:00
|
|
|
dontExit=false;
|
|
|
|
|
//Only allow passing on Start request.
|
|
|
|
|
//Otherwise scoreboard updates and such will confuse us.
|
2004-10-13 06:42:53 +00:00
|
|
|
|
2004-08-13 20:20:10 +00:00
|
|
|
}
|
2004-07-04 05:06:55 +00:00
|
|
|
NetPlayerClient->blocking=false;
|
2004-04-17 22:26:37 +00:00
|
|
|
|
|
|
|
|
}
|
2004-04-29 01:03:28 +00:00
|
|
|
|
|
|
|
|
void NetworkSyncManager::DisplayStartupStatus()
|
|
|
|
|
{
|
|
|
|
|
CString sMessage("");
|
2004-04-17 22:26:37 +00:00
|
|
|
|
2004-04-29 01:03:28 +00:00
|
|
|
switch (m_startupStatus)
|
|
|
|
|
{
|
|
|
|
|
case 0:
|
|
|
|
|
//Networking wasn't attepmpted
|
|
|
|
|
return;
|
|
|
|
|
case 1:
|
2005-04-02 16:29:29 +00:00
|
|
|
sMessage = "Connection to " + m_ServerName + " successful.";
|
2004-04-29 01:03:28 +00:00
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
sMessage = "Connection failed.";
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
SCREENMAN->SystemMessage(sMessage);
|
|
|
|
|
}
|
2004-04-17 22:26:37 +00:00
|
|
|
|
2004-05-24 13:59:05 +00:00
|
|
|
void NetworkSyncManager::Update(float fDeltaTime)
|
|
|
|
|
{
|
2004-09-06 21:02:55 +00:00
|
|
|
if (isLanServer)
|
2004-08-28 05:30:23 +00:00
|
|
|
LANserver->ServerUpdate();
|
|
|
|
|
|
2004-08-13 09:20:55 +00:00
|
|
|
if (useSMserver)
|
|
|
|
|
ProcessInput();
|
2004-07-04 05:06:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NetworkSyncManager::ProcessInput()
|
|
|
|
|
{
|
|
|
|
|
//If we're disconnected, just exit
|
2004-07-04 06:30:16 +00:00
|
|
|
if ((NetPlayerClient->state!=NetPlayerClient->skCONNECTED) ||
|
|
|
|
|
NetPlayerClient->IsError())
|
2004-08-13 09:20:55 +00:00
|
|
|
{
|
|
|
|
|
SCREENMAN->SystemMessageNoAnimate("Connection to server dropped.");
|
|
|
|
|
useSMserver=false;
|
2005-01-09 18:26:32 +00:00
|
|
|
isSMOnline = false;
|
2005-01-12 05:40:23 +00:00
|
|
|
FOREACH_PlayerNumber(pn)
|
|
|
|
|
isSMOLoggedIn[pn] = false;
|
|
|
|
|
NetPlayerClient->close();
|
2004-07-04 05:06:55 +00:00
|
|
|
return;
|
2004-08-13 09:20:55 +00:00
|
|
|
}
|
2004-07-04 05:06:55 +00:00
|
|
|
|
|
|
|
|
//load new data into buffer
|
|
|
|
|
|
|
|
|
|
NetPlayerClient->update();
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-07-04 05:06:55 +00:00
|
|
|
|
2004-10-13 06:42:53 +00:00
|
|
|
int packetSize;
|
|
|
|
|
|
|
|
|
|
while ( (packetSize = NetPlayerClient->ReadPack((char *)&m_packet, NETMAXBUFFERSIZE) ) > 0 )
|
2004-07-04 05:06:55 +00:00
|
|
|
{
|
2004-10-13 06:42:53 +00:00
|
|
|
m_packet.size = packetSize;
|
2004-08-26 06:40:45 +00:00
|
|
|
int command = m_packet.Read1();
|
2004-07-04 05:06:55 +00:00
|
|
|
//Check to make sure command is valid from server
|
2004-09-07 00:13:15 +00:00
|
|
|
if (command < NSServerOffset)
|
2004-08-14 07:14:43 +00:00
|
|
|
{
|
2004-08-14 16:57:00 +00:00
|
|
|
LOG->Trace("CMD (below 128) Invalid> %d",command);
|
2004-08-14 07:14:43 +00:00
|
|
|
break;
|
|
|
|
|
}
|
2004-07-04 05:06:55 +00:00
|
|
|
|
2004-09-07 00:13:15 +00:00
|
|
|
command = command - NSServerOffset;
|
2004-07-04 05:06:55 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
switch (command)
|
|
|
|
|
{
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCPing: //Ping packet responce
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCPingR );
|
2004-07-04 05:06:55 +00:00
|
|
|
NetPlayerClient->SendPack((char*)m_packet.Data,m_packet.Position);
|
|
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCPingR: //These are in responce to when/if we send packet 0's
|
|
|
|
|
case NSCHello: //This is already taken care of by the blocking code earlier on
|
|
|
|
|
case NSCGSR: //This is taken care of by the blocking start code
|
2004-08-31 15:44:19 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCGON:
|
2004-08-31 15:44:19 +00:00
|
|
|
{
|
2004-09-01 04:09:36 +00:00
|
|
|
int PlayersInPack = m_packet.Read1();
|
2004-12-08 05:35:03 +00:00
|
|
|
m_EvalPlayerData.resize(PlayersInPack);
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-02 23:53:26 +00:00
|
|
|
m_EvalPlayerData[i].name = m_packet.Read1();
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-01 04:09:36 +00:00
|
|
|
m_EvalPlayerData[i].score = m_packet.Read4();
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-01 04:09:36 +00:00
|
|
|
m_EvalPlayerData[i].grade = m_packet.Read1();
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-01 17:16:01 +00:00
|
|
|
m_EvalPlayerData[i].difficulty = (Difficulty) m_packet.Read1();
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int j=0; j<NETNUMTAPSCORES; ++j)
|
|
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-01 04:09:36 +00:00
|
|
|
m_EvalPlayerData[i].tapScores[j] = m_packet.Read2();
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInPack; ++i)
|
2004-09-06 03:54:04 +00:00
|
|
|
m_EvalPlayerData[i].playerOptions = m_packet.ReadNT();
|
2004-09-02 23:53:26 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_GotEval );
|
2004-08-31 15:44:19 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCGSU: //Scoreboard Update
|
2004-08-14 07:14:43 +00:00
|
|
|
{ //Ease scope
|
2004-08-26 06:40:45 +00:00
|
|
|
int ColumnNumber=m_packet.Read1();
|
|
|
|
|
int NumberPlayers=m_packet.Read1();
|
2004-08-14 07:14:43 +00:00
|
|
|
CString ColumnData;
|
2004-09-21 07:53:39 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
switch (ColumnNumber)
|
|
|
|
|
{
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSSB_NAMES:
|
2004-08-14 07:14:43 +00:00
|
|
|
ColumnData = "Names\n";
|
2004-09-21 07:53:39 +00:00
|
|
|
for (int i=0; i<NumberPlayers; ++i)
|
2004-08-29 17:15:10 +00:00
|
|
|
ColumnData += m_PlayerNames[m_packet.Read1()] + "\n";
|
2004-08-14 07:14:43 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSSB_COMBO:
|
2004-08-14 07:14:43 +00:00
|
|
|
ColumnData = "Combo\n";
|
2004-09-21 07:53:39 +00:00
|
|
|
for (int i=0; i<NumberPlayers; ++i)
|
2004-08-26 06:40:45 +00:00
|
|
|
ColumnData += ssprintf("%d\n",m_packet.Read2());
|
2004-08-14 07:14:43 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSSB_GRADE:
|
2004-08-14 07:14:43 +00:00
|
|
|
ColumnData = "Grade\n";
|
2004-09-21 07:53:39 +00:00
|
|
|
for (int i=0;i<NumberPlayers;i++)
|
2004-09-06 21:02:55 +00:00
|
|
|
switch (m_packet.Read1())
|
|
|
|
|
{
|
2004-08-14 07:14:43 +00:00
|
|
|
case 0:
|
|
|
|
|
ColumnData+="AAAA\n"; break;
|
|
|
|
|
case 1:
|
|
|
|
|
ColumnData+="AAA\n"; break;
|
|
|
|
|
case 2:
|
|
|
|
|
ColumnData+="AA\n"; break;
|
|
|
|
|
case 3:
|
|
|
|
|
ColumnData+="A\n"; break;
|
|
|
|
|
case 4:
|
|
|
|
|
ColumnData+="B\n"; break;
|
|
|
|
|
case 5:
|
|
|
|
|
ColumnData+="C\n"; break;
|
|
|
|
|
case 6:
|
|
|
|
|
ColumnData+="D\n"; break;
|
|
|
|
|
case 7:
|
|
|
|
|
ColumnData+="E\n"; break; //Is there a better way?
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
m_Scoreboard[ColumnNumber] = ColumnData;
|
2004-08-13 08:24:11 +00:00
|
|
|
m_scoreboardchange[ColumnNumber]=true;
|
|
|
|
|
}
|
2004-07-04 05:06:55 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCSU: //System message from server
|
2004-08-18 01:02:06 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
CString SysMSG = m_packet.ReadNT();
|
2004-08-26 19:43:25 +00:00
|
|
|
SCREENMAN->SystemMessage( SysMSG );
|
2004-08-18 01:02:06 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCCM: //Chat message from server
|
2004-08-26 19:43:25 +00:00
|
|
|
{
|
2004-09-01 05:02:28 +00:00
|
|
|
m_sChatText += m_packet.ReadNT() + " \n ";
|
|
|
|
|
//10000 chars backlog should be more than enough
|
|
|
|
|
m_sChatText = m_sChatText.Right(10000);
|
2004-08-26 19:43:25 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_AddToChat );
|
|
|
|
|
}
|
2004-08-28 04:43:29 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCRSG: //Select Song/Play song
|
2004-08-28 03:37:52 +00:00
|
|
|
{
|
|
|
|
|
m_iSelectMode = m_packet.Read1();
|
|
|
|
|
m_sMainTitle = m_packet.ReadNT();
|
|
|
|
|
m_sArtist = m_packet.ReadNT();
|
|
|
|
|
m_sSubTitle = m_packet.ReadNT();
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_ChangeSong );
|
|
|
|
|
}
|
2004-08-28 04:43:29 +00:00
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCUUL:
|
2004-08-29 17:15:10 +00:00
|
|
|
{
|
2004-09-02 21:05:57 +00:00
|
|
|
/*int ServerMaxPlayers=*/m_packet.Read1();
|
2004-08-29 17:15:10 +00:00
|
|
|
int PlayersInThisPacket=m_packet.Read1();
|
2004-10-13 06:42:53 +00:00
|
|
|
m_ActivePlayer.clear();
|
2004-08-29 17:15:10 +00:00
|
|
|
m_PlayerStatus.clear();
|
|
|
|
|
m_PlayerNames.clear();
|
|
|
|
|
m_ActivePlayers = 0;
|
2004-09-06 21:02:55 +00:00
|
|
|
for (int i=0; i<PlayersInThisPacket; ++i)
|
2004-08-29 17:15:10 +00:00
|
|
|
{
|
|
|
|
|
int PStatus = m_packet.Read1();
|
|
|
|
|
if ( PStatus > 0 )
|
2004-08-29 23:36:16 +00:00
|
|
|
{
|
2004-08-29 17:15:10 +00:00
|
|
|
m_ActivePlayers++;
|
2004-08-29 23:36:16 +00:00
|
|
|
m_ActivePlayer.push_back( i );
|
|
|
|
|
}
|
2004-08-29 17:15:10 +00:00
|
|
|
m_PlayerStatus.push_back( PStatus );
|
|
|
|
|
m_PlayerNames.push_back( m_packet.ReadNT() );
|
|
|
|
|
}
|
2004-10-13 06:42:53 +00:00
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_UsersUpdate );
|
2004-08-29 17:15:10 +00:00
|
|
|
}
|
|
|
|
|
break;
|
2004-09-07 00:13:15 +00:00
|
|
|
case NSCSMS:
|
2004-09-03 15:33:00 +00:00
|
|
|
{
|
|
|
|
|
CString StyleName, GameName;
|
|
|
|
|
GameName = m_packet.ReadNT();
|
|
|
|
|
StyleName = m_packet.ReadNT();
|
|
|
|
|
|
|
|
|
|
GAMESTATE->m_pCurGame = GAMEMAN->StringToGameType( GameName );
|
2005-05-07 08:34:20 +00:00
|
|
|
GAMESTATE->m_pCurStyle.Set( GAMEMAN->GameAndStringToStyle(GAMESTATE->m_pCurGame,StyleName) );
|
2004-09-03 15:33:00 +00:00
|
|
|
|
|
|
|
|
SCREENMAN->SetNewScreen( "ScreenNetSelectMusic" ); //Should this be metric'd out?
|
|
|
|
|
}
|
|
|
|
|
break;
|
2004-10-13 06:42:53 +00:00
|
|
|
case NSCSMOnline:
|
|
|
|
|
{
|
2004-11-21 07:05:18 +00:00
|
|
|
m_SMOnlinePacket.size = packetSize - 1;
|
|
|
|
|
m_SMOnlinePacket.Position = 0;
|
|
|
|
|
memcpy( m_SMOnlinePacket.Data, (m_packet.Data + 1), packetSize-1 );
|
2004-10-13 06:42:53 +00:00
|
|
|
LOG->Trace( "Received SMOnline Command: %d, size:%d", command, packetSize - 1 );
|
|
|
|
|
SCREENMAN->SendMessageToTopScreen( SM_SMOnlinePack );
|
|
|
|
|
}
|
2004-07-04 05:06:55 +00:00
|
|
|
}
|
2004-08-26 06:40:45 +00:00
|
|
|
m_packet.ClearPacket();
|
2004-07-04 05:06:55 +00:00
|
|
|
}
|
2004-05-24 13:59:05 +00:00
|
|
|
}
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-13 08:24:11 +00:00
|
|
|
bool NetworkSyncManager::ChangedScoreboard(int Column)
|
|
|
|
|
{
|
|
|
|
|
if (!m_scoreboardchange[Column])
|
|
|
|
|
return false;
|
|
|
|
|
m_scoreboardchange[Column]=false;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
void NetworkSyncManager::SendChat(const CString& message)
|
2004-08-26 19:43:25 +00:00
|
|
|
{
|
|
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCCM );
|
2004-08-26 19:43:25 +00:00
|
|
|
m_packet.WriteNT( message );
|
|
|
|
|
NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position);
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-06 03:25:26 +00:00
|
|
|
void NetworkSyncManager::ReportPlayerOptions()
|
|
|
|
|
{
|
|
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCUPOpts );
|
2004-09-06 03:25:26 +00:00
|
|
|
FOREACH_PlayerNumber (pn)
|
2004-12-20 06:25:59 +00:00
|
|
|
m_packet.WriteNT( GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetString() );
|
2004-09-06 04:24:51 +00:00
|
|
|
NetPlayerClient->SendPack((char*)&m_packet.Data, m_packet.Position);
|
2004-09-06 03:25:26 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-28 03:37:52 +00:00
|
|
|
void NetworkSyncManager::SelectUserSong()
|
|
|
|
|
{
|
|
|
|
|
m_packet.ClearPacket();
|
2004-09-07 00:13:15 +00:00
|
|
|
m_packet.Write1( NSCRSG );
|
2004-08-28 23:25:13 +00:00
|
|
|
m_packet.Write1( (uint8_t) m_iSelectMode );
|
2004-08-28 03:37:52 +00:00
|
|
|
m_packet.WriteNT( m_sMainTitle );
|
|
|
|
|
m_packet.WriteNT( m_sArtist );
|
|
|
|
|
m_packet.WriteNT( m_sSubTitle );
|
2004-10-13 06:42:53 +00:00
|
|
|
NetPlayerClient->SendPack( (char*)&m_packet.Data, m_packet.Position );
|
2004-08-28 03:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
2004-11-21 07:05:18 +00:00
|
|
|
void NetworkSyncManager::SendSMOnline( )
|
2004-10-13 06:42:53 +00:00
|
|
|
{
|
2005-01-12 22:22:53 +00:00
|
|
|
m_packet.Position = m_SMOnlinePacket.Position + 1;
|
|
|
|
|
memcpy( (m_packet.Data + 1), m_SMOnlinePacket.Data, m_SMOnlinePacket.Position );
|
2004-12-01 00:06:40 +00:00
|
|
|
m_packet.Data[0] = NSCSMOnline;
|
2005-01-12 22:22:53 +00:00
|
|
|
NetPlayerClient->SendPack( (char*)&m_packet.Data , m_packet.Position );
|
2004-10-13 06:42:53 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-28 03:37:52 +00:00
|
|
|
//Packet functions
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
uint8_t PacketFunctions::Read1()
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE)
|
2004-06-30 07:16:44 +00:00
|
|
|
return 0;
|
2004-08-14 16:57:00 +00:00
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
return Data[Position++];
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
uint16_t PacketFunctions::Read2()
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE-1)
|
2004-06-30 07:16:44 +00:00
|
|
|
return 0;
|
|
|
|
|
|
2004-07-07 19:24:09 +00:00
|
|
|
uint16_t Temp;
|
2004-08-26 06:40:45 +00:00
|
|
|
memcpy( &Temp, Data + Position,2 );
|
|
|
|
|
Position+=2;
|
2004-08-14 16:57:00 +00:00
|
|
|
return ntohs(Temp);
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
uint32_t PacketFunctions::Read4()
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE-3)
|
2004-06-30 07:16:44 +00:00
|
|
|
return 0;
|
|
|
|
|
|
2004-07-07 19:24:09 +00:00
|
|
|
uint32_t Temp;
|
2004-08-26 06:40:45 +00:00
|
|
|
memcpy( &Temp, Data + Position,4 );
|
|
|
|
|
Position+=4;
|
2004-08-14 16:57:00 +00:00
|
|
|
return ntohl(Temp);
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
CString PacketFunctions::ReadNT()
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-07-04 01:33:05 +00:00
|
|
|
//int Orig=Packet.Position;
|
2004-06-30 07:16:44 +00:00
|
|
|
CString TempStr;
|
2004-08-26 06:40:45 +00:00
|
|
|
while ((Position<NETMAXBUFFERSIZE)&& (((char*)Data)[Position]!=0))
|
|
|
|
|
TempStr= TempStr + (char)Data[Position++];
|
2004-06-30 07:16:44 +00:00
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
++Position;
|
2004-06-30 07:16:44 +00:00
|
|
|
return TempStr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
void PacketFunctions::Write1(uint8_t data)
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE)
|
2004-06-30 07:16:44 +00:00
|
|
|
return;
|
2004-09-06 21:02:55 +00:00
|
|
|
memcpy( &Data[Position], &data, 1 );
|
|
|
|
|
++Position;
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
void PacketFunctions::Write2(uint16_t data)
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE-1)
|
2004-06-30 07:16:44 +00:00
|
|
|
return;
|
2004-08-26 06:40:45 +00:00
|
|
|
data = htons(data);
|
2004-09-06 21:02:55 +00:00
|
|
|
memcpy( &Data[Position], &data, 2 );
|
2004-08-26 06:40:45 +00:00
|
|
|
Position+=2;
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
void PacketFunctions::Write4(uint32_t data)
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
2004-08-26 06:40:45 +00:00
|
|
|
if (Position>=NETMAXBUFFERSIZE-3)
|
2004-06-30 07:16:44 +00:00
|
|
|
return ;
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
data = htonl(data);
|
2004-09-06 21:02:55 +00:00
|
|
|
memcpy( &Data[Position], &data, 4 );
|
2004-08-26 06:40:45 +00:00
|
|
|
Position+=4;
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-09-06 21:02:55 +00:00
|
|
|
void PacketFunctions::WriteNT(const CString& data)
|
2004-06-30 07:16:44 +00:00
|
|
|
{
|
|
|
|
|
int index=0;
|
2004-08-26 06:40:45 +00:00
|
|
|
while ((Position<NETMAXBUFFERSIZE)&&(index<data.GetLength()))
|
|
|
|
|
Data[Position++] = (unsigned char)(data.c_str()[index++]);
|
|
|
|
|
Data[Position++] = 0;
|
2004-06-30 07:16:44 +00:00
|
|
|
}
|
|
|
|
|
|
2004-08-26 06:40:45 +00:00
|
|
|
void PacketFunctions::ClearPacket()
|
|
|
|
|
{
|
|
|
|
|
memset((void*)(&Data),0, NETMAXBUFFERSIZE);
|
|
|
|
|
Position = 0;
|
|
|
|
|
}
|
2005-05-08 04:42:33 +00:00
|
|
|
|
2005-05-08 09:15:06 +00:00
|
|
|
CString NetworkSyncManager::MD5Hex( const CString &sInput )
|
2005-05-08 04:42:33 +00:00
|
|
|
{
|
|
|
|
|
CString HashedName;
|
|
|
|
|
CString PreHashedName;
|
|
|
|
|
|
|
|
|
|
unsigned char Output[16];
|
|
|
|
|
const unsigned char *Input = (unsigned char *)sInput.c_str();
|
|
|
|
|
|
|
|
|
|
MD5Context BASE;
|
|
|
|
|
|
|
|
|
|
memset(&BASE,0,sizeof(MD5Context));
|
|
|
|
|
memset(&Output,0,16);
|
|
|
|
|
|
|
|
|
|
MD5Init( &BASE );
|
|
|
|
|
|
|
|
|
|
MD5Update( &BASE, Input, sInput.length());
|
|
|
|
|
|
|
|
|
|
MD5Final( Output, &BASE );
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 16; i++)
|
|
|
|
|
PreHashedName += ssprintf( "%2X", Output[i] );
|
|
|
|
|
|
|
|
|
|
//XXX: Yuck. Convert spaces to 0's better. (will fix soon)
|
|
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
|
|
if ( PreHashedName.c_str()[i] == ' ' )
|
|
|
|
|
HashedName += '0';
|
|
|
|
|
else
|
|
|
|
|
if ( PreHashedName.c_str()[i]=='\0' )
|
|
|
|
|
HashedName += ' ';
|
|
|
|
|
else
|
|
|
|
|
HashedName += PreHashedName.c_str()[i];
|
|
|
|
|
|
|
|
|
|
return HashedName;
|
|
|
|
|
}
|
2004-06-15 02:21:16 +00:00
|
|
|
#endif
|
2004-04-17 22:26:37 +00:00
|
|
|
|
2004-08-28 23:25:13 +00:00
|
|
|
LuaFunction_NoArgs( IsNetConnected, NSMAN->useSMserver )
|
2004-11-21 07:05:18 +00:00
|
|
|
LuaFunction_NoArgs( IsNetSMOnline, NSMAN->isSMOnline )
|
2005-02-25 04:42:24 +00:00
|
|
|
static bool ReportStyle() { NSMAN->ReportStyle(); return true; }
|
|
|
|
|
LuaFunction_NoArgs( ReportStyle, ReportStyle() )
|
2005-05-29 02:21:24 +00:00
|
|
|
LuaFunction( IsSMOnlineLoggedIn, NSMAN->isSMOLoggedIn[IArg(1)] )
|
2005-01-22 05:31:35 +00:00
|
|
|
|
2004-06-08 01:24:17 +00:00
|
|
|
/*
|
|
|
|
|
* (c) 2003-2004 Charles Lohr, Joshua Allen
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* 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, and/or sell copies of the Software, and to permit persons to
|
|
|
|
|
* whom the Software is furnished to do so, provided that the above
|
|
|
|
|
* copyright notice(s) and this permission notice appear in all copies of
|
|
|
|
|
* the Software and that both the above copyright notice(s) and this
|
|
|
|
|
* permission notice appear in supporting documentation.
|
|
|
|
|
*
|
|
|
|
|
* 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 OF
|
|
|
|
|
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
|
|
|
|
|
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
|
|
|
|
|
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
|
|
|
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
|
|
|
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
*/
|