mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-22 18:30:27 +01:00
Merge branch 'RocketersAlex-fixstuff'
This commit is contained in:
commit
d8424a3042
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -39,6 +39,8 @@ Debug/
|
||||||
*.sdf
|
*.sdf
|
||||||
*.map
|
*.map
|
||||||
*.opensdf
|
*.opensdf
|
||||||
|
*.pdb
|
||||||
|
*.sbr
|
||||||
*.suo
|
*.suo
|
||||||
*.tlog
|
*.tlog
|
||||||
*.ipch
|
*.ipch
|
||||||
|
|
|
@ -111,6 +111,8 @@ functions:
|
||||||
|
|
||||||
// provide info for GameAgent enumeration
|
// provide info for GameAgent enumeration
|
||||||
export virtual void GetGameAgentPlayerInfo( INDEX iPlayer, CTString &strOut) { };
|
export virtual void GetGameAgentPlayerInfo( INDEX iPlayer, CTString &strOut) { };
|
||||||
|
// provide info for MSLegacy enumeration
|
||||||
|
export virtual void GetMSLegacyPlayerInf( INDEX iPlayer, CTString &strOut) { };
|
||||||
|
|
||||||
// create a checksum value for sync-check
|
// create a checksum value for sync-check
|
||||||
export void ChecksumForSync(ULONG &ulCRC, INDEX iExtensiveSyncCheck)
|
export void ChecksumForSync(ULONG &ulCRC, INDEX iExtensiveSyncCheck)
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -20,6 +20,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern CTString ga_strServer;
|
extern CTString ga_strServer;
|
||||||
|
extern CTString ga_strMSLegacy;
|
||||||
|
extern BOOL ga_bMSLegacy;
|
||||||
|
|
||||||
/// Initialize GameAgent.
|
/// Initialize GameAgent.
|
||||||
extern void GameAgent_ServerInit(void);
|
extern void GameAgent_ServerInit(void);
|
||||||
|
@ -36,6 +38,10 @@ extern void GameAgent_EnumTrigger(BOOL bInternet);
|
||||||
extern void GameAgent_EnumUpdate(void);
|
extern void GameAgent_EnumUpdate(void);
|
||||||
/// Cancel the GameAgent serverlist enumeration.
|
/// Cancel the GameAgent serverlist enumeration.
|
||||||
extern void GameAgent_EnumCancel(void);
|
extern void GameAgent_EnumCancel(void);
|
||||||
|
///
|
||||||
|
DWORD WINAPI _MS_Thread(LPVOID lpParam);
|
||||||
|
///
|
||||||
|
DWORD WINAPI _LocalNet_Thread(LPVOID lpParam);
|
||||||
|
|
||||||
/// Server request structure. Primarily used for getting server pings.
|
/// Server request structure. Primarily used for getting server pings.
|
||||||
class CServerRequest {
|
class CServerRequest {
|
||||||
|
|
185
Sources/Engine/GameAgent/MSLegacy.h
Normal file
185
Sources/Engine/GameAgent/MSLegacy.h
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
/*
|
||||||
|
GSMSALG 0.3.3
|
||||||
|
by Luigi Auriemma
|
||||||
|
e-mail: aluigi@autistici.org
|
||||||
|
web: aluigi.org
|
||||||
|
|
||||||
|
|
||||||
|
INTRODUCTION
|
||||||
|
============
|
||||||
|
With the name Gsmsalg I define the challenge-response algorithm needed
|
||||||
|
to query the master servers that use the Gamespy "secure" protocol (like
|
||||||
|
master.gamespy.com for example).
|
||||||
|
This algorithm is not only used for this type of query but also in other
|
||||||
|
situations like the so called "Gamespy Firewall Probe Packet" and the
|
||||||
|
master server hearbeat that is the challenge string sent by the master
|
||||||
|
servers of the games that use the Gamespy SDK when game servers want to
|
||||||
|
be included in the online servers list (UDP port 27900).
|
||||||
|
|
||||||
|
|
||||||
|
HOW TO USE
|
||||||
|
==========
|
||||||
|
The function needs 4 parameters:
|
||||||
|
- dst: the destination buffer that will contain the calculated
|
||||||
|
response. Its length is 4/3 of the challenge size so if the
|
||||||
|
challenge is 6 bytes long, the response will be 8 bytes long
|
||||||
|
plus the final NULL byte which is required (to be sure of the
|
||||||
|
allocated space use 89 bytes or "((len * 4) / 3) + 3")
|
||||||
|
if this parameter is NULL the function will allocate the
|
||||||
|
memory for a new one automatically
|
||||||
|
- src: the source buffer containing the challenge string received
|
||||||
|
from the server.
|
||||||
|
- key: the gamekey or any other text string used as algorithm's
|
||||||
|
key, usually it is the gamekey but "might" be another thing
|
||||||
|
in some cases. Each game has its unique Gamespy gamekey which
|
||||||
|
are available here:
|
||||||
|
http://aluigi.org/papers/gslist.cfg
|
||||||
|
- enctype: are supported 0 (plain-text used in old games, heartbeat
|
||||||
|
challenge respond, enctypeX and more), 1 (Gamespy3D) and 2
|
||||||
|
(old Gamespy Arcade or something else).
|
||||||
|
|
||||||
|
The return value is a pointer to the destination buffer.
|
||||||
|
|
||||||
|
|
||||||
|
EXAMPLE
|
||||||
|
=======
|
||||||
|
#include "MSLegacy.h"
|
||||||
|
|
||||||
|
char *dest;
|
||||||
|
dest = gsseckey(
|
||||||
|
NULL, // dest buffer, NULL for auto allocation
|
||||||
|
"ABCDEF", // the challenge received from the server
|
||||||
|
"kbeafe", // kbeafe of Doom 3 and enctype set to 0
|
||||||
|
0); // enctype 0
|
||||||
|
|
||||||
|
|
||||||
|
LICENSE
|
||||||
|
=======
|
||||||
|
Copyright 2004,2005,2006,2007,2008 Luigi Auriemma
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
http://www.gnu.org/licenses/gpl.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* function gsvalfunc */
|
||||||
|
unsigned char gsvalfunc(u_char reg) {
|
||||||
|
if(reg < 0x1a) return u_char (reg + 'A');
|
||||||
|
if(reg < 0x34) return u_char (reg + 'G');
|
||||||
|
if(reg < 0x3e) return u_char (reg - 4);
|
||||||
|
if(reg == 0x3e) return u_char('+');
|
||||||
|
if(reg == 0x3f) return u_char ('/');
|
||||||
|
return u_char(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function gsseckey */
|
||||||
|
unsigned char *gsseckey(u_char *secure, u_char *key, int enctype) {
|
||||||
|
static u_char validate[9];
|
||||||
|
u_char secbuf[7],
|
||||||
|
buff[256],
|
||||||
|
*ptr,
|
||||||
|
*ptrval,
|
||||||
|
*sec,
|
||||||
|
*k,
|
||||||
|
tmp1,
|
||||||
|
tmp2,
|
||||||
|
ebx,
|
||||||
|
i,
|
||||||
|
ecx,
|
||||||
|
edx,
|
||||||
|
edi;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
ptr = buff;
|
||||||
|
do { *ptr++ = i++; } while(i); /* 256 times */
|
||||||
|
|
||||||
|
ptr = buff;
|
||||||
|
k = (unsigned char*) memcpy(secbuf, key, 6); /* good if key is not NULLed */
|
||||||
|
k[6] = edx = i = 0;
|
||||||
|
do { /* 256 times */
|
||||||
|
if(!*k) k = secbuf;
|
||||||
|
edx = *ptr + edx + *k;
|
||||||
|
/* don't use the XOR exchange optimization!!! */
|
||||||
|
/* ptrval is used only for faster code */
|
||||||
|
ptrval = buff + edx;
|
||||||
|
tmp1 = *ptr;
|
||||||
|
*ptr = *ptrval;
|
||||||
|
*ptrval = tmp1;
|
||||||
|
ptr++; k++; i++;
|
||||||
|
} while(i);
|
||||||
|
|
||||||
|
sec = (unsigned char *) memcpy(secbuf, secure, 6);
|
||||||
|
sec[6] = edi = ebx = 0;
|
||||||
|
do { /* 6 times */
|
||||||
|
edi = edi + *sec + 1;
|
||||||
|
ecx = ebx + buff[edi];
|
||||||
|
ebx = ecx;
|
||||||
|
/* don't use the XOR exchange optimization!!! */
|
||||||
|
/* ptr and ptrval are used only for faster code */
|
||||||
|
ptr = buff + edi;
|
||||||
|
ptrval = buff + ebx;
|
||||||
|
tmp1 = *ptr;
|
||||||
|
*ptr = *ptrval;
|
||||||
|
*ptrval = tmp1;
|
||||||
|
ecx = tmp1 + *ptr;
|
||||||
|
*sec++ ^= buff[ecx];
|
||||||
|
} while(*sec);
|
||||||
|
|
||||||
|
if(enctype == 2) {
|
||||||
|
ptr = key;
|
||||||
|
sec = secbuf;
|
||||||
|
do { /* 6 times */
|
||||||
|
*sec++ ^= *ptr++;
|
||||||
|
} while(*sec);
|
||||||
|
}
|
||||||
|
|
||||||
|
sec = secbuf;
|
||||||
|
ptrval = validate;
|
||||||
|
for(i = 0; i < 2; i++) {
|
||||||
|
tmp1 = *sec++;
|
||||||
|
tmp2 = *sec++;
|
||||||
|
*ptrval++ = gsvalfunc(tmp1 >> 2);
|
||||||
|
*ptrval++ = gsvalfunc(((tmp1 & 3) << 4) + (tmp2 >> 4));
|
||||||
|
tmp1 = *sec++;
|
||||||
|
*ptrval++ = gsvalfunc(((tmp2 & 0xf) << 2) + (tmp1 >> 6));
|
||||||
|
*ptrval++ = gsvalfunc(tmp1 & 0x3f);
|
||||||
|
}
|
||||||
|
*ptrval = 0x00;
|
||||||
|
|
||||||
|
return(validate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* function resolv */
|
||||||
|
u_int resolv(char *host) {
|
||||||
|
struct hostent *hp;
|
||||||
|
u_int host_ip;
|
||||||
|
|
||||||
|
host_ip = inet_addr(host);
|
||||||
|
if(host_ip == INADDR_NONE) {
|
||||||
|
hp = gethostbyname(host);
|
||||||
|
if(!hp) {
|
||||||
|
return (NULL);
|
||||||
|
} else host_ip = *(u_int *)(hp->h_addr);
|
||||||
|
}
|
||||||
|
return(host_ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* end functions */
|
||||||
|
|
||||||
|
|
|
@ -887,6 +887,8 @@ void CNetworkLibrary::Init(const CTString &strGameID)
|
||||||
_pShell->DeclareSymbol("persistent user INDEX wed_bUseGenericTextureReplacement;", &wed_bUseGenericTextureReplacement);
|
_pShell->DeclareSymbol("persistent user INDEX wed_bUseGenericTextureReplacement;", &wed_bUseGenericTextureReplacement);
|
||||||
|
|
||||||
_pShell->DeclareSymbol("user CTString ga_strServer;", &ga_strServer);
|
_pShell->DeclareSymbol("user CTString ga_strServer;", &ga_strServer);
|
||||||
|
_pShell->DeclareSymbol("user CTString ga_strMSLegacy;", &ga_strMSLegacy);
|
||||||
|
_pShell->DeclareSymbol("user INDEX ga_bMSLegacy;", &ga_bMSLegacy);
|
||||||
|
|
||||||
_pShell->DeclareSymbol("INDEX pwoCurrentWorld;", &_pwoCurrentWorld);
|
_pShell->DeclareSymbol("INDEX pwoCurrentWorld;", &_pwoCurrentWorld);
|
||||||
}
|
}
|
||||||
|
@ -2427,7 +2429,7 @@ void CNetworkLibrary::GameInactive(void)
|
||||||
FOREVER {
|
FOREVER {
|
||||||
CNetworkMessage nmReceived;
|
CNetworkMessage nmReceived;
|
||||||
|
|
||||||
//_cmiComm.Broadcast_Update();
|
// _cmiComm.Broadcast_Update();
|
||||||
ULONG ulFrom;
|
ULONG ulFrom;
|
||||||
UWORD uwPort;
|
UWORD uwPort;
|
||||||
BOOL bHasMsg = ReceiveBroadcast(nmReceived, ulFrom, uwPort);
|
BOOL bHasMsg = ReceiveBroadcast(nmReceived, ulFrom, uwPort);
|
||||||
|
|
|
@ -77,6 +77,7 @@ public:
|
||||||
CTString ns_strGameType; // game type
|
CTString ns_strGameType; // game type
|
||||||
CTString ns_strMod; // active mod
|
CTString ns_strMod; // active mod
|
||||||
CTString ns_strVer; // version
|
CTString ns_strVer; // version
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Copy(const CNetworkSession &nsOriginal);
|
void Copy(const CNetworkSession &nsOriginal);
|
||||||
|
|
||||||
|
|
|
@ -1957,6 +1957,23 @@ functions:
|
||||||
strOut+=strKey;
|
strOut+=strKey;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// provide info for MSLegacy enumeration
|
||||||
|
void GetMSLegacyPlayerInf( INDEX iPlayer, CTString &strOut)
|
||||||
|
{
|
||||||
|
CTString strKey;
|
||||||
|
strKey.PrintF("\\player_%d\\%s", iPlayer, (const char*)GetPlayerName());
|
||||||
|
strOut+=strKey;
|
||||||
|
if (GetSP()->sp_bUseFrags) {
|
||||||
|
strKey.PrintF("\\frags_%d\\%d", iPlayer, m_psLevelStats.ps_iKills);
|
||||||
|
strOut+=strKey;
|
||||||
|
} else {
|
||||||
|
strKey.PrintF("\\frags_%d\\%d", iPlayer, m_psLevelStats.ps_iScore);
|
||||||
|
strOut+=strKey;
|
||||||
|
}
|
||||||
|
strKey.PrintF("\\ping_%d\\%d", iPlayer, INDEX(ceil(en_tmPing*1000.0f)));
|
||||||
|
strOut+=strKey;
|
||||||
|
};
|
||||||
|
|
||||||
// check if message is in inbox
|
// check if message is in inbox
|
||||||
BOOL HasMessage( const CTFileName &fnmMessage)
|
BOOL HasMessage( const CTFileName &fnmMessage)
|
||||||
{
|
{
|
||||||
|
|
|
@ -115,7 +115,7 @@ extern CTString sam_strModName = TRANS("- O P E N S O U R C E -");
|
||||||
#if _SE_DEMO
|
#if _SE_DEMO
|
||||||
extern CTString sam_strFirstLevel = "Levels\\KarnakDemo.wld";
|
extern CTString sam_strFirstLevel = "Levels\\KarnakDemo.wld";
|
||||||
#else
|
#else
|
||||||
extern CTString sam_strFirstLevel = "Levels\\LevelsMP\\1_0_InTheLastEpisode.wld.wld";
|
extern CTString sam_strFirstLevel = "Levels\\LevelsMP\\1_0_InTheLastEpisode.wld";
|
||||||
#endif
|
#endif
|
||||||
extern CTString sam_strIntroLevel = "Levels\\LevelsMP\\Intro.wld";
|
extern CTString sam_strIntroLevel = "Levels\\LevelsMP\\Intro.wld";
|
||||||
extern CTString sam_strGameName = "serioussamse";
|
extern CTString sam_strGameName = "serioussamse";
|
||||||
|
@ -514,8 +514,8 @@ BOOL Init( HINSTANCE hInstance, int nCmdShow, CTString strCmdLine)
|
||||||
LoadAndForceTexture(_toLogoEAX, _ptoLogoEAX, CTFILENAME("Textures\\Logo\\LogoEAX.tex"));
|
LoadAndForceTexture(_toLogoEAX, _ptoLogoEAX, CTFILENAME("Textures\\Logo\\LogoEAX.tex"));
|
||||||
|
|
||||||
// !! NOTE !! Re-enable these to allow mod support.
|
// !! NOTE !! Re-enable these to allow mod support.
|
||||||
//LoadStringVar(CTString("Data\\Var\\Sam_Version.var"), sam_strVersion);
|
LoadStringVar(CTString("Data\\Var\\Sam_Version.var"), sam_strVersion);
|
||||||
//LoadStringVar(CTString("Data\\Var\\ModName.var"), sam_strModName);
|
LoadStringVar(CTString("Data\\Var\\ModName.var"), sam_strModName);
|
||||||
CPrintF(TRANS("Serious Sam version: %s\n"), sam_strVersion);
|
CPrintF(TRANS("Serious Sam version: %s\n"), sam_strVersion);
|
||||||
CPrintF(TRANS("Active mod: %s\n"), sam_strModName);
|
CPrintF(TRANS("Active mod: %s\n"), sam_strModName);
|
||||||
InitializeMenus();
|
InitializeMenus();
|
||||||
|
@ -612,6 +612,7 @@ void End(void)
|
||||||
pvpViewPort = NULL;
|
pvpViewPort = NULL;
|
||||||
pdpNormal = NULL;
|
pdpNormal = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseMainWindow();
|
CloseMainWindow();
|
||||||
MainWindow_End();
|
MainWindow_End();
|
||||||
DestroyMenus();
|
DestroyMenus();
|
||||||
|
@ -1200,14 +1201,36 @@ int SubMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int
|
||||||
_pInput->DisableInput();
|
_pInput->DisableInput();
|
||||||
_pGame->StopGame();
|
_pGame->StopGame();
|
||||||
|
|
||||||
|
if (_fnmModToLoad!="") {
|
||||||
|
|
||||||
|
char strCmd [64] = {0};
|
||||||
|
char strParam [128] = {0};
|
||||||
|
STARTUPINFOA cif;
|
||||||
|
ZeroMemory(&cif,sizeof(STARTUPINFOA));
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
|
||||||
|
strcpy_s(strCmd,"SeriousSam.exe");
|
||||||
|
strcpy_s(strParam," +game ");
|
||||||
|
strcat_s(strParam,_fnmModToLoad.FileName());
|
||||||
|
if (_strModServerJoin!="") {
|
||||||
|
strcat_s(strParam," +connect ");
|
||||||
|
strcat_s(strParam,_strModServerJoin);
|
||||||
|
strcat_s(strParam," +quickjoin");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CreateProcessA(strCmd,strParam,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,&cif,&pi) == FALSE)
|
||||||
|
{
|
||||||
|
MessageBox(0, L"error launching the Mod!\n", L"Serious Sam", MB_OK|MB_ICONERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
// invoke quit screen if needed
|
// invoke quit screen if needed
|
||||||
if( _bQuitScreen && _fnmModToLoad=="") QuitScreenLoop();
|
if( _bQuitScreen && _fnmModToLoad=="") QuitScreenLoop();
|
||||||
|
|
||||||
End();
|
End();
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void CheckModReload(void)
|
void CheckModReload(void)
|
||||||
{
|
{
|
||||||
if (_fnmModToLoad!="") {
|
if (_fnmModToLoad!="") {
|
||||||
|
@ -1225,9 +1248,10 @@ void CheckModReload(void)
|
||||||
argv[5] = "+quickjoin";
|
argv[5] = "+quickjoin";
|
||||||
argv[6] = NULL;
|
argv[6] = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
_execv(strCommand, argv);
|
_execv(strCommand, argv);
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
void CheckTeaser(void)
|
void CheckTeaser(void)
|
||||||
{
|
{
|
||||||
|
@ -1255,7 +1279,7 @@ int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||||
iResult = SubMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
|
iResult = SubMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
|
||||||
} CTSTREAM_END;
|
} CTSTREAM_END;
|
||||||
|
|
||||||
CheckModReload();
|
//CheckModReload();
|
||||||
|
|
||||||
CheckTeaser();
|
CheckTeaser();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user