Login To Vote
Sign in and rate this file in one click.
  • MuServer Season 6 LTP - Full Server plus Sources 5 0 5 2

MuServer Season 6 LTP - Full Server plus Sources

Started by fratika, Oct 04, 2023, 05:24 PM

#20
I solved this problem in the data server was the problem. In source, here is the corrected code for the data server qwerymanager.cpp

// QueryManager.cpp: implementation of the CQueryManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QueryManager.h"
#include "Util.h"

CQueryManager gQueryManager;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CQueryManager::CQueryManager() // OK
{
   this->m_SQLEnvironment = SQL_NULL_HANDLE;
   this->m_SQLConnection = SQL_NULL_HANDLE;
   this->m_STMT = SQL_NULL_HANDLE;
   this->m_RowCount = -1;
   this->m_ColCount = -1;

   memset(this->m_SQLColName, 0, sizeof(this->m_SQLColName));
   memset(this->m_SQLData, 0, sizeof(this->m_SQLData));

   SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &this->m_SQLEnvironment);
   SQLSetEnvAttr(this->m_SQLEnvironment, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
}

CQueryManager::~CQueryManager() // OK
{
   this->Disconnect();
}

bool CQueryManager::Connect(char* odbc, char* user, char* pass, int logs) // OK
{
   strcpy_s(this->m_odbc, odbc);
   strcpy_s(this->m_user, user);
   strcpy_s(this->m_pass, pass);
   this->m_writelogs = logs;

   if (SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC, this->m_SQLEnvironment, &this->m_SQLConnection)) == 0)
   {
      return 0;
   }

   // Setează Timeout pentru conexiune (30 secunde)
   SQLSetConnectAttr(this->m_SQLConnection, SQL_LOGIN_TIMEOUT, (SQLPOINTER)30, 0);

   if (SQL_SUCCEEDED(SQLConnect(this->m_SQLConnection, (SQLCHAR*)this->m_odbc, SQL_NTS, (SQLCHAR*)this->m_user, SQL_NTS, (SQLCHAR*)this->m_pass, SQL_NTS)) == 0)
   {
      return 0;
   }

   if (SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, this->m_SQLConnection, &this->m_STMT)) == 0)
   {
      return 0;
   }

   return 1;
}

void CQueryManager::Disconnect() // OK
{
   if (this->m_STMT != SQL_NULL_HANDLE)
   {
      SQLFreeHandle(SQL_HANDLE_STMT, this->m_STMT);
      this->m_STMT = SQL_NULL_HANDLE;
   }

   if (this->m_SQLConnection != SQL_NULL_HANDLE)
   {
      SQLDisconnect(this->m_SQLConnection); // Important: Deconectează înainte de eliberare
      SQLFreeHandle(SQL_HANDLE_DBC, this->m_SQLConnection);
      this->m_SQLConnection = SQL_NULL_HANDLE;
   }

   if (this->m_SQLEnvironment != SQL_NULL_HANDLE)
   {
      SQLFreeHandle(SQL_HANDLE_ENV, this->m_SQLEnvironment);
      this->m_SQLEnvironment = SQL_NULL_HANDLE;
   }
}

void CQueryManager::Diagnostic(char* query) // OK
{
   LogAdd(LOG_BLACK, "%s", query);

   SQLINTEGER NativeError;
   SQLSMALLINT RecNumber = 1, BufferLength;
   SQLCHAR SqlState[6], MessageText[SQL_MAX_MESSAGE_LENGTH];

   while (SQLGetDiagRec(SQL_HANDLE_STMT, this->m_STMT, (RecNumber++), SqlState, &NativeError, MessageText, sizeof(MessageText), &BufferLength) != SQL_NO_DATA)
   {
      LogAdd(LOG_RED, "[QueryManager] State (%s), Diagnostic: %s", SqlState, MessageText);
   }

   if (strcmp((char*)SqlState, "08S01") == 0) // Communication link failure
   {
      this->Connect(this->m_odbc, this->m_user, this->m_pass, this->m_writelogs);
   }
}

bool CQueryManager::ExecQuery(char* query, ...) // REPARAT PENTRU EROARE 24000
{
   char buff[4096];

   va_list arg;
   va_start(arg, query);
   vsprintf_s(buff, query, arg);
   va_end(arg);

   if (this->m_writelogs != 0)
   {
      LogAdd(LOG_BLACK, "%s", buff);
   }

   // MODIFICARE CRITICĂ: Închidem cursorul existent înainte de a rula o nouă comandă
   // Asta previne eroarea "Invalid Cursor State" (24000)
   SQLCloseCursor(this->m_STMT);

   SQLRETURN result = SQLExecDirect(this->m_STMT, (SQLCHAR*)buff, SQL_NTS);

   if (SQL_SUCCEEDED(result) == 0 && result != SQL_NO_DATA)
   {
      this->Diagnostic(buff);
      return 0;
   }

   this->m_RowCount = -1;
   this->m_ColCount = -1;

   SQLRowCount(this->m_STMT, &this->m_RowCount);

   if (this->m_RowCount == 0) { return 1; }

   SQLNumResultCols(this->m_STMT, &this->m_ColCount);

   if (this->m_ColCount == 0) { return 1; }

   if (this->m_ColCount > MAX_COLUMNS) { return 0; }

   memset(this->m_SQLColName, 0, sizeof(this->m_SQLColName));
   memset(this->m_SQLData, 0, sizeof(this->m_SQLData));

   for (int n = 0; n < this->m_ColCount; n++)
   {
      SQLDescribeCol(this->m_STMT, (n + 1), this->m_SQLColName[n], sizeof(this->m_SQLColName[n]), 0, 0, 0, 0, 0);
      SQLBindCol(this->m_STMT, (n + 1), SQL_C_CHAR, this->m_SQLData[n], sizeof(this->m_SQLData[n]), &this->m_SQLDataLen[n]);
   }

   return 1;
}

void CQueryManager::Close() // OK
{
   // Eliberare completă a cursorului și a parametrilor
   SQLFreeStmt(this->m_STMT, SQL_CLOSE);
   SQLFreeStmt(this->m_STMT, SQL_UNBIND);
   SQLFreeStmt(this->m_STMT, SQL_RESET_PARAMS);
}

SQLRETURN CQueryManager::Fetch() // OK
{
   return SQLFetch(this->m_STMT);
}

int CQueryManager::FindIndex(char* ColName) // OK
{
   for (int n = 0; n < this->m_ColCount; n++)
   {
      if (_stricmp(ColName, (char*)this->m_SQLColName[n]) == 0)
      {
         return n;
      }
   }
   return -1;
}

int CQueryManager::GetResult(int index) // OK
{
   return atoi(this->m_SQLData[index]);
}

CSQLData CQueryManager::get(char* ColName)
{
   int index = this->FindIndex(ColName);
   if (index == -1)
   {
      return { "" };
   }
   return { this->m_SQLData[index] };
}

int CQueryManager::GetAsInteger(char* ColName) // OK
{
   int index = this->FindIndex(ColName);
   return (index == -1) ? -1 : atoi(this->m_SQLData[index]);
}

float CQueryManager::GetAsFloat(char* ColName) // OK
{
   int index = this->FindIndex(ColName);
   return (index == -1) ? 0.0f : (float)atof(this->m_SQLData[index]);
}

__int64 CQueryManager::GetAsInteger64(char* ColName) // OK
{
   int index = this->FindIndex(ColName);
   return (index == -1) ? -1 : _atoi64(this->m_SQLData[index]);
}

void CQueryManager::GetAsString(char* ColName, char* OutBuffer, int OutBufferSize) // OK
{
   int index = this->FindIndex(ColName);
   if (index == -1)
   {
      memset(OutBuffer, 0, OutBufferSize);
   }
   else
   {
      strncpy_s(OutBuffer, OutBufferSize, this->m_SQLData[index], _TRUNCATE);
   }
}

void CQueryManager::GetAsBinary(char* ColName, BYTE* OutBuffer, int OutBufferSize) // OK
{
   int index = this->FindIndex(ColName);
   if (index == -1)
   {
      memset(OutBuffer, 0, OutBufferSize);
   }
   else
   {
      this->ConvertStringToBinary(this->m_SQLData[index], sizeof(this->m_SQLData[index]), OutBuffer, OutBufferSize);
   }
}

void CQueryManager::BindParameterAsString(int ParamNumber, void* InBuffer, int ColumnSize) // OK
{
   this->m_SQLBindValue[(ParamNumber - 1)] = SQL_NTS;
   SQLBindParameter(this->m_STMT, ParamNumber, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, ColumnSize, 0, InBuffer, 0, &this->m_SQLBindValue[(ParamNumber - 1)]);
}

void CQueryManager::BindParameterAsBinary(int ParamNumber, void* InBuffer, int ColumnSize) // OK
{
   this->m_SQLBindValue[(ParamNumber - 1)] = ColumnSize;
   SQLBindParameter(this->m_STMT, ParamNumber, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_VARBINARY, ColumnSize, 0, InBuffer, 0, &this->m_SQLBindValue[(ParamNumber - 1)]);
}

void CQueryManager::ConvertStringToBinary(char* InBuff, int InSize, BYTE* OutBuff, int OutSize) // OK
{
   int size = 0;
   memset(OutBuff, 0, OutSize);
   for (int n = 0; n < InSize && size < OutSize; n++)
   {
      if (InBuff[n] == 0) break;
      if ((n % 2) == 0)
         OutBuff[size] = ((InBuff[n] >= 'A') ? ((InBuff[n] - 'A') + 10) : (InBuff[n] - '0')) * 16;
      else
      {
         OutBuff[size] |= ((InBuff[n] >= 'A') ? ((InBuff[n] - 'A') + 10) : (InBuff[n] - '0'));
         size++;
      }
   }
}

void CQueryManager::ConvertBinaryToString(BYTE* InBuff, int InSize, char* OutBuff, int OutSize) // OK
{
   int size = 0;
   memset(OutBuff, 0, OutSize);
   for (int n = 0; n < OutSize && size < InSize; n++)
   {
      if ((n % 2) == 0)
         OutBuff[n] = (((InBuff[size] / 16) >= 10) ? ('A' + ((InBuff[size] / 16) - 10)) : ('0' + (InBuff[size] / 16)));
      else
      {
         OutBuff[n] = (((InBuff[size] % 16) >= 10) ? ('A' + ((InBuff[size] % 16) - 10)) : ('0' + (InBuff[size] % 16)));
         size++;
      }
   }
}
  •  

#21
I will leave you the links in order to skip this part, there is no need if you have 1.6.11 LTP Team last touch.

Link Source: https://www.mediafire.com/file/rghdg3devpi4a0u/LTP_Last_Sources_2023.rar/file
Client: https://www.mediafire.com/file/wxft0omcmzjxpbw/LTPTeam_Client_%255B1.6.8%255D.rar/file
MuServer: https://www.mediafire.com/file/m7xs2jasypw8hz5/server_pack.rar/file

If anyone have crash client on start, recompile all server binaries, LTP.dll and GetMainInfo
Also, you need run all .sql scripts in DB/scripts/ folder.

This is from Official LTP Team itself so I could state credits to LTP Team.

I have left it without thanks button as there is already set in the post.

I will soon release a Mu Editor for LTP Monsters (done this part, I need to work on maps) for free.





Enjoy!
MU Online Developer focused on custom systems, unique features and serious projects. Available for selected collaborations and private development. Serious inquiries only — no time-wasters.

60 fps READY (any busy scene) DM Me.
  •  
    The following users thanked this post: Xeros

Hi guys,

have someone same trouble with this files? i buildet .dll and new main maker, and after loading screen client close. I dont get dissconect window. Just close. I dont know where im doin mistake...

Thanks for response :)
  •  

  •  

Quote from: ꧁Phantasm꧂ on Feb 27, 2026, 06:46 PM
Quote from: dannys on Feb 23, 2026, 12:11 AMI have a problem, I started the server and it works, but it's enough to enter the game once, then I close the server and when I open it, I go into the account and it appears to me to create a new character and the old character doesn't show and I can't make a new one. It's a problem with the DB from the start, it works, then it doesn't and all the scripts are made in qwery. Has anyone else encountered this problem?

