Compare commits
71 Commits
Author | SHA1 | Date |
---|---|---|
Exynox | d4fa88b7e2 | |
Exynox | 7cc9550efc | |
Exynox | c6177d9c73 | |
Exynox | 903b3bb3a5 | |
Exynox | b3a83c5238 | |
Exynox | fafa828b27 | |
Exynox | 7e8009b45d | |
Exynox | 170be95dc5 | |
Exynox | 6d65fae7e4 | |
Exynox | 8ed1e7879e | |
WildEgo | 65a81ec4a1 | |
WildEgo | ae708d9315 | |
Exynox | 48ee253534 | |
Exynox | 27108d629a | |
WildEgo | 21e028f186 | |
Exynox | 175816c81d | |
Tr0n | b15eb7f3fe | |
Tr0n | 3a8d9e38e8 | |
Tr0n | 4074c3b96a | |
Tr0n | 854fef68e8 | |
Tr0n | cf66bb3310 | |
Tr0n | 254f6f6664 | |
Tr0n | 0072bc5e14 | |
Tr0n | 62f3635b86 | |
Tr0n | 2c37b2009d | |
Tr0n | e0701ed5bd | |
Tr0n | 21381a4e3a | |
Tr0n | ba44269071 | |
Tr0n | f5ccb17736 | |
Tr0n | bb52a57ffc | |
Tr0n | 8360d6939f | |
Tr0n | 1e362d8507 | |
Tr0n | 0a907f41d2 | |
Tr0n | dbcabd7fa9 | |
Exynox | fcc2a9e4a0 | |
Tr0n | 12b6abf373 | |
Tr0n | e1daa48366 | |
Exynox | 83707434ee | |
Exynox | 042414a499 | |
Tr0n | 68c7c4bc4f | |
Tr0n | eafbee616f | |
Tr0n | 026cb861a8 | |
Tr0n | 1ba21fb1f9 | |
Tr0n | 8fede9a1df | |
Tr0n | dfb3d08998 | |
Tr0n | 326c134f9e | |
Tr0n | 9b7536ee9a | |
Tr0n | 9056f6c6c6 | |
Tr0n | 8685b02fdc | |
Tr0n | 341bef9aba | |
sdgmt2 | 8a1acefeeb | |
sdgmt2 | eacc808366 | |
sdgmt2 | 4a1460f36e | |
sdgmt2 | aae9b169df | |
sdgmt2 | dd74eafc24 | |
sdgmt2 | d471d99a24 | |
sdgmt2 | 350fb0d424 | |
sdgmt2 | 869720f9e6 | |
sdgmt2 | 4fc612552a | |
sdgmt2 | 248205ae01 | |
sdgmt2 | 82317e6c4d | |
Exynox | 847ab2ef89 | |
Exynox | ebc479b7df | |
Exynox | 1ee687f269 | |
Exynox | d85ef28eac | |
Exynox | 01cc27a7df | |
Exynox | 72b495c03c | |
Exynox | 0c86f802ca | |
Exynox | 05a1406c7c | |
Exynox | 00c5634c09 | |
Exynox | 42079d56b7 |
|
@ -2,6 +2,10 @@
|
|||
cmake-build-debug/
|
||||
cmake-build-release/
|
||||
|
||||
# IDE folders
|
||||
.vscode/
|
||||
.idea/
|
||||
|
||||
# Dockerfile (in order to allow changes without rebuilding)
|
||||
Dockerfile
|
||||
|
||||
|
@ -10,9 +14,12 @@ Dockerfile
|
|||
.gitkeep
|
||||
|
||||
# Compiled quests
|
||||
gamefiles/locale/english/quest/object/
|
||||
gamefiles/locale/english/quest/pre_qc/
|
||||
gamefiles/locale/english/quest/qc
|
||||
gamefiles/data/quest/object/
|
||||
gamefiles/data/quest/pre_qc/
|
||||
gamefiles/data/quest/qc
|
||||
|
||||
# Test folder
|
||||
test/
|
||||
|
||||
# Built files
|
||||
build/
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="PROJECT" charset="EUC-KR" />
|
||||
</component>
|
||||
</project>
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"cmake.configureOnOpen": true
|
||||
}
|
24
Dockerfile
24
Dockerfile
|
@ -1,6 +1,11 @@
|
|||
FROM ubuntu:22.04 as build
|
||||
FROM ubuntu:22.04 AS build
|
||||
WORKDIR /app
|
||||
|
||||
# Set up the CMake repository
|
||||
RUN apt-get update && apt-get install -y ca-certificates gpg wget
|
||||
RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
|
||||
RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' | tee /etc/apt/sources.list.d/kitware.list >/dev/null
|
||||
|
||||
# Update the system and install various dependencies
|
||||
RUN apt-get update && \
|
||||
apt-get install -y git cmake ninja-build build-essential tar curl zip unzip pkg-config autoconf python3 \
|
||||
|
@ -12,7 +17,7 @@ ENV VCPKG_FORCE_SYSTEM_BINARIES=1
|
|||
# Install vcpkg and the required libraries
|
||||
RUN git clone https://github.com/Microsoft/vcpkg.git
|
||||
RUN bash ./vcpkg/bootstrap-vcpkg.sh
|
||||
RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog
|
||||
RUN ./vcpkg/vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2
|
||||
|
||||
COPY . .
|
||||
|
||||
|
@ -21,10 +26,10 @@ RUN mkdir build/
|
|||
RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake ..
|
||||
RUN cd build && make -j $(nproc)
|
||||
|
||||
FROM ubuntu:22.04 as app
|
||||
FROM ubuntu:22.04 AS app
|
||||
WORKDIR /app
|
||||
|
||||
RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean
|
||||
RUN apt-get update && apt-get install -y gettext python2 libdevil-dev libbsd-dev && apt-get clean
|
||||
|
||||
# Copy the binaries from the build stage
|
||||
COPY --from=build /app/build/src/db/db /bin/db
|
||||
|
@ -34,8 +39,11 @@ COPY --from=build /app/build/src/quest/qc /bin/qc
|
|||
# Copy the game files
|
||||
COPY ./gamefiles/ .
|
||||
|
||||
# Copy the auxiliary files
|
||||
COPY ./docker/ .
|
||||
|
||||
# Compile the quests
|
||||
RUN cd /app/locale/english/quest && python2 make.py
|
||||
RUN cd /app/data/quest && python2 make.py
|
||||
|
||||
# Symlink the configuration files
|
||||
RUN ln -s "./conf/CMD" "CMD"
|
||||
|
@ -43,3 +51,9 @@ RUN ln -s ./conf/item_names_en.txt item_names.txt
|
|||
RUN ln -s ./conf/item_proto.txt item_proto.txt
|
||||
RUN ln -s ./conf/mob_names_en.txt mob_names.txt
|
||||
RUN ln -s ./conf/mob_proto.txt mob_proto.txt
|
||||
|
||||
# Set up default environment variables
|
||||
ENV PUBLIC_BIND_IP=0.0.0.0
|
||||
ENV INTERNAL_BIND_IP=0.0.0.0
|
||||
|
||||
ENTRYPOINT ["/usr/bin/bash", "docker-entrypoint.sh"]
|
||||
|
|
48
README.md
48
README.md
|
@ -7,14 +7,34 @@ 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)
|
||||
## 1. Usage
|
||||
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)
|
||||
## 2. Building
|
||||
### A. Building Docker images
|
||||
#### Building a Docker image from the repository
|
||||
In order to build a local Docker image on your local architecture, just build the
|
||||
provided Dockerfile in this project:
|
||||
|
||||
```shell
|
||||
docker build -t metin2/server:test --provenance=false .
|
||||
```
|
||||
|
||||
#### Publishing a multiplatform Docker image manually
|
||||
This command is reserved only for repository maintainers in order to publish
|
||||
new Docker images for public use with the Deployment project.
|
||||
|
||||
**WARNING:** Using WSL for building might lead to QEMU segmentation fault issues;
|
||||
this can be worked around by using `binfmt` and `qemu-user-static` as described
|
||||
[here](https://github.com/docker/buildx/issues/1170#issuecomment-1159350550).
|
||||
|
||||
```shell
|
||||
docker build --push -t git.old-metin2.com/metin2/server:<IMAGE-TAG-HERE> --platform linux/amd64,linux/arm64 --provenance=false .
|
||||
```
|
||||
|
||||
### B. Building 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._
|
||||
|
||||
|
@ -23,6 +43,7 @@ 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.
|
||||
|
||||
#### Setting up the requirements
|
||||
On your Linux box, install the dependencies for `vcpkg` and the other libraries
|
||||
we're going to install.
|
||||
```shell
|
||||
|
@ -35,22 +56,25 @@ Also install DevIL (1.7.8) and the BSD compatibility library:
|
|||
apt-get install -y libdevil-dev libbsd-dev
|
||||
```
|
||||
|
||||
Install `vcpkg` according to the [lastest instructions](https://vcpkg.io/en/getting-started.html).
|
||||
Install `vcpkg` according to the [latest 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 fmt spdlog
|
||||
vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2
|
||||
```
|
||||
|
||||
Then, it's time to build your binaries. Your commands should look along the lines of:
|
||||
#### Building the binaries
|
||||
Instead of building the binaries directly from the CLI, we recommend using an IDE, since
|
||||
you're probably doing some kind of development anyway. See the "Development" section for more information on that.
|
||||
|
||||
If you decide do build from the command line, make sure to find the right path for `vcpkg.cmake` and run the following:
|
||||
```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.
|
||||
If everything goes right, you should now have compiled binaries in the `build/` directory.
|
||||
|
||||
## 2. Development
|
||||
The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/),
|
||||
|
@ -79,8 +103,9 @@ goodies you wish. Also, a lot of time.
|
|||
- 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)
|
||||
- Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `game.conf` file. (Might need further work)
|
||||
- Refactored logging to use [spdlog](https://github.com/gabime/spdlog) for more consistent function calls.
|
||||
- Refactored login code to use Argon2ID.
|
||||
|
||||
## 4. Bugfixes
|
||||
**WARNING: This project is based on the "kraizy" leak. That was over 10 years ago.
|
||||
|
@ -101,8 +126,7 @@ This is a very serious security risk and one of the reasons this project is stil
|
|||
- 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.
|
||||
- Migrate `db.conf` and `game.conf` to a modern dotenv-like format, which would enable pretty nice Docker images.
|
||||
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
|
||||
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
|
||||
- Improve memory safety.
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
WELCOME_MSG = "DB Server has been started"
|
||||
|
||||
SQL_ACCOUNT = "${MYSQL_HOST} ${MYSQL_DB_ACCOUNT} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
|
||||
SQL_COMMON = "${MYSQL_HOST} ${MYSQL_DB_COMMON} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
|
||||
SQL_PLAYER = "${MYSQL_HOST} ${MYSQL_DB_PLAYER} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
|
||||
|
||||
TABLE_POSTFIX = ""
|
||||
|
||||
BIND_PORT = ${DB_PORT}
|
||||
DB_SLEEP_MSEC = 10
|
||||
CLIENT_HEART_FPS = 10
|
||||
HASH_PLAYER_LIFE_SEC = 600
|
||||
BACKUP_LIMIT_SEC = 3600
|
||||
PLAYER_ID_START = 100
|
||||
PLAYER_DELETE_LEVEL_LIMIT = 70
|
||||
|
||||
ITEM_ID_RANGE = 10000001 20000000
|
||||
TEST_SERVER = ${TEST_SERVER}
|
|
@ -0,0 +1,42 @@
|
|||
HOSTNAME: ${GAME_HOSTNAME}
|
||||
CHANNEL: ${GAME_CHANNEL}
|
||||
|
||||
PUBLIC_IP: ${PUBLIC_IP}
|
||||
PUBLIC_BIND_IP: ${PUBLIC_BIND_IP}
|
||||
INTERNAL_IP: ${INTERNAL_IP}
|
||||
INTERNAL_BIND_IP: ${INTERNAL_BIND_IP}
|
||||
PORT: ${GAME_PORT}
|
||||
P2P_PORT: ${GAME_P2P_PORT}
|
||||
|
||||
DB_ADDR: ${DB_ADDR}
|
||||
DB_PORT: ${DB_PORT}
|
||||
|
||||
COMMON_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_COMMON} ${MYSQL_PORT}
|
||||
LOG_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_LOG} ${MYSQL_PORT}
|
||||
PLAYER_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_PLAYER} ${MYSQL_PORT}
|
||||
TABLE_POSTFIX:
|
||||
|
||||
AUTH_SERVER: ${GAME_AUTH_SERVER}
|
||||
MARK_SERVER: ${GAME_MARK_SERVER}
|
||||
|
||||
MAP_ALLOW: ${GAME_MAP_ALLOW}
|
||||
MAX_LEVEL: ${GAME_MAX_LEVEL}
|
||||
PK_PROTECT_LEVEL: 15
|
||||
SPAM_BLOCK_MAX_LEVEL: 90
|
||||
GOLD_DROP_LIMIT_TIME: 10
|
||||
WEB_APP_URL: ${WEB_APP_URL}
|
||||
WEB_APP_KEY: ${WEB_APP_KEY}
|
||||
|
||||
CHECK_MULTIHACK: 0
|
||||
SPEEDHACK_LIMIT_COUNT: 300
|
||||
SPEEDHACK_LIMIT_BONUS: 80
|
||||
|
||||
ADMINPAGE_IP: 127.0.0.1
|
||||
ADMINPAGE_PASSWORD: metin2adminpass
|
||||
|
||||
PASSES_PER_SEC: 25
|
||||
SAVE_EVENT_SECOND_CYCLE: 180
|
||||
PING_EVENT_SECOND_CYCLE: 180
|
||||
VIEW_RANGE: 8000
|
||||
|
||||
TEST_SERVER: ${TEST_SERVER}
|
|
@ -0,0 +1,9 @@
|
|||
#!/bin/sh
|
||||
# docker-entrypoint.sh
|
||||
|
||||
# Generate configuration files based on environment variables
|
||||
envsubst <"/app/conf/db.conf.tmpl" >"/app/db.conf"
|
||||
envsubst <"/app/conf/game.conf.tmpl" >"/app/game.conf"
|
||||
|
||||
# Run the standard container command.
|
||||
exec "$@"
|
|
@ -41,8 +41,6 @@ tstr IMPLEMENTOR
|
|||
tint IMPLEMENTOR
|
||||
tcon IMPLEMENTOR
|
||||
mob_ld IMPLEMENTOR
|
||||
pcbang_check IMPLEMENTOR
|
||||
pcbang_update IMPLEMENTOR
|
||||
setqf IMPLEMENTOR
|
||||
delqf IMPLEMENTOR
|
||||
effect IMPLEMENTOR
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue