Beiträge von msnas

    This is a simple (and probably unwanted) tutorial that will give you all the online players for each core, including the auth

    We might argue about whether being in the select character phase is really in-game, but we will include it anyway



    Why?

    The /u and /w commands only provide data from the channel where the player is

    Since I needed absolute values - as soon as someone logs in - I went searching in the source and came across the GetUserCount() function

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    I had 3 players in separated channels (auth, 1 and 99 respectively)

    I used the commands above and lastly the new one we are going to create



    Explanation?

    The function returns (in type DWORD) the size of m_map_kLogonAccount

    It is a map that stores the login values with class CLoginData

    It is also responsible for storing the values of the players online every 1h in usage.txt

    It is given an insert in the map every login a player makes through the boolean function InsertLogonAccount()

    What we're going to do is requesting the data from GetUserCount() and show it.




    Installing


    DB


    ClientManager.cpp:

    Search for:

    Code
    1. //RELOAD_ADMIN
    2. case HEADER_GD_RELOAD_ADMIN:
    3. ReloadAdmin(peer, (TPacketReloadAdmin*)data);
    4. break;
    5. //END_RELOAD_ADMIN

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Add below:

    Code
    1. case HEADER_GD_REQ_USER_COUNT:
    2. RequestUserCount(dwHandle);
    3. break;

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Search for:

    Code
    1. void CClientManager::ReloadAdmin(CPeer*, TPacketReloadAdmin* p)
    2. { ....
    3. }

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Add below:

    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    ClientManager.h:

    Search for:

    Code
    1. //RELOAD_ADMIN
    2. void ReloadAdmin(CPeer * peer, TPacketReloadAdmin * p);
    3. //END_RELOAD_ADMIN

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Add below:

    Code
    1. void RequestUserCount(DWORD dwHandle);

    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    Common

    tables.h:

    Search for:

    Code
    1. HEADER_DG_RESPOND_CHANNELSTATUS = 181,

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Add below:

    Code
    1. HEADER_GD_REQ_USER_COUNT = 141,
    2. HEADER_DG_RET_USER_COUNT = 182,

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Search for:

    Code
    1. typedef struct SPacketDGChangeEmpirePriv
    2. {
    3. BYTE type;
    4. int value;
    5. BYTE empire;
    6. BYTE bLog;
    7. time_t end_time_sec;
    8. } TPacketDGChangeEmpirePriv;

    Bitte melden Sie sich an, um diesen Anhang zu sehen.

    Add below:

    Code
    1. typedef struct SPacketDGUserCount
    2. {
    3. DWORD user;
    4. } TPacketDGUserCount;

    Bitte melden Sie sich an, um diesen Anhang zu sehen.


    Game

    cmd_gm.cpp:

    Search for:

    Code
    1. //RELOAD_ADMIN
    2. case 'a':
    3. ch->ChatPacket(CHAT_TYPE_INFO, "Reloading Admin infomation.");
    4. db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0);
    5. sys_log(0, "Reloading admin infomation.");
    6. break;
    7. //END_RELOAD_ADMIN

    Add below:

    Code
    1. case 'y':
    2. ch->ChatPacket(CHAT_TYPE_INFO, "Requesting total users.");
    3. db_clientdesc->DBPacket(HEADER_GD_REQ_USER_COUNT, ch->GetDesc()->GetHandle(), NULL, 0);
    4. break;


    input.cpp:

    Search for:

    Code
    1. case 'a':
    2. db_clientdesc->DBPacket(HEADER_GD_RELOAD_ADMIN, 0, NULL, 0);
    3. sys_log(0, "Reloading admin infomation.");
    4. break;

    Add below:

    Code
    1. case 'y':
    2. db_clientdesc->DBPacket(HEADER_GD_REQ_USER_COUNT, d->GetHandle(), NULL, 0);
    3. sys_log(0, "Reloading user count.");
    4. break;


    input.h:

    Search for:

    Code
    1. //RELOAD_ADMIN
    2. void ReloadAdmin( const char * c_pData );
    3. //END_RELOAD_ADMIN

    Add below:

    Code
    1. void UserCount(LPDESC d, const TPacketDGUserCount* p);


    input_db.cpp:

    Search for:

    Add below:

    Search for:

    Code
    1. // RELOAD_ADMIN
    2. case HEADER_DG_RELOAD_ADMIN:
    3. ReloadAdmin(c_pData );
    4. break;
    5. //END_RELOAD_ADMIN

    Add below:

    Code
    1. case HEADER_DG_RET_USER_COUNT:
    2. UserCount(DESC_MANAGER::instance().FindByHandle(m_dwHandle), (TPacketDGUserCount*)c_pData);
    3. break;


    Usage

    The usage is /reload y

    This tutorial is going to teach you how to compile, run and configure a server on Windows.

    I needed something like this a few days ago and since it doesn't exist, I decided to make it

    There is no addition or modification in the source or client (except for small bonuses).



    0. Beginning

    At the end of the topic there will be two links where you will need to download:


    Client + Server + Source

    Bitte melden Sie sich an, um dieses Bild zu sehen.


    MySQL

    Bitte melden Sie sich an, um dieses Bild zu sehen.



    The client is based on theBitte melden Sie sich an, um diesen Link zu sehen., I just edited it to have the classic format.

    Regardless the Bitte melden Sie sich an, um diesen Link zu sehen. and Bitte melden Sie sich an, um diesen Link zu sehen. source.



    1. The files

    We will need to download the following files:

    Bitte melden Sie sich an, um diesen Link zu sehen. - In order to compile both the server and the binary, we're going to need this

    Bitte melden Sie sich an, um diesen Link zu sehen. - Connect and create the database



    2. Installing

    The installation is easy enough for me to consider that I don't need to spend much time on this, however I hope this two pictures will facilitate (more) on what you need to do:


    Visual Studio Community

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Note: You actually just need the MSVC v142, C++ CMake, C++ ATL, C++ MFC and C++/CLI for this to work


    MySQL:

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Warning: In this tutorial we're going to use Mysql Server 5.7.33 X64 but you can (must) upgrade it to 8.0



    2.1 Installing Server / Client / Database

    Here you need to pay attention because there's a limitation:


    You must unzip the file "dev" on C:\

    If you don't want, follow the Bitte melden Sie sich an, um diesen Link zu sehen. and you need to create manually the symlinks for each core on the server.



    Bitte melden Sie sich an, um dieses Bild zu sehen.

    This is how it should be.


    Client:

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    There isn't much to say, in pack/ you already have root and locale_de unpacked but since this is going to be localhost only, you don't need to change nothing on the serverinfo.py

    Bonus: I translated the client to English, just because


    Database:

    1) Windows Key + R and write services.msc

    Bitte melden Sie sich an, um dieses Bild zu sehen.


    2) Search for MySQL57 (or the version you installed) and click on Stop

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Since Im portuguese, yeah


    3) Go to directory C:\ProgramData\MySQL

    Bitte melden Sie sich an, um dieses Bild zu sehen.


    4) In the folder MySQL Server 5.7 (or the version you installed) and in the folder Data, paste the files you previously downloaded and unziped from mysql_dev.rar

    Bitte melden Sie sich an, um dieses Bild zu sehen.


    5) On services.msc, start the MySQL process

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Back it again with the portuguese


    Server:

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    These images are referenced in each core's CONFIG and conf.txt, respectively where the location is on directory C:\dev\2. Server.

    Warning: Don't forget to change the MySQL's user password! You need to put the same password you had when installing the MySQL.



    3. Compile Server / Client Source

    There is nothing introductory since it is something very simple that you will be able to.


    Server:

    It's quite simple, to build the server source, we just need to open the file dev_server.sln which is located in C:\dev\1. Svn\Server\build


    Bitte melden Sie sich an, um dieses Bild zu sehen.

    You can build all at once or separately.

    Bonus: I linked the files to go to the directory C:\dev\2. Server\share\ so you don't need to c&p multiple times.


    Client:

    Same as before, open the dev_solution.sln which is located in C:\dev\1. Svn\Client


    Bitte melden Sie sich an, um dieses Bild zu sehen.



    Since I have a good computer, I enabled the multi-processor compilation option. If your computer is very slow while you are compiling, I suggest you deactivate by going to Properties in all the builds.

    Bitte melden Sie sich an, um dieses Bild zu sehen.




    4. Starting the Server

    On the main directory of the server (C:\dev\2. Server) you'll have 2 bat files:

    start.bat* - As the name says, it will start the server

    clear.bat - It will clear all the server's logs



    * I forgot the make it dynamic so if you don't want to have on the C:\dev, you'll need to change the directory.


    Execute start.bat and it will show up first the db.exe, then auth's game.exe and last channel1's game.exe

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Bitte melden Sie sich an, um dieses Bild zu sehen.

    And there you have it, your server is now online!



    5. Debug

    You can debug by going to Debug -> Start New Instance


    Bitte melden Sie sich an, um dieses Bild zu sehen.

    Bonus: I linked everything so you don't have to worry about anything



    5. Credits

    I like to say that I don't know anything about anything and as such, everything here has its credits.

    Bitte melden Sie sich an, um diesen Link zu sehen. - Client/Server compilable with VS2019 (Bitte melden Sie sich an, um diesen Link zu sehen. & Bitte melden Sie sich an, um diesen Link zu sehen.)

    Bitte melden Sie sich an, um diesen Link zu sehen. - If it wasn't for him, I couldn't have done this

    ThatGuyPT - The base was from his Windows Serverfiles



    6. FAQ

    Q: Why didn't you use xampp instead of MySQL?

    A: At the moment I use MySQL a lot even outside of Metin2, so it makes more sense to me that it be this way.

    However, it is exactly the same, especially on localhost.


    Q: Can I migrate the source to FreeBSD?

    A: Yes, you can! As long as you have cmake configured, you can distribute to FreeBSD and use it there.


    Q: What is the id and password to enter the game?

    (I put this question because I know there will be someone asking this)

    A: You can create an account in the database, but you can use id: admin pw: 123




    7. Links

    Bitte melden Sie sich an, um diesen Link zu sehen.

    Bitte melden Sie sich an, um diesen Link zu sehen.



    If you have any questions that I can answer, feel free to write a post here.

    Before you start with the topic, if you expect something complex from this system, then you can go back because this was in only 1 hour of work.
    You have every right to improve this if you want.


    Well, I'm running some tests on the performance between quest-client and game-client and being honest, I didn't noticed the difference, only 1 ~ 3 commands to be made.


    What is this system?
    This is given as the name of Admin Whisper and aims to send a message to all players as they enter the game for the first time.


    What is it for?
    As stated above, all players (regardless of channel - that is, they may be in CH1 as in CH2 -) will receive without any type of problem or latency.



    (Message to be sent - print can't be visible but it flashes)
    Bitte melden Sie sich an, um diesen Link zu sehen.


    (Message Content)


    Bitte melden Sie sich an, um diesen Link zu sehen.


    Requirements:

    • Python
    • LUA


    Client


    Search (game.py) for:



    Add it under:



    Search for:



    Add it under:




    SERVER


    Create a file named admin_whisper.lua in your locale (probably /germany):


    Put this on the questlib.lua:



    Use this quest as a test:


    • /e admin_whisper 1 - The system will be active and everyone will receive the messages
    • /e admin_whisper 0 - The system will be disabled and no one will receive the messages


    Have fun.