Hello, Dannys.

I would recommend, first the server/game works fine in terms of what have you described (tested by me, I have even fixed the maps from tab keyboard and Vulcanus view, so the game works ace, loads to fix, but nothing alike the problem you have described so far), second redo everything from start. DB works fine (never what you have mentioned), probably the thing left to config in terms of database is the CS time/date.





Link to DB Folder that I am utilising:

This content is hidden and cannot be quoted.
  •  

Use lua53 instead of lua52. It worked for me.
  •  

#26
Hello everyone,

I have made a simple tutorial, very explicit with what you have to do in order to start all the functionality of this MuServer.

Please find the yt link here :

Don't forget to resto db and press necessary .reg (mine already restored).
MU Online Developer focused on custom systems, unique features and serious projects. Available for selected collaborations and private development. Serious inquiries only — no time-wasters.

60 fps READY (any busy scene) DM Me.
  •  

  •  

I am running SQL Server 2017 using Docker Desktop on Windows, but it does not support Windows authentication mode. How can I modify the registry to enable SQL Server authentication mode
  •  

client login,gamserver print error log:
14:34:36 [RAKLION] [BossEggRegen] : BossEgg[0 ea]
14:34:39 [CastleSiege] CCastleSiege::DataRequest() - REQUEST DATA FIRST
14:38:02 [ObjectManager][3500] AddClient [10.100.30.27]
14:38:03 [ObjectManager][3500] DelClient [10.100.30.27]
14:38:36 Response error after connection causes conclusion [3500][][][10.100.30.27]

Help me, how to solve it
  •  

Quote from: xiaowcji33 on Aug 27, 2026, 07:45 AMclient login,gamserver print error log:
14:34:36 [RAKLION] [BossEggRegen] : BossEgg[0 ea]
14:34:39 [CastleSiege] CCastleSiege::DataRequest() - REQUEST DATA FIRST
14:38:02 [ObjectManager][3500] AddClient [10.100.30.27]
14:38:03 [ObjectManager][3500] DelClient [10.100.30.27]
14:38:36 Response error after connection causes conclusion [3500][][][10.100.30.27]

Help me, how to solve it

FIX: Client connects to GameServer and disconnects immediately – LTP Season 6

I checked this issue directly in the LTP sources.

If your GameServer shows:

14:38:02 [ObjectManager][3500] AddClient [10.100.30.27]
14:38:03 [ObjectManager][3500] DelClient [10.100.30.27]
14:38:36 Response error after connection causes conclusion [3500][][][10.100.30.27]

the important part is:

AddClient
DelClient

The client is successfully reaching the GameServer, so this is normally not a basic firewall or GameServer port problem.

The connection is being lost during the initial client/GameServer handshake.

1. Check the correct client settings

Open:

Tools\GetMainInfo_New\Release\MainInfo.ini

For the original LTP configuration, use:

[MainInfo]

CustomerName = release
IpAddress = YOUR_SERVER_IP
IpAddressPort = 44406

ClientVersion = 1.04.05
ClientSerial = TbYehR2hFUPBKgZj

ClientName = main.exe
UseWrongPacketsCheck = 0

Change only:

IpAddress = YOUR_SERVER_IP

For example:

IpAddress = 10.100.30.10

if that is the LAN IP of your server PC.

Important:

The ConnectServer port in this configuration is:

44406

not 44405, unless you manually changed your ConnectServer configuration.

2. Check GameServer version and serial

In your GameServer configuration, make sure you have:

CustomerName = release
ServerVersion = 1.04.05
ServerSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

The following values must match exactly:

ClientVersion = ServerVersion

1.04.05 = 1.04.05

and:

ClientSerial = ServerSerial

TbYehR2hFUPBKgZj = TbYehR2hFUPBKgZj

The serial is case-sensitive and must be identical character by character.

3. Do not forget to regenerate main.ltp

This source does not simply use MainInfo.ini directly while the client is running.

After editing MainInfo.ini, run:

GetMainInfo.exe

It generates:

