mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
Multiplayer: We can now send files from server to all clients. I just send two dummy files (Items.xml, German.Items.xml) from server to all clients and save them on the client in the JA2 root directory.
The files are send as soon as the client connects. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2640 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
+111
-3
@@ -77,6 +77,13 @@
|
||||
#include "RakNetStatistics.h"
|
||||
#include "RakNetTypes.h"
|
||||
|
||||
#include "FileListTransfer.h"
|
||||
#include "FileListTransferCBInterface.h"
|
||||
#include "FileOperations.h"
|
||||
#include "SuperFastHash.h"
|
||||
#include "RakAssert.h"
|
||||
#include "IncrementalReadInterface.h"
|
||||
|
||||
#include "BitStream.h"
|
||||
#include <assert.h>
|
||||
#include <cstdio>
|
||||
@@ -92,6 +99,86 @@
|
||||
#include "tactical placement gui.h"
|
||||
#include "prebattle interface.h"
|
||||
|
||||
// WANNE: FILE TRANSFER
|
||||
STRING512 executableDirectory;
|
||||
|
||||
class ClientTransferCB : public FileListTransferCBInterface
|
||||
{
|
||||
public:
|
||||
// This method gets called when all the data is received on the client.
|
||||
// Now the file will be saved on the client
|
||||
bool OnFile(OnFileStruct *onFileStruct)
|
||||
{
|
||||
STRING512 targetFileName;
|
||||
|
||||
ScreenMsg( FONT_BCOLOR_ORANGE, MSG_CHAT, L"(100%%) Got file from server: %S", onFileStruct->fileName);
|
||||
//ScreenMsg( FONT_BCOLOR_ORANGE, MSG_CHAT, L"%i. (100%%) %i/%i %S %ib->%ib / %ib->%ib\n", onFileStruct->setID, onFileStruct->fileIndex+1, onFileStruct->setCount, onFileStruct->fileName, onFileStruct->compressedTransmissionLength, onFileStruct->finalDataLength, onFileStruct->setTotalCompressedTransmissionLength, onFileStruct->setTotalFinalLength);
|
||||
|
||||
// Save the file in the clients executable dir!
|
||||
strcpy(targetFileName, executableDirectory);
|
||||
strcat(targetFileName, "\\");
|
||||
// Only get the filename
|
||||
char* file = ExtractFilename(onFileStruct->fileName);
|
||||
strcat(targetFileName, file);
|
||||
|
||||
|
||||
FILE *fp = fopen(targetFileName, "wb");
|
||||
fwrite(onFileStruct->fileData, onFileStruct->finalDataLength, 1, fp);
|
||||
fclose(fp);
|
||||
|
||||
/*
|
||||
// Make sure it worked
|
||||
unsigned int hash1 = SuperFastHashFile(fileToSend);
|
||||
if (RakNet::BitStream::DoEndianSwap())
|
||||
RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash1, sizeof(hash1));
|
||||
unsigned int hash2 = SuperFastHashFile(targetFileName);
|
||||
if (RakNet::BitStream::DoEndianSwap())
|
||||
RakNet::BitStream::ReverseBytesInPlace((unsigned char*) &hash2, sizeof(hash2));
|
||||
RakAssert(hash1==hash2);
|
||||
*/
|
||||
|
||||
ScreenMsg( FONT_BCOLOR_ORANGE, MSG_CHAT, L"Saved file local in %S", targetFileName);
|
||||
|
||||
// Return true to have RakNet delete the memory allocated to hold this file.
|
||||
// False if you hold onto the memory, and plan to delete it yourself later
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void OnFileProgress(OnFileStruct *onFileStruct,unsigned int partCount,unsigned int partTotal,unsigned int partLength, char *firstDataChunk)
|
||||
{
|
||||
|
||||
//ScreenMsg( FONT_BLUE, MSG_CHAT, L"(%i%%) %S", 100*partCount/partTotal, onFileStruct->fileName);
|
||||
//ScreenMsg( FONT_BLUE, MSG_CHAT, L"%i (%i%%) %i/%i %S %ib->%ib / %ib->%ib\n", onFileStruct->setID, 100*partCount/partTotal, onFileStruct->fileIndex+1, onFileStruct->setCount, onFileStruct->fileName, onFileStruct->compressedTransmissionLength, onFileStruct->finalDataLength, onFileStruct->setTotalCompressedTransmissionLength, onFileStruct->setTotalFinalLength, firstDataChunk);
|
||||
|
||||
//printf("%i (%i%%) %i/%i %s %ib->%ib / %ib->%ib\n", onFileStruct->setID, 100*partCount/partTotal, onFileStruct->fileIndex+1, onFileStruct->setCount, onFileStruct->fileName, onFileStruct->compressedTransmissionLength, onFileStruct->finalDataLength, onFileStruct->setTotalCompressedTransmissionLength, onFileStruct->setTotalFinalLength, firstDataChunk);
|
||||
}
|
||||
|
||||
virtual bool OnDownloadComplete(void)
|
||||
{
|
||||
//printf("Download complete.\n");
|
||||
|
||||
ScreenMsg( FONT_RED, MSG_CHAT, L"Download complete");
|
||||
|
||||
// Returning false automatically deallocates the automatically allocated handler that was created by DirectoryDeltaTransfer
|
||||
return false;
|
||||
}
|
||||
|
||||
private:
|
||||
char *ExtractFilename(char *pathname)
|
||||
{
|
||||
char *s;
|
||||
|
||||
if ((s=strrchr(pathname, '\\')) != NULL) s++;
|
||||
else if ((s=strrchr(pathname, '/')) != NULL) s++;
|
||||
else if ((s=strrchr(pathname, ':')) != NULL) s++;
|
||||
else s = pathname;
|
||||
return s;
|
||||
}
|
||||
|
||||
} transferCallback;
|
||||
|
||||
|
||||
|
||||
unsigned char GetPacketIdentifier(Packet *p);
|
||||
unsigned char packetIdentifier;
|
||||
|
||||
@@ -124,6 +211,11 @@ unsigned char packetIdentifier;
|
||||
extern INT8 SquadMovementGroups[ ];
|
||||
RakPeerInterface *client;
|
||||
|
||||
|
||||
// WANNE: FILE TRANSFER
|
||||
FileListTransfer fltClient; // flt2
|
||||
ClientTransferCB transferCBClient;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
UINT8 ubProfileID;
|
||||
@@ -326,6 +418,9 @@ UINT32 iCCStartGameTime = 0;
|
||||
bool is_game_started = false;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// OJW - added 20081130
|
||||
// <TODO> - add retry timer and notification
|
||||
void NetworkAutoStart()
|
||||
@@ -1968,6 +2063,7 @@ void overide_callback( UINT8 ubResult )
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void requestSETTINGS(void)
|
||||
{
|
||||
client_info cl_name;
|
||||
@@ -2201,6 +2297,8 @@ void recieveSETTINGS (RPCParameters *rpcParameters) //recive settings from serve
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void recieveTEAMCHANGE( RPCParameters *rpcParameters )
|
||||
@@ -3379,7 +3477,12 @@ void connect_client ( void )
|
||||
{
|
||||
//ScreenMsg( FONT_LTGREEN, MSG_CHAT, L"Client started, waiting for connections...");
|
||||
is_client=true;
|
||||
/*repo=0;*/
|
||||
|
||||
GetExecutableDirectory(executableDirectory);
|
||||
|
||||
// WANNE: FILE TRANSFER
|
||||
client->AttachPlugin(&fltClient);
|
||||
client->SetSplitMessageProgressInterval(1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3537,6 +3640,8 @@ void connect_client ( void )
|
||||
MPDebugMsg( String ( "connect_client()\n" ) );
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
else if (is_connecting)
|
||||
@@ -3630,9 +3735,11 @@ void client_packet ( void )
|
||||
is_connected=true;
|
||||
is_connecting=false;
|
||||
requestSETTINGS();
|
||||
//request_settings();//ask server for game settings...
|
||||
|
||||
// WANNE: FILE TRANSFER
|
||||
setID = fltClient.SetupReceive(&transferCBClient, false, p->systemAddress);
|
||||
break;
|
||||
case ID_NEW_INCOMING_CONNECTION:
|
||||
case ID_NEW_INCOMING_CONNECTION:
|
||||
//tells server client has connected
|
||||
ScreenMsg( FONT_LTGREEN, MSG_CHAT, L"ID_NEW_INCOMING_CONNECTION");
|
||||
break;
|
||||
@@ -3702,6 +3809,7 @@ void client_disconnect (void)
|
||||
|
||||
allowlaptop=false;
|
||||
|
||||
|
||||
// clear local client cache
|
||||
memset(client_names,0,sizeof(char)*4*30);
|
||||
memset(client_edges,0,sizeof(int)*4);
|
||||
|
||||
Reference in New Issue
Block a user