diff --git a/CMakeSettings.json b/CMakeSettings.json deleted file mode 100644 index 836cc1e..0000000 --- a/CMakeSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, - { - "name": "WSL-GCC-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeExecutable": "cmake", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "", - "inheritEnvironments": [ "linux_x64" ], - "wslPath": "${defaultWSLPath}" - } - ] -} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bbd11c9 --- /dev/null +++ b/README.md @@ -0,0 +1,112 @@ +# The Metin2 Server +The Old Metin2 Project aims at improving and maintaining the 2014 Metin2 game +files up to modern standards. The goal is to archive the game as it was in order +to preserve it for the future and enable nostalgic players to have a good time. + +For-profit usage of this material is certainly illegal without the proper +licensing agreements and is hereby discouraged (not legal advice). Even so, the +nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now. + +## 1. Building and usage + +### A. Use Docker to instantly bring up a server (recommended) +We aim to provide Docker images which _just work_ for your convenience. +A Docker Compose project is maintained in the [Deployment project](https://git.old-metin2.com/metin2/deploy). +Please head over there for further instructions. + +### B. Build the binaries yourself (for advanced users) +_Sadly, we're unable to provide hand-holding services. You should have some C++ development experience +going forward with this route._ + +A Linux environment is strongly recommended, preferably of the Ubuntu/Debian +variety. This project is also compatible with WSL, even though WSL can be buggy +at times. FreeBSD/Windows compatibility is untested and unsupported for the +time being - there are other projects out there if that's what you want. + +On your Linux box, install the dependencies for `vcpkg` and the other libraries +we're going to install. +```shell +apt-get update +apt-get install -y git cmake build-essential tar curl zip unzip pkg-config autoconf python3 libncurses5-dev +``` + +Also install DevIL (1.7.8) and the BSD compatibility library: +```shell +apt-get install -y libdevil-dev libbsd-dev +``` + +Install `vcpkg` according to the [lastest instructions](https://vcpkg.io/en/getting-started.html). + +Build and install the required libraries: +```shell +vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo +``` + +Then, it's time to build your binaries. Your commands should look along the lines of: +```shell +mkdir build/ +cd build && cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake .. +make -j $(nproc) +``` + +If everything goes right, you should now have compiled binaries you should just be able to use +as a drop-in replacement for your BSD binaries in your favourite serverfiles. + +## 2. Development +The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/), +baked by the fine Czech folks at JetBrains. Educational licenses are available if you're elligible. + +1. Make sure you install all the dependencies mentioned in the "Build the binaries yourself" section. +2. Inside a WSL environment, a remote SSH one or directly on a Linux machine, just +clone this repository and open it with CLion. +3. Set up "Run/Debug Configurations" of the "CMake Application" type for +the `db`, `auth`, and `game` services, using the "db" target for the former and +the "game" target for the latter two. Make sure each service has its own working +directory with all the required configuration and game files. +4. Optionally, add a "Compound" configuration containing these three configurations +in order to start them at once. +5. Of course, you'll need a MySQL 5.x database, Valgrind and any other development +goodies you wish. Also, a lot of time. + +## 3. Improvements +### Major improvements +- The binaries run on 64-bit Linux with the network stack being partially rewritten in Libevent. +- CMake build system mainly based on `vcpkg`. Docker-friendly architectural approach. +- HackShield and other proprietary binaries were successfully _yeeted_, the project only has open-source dependencies. +- Included gamefiles from [TMP4's server files](https://metin2.dev/topic/27610-40250-reference-serverfile-client-src-15-available-languages/) (2023.08.05 version). + +### Minor improvements +- Removed unused functionalities (time bombs, activation servers, other Korean stuff) +- Switched to the [effolkronium/random PRNG](https://github.com/effolkronium/random) instead of the standard C functions. +- Refactored macros to modern C++ functions. +- Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `CONFIG` file. (Might need further work) + +## 4. Bugfixes +**WARNING: This project is based on the "kraizy" leak. That was over 10 years ago. +A lot of exploits and bugs were discovered since then. Most of these public bugs are UNPATCHED. +This is a very serious security risk and one of the reasons this project is still experimental.** + +### Gameplay +- Fixed invisibility bug on login/respawn/teleport etc. + +### Exploits +- See the warning above :( + +### Architectural +- Fixed various bugs caused by the migration of the codebase to 64-bit (some C/C++ data types have different lengths based on the CPU architecture) +- Fixed buffer overruns and hardcoded limits in the MAP_ALLOW parsing routines. +- Fixed quest server timers cancellation bug which could cause a server crash - [(thread)](https://metin2.dev/topic/25142-core-crash-when-cancelling-server-timers/). +- Fixed buffer overruns and integer overflows in SQL queries. + +## 5. Further plans +- Migrate `conf.txt` and `CONFIG` to a modern dotenv-like format, which would enable pretty nice Docker images. +- Add a health check to the Docker image. +- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting. +- Use a modern logging library to clean up the current mess. +- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server. +- Improve memory safety. +- Use fixed width integer types instead of Microsoft-style typedefs. +- Convert C-style strings to C++ `std::string`. +- Perform static and runtime analysis. +- Find and implement other fitting improvements from projects such as [Vanilla's core](https://metin2.dev/topic/14770-vanilla-core-latest-r71480/), [TMP's serverfiles](https://metin2.dev/topic/27610-40250-reference-serverfile-client-src-15-available-languages/). +- Find time to take care of this project. \ No newline at end of file