Client\Data\Custom\Configs\main.ltp

Copy the newly generated:

main.ltp

to your actual client:

YOUR CLIENT\Data\Custom\Configs\main.ltp

Overwrite the old file.

This is very important.

If you change MainInfo.ini but keep an old main.ltp, the client can still use the old IP, version, serial or other configuration.

4. Keep CustomerName as "release" for testing

Use:

CustomerName = release

Do not change it to:

CustomerName = MyServer

until the client is connecting correctly.

In these sources, CustomerName is also involved in client/server initialization and protection/encryption-related logic.

A mismatch can cause exactly this:

AddClient
DelClient

without reaching the normal login stage.

5. Use the correct LTP client Main/DLL

Do not mix these server files with a random Season 6 client.

For example, do not use:

LTP GameServer
+
random main.exe
+
DLL from another MuEMU/X-Team/Louis source

Even if the client is also Season 6 Episode 3, the protocol/hooks/encryption can be different.

Use the Main and client DLL that belong to these LTP sources.

The client source is under the LTP client project, similar to:

Client\Main_EX603_vs2019

Make sure the correct compiled client DLL is actually loaded by the client.

6. Encryption is enabled

The GameServer source uses:

#define ENCRYPT_STATE 1

So the client and GameServer must use compatible packet encryption/protocol handling.

If you use a Main/DLL from another source, GameServer may accept the TCP connection but the first packets cannot be processed correctly.

Result:

AddClient
DelClient

after approximately one second.

Do not disable ENCRYPT_STATE as the first fix.

First test the original LTP configuration with the correct client.

7. Understand where the connection fails

The normal connection sequence is approximately:

Client connects
|
GameServer AddClient
|
GameServer sends initial connection packet
|
Client processes F1:00
|
Client sends F1:01
|
GameServer checks version/serial
|
Login process continues

In this problem, you normally get:

Client connects
|
AddClient
|
FAIL
|
DelClient

The GameServer sends the initial connection packet through:

GCConnectClientSend(index,1);

which is associated with:

F1:00

The client must process it and continue with:

F1:01

If the client cannot decode/process F1:00 correctly, it can close the socket immediately.

8. Check the GameServer log for these errors

If you see something related to:

err 2

check:

ClientVersion
ServerVersion
main.ltp
client DLL

If you see:

err 3

check:

ClientSerial
ServerSerial
main.ltp
client DLL

Also check for messages such as:

Protocol header error
Protocol size error
Packet unknown error
Packet encryption error
Packet serial error

If you get a protocol/encryption error, the problem is most likely:

wrong client DLL
wrong main.exe
wrong main.ltp
wrong protocol
wrong encryption configuration

9. The "Response error after connection causes conclusion" message is not the main problem

This:

Response error after connection causes conclusion

is normally a later cleanup/timeout message because the object never completed the login process.

Do not "fix" this by increasing a timeout from something like:

30000

to:

300000

Your client already disconnects after around one second.

Increasing the timeout only delays the cleanup. It does not fix the handshake.

10. Castle Siege and Raklion messages are unrelated

These lines:

[RAKLION] [BossEggRegen] : BossEgg[0 ea]

[CastleSiege] CCastleSiege::DataRequest() - REQUEST DATA FIRST

are not the cause of this connection problem.

The relevant part is:

AddClient
DelClient

11. Recommended clean test configuration

Client:

CustomerName = release
IpAddress = YOUR_SERVER_IP
IpAddressPort = 44406
ClientVersion = 1.04.05
ClientSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

GameServer:

CustomerName = release
ServerVersion = 1.04.05
ServerSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

Then:


Save MainInfo.ini
Run GetMainInfo.exe
Get the new:
main.ltp
Copy it to:
Client\Data\Custom\Configs\main.ltp
Use the correct LTP main.exe
Use the correct LTP client DLL
Restart GameServer
Start the client
Select the server
Check the GameServer log

12. If it still shows AddClient -> DelClient

If you still get:

AddClient
DelClient

and you do NOT get:

err 2

or:

err 3

then the client is probably disconnecting before the version/serial validation is even reached.

At that point, concentrate on:

