l2-unlegits/l2detect/ConfigIni.cpp
alexey.min a424966835 extend config optons DialogBox
teon pvp server hacks
2012-02-05 15:09:42 +00:00

489 lines
16 KiB
C++

#include "stdafx.h"
#include "ConfigIni.h"
CConfig::CConfig()
{
_initNull();
}
CConfig::~CConfig()
{
_initNull();
}
void CConfig::_initNull()
{
isInGameMode = false;
L2_version = 0;
L2_client_version = 0;
//
szCfgFileName[0] = FakeListenLoginIP[0] = FakeListenGameIP[0];
FakeListenLoginPort = FakeListenGamePort = 0;
// Forward connection to
RealLoginServerIP[0] = 0;
RealLoginServerPort = 0;
// Catch game server traffic
//PlayGameServerNo = 0;
ForceGameServerIP[0] = 0;
ForceGameServerPort = 0;
IngameGameServerPort = 7777;
// Logging setup
LogGamePackets = 0;
LogGameFileNamePrefix[0] = 0;
WarnUnknownPacketsToStdout = DumpUnknownToStdout = WarnMessageLevel = 0;
// hacks
EnableModifyGameTraffic = 0; // enable or disable game protocol-level hacks
OverrideGameProtocolVersion = 0;
ReplyL2JGameGuardQuery = 0;
GraciaEpilogueProtocol_148_hacks = 0;
TeonPvP_hacks = 0;
// L2Walker fixes
L2Walker_DropRequestGMList = 0;
L2Walker_FixMoveBackwardToLocation = 1;
L2Walker_FixChangeWaitType2 = 1;
L2Walker_InjectStatusUpdate = 0;
// Invis GM
InvisGMTrackEnable = 1;
InvisGMSpeed = 400; // //gmspeed 4
}
bool CConfig::ReadConfig( const wchar_t *szConfigFileName )
{
if( !szConfigFileName ) return false;
char tempbuf[512] = {0};
WideCharToMultiByte( CP_ACP, 0, szConfigFileName, -1, tempbuf, 511, NULL, NULL );
return this->ReadConfig( tempbuf );
}
bool CConfig::ReadConfig( const char *szConfigFileName )
{
if( !szConfigFileName ) return false;
strcpy( this->szCfgFileName, szConfigFileName );
FILE *f = fopen( szConfigFileName, "rt" );
if( !f ) return false;
char line[512];
size_t ll; // line length
char *token = NULL;
while( !feof(f) )
{
memset( line, 0, sizeof(line) );
fgets( line, sizeof(line)-1, f );
if( line[0] == 0 ) /* line empty */ continue;
if( (line[0] == '#') || (line[0] == ';') ) /* pass comments */ continue;
/* remove NL & BR from end of line */
ll = strlen( line );
if( (line[ll-1] == '\r') || (line[ll-1] == '\n') ) line[ll-1] = 0;
if( (line[ll-2] == '\r') || (line[ll-2] == '\n') ) line[ll-2] = 0;
/* find '=' */
token = strchr( line, '=' );
if( token )
{
token++; // token points to next char after '='
while( (*token) && ((*token) == ' ') ) token++; // pass spaces
}
else
continue; /* no '=' symbol in line */
/* is there any string in token */
if( token[0] == 0 ) continue; /* token is an empty string.. */
/* find match */
if( strstr( line, "Lineage2Version" ) == line )
{
sscanf( token, "%d", &(this->L2_version) );
}
if( strstr( line, "Lineage2ClientVersion" ) == line )
{
sscanf( token, "%d", &(this->L2_client_version) );
}
if( strstr( line, "FakeListenLoginIP" ) == line )
{
strcpy( this->FakeListenLoginIP, token );
}
if( strstr( line, "FakeListenLoginPort" ) == line )
{
sscanf( token, "%d", &(this->FakeListenLoginPort) );
}
if( strstr( line, "FakeListenGameIP" ) == line )
{
strcpy( this->FakeListenGameIP, token );
}
if( strstr( line, "FakeListenGamePort" ) == line )
{
sscanf( token, "%d", &(this->FakeListenGamePort) );
}
if( strstr( line, "RealLoginServerIP" ) == line )
{
strcpy( this->RealLoginServerIP, token );
}
if( strstr( line, "RealLoginServerPort" ) == line )
{
sscanf( token, "%d", &(this->RealLoginServerPort) );
}
/*if( strstr( line, "PlayGameServerNo" ) == line )
{
sscanf( token, "%d", &(this->PlayGameServerNo) );
}*/
if( strstr( line, "ForceGameServerIP" ) == line )
{
strcpy( this->ForceGameServerIP, token );
}
if( strstr( line, "ForceGameServerPort" ) == line )
{
sscanf( token, "%d", &(this->ForceGameServerPort) );
}
if( strstr( line, "IngameGameServerPort" ) == line )
{
sscanf( token, "%d", &(this->IngameGameServerPort) );
}
if( strstr( line, "LogGamePackets" ) == line )
{
sscanf( token, "%d", &(this->LogGamePackets) );
}
if( strstr( line, "LogGameFileNamePrefix" ) == line )
{
strcpy( this->LogGameFileNamePrefix, token );
}
if( strstr( line, "WarnUnknownPacketsToStdout" ) == line )
{
sscanf( token, "%d", &(this->WarnUnknownPacketsToStdout) );
}
if( strstr( line, "DumpUnknownToStdout" ) == line )
{
sscanf( token, "%d", &(this->DumpUnknownToStdout) );
}
if( strstr( line, "WarnMessageLevel" ) == line )
{
sscanf( token, "%d", &(this->WarnMessageLevel) );
if( WarnMessageLevel < 0 ) WarnMessageLevel = 0;
}
if( strstr( line, "EnableModifyGameTraffic" ) == line )
{
sscanf( token, "%d", &(this->EnableModifyGameTraffic) );
}
if( strstr( line, "OverrideGameProtocolVersion" ) == line )
{
sscanf( token, "%d", &(this->OverrideGameProtocolVersion) );
}
if( strstr( line, "ReplyL2JGameGuardQuery" ) == line )
{
sscanf( token, "%d", &(this->ReplyL2JGameGuardQuery) );
}
if( strstr( line, "GraciaEpilogueProtocol_148_hacks" ) == line )
{
sscanf( token, "%d", &(this->GraciaEpilogueProtocol_148_hacks) );
}
if( strstr( line, "TeonPvP_hacks" ) == line )
{
sscanf( token, "%d", &(this->TeonPvP_hacks) );
}
if( strstr( line, "ThreadProirityRaiseEnable" ) == line )
{
sscanf( token, "%d", &(this->ThreadProirityRaiseEnable) );
}
if( strstr( line, "L2Walker_DropRequestGMList" ) == line )
{
sscanf( token, "%d", &(this->L2Walker_DropRequestGMList) );
}
if( strstr( line, "L2Walker_FixMoveBackwardToLocation" ) == line )
{
sscanf( token, "%d", &(this->L2Walker_FixMoveBackwardToLocation) );
}
if( strstr( line, "L2Walker_FixChangeWaitType2" ) == line )
{
sscanf( token, "%d", &(this->L2Walker_FixChangeWaitType2) );
}
if( strstr( line, "L2Walker_InjectStatusUpdate" ) == line )
{
sscanf( token, "%d", &(this->L2Walker_InjectStatusUpdate) );
}
if( strstr( line, "InvisGMTrackEnable" ) == line )
{
sscanf( token, "%d", &(this->InvisGMTrackEnable) );
}
if( strstr( line, "InvisGMSpeed" ) == line )
{
sscanf( token, "%d", &(this->InvisGMSpeed) );
}
}
fclose( f );
return true;
}
bool CConfig::SaveConfig()
{
if( szCfgFileName[0] == 0 ) return false;
FILE *f = fopen( szCfgFileName, "wt" );
if( !f ) return false;
// declared in L2PcodeObfuscator.h (include L2Packets.h)
//#define L2_VERSION_T1 0
//#define L2_VERSION_T15 1
//#define L2_VERSION_T2 2
//#define L2_VERSION_T22 3
fprintf( f, ""
"# First - configure Lineage2 game protocol version and L2 Client version.\n"
"# Supported versions are:\n"
"# * Chaotic Throne 1 - The Kamael = 0\n"
"# * Chaotic Throne 1.5 - Hellbound = 1\n"
"# * Chaotic Throne 2 - Gracia (Part 1) = 2\n"
"# * Chaotic Throne 2.2 - Gracia Part 2 = 3\n"
"# * Chaotic Throne 2.3 - Gracia Final = 4\n"
"# * Chaotic Throne 2.4 - Gracia Epilogue = 5\n"
"# * 2nd Throne - Freya = 6\n"
"# * 2nd Throne - High Five = 7\n"
"# default is 6 (CT2.5 Freya)\n"
"Lineage2Version = %d\n"
"Lineage2ClientVersion = %d\n"
"\n\n",
L2_version, L2_client_version );
fprintf( f, ""
"# ===============\n"
"# Network setup \n"
"# ===============\n"
"\n"
"# =======================\n"
"# Listen ports setup \n"
"# * Ports on which program will bind listen sockets - local address\n"
"FakeListenLoginIP = %s\n"
"FakeListenLoginPort = %d\n"
"FakeListenGameIP = %s\n"
"FakeListenGamePort = %d\n"
"\n", FakeListenLoginIP, FakeListenLoginPort, FakeListenGameIP, FakeListenGamePort );
fprintf( f, ""
"# ========================\n"
"# Forward connection to \n"
"# * Where to redirect login connection - IP/hostname & port\n"
"RealLoginServerIP = %s\n"
"RealLoginServerPort = %d\n"
"\n", RealLoginServerIP, RealLoginServerPort );
// this was removed
/*fprintf( f, ""
"# ===========================\n"
"# Catch game server traffic \n"
"# * Which Game server's IP and port will be replaced in ServerList packet\n"
"# WARNING: this option is ignored!\n"
"PlayGameServerNo = %d\n"
"\n", PlayGameServerNo );*/
fprintf( f, "# You may force radar to redirect connection to specified game server IP:port.\n" );
fprintf( f, "# To do this, you must set BOTH ForceGameServerIP and ForceGameServerPort.\n" );
fprintf( f, "# if ForceGameServerIP == \"\" or ForceGameServerPort == 0 then feature is diabled.\n" );
fprintf( f, ""
"# ===========================\n"
"# Force choose game server by IP:port \n"
"# * independently of selection in server list window during login\n"
"# * if not set (empty string) - use selected server\n"
"ForceGameServerIP = %s\n"
"\n", ForceGameServerIP );
fprintf( f, ""
"# ===========================\n"
"# Force choose game server by IP:port \n"
"# * independently of selection in server list window during login\n"
"# * if = 0 - use selected server\n"
"ForceGameServerPort = %d\n"
"\n", ForceGameServerPort );
fprintf( f, ""
"# ===========================\n"
"# Catch following game traffic port in INGAME mode \n"
"IngameGameServerPort = %d\n"
"\n", IngameGameServerPort );
fprintf( f, ""
"# =========================================================================\n"
"# Logging Setup \n"
"# =========================================================================\n"
"# =========================================================================\n"
"# Warn messages level printed to stdout \n"
"# 0 - no messages to screen \n"
"# 1 - errors only ( Recommended :) ) \n"
"# 2 - errors, warnings \n"
"# 3 - errors, warnings, AI \n"
"# 4 - errors, warnings, AI, packet names \n"
"# 5 - errors, warnings, AI, packet names, debug messages \n"
"# 6 - errors, warnings, AI, packet names, debug messages, packet dumps \n"
"# Default: 1; it cannot be <0, but can be very big number. [0..0xFFFFFFFF]\n"
"WarnMessageLevel = %d\n"
"\n", WarnMessageLevel );
fprintf( f, ""
"# =========================================================================\n"
"# Warn about unknown packets? 1 - yes, 0 - no; (default: 0, no) \n"
"WarnUnknownPacketsToStdout = %d\n"
"\n", WarnUnknownPacketsToStdout );
fprintf( f, ""
"# ==========================================================================\n"
"# Full dump unknown packets to log? 0-no, 1-yes (Default: 0, not display)\n"
"DumpUnknownToStdout = %d\n"
"\n", DumpUnknownToStdout );
fprintf( f, ""
"# ====================================\n"
"# Enable or disable logging of Game Server packets 0-disable, 1-enable (Default: 0, disable)\n"
"LogGamePackets = %d\n"
"\n", LogGamePackets );
fprintf( f, ""
"# ====================================\n"
"# File name prefix for log file with game server packets log\n"
"# (file name will look like prefix_XXXXXXXX.txt, where XXX-current date/time unix timestamp)\n"
"# Default: prefix_\n"
"LogGameFileNamePrefix = %s\n"
"\n", LogGameFileNamePrefix );
fprintf( f, ""
"# ==========\n"
"# Hacks!!!! \n"
"# ==========\n"
" \n"
"# ========================================\n"
"# Enable or disable game packets modifying\n"
"# - If disabled (0), only passive sniffing if possible, NO ANY HACKS will work\n"
"# - If enabled (1), packet-level hacks WILL work. This setting is REQUIRED to be set to ENABLED\n"
"# if you want any hacks to work\n"
"# - 0-disable, 1-enable; (Default: 0, disable, passive SNIFFING ONLY)\n"
"EnableModifyGameTraffic = %d\n"
"\n", EnableModifyGameTraffic );
fprintf( f, ""
"# !!!!! Any hacks below will not work, if EnableModifyGameTraffic is set to 0 !!!!!\n"
"\n"
"# =====================================================================\n"
"# * Override game protocol version: change game protocol version number\n"
"# * in C->S ProtocolVersion packet to given number.\n"
"# * Value: 0 - disable this; any other number greater than 0: override to this number\n"
"# * Default: 0\n"
"OverrideGameProtocolVersion = %d\n"
"# Help on protocol versions (Official server):\n"
"# - T1 Kamael - 828\n"
"# - T1.5 Hellbound - 831 ?\n"
"# - T2 Gracia live - 851\n"
"# - T2.2 Gracia Part 2 - 12-17\n"
"# - T2.3 Gracia Final - 83-87\n"
"# - T2.4 Gracia Epilogue - 146\n"
"\n",
OverrideGameProtocolVersion );
fprintf( f, ""
"# If set to 1, L2Detect will send reply to standard L2J GameGuard query\n"
"# by itself, so it will be possible to play with GameGuard disabled\n"
"# on private servers where GameGuard is required.\n"
"# NOTE: L2Detect will NOT reply to unknown queries! You cannot be sure in it on official servers.\n"
"# (Default: disabled)\n"
"ReplyL2JGameGuardQuery = %d\n"
"\n",
ReplyL2JGameGuardQuery );
fprintf( f, ""
"# If set to 1, you know that server is using G.Epilogue protocol 148 and client\n"
"# is using G.Epilogue protocol 146; this setting will enable protocol conversion\n"
"# (converting some packets like ItemList, etc) between server and client, allowing\n"
"# clent with protocol 146 to play on server with protocol 148.\n"
"GraciaEpilogueProtocol_148_hacks = %d\n"
"\n",
GraciaEpilogueProtocol_148_hacks );
fprintf( f, ""
"# Enables server specific protocol handlers for TeonPvP server.\n"
"TeonPvP_hacks = %d\n"
"\n",
TeonPvP_hacks );
fprintf( f, ""
"# Fixes L2Walker wrong or old packets\n"
"L2Walker_DropRequestGMList = %d\n"
"L2Walker_FixMoveBackwardToLocation = %d\n"
"L2Walker_FixChangeWaitType2 = %d\n"
"L2Walker_InjectStatusUpdate = %d\n"
"\n",
L2Walker_DropRequestGMList,
L2Walker_FixMoveBackwardToLocation,
L2Walker_FixChangeWaitType2,
L2Walker_InjectStatusUpdate );
fprintf( f, ""
"# Enable/disable game listener thread priority above normal. Try changing this, if you have comp. lags...\n"
"# default: 0, disabled\n"
"ThreadProirityRaiseEnable = %d\n"
"\n",
ThreadProirityRaiseEnable );
fprintf( f, ""
"# Enable/disable invisible GM tracking\n"
"# default: 1, enabled\n"
"InvisGMTrackEnable = %d\n"
"\n",
InvisGMTrackEnable );
fprintf( f, ""
"# Invisible GM display speed\n"
"# default: 400, as //gmspeed 4\n"
"InvisGMSpeed = %d\n"
"\n",
InvisGMSpeed );
fclose( f );
return true;
}
void CConfig::SetDefault()
{
// declared in L2_versions.h (include L2Packets.h)
L2_version = 7;
L2_client_version = 7;
// Listen port setup
strcpy( FakeListenLoginIP, "127.0.0.1" );
FakeListenLoginPort = 9998;
strcpy( FakeListenGameIP, "127.0.0.1" );
FakeListenGamePort = 9999;
// Forward connection to
strcpy( RealLoginServerIP, "0.0.0.0" );
RealLoginServerPort = 2106;
// Catch game server traffic
//PlayGameServerNo = 0;
ForceGameServerIP[0] = 0;
ForceGameServerPort = 0;
IngameGameServerPort = 7777;
// Logging setup
LogGamePackets = 0;
LogGameFileNamePrefix[0] = 0;
WarnUnknownPacketsToStdout = 0;
DumpUnknownToStdout = 0;
WarnMessageLevel = 4;
// hacks
EnableModifyGameTraffic = 0; // enable or disable game protocol-level hacks
OverrideGameProtocolVersion = 0;
ReplyL2JGameGuardQuery = 0;
GraciaEpilogueProtocol_148_hacks = 0;
TeonPvP_hacks = 0;
// L2Walker fixes
L2Walker_DropRequestGMList = 0;
L2Walker_FixMoveBackwardToLocation = 1;
L2Walker_FixChangeWaitType2 = 1;
L2Walker_InjectStatusUpdate = 0;
// tweaks
ThreadProirityRaiseEnable = 1;
// Invis GM
InvisGMTrackEnable = 0;
InvisGMSpeed = 400; // //gmspeed 4
}