main.exe
client DLL
main.ltp
CustomerName
encryption
packet protocol
F1:00 handling
F1:01 handling

Do not waste time debugging SQL, Castle Siege or character database tables at this stage.

Final check

For these LTP sources, start with exactly:

CustomerName = release

ClientVersion = 1.04.05
ServerVersion = 1.04.05

ClientSerial = TbYehR2hFUPBKgZj
ServerSerial = TbYehR2hFUPBKgZj

ConnectServer Port = 44406

UseWrongPacketsCheck = 0

Then regenerate:

main.ltp

and replace:

Client\Data\Custom\Configs\main.ltp

If the values are correct but the client still disconnects immediately, the next thing to verify is the exact main.exe/client DLL and encryption/protocol compatibility.

That is the correct direction for this specific:

AddClient -> DelClient
MU Online Developer focused on custom systems, unique features and serious projects. Available for selected collaborations and private development. Serious inquiries only — no time-wasters.

60 fps READY (any busy scene) DM Me.
  •  
    The following users thanked this post: xiaowcji33

It has been resolved. Thank you very much
  •  

The issue has been resolved, thank you very much. Additionally, I would like to add a client that can be translated into Chinese. How can I translate it? (Which files should be modified?)
  •  

Quote from: Phantasm on Aug 27, 2026, 08:10 AM
Quote from: xiaowcji33 on Aug 27, 2026, 07:45 AMclient login,gamserver print error log:
14:34:36 [RAKLION] [BossEggRegen] : BossEgg[0 ea]
14:34:39 [CastleSiege] CCastleSiege::DataRequest() - REQUEST DATA FIRST
14:38:02 [ObjectManager][3500] AddClient [10.100.30.27]
14:38:03 [ObjectManager][3500] DelClient [10.100.30.27]
14:38:36 Response error after connection causes conclusion [3500][][][10.100.30.27]

Help me, how to solve it

FIX: Client connects to GameServer and disconnects immediately – LTP Season 6

I checked this issue directly in the LTP sources.

If your GameServer shows:

14:38:02 [ObjectManager][3500] AddClient [10.100.30.27]
14:38:03 [ObjectManager][3500] DelClient [10.100.30.27]
14:38:36 Response error after connection causes conclusion [3500][][][10.100.30.27]

the important part is:

AddClient
DelClient

The client is successfully reaching the GameServer, so this is normally not a basic firewall or GameServer port problem.

The connection is being lost during the initial client/GameServer handshake.

1. Check the correct client settings

Open:

Tools\GetMainInfo_New\Release\MainInfo.ini

For the original LTP configuration, use:

[MainInfo]

CustomerName = release
IpAddress = YOUR_SERVER_IP
IpAddressPort = 44406

ClientVersion = 1.04.05
ClientSerial = TbYehR2hFUPBKgZj

ClientName = main.exe
UseWrongPacketsCheck = 0

Change only:

IpAddress = YOUR_SERVER_IP

For example:

IpAddress = 10.100.30.10

if that is the LAN IP of your server PC.

Important:

The ConnectServer port in this configuration is:

44406

not 44405, unless you manually changed your ConnectServer configuration.

2. Check GameServer version and serial

In your GameServer configuration, make sure you have:

CustomerName = release
ServerVersion = 1.04.05
ServerSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

The following values must match exactly:

ClientVersion = ServerVersion

1.04.05 = 1.04.05

and:

ClientSerial = ServerSerial

TbYehR2hFUPBKgZj = TbYehR2hFUPBKgZj

The serial is case-sensitive and must be identical character by character.

3. Do not forget to regenerate main.ltp

This source does not simply use MainInfo.ini directly while the client is running.

After editing MainInfo.ini, run:

GetMainInfo.exe

It generates:

Client\Data\Custom\Configs\main.ltp

Copy the newly generated:

main.ltp

to your actual client:

YOUR CLIENT\Data\Custom\Configs\main.ltp

Overwrite the old file.

This is very important.

If you change MainInfo.ini but keep an old main.ltp, the client can still use the old IP, version, serial or other configuration.

4. Keep CustomerName as "release" for testing

Use:

CustomerName = release

Do not change it to:

CustomerName = MyServer

until the client is connecting correctly.

In these sources, CustomerName is also involved in client/server initialization and protection/encryption-related logic.

A mismatch can cause exactly this:

AddClient
DelClient

without reaching the normal login stage.

5. Use the correct LTP client Main/DLL

Do not mix these server files with a random Season 6 client.

For example, do not use:

LTP GameServer
+
random main.exe
+
DLL from another MuEMU/X-Team/Louis source

Even if the client is also Season 6 Episode 3, the protocol/hooks/encryption can be different.

Use the Main and client DLL that belong to these LTP sources.

The client source is under the LTP client project, similar to:

Client\Main_EX603_vs2019

Make sure the correct compiled client DLL is actually loaded by the client.

6. Encryption is enabled

The GameServer source uses:

#define ENCRYPT_STATE 1

So the client and GameServer must use compatible packet encryption/protocol handling.

If you use a Main/DLL from another source, GameServer may accept the TCP connection but the first packets cannot be processed correctly.

Result:

AddClient
DelClient

after approximately one second.

Do not disable ENCRYPT_STATE as the first fix.

First test the original LTP configuration with the correct client.

7. Understand where the connection fails

The normal connection sequence is approximately:

Client connects
|
GameServer AddClient
|
GameServer sends initial connection packet
|
Client processes F1:00
|
Client sends F1:01
|
GameServer checks version/serial
|
Login process continues

In this problem, you normally get:

Client connects
|
AddClient
|
FAIL
|
DelClient

The GameServer sends the initial connection packet through:

GCConnectClientSend(index,1);

which is associated with:

F1:00

The client must process it and continue with:

F1:01

If the client cannot decode/process F1:00 correctly, it can close the socket immediately.

8. Check the GameServer log for these errors

If you see something related to:

err 2

check:

ClientVersion
ServerVersion
main.ltp
client DLL

If you see:

err 3

check:

ClientSerial
ServerSerial
main.ltp
client DLL

Also check for messages such as:

Protocol header error
Protocol size error
Packet unknown error
Packet encryption error
Packet serial error

If you get a protocol/encryption error, the problem is most likely:

wrong client DLL
wrong main.exe
wrong main.ltp
wrong protocol
wrong encryption configuration

9. The "Response error after connection causes conclusion" message is not the main problem

This:

Response error after connection causes conclusion

is normally a later cleanup/timeout message because the object never completed the login process.

Do not "fix" this by increasing a timeout from something like:

30000

to:

300000

Your client already disconnects after around one second.

Increasing the timeout only delays the cleanup. It does not fix the handshake.

10. Castle Siege and Raklion messages are unrelated

These lines:

[RAKLION] [BossEggRegen] : BossEgg[0 ea]

[CastleSiege] CCastleSiege::DataRequest() - REQUEST DATA FIRST

are not the cause of this connection problem.

The relevant part is:

AddClient
DelClient

11. Recommended clean test configuration

Client:

CustomerName = release
IpAddress = YOUR_SERVER_IP
IpAddressPort = 44406
ClientVersion = 1.04.05
ClientSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

GameServer:

CustomerName = release
ServerVersion = 1.04.05
ServerSerial = TbYehR2hFUPBKgZj
UseWrongPacketsCheck = 0

Then:


Save MainInfo.ini
Run GetMainInfo.exe
Get the new:
main.ltp
Copy it to:
Client\Data\Custom\Configs\main.ltp
Use the correct LTP main.exe
Use the correct LTP client DLL
Restart GameServer
Start the client
Select the server
Check the GameServer log

12. If it still shows AddClient -> DelClient

If you still get:

AddClient
DelClient

and you do NOT get:

err 2

or:

err 3

then the client is probably disconnecting before the version/serial validation is even reached.

At that point, concentrate on:

main.exe
client DLL
main.ltp
CustomerName
encryption
packet protocol
F1:00 handling
F1:01 handling

Do not waste time debugging SQL, Castle Siege or character database tables at this stage.

Final check

For these LTP sources, start with exactly:

CustomerName = release

ClientVersion = 1.04.05
ServerVersion = 1.04.05

ClientSerial = TbYehR2hFUPBKgZj
ServerSerial = TbYehR2hFUPBKgZj

ConnectServer Port = 44406

UseWrongPacketsCheck = 0

Then regenerate:

main.ltp

and replace:

Client\Data\Custom\Configs\main.ltp

If the values are correct but the client still disconnects immediately, the next thing to verify is the exact main.exe/client DLL and encryption/protocol compatibility.

That is the correct direction for this specific:

AddClient -> DelClient

The issue has been resolved, thank you very much. Additionally, I would like to add a client that can be translated into Chinese. How can I translate it? (Which files should be modified?)
  •  

#34
Data\Local\Eng

And here you create ur Chn folder, so after creating you will have Data\Local\Chn, and translate all the .bmd file from Eng folder to Chinese.

+ you need .reg registry in order to work. Additionally you can leave the Eng folder and translate it to Chinese, much easier.

Good luck.
MU Online Developer focused on custom systems, unique features and serious projects. Available for selected collaborations and private development. Serious inquiries only — no time-wasters.

60 fps READY (any busy scene) DM Me.

Quote from: Phantasm on Aug 27, 2026, 11:36 AMData\Local\Eng

And here you create ur Chn folder, so after creating you will have Data\Local\Chn, and translate all the .bmd file from Eng folder to Chinese.

+ you need .reg registry in order to work. Additionally you can leave the Eng folder and translate it to Chinese, much easier.

Good luck.
Understood, thank you very much for your guidance
  •  

Quote from: Phantasm on Aug 27, 2026, 11:36 AMData\Local\Eng

And here you create ur Chn folder, so after creating you will have Data\Local\Chn, and translate all the .bmd file from Eng folder to Chinese.

+ you need .reg registry in order to work. Additionally you can leave the Eng folder and translate it to Chinese, much easier.

Good luck.
Guru, can the file BmdDec.exe encrypt and decrypt all .bmd files under Data/local/eng?
  •  

Quote from: Phantasm on Aug 27, 2026, 11:36 AMData\Local\Eng

And here you create ur Chn folder, so after creating you will have Data\Local\Chn, and translate all the .bmd file from Eng folder to Chinese.

+ you need .reg registry in order to work. Additionally you can leave the Eng folder and translate it to Chinese, much easier.

Good luck.
I directly translated item_eng.bmd and Text.bmd in the Data/local/eng folder, re-encrypted them into bmd files, but the game still displays in English. Is there any missing step? Also, I noticed you mentioned editing the registry earlier. Could you please guide me on how to do that? I'm seeking help, please assist me
  •  

#38
Hello, you need to modify MuServer - Client in order to work, also there might be hardcoded in English/Source, it is not a easy fix, and loads to modify.

CLIENT
├─ font / charset
├─ interface text
├─ message files
├─ custom text
├─ item / skill / NPC names
└─ hardcoded strings in Main source

MUSERVER
├─ GameServer messages
├─ notices
├─ commands
├─ event messages
├─ NPC text
└─ custom systems messages

I have passed you almost all the information, so I would please you to guide yourself more in this, as is the hardest part to configure.

Good luck!
Protected content
  • Click the orange - Unlock Content - button on the bottom-right of this post to reveal the hidden links.
MU Online Developer focused on custom systems, unique features and serious projects. Available for selected collaborations and private development. Serious inquiries only — no time-wasters.

60 fps READY (any busy scene) DM Me.

Quote from: Phantasm on Aug 28, 2026, 07:31 AMHello, you need to modify MuServer - Client in order to work, also there might be hardcoded in English/Source, it is not a easy fix, and loads to modify.

CLIENT
├─ font / charset
├─ interface text
├─ message files
├─ custom text
├─ item / skill / NPC names
└─ hardcoded strings in Main source

MUSERVER
├─ GameServer messages
├─ notices
├─ commands
├─ event messages
├─ NPC text
└─ custom systems messages

I have passed you almost all the information, so I would please you to guide yourself more in this, as is the hardest part to configure.

Good luck!
This content is hidden and cannot be quoted.
thank you!
  •