mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 00:46:46 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f9b45fc023 |
@@ -1,6 +0,0 @@
|
|||||||
!Makefile
|
|
||||||
base/*.sql
|
|
||||||
base/*.zip
|
|
||||||
base/db/
|
|
||||||
base/maps/
|
|
||||||
!base/expansion/Makefile
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# This is a "dev" image for running eqemu in development, also for dev containers
|
|
||||||
ARG USERNAME=user-name-goes-here
|
|
||||||
ARG USER_UID=1000
|
|
||||||
ARG USER_GID=$USER_UID
|
|
||||||
|
|
||||||
FROM --platform=linux/arm64 mcr.microsoft.com/devcontainers/base:debian
|
|
||||||
RUN sudo apt update && sudo apt install -y --no-install-recommends build-essential libtool cmake curl debconf-utils git libluabind-dev libsodium-dev liblua5.2-0 liblua5.2-dev libmariadb-dev libssl-dev minizip make mariadb-client locales nano open-vm-tools unzip uuid-dev iputils-ping wget libcurl4-openssl-dev gdb libyaml-cpp-dev ccache ninja-build pv mariadb-server libperl-dev libjson-perl libio-stringy-perl liblua5.1-dev libluabind-dev libboost-dev mariadb-server valgrind telnet libgoogle-perftools-dev google-perftools
|
|
||||||
|
|
||||||
USER $USERNAME
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
# This is a "dev" image for running eqemu in development, also for dev containers
|
|
||||||
ARG USERNAME=user-name-goes-here
|
|
||||||
ARG USER_UID=1000
|
|
||||||
ARG USER_GID=$USER_UID
|
|
||||||
|
|
||||||
FROM mcr.microsoft.com/devcontainers/base:debian
|
|
||||||
RUN sudo apt update && sudo apt install -y --no-install-recommends build-essential libtool cmake curl debconf-utils git libluabind-dev libsodium-dev liblua5.2-0 liblua5.2-dev libmariadb-dev libssl-dev minizip make mariadb-client locales nano open-vm-tools unzip uuid-dev iputils-ping wget libcurl4-openssl-dev gdb libyaml-cpp-dev ccache ninja-build pv mariadb-server libperl-dev libjson-perl libio-stringy-perl liblua5.1-dev libluabind-dev libboost-dev mariadb-server valgrind telnet libgoogle-perftools-dev google-perftools
|
|
||||||
|
|
||||||
USER $USERNAME
|
|
||||||
@@ -1,284 +0,0 @@
|
|||||||
NAME := eqemu-server
|
|
||||||
.ONESHELL:
|
|
||||||
|
|
||||||
DOCKER_ARGS := --rm --name ${NAME} -v $$PWD:/src -w /src ${NAME}
|
|
||||||
DOCKER_ARM64_ARGS := --rm --platform linux/arm64 --name ${NAME}-arm64 -v $$PWD:/src -w /src ${NAME}-arm64
|
|
||||||
|
|
||||||
.PHONY: build
|
|
||||||
build:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile build --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build$$BUILD_SUFFIX && cmake --build . --config Release --target all --
|
|
||||||
|
|
||||||
.PHONY: cmake
|
|
||||||
cmake:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile cmake --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@echo "working directory: $$PWD"
|
|
||||||
mkdir -p build$$BUILD_SUFFIX
|
|
||||||
@cd build$$BUILD_SUFFIX && cmake -DEQEMU_BUILD_LOGIN=ON \
|
|
||||||
-DEQEMU_BUILD_TESTS=ON \
|
|
||||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache -G Ninja ..
|
|
||||||
|
|
||||||
clean:
|
|
||||||
ifneq (,$(findstring .devcontainer,$$PWD))
|
|
||||||
@make -C ../ -f .devcontainer/Makefile clean --no-print-directory
|
|
||||||
endif
|
|
||||||
rm -rf build
|
|
||||||
|
|
||||||
docker-cmake:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile docker-cmake --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@echo "working directory: $$PWD"
|
|
||||||
git submodule update --init --recursive
|
|
||||||
docker run ${DOCKER_ARGS} make cmake
|
|
||||||
|
|
||||||
docker-build:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile docker-build --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
docker run ${DOCKER_ARGS} make build
|
|
||||||
|
|
||||||
# Build image if it doesn't exist
|
|
||||||
docker-image-build:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile docker-image-build --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
ifeq ($(shell docker images -q ${NAME} 2> /dev/null),)
|
|
||||||
@echo "Docker image not found. Building..."
|
|
||||||
docker build -f Dockerfile.debian.dev -t ${NAME} .
|
|
||||||
endif
|
|
||||||
|
|
||||||
docker-arm-cmake: docker-arm-image-build
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile docker-arm-cmake --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
git submodule update --init --recursive
|
|
||||||
docker run ${DOCKER_ARM64_ARGS} make cmake BUILD_SUFFIX=arm64
|
|
||||||
|
|
||||||
docker-arm-build: docker-arm-image-build
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile docker-arm-build --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
docker run ${DOCKER_ARM64_ARGS} make build BUILD_SUFFIX=arm64
|
|
||||||
|
|
||||||
docker-arm-image-build:
|
|
||||||
ifeq ($(shell docker images -q ${NAME}-arm64 2> /dev/null),)
|
|
||||||
@echo "Docker image not found. Building..."
|
|
||||||
docker build -f Dockerfile.debian.arm.dev -t ${NAME}-arm64 .
|
|
||||||
endif
|
|
||||||
|
|
||||||
docker-clean: clean
|
|
||||||
|
|
||||||
.PHONY: prep
|
|
||||||
prep:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile prep --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@echo "Preparing build/bin for usage..."
|
|
||||||
mkdir -p build/bin/assets/patches
|
|
||||||
cp -R -u -p .devcontainer/base/eqemu_config.json build/bin/eqemu_config.json
|
|
||||||
cp -R -u -p .devcontainer/base/login.json build/bin/login.json
|
|
||||||
cp -R -u -p loginserver/login_util/* build/bin/assets/patches/
|
|
||||||
mkdir -p build/bin/assets
|
|
||||||
cp -R -u -p utils/patches build/bin/assets/
|
|
||||||
-unlink build/bin/lua_modules
|
|
||||||
cd build/bin && ln -s quests/lua_modules lua_modules
|
|
||||||
-unlink build/bin/mods
|
|
||||||
cd build/bin && ln -s quests/mods mods
|
|
||||||
-unlink build/bin/maps
|
|
||||||
cd build/bin && ln -s ../../base/maps maps
|
|
||||||
mkdir -p build/bin/logs
|
|
||||||
mkdir -p build/bin/shared
|
|
||||||
@echo "Eqemu is prepared. Edit build/bin/eqemu_config.json to configure."
|
|
||||||
|
|
||||||
maps:
|
|
||||||
@echo "Downloading maps..."
|
|
||||||
@mkdir -p base/maps
|
|
||||||
@cd base/maps && wget -nc https://github.com/Akkadius/eqemu-maps/archive/refs/heads/master.zip
|
|
||||||
@cd base/maps && unzip -o master.zip
|
|
||||||
@cd base/maps && mv eqemu-maps-master/* .
|
|
||||||
@cd base/maps && rm -rf eqemu-maps-master
|
|
||||||
@echo "Maps downloaded."
|
|
||||||
|
|
||||||
quests:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile quests --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@cd build/bin && git clone https://github.com/ProjectEQ/projecteqquests.git quests
|
|
||||||
|
|
||||||
# Runs tests
|
|
||||||
.PHONY: test
|
|
||||||
test:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile test --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && ./tests
|
|
||||||
|
|
||||||
# Runs login binary
|
|
||||||
.PHONY: login
|
|
||||||
login:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile login --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && ./loginserver
|
|
||||||
|
|
||||||
# Runs shared_memory binary
|
|
||||||
.PHONY: shared
|
|
||||||
shared:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile shared --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && ./shared_memory
|
|
||||||
|
|
||||||
# Runs zone binary
|
|
||||||
.PHONY: zone
|
|
||||||
zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@-rm build/bin/logs/zone/zone*.log
|
|
||||||
cd build/bin && ./zone
|
|
||||||
|
|
||||||
# Runs world binary
|
|
||||||
.PHONY: world
|
|
||||||
world:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile world --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@-rm build/bin/logs/world*.log
|
|
||||||
cd build/bin && ./world
|
|
||||||
|
|
||||||
# Runs ucs binary
|
|
||||||
.PHONY: ucs
|
|
||||||
ucs:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile ucs --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@-rm build/bin/logs/ucs*.log
|
|
||||||
cd build/bin && ./ucs
|
|
||||||
|
|
||||||
# Runs queryserv binary
|
|
||||||
.PHONY: queryserv
|
|
||||||
queryserv:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile queryserv --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@-rm build/bin/logs/query_server*.log
|
|
||||||
cd build/bin && ./queryserv
|
|
||||||
|
|
||||||
valgrind-%:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile valgrind --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=logs/$*.valgrind.log ./$*
|
|
||||||
|
|
||||||
# Start mariaDB standalone
|
|
||||||
.PHONY: mariadb
|
|
||||||
mariadb:
|
|
||||||
@sudo service mariadb start
|
|
||||||
|
|
||||||
.PHONY: inject-mariadb
|
|
||||||
inject-mariadb:
|
|
||||||
-sudo service mariadb start
|
|
||||||
-mkdir -p base/db/
|
|
||||||
-sudo mariadb -e 'DROP DATABASE IF EXISTS peq;'
|
|
||||||
-sudo mariadb -e 'CREATE DATABASE peq;'
|
|
||||||
-sudo mariadb -e "CREATE USER 'peq'@'127.0.0.1' IDENTIFIED BY 'peqpass';"
|
|
||||||
-sudo mariadb -e "GRANT ALL PRIVILEGES ON *.* TO 'peq'@'127.0.0.1';"
|
|
||||||
ifeq (,$(wildcard base/db/db.sql.zip))
|
|
||||||
@echo "base/db.sql.zip not found. Downloading latest from https://db.projecteq.net/"
|
|
||||||
wget -nc https://db.projecteq.net/latest -O base/db/db.sql.zip
|
|
||||||
-cd base/db && unzip db.sql.zip
|
|
||||||
endif
|
|
||||||
@echo "Sourcing db may take a while, please wait..."
|
|
||||||
@cd base/db/peq-dump && sudo mariadb --database peq -e "source create_all_tables.sql"
|
|
||||||
@echo "MariaDB is now injected."
|
|
||||||
|
|
||||||
.PHONY: gm-%
|
|
||||||
gm-%:
|
|
||||||
sudo mariadb --database peq -e "UPDATE account SET status=255 WHERE name = '$*';"
|
|
||||||
@echo "Account $* is now a GM. /camp to have it go into effect."
|
|
||||||
|
|
||||||
depends:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile depends --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
sudo apt install graphviz pip time
|
|
||||||
pip3 install graphviz
|
|
||||||
mkdir -p build/depends
|
|
||||||
@if [ ! -f "build/depends/dependency_graph.py" ]; then \
|
|
||||||
wget https://raw.githubusercontent.com/pvigier/dependency-graph/master/dependency_graph.py -O build/depends/dependency_graph.py; \
|
|
||||||
fi
|
|
||||||
@echo "Generating dependency graphs (This may take a while)..."
|
|
||||||
@echo "Login..."
|
|
||||||
time python3 build/depends/dependency_graph.py -f png login build/depends/login.dot
|
|
||||||
@echo "World..."
|
|
||||||
time python3 build/depends/dependency_graph.py -f png world build/depends/world.dot
|
|
||||||
@echo "Zone..."
|
|
||||||
time python3 build/depends/dependency_graph.py -f png zone build/depends/zone.dot
|
|
||||||
@echo "Common..."
|
|
||||||
time python3 build/depends/dependency_graph.py -f png common build/depends/common.dot
|
|
||||||
|
|
||||||
backup:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile backup --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@mkdir -p build/bin/backup
|
|
||||||
cd build/bin && ./world database:dump --compress --player-tables --state-tables --system-tables --query-serv-tables
|
|
||||||
|
|
||||||
cpu-zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile cpu-zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@cd build/bin && mkdir -p tmp
|
|
||||||
cd build/bin && CPUPROFILE=prof.out ./zone
|
|
||||||
|
|
||||||
pprof-zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile pprof-zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && google-pprof --pdf zone prof.out > prof.pdf
|
|
||||||
pprof-web-zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile pprof-web-zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && google-pprof --web zone prof.out
|
|
||||||
pprof-gv-zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile pprof-gv-zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
cd build/bin && google-pprof --gv zone prof.out > prof.gv
|
|
||||||
heap-zone:
|
|
||||||
ifeq ($(findstring .devcontainer,$(CURDIR)),.devcontainer)
|
|
||||||
@make -C ../ -f .devcontainer/Makefile heap-zone --no-print-directory
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
@cd build/bin && mkdir -p tmp
|
|
||||||
cd build/bin && HEAPPROFILE=prof.out ./zone
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
{
|
|
||||||
"server": {
|
|
||||||
"zones": {
|
|
||||||
"defaultstatus": "0",
|
|
||||||
"ports": {
|
|
||||||
"low": "7000",
|
|
||||||
"high": "7400"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"qsdatabase": {
|
|
||||||
"host": "127.0.0.1",
|
|
||||||
"port": "3306",
|
|
||||||
"username": "peq",
|
|
||||||
"password": "peqpass",
|
|
||||||
"db": "peq"
|
|
||||||
},
|
|
||||||
"chatserver": {
|
|
||||||
"port": "7778",
|
|
||||||
"host": ""
|
|
||||||
},
|
|
||||||
"mailserver": {
|
|
||||||
"host": "",
|
|
||||||
"port": "7778"
|
|
||||||
},
|
|
||||||
"webinterface": {
|
|
||||||
"port": "9081"
|
|
||||||
},
|
|
||||||
"world": {
|
|
||||||
"longname": "New Devbox",
|
|
||||||
"address": "192.168.1.100",
|
|
||||||
"localaddress": "192.168.1.100",
|
|
||||||
"loginserver1": {
|
|
||||||
"account": "",
|
|
||||||
"password": "",
|
|
||||||
"legacy": 0,
|
|
||||||
"host": "login.projecteq.net",
|
|
||||||
"port": "5998"
|
|
||||||
},
|
|
||||||
"tcp": {
|
|
||||||
"ip": "127.0.0.1",
|
|
||||||
"port": "9001"
|
|
||||||
},
|
|
||||||
"telnet": {
|
|
||||||
"ip": "0.0.0.0",
|
|
||||||
"port": "9000",
|
|
||||||
"enabled": "true"
|
|
||||||
},
|
|
||||||
"key": "random-generate-here",
|
|
||||||
"http": {
|
|
||||||
"port": "9080",
|
|
||||||
"enabled": "true",
|
|
||||||
"mimefile": "mime.types"
|
|
||||||
},
|
|
||||||
"shortname": "dev"
|
|
||||||
},
|
|
||||||
"database": {
|
|
||||||
"db": "peq",
|
|
||||||
"host": "127.0.0.1",
|
|
||||||
"port": "3306",
|
|
||||||
"username": "peq",
|
|
||||||
"password": "peqpass"
|
|
||||||
},
|
|
||||||
"files": {
|
|
||||||
"opcodes": "assets/patches/opcodes.conf",
|
|
||||||
"mail_opcodes": "assets/patches/mail_opcodes.conf"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"patches": "assets/patches/",
|
|
||||||
"opcodes": "assets/patches/",
|
|
||||||
"plugins": "quests/plugins/"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"database": {
|
|
||||||
"host": "127.0.0.1",
|
|
||||||
"port": "3306",
|
|
||||||
"db": "peq",
|
|
||||||
"user": "peq",
|
|
||||||
"password": "peqpass"
|
|
||||||
},
|
|
||||||
"account": {
|
|
||||||
"auto_create_accounts": true
|
|
||||||
},
|
|
||||||
"worldservers": {
|
|
||||||
"unregistered_allowed": true,
|
|
||||||
"reject_duplicate_servers": false
|
|
||||||
},
|
|
||||||
"web_api": {
|
|
||||||
"enabled": true,
|
|
||||||
"port": 6000
|
|
||||||
},
|
|
||||||
"security": {
|
|
||||||
"mode": 14,
|
|
||||||
"allow_password_login": true,
|
|
||||||
"allow_token_login": true
|
|
||||||
},
|
|
||||||
"logging": {
|
|
||||||
"trace": false,
|
|
||||||
"world_trace": false,
|
|
||||||
"dump_packets_in": false,
|
|
||||||
"dump_packets_out": false
|
|
||||||
},
|
|
||||||
"client_configuration": {
|
|
||||||
"titanium_port": 5998,
|
|
||||||
"titanium_opcodes": "assets/patches/login_opcodes.conf",
|
|
||||||
"sod_port": 5999,
|
|
||||||
"sod_opcodes": "assets/patches/login_opcodes_sod.conf"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +1,21 @@
|
|||||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
|
||||||
// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu
|
// https://github.com/microsoft/vscode-dev-containers/tree/v0.101.1/containers/ubuntu-18.04-git
|
||||||
{
|
{
|
||||||
"name": "eqemu",
|
"name": "Ubuntu 18.04 EQEMU",
|
||||||
"build": {
|
// Moved from dockerfile to image so it builds faster
|
||||||
"dockerfile": "Dockerfile.debian.dev"
|
"image": "eqemu/devcontainer:0.0.2",
|
||||||
|
|
||||||
|
// Set *default* container specific settings.json values on container create.
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.shell.linux": "/bin/bash"
|
||||||
},
|
},
|
||||||
"appPort": [
|
|
||||||
"5998:5998/udp",
|
"runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
|
||||||
"7000:7000/udp",
|
|
||||||
"7001:7001/udp",
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
"7002:7002/udp",
|
"extensions": ["ms-vscode.cpptools", "ms-azuretools.vscode-docker"],
|
||||||
"7003:7003/udp",
|
"mounts": ["source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind"],
|
||||||
"7004:7004/udp",
|
|
||||||
"7005:7005/udp",
|
|
||||||
"9000:9000/udp",
|
|
||||||
"9001:9001/udp"
|
|
||||||
],
|
|
||||||
"forwardPorts": [
|
|
||||||
3306
|
|
||||||
],
|
|
||||||
"remoteEnv": {
|
"remoteEnv": {
|
||||||
"LOCALWSF": "${localWorkspaceFolder}",
|
"HOST_PROJECT_PATH": "${localWorkspaceFolder}"
|
||||||
"CONTAINERWSF": "${containerWorkspaceFolder}"
|
}
|
||||||
},
|
}
|
||||||
"containerUser": "vscode",
|
|
||||||
// add ptrace
|
|
||||||
"runArgs": [
|
|
||||||
"--cap-add=SYS_PTRACE",
|
|
||||||
"--security-opt",
|
|
||||||
"seccomp=unconfined"
|
|
||||||
],
|
|
||||||
"customizations": {
|
|
||||||
"vscode": {
|
|
||||||
"extensions": [
|
|
||||||
"ms-vscode.cpptools-extension-pack",
|
|
||||||
"vilicvane.sensitive-replace",
|
|
||||||
"maattdd.gitless",
|
|
||||||
"bibhasdn.unique-lines",
|
|
||||||
"GitHub.copilot",
|
|
||||||
"xackery.make-magic",
|
|
||||||
"Gruntfuggly.todo-tree",
|
|
||||||
"ms-vscode.cmake-tools"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"workspaceFolder": "/src",
|
|
||||||
"workspaceMount": "source=${localWorkspaceFolder},target=/src,type=bind,consistency=cached"
|
|
||||||
}
|
|
||||||
|
|||||||
+10
-81
@@ -1,8 +1,7 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
name: Build Linux
|
name: EQEmulator Server Linux CI
|
||||||
|
|
||||||
# Limits how many of these builds can run on the drone runner at a time, this isn't about cores
|
# Limits how many of these builds can run on the drone runner at a time, this isn't about cores
|
||||||
concurrency:
|
concurrency:
|
||||||
@@ -11,88 +10,18 @@ concurrency:
|
|||||||
volumes:
|
volumes:
|
||||||
- name: cache
|
- name: cache
|
||||||
host:
|
host:
|
||||||
path: /var/lib/cache-release
|
path: /var/lib/cache
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Build Linux X64
|
- name: server-build
|
||||||
image: akkadius/eqemu-server:v14
|
# Source build script https://github.com/Akkadius/akk-stack/blob/master/containers/eqemu-server/Dockerfile#L20
|
||||||
environment:
|
image: akkadius/eqemu-server:v11
|
||||||
GITHUB_TOKEN:
|
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
|
||||||
RCLONE_CONFIG_REMOTE_TYPE: ftp
|
|
||||||
RCLONE_FTP_HOST: drone.akkadius.com
|
|
||||||
RCLONE_FTP_USER: artifacts
|
|
||||||
RCLONE_FTP_PASS:
|
|
||||||
from_secret: RCLONE_FTP_PASS
|
|
||||||
commands:
|
commands:
|
||||||
- ./utils/scripts/build/linux-build.sh
|
- sudo chown eqemu:eqemu /drone/src/ * -R
|
||||||
|
- sudo chown eqemu:eqemu /home/eqemu/.ccache/ * -R
|
||||||
|
- git submodule init && git submodule update && mkdir -p build && cd build && cmake -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -DEQEMU_ENABLE_BOTS=ON -DEQEMU_BUILD_LUA=ON -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING="-O0 -g -DNDEBUG" -G 'Unix Makefiles' .. && make -j$((`nproc`-4))
|
||||||
|
- curl https://raw.githubusercontent.com/Akkadius/eqemu-install-v2/master/eqemu_config.json --output eqemu_config.json
|
||||||
|
- ./bin/tests
|
||||||
volumes:
|
volumes:
|
||||||
- name: cache
|
- name: cache
|
||||||
path: /home/eqemu/.ccache/
|
path: /home/eqemu/.ccache/
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
kind: pipeline
|
|
||||||
type: exec
|
|
||||||
name: Build Windows
|
|
||||||
|
|
||||||
# Limits how many of these builds can run on the drone runner at a time, this isn't about cores
|
|
||||||
concurrency:
|
|
||||||
limit: 1
|
|
||||||
|
|
||||||
platform:
|
|
||||||
os: windows
|
|
||||||
arch: amd64
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Build Windows X64
|
|
||||||
environment:
|
|
||||||
RCLONE_CONFIG_REMOTE_TYPE: ftp
|
|
||||||
RCLONE_FTP_HOST: drone.akkadius.com
|
|
||||||
RCLONE_FTP_USER: artifacts
|
|
||||||
RCLONE_FTP_PASS:
|
|
||||||
from_secret: RCLONE_FTP_PASS
|
|
||||||
GITHUB_TOKEN:
|
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
|
||||||
commands:
|
|
||||||
- .\utils\scripts\build\windows-build.ps1
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
kind: pipeline
|
|
||||||
type: docker
|
|
||||||
name: Publish Artifacts to Github
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Upload Artifacts
|
|
||||||
image: akkadius/eqemu-build-releaser:v3
|
|
||||||
environment:
|
|
||||||
RCLONE_CONFIG_REMOTE_TYPE: ftp
|
|
||||||
RCLONE_FTP_HOST: drone.akkadius.com
|
|
||||||
RCLONE_FTP_USER: artifacts
|
|
||||||
RCLONE_FTP_PASS:
|
|
||||||
from_secret: RCLONE_FTP_PASS
|
|
||||||
GH_RELEASE_GITHUB_API_TOKEN:
|
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
|
||||||
GITHUB_TOKEN:
|
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
|
||||||
commands:
|
|
||||||
- ./utils/scripts/build/should-release/should-release
|
|
||||||
- rclone config create remote ftp env_auth true > /dev/null
|
|
||||||
- |
|
|
||||||
rclone copy remote: --include "eqemu-server*.zip" .
|
|
||||||
- gh-release --assets=eqemu-server-linux-x64.zip,eqemu-server-windows-x64.zip -y
|
|
||||||
- |
|
|
||||||
rclone delete remote: --include "eqemu-server*.zip"
|
|
||||||
|
|
||||||
trigger:
|
|
||||||
branch:
|
|
||||||
- master
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
|
|
||||||
depends_on:
|
|
||||||
- Build Windows
|
|
||||||
- Build Linux
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-10
@@ -59,13 +59,4 @@ bin/
|
|||||||
|
|
||||||
# Clangd Generated Files.
|
# Clangd Generated Files.
|
||||||
compile_flags.txt
|
compile_flags.txt
|
||||||
.cache/
|
.cache/
|
||||||
|
|
||||||
# Build pipeline
|
|
||||||
!utils/scripts/build/
|
|
||||||
!utils/scripts/build/should-release/should-release
|
|
||||||
!utils/scripts/build/should-release/should-release.exe
|
|
||||||
|
|
||||||
# CMake Files
|
|
||||||
cmake-build-relwithdebinfo/*
|
|
||||||
skill-caps.diff
|
|
||||||
Vendored
+5
-12
@@ -3,20 +3,13 @@
|
|||||||
{
|
{
|
||||||
"name": "Linux",
|
"name": "Linux",
|
||||||
"includePath": [
|
"includePath": [
|
||||||
"${default}",
|
"${workspaceFolder}/**",
|
||||||
"${workspaceFolder}/submodules/fmt/include",
|
"/usr/include/mysql"
|
||||||
"${workspaceFolder}/submodules/cereal/include",
|
|
||||||
"${workspaceFolder}/submodules/glm",
|
|
||||||
"${workspaceFolder}/submodules/libuv/include"
|
|
||||||
],
|
|
||||||
"defines": [
|
|
||||||
"LUA_EQEMU=1"
|
|
||||||
],
|
],
|
||||||
|
"defines": [],
|
||||||
"compilerPath": "/usr/bin/gcc",
|
"compilerPath": "/usr/bin/gcc",
|
||||||
"cStandard": "c17",
|
"cStandard": "c11",
|
||||||
"cppStandard": "gnu++17",
|
"cppStandard": "c++17"
|
||||||
"intelliSenseMode": "linux-gcc-x64",
|
|
||||||
"configurationProvider": "ms-vscode.cmake-tools"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"version": 4
|
"version": 4
|
||||||
|
|||||||
Vendored
-173
@@ -1,173 +0,0 @@
|
|||||||
{
|
|
||||||
// Use IntelliSense to learn about possible attributes.
|
|
||||||
// Hover to view descriptions of existing attributes.
|
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"name": "(gdb) attach",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "attach",
|
|
||||||
"program": "${workspaceFolder}/build/bin/world",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) shared_memory",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/shared_memory",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) world",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/world",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) zone",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/zone",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"args": [
|
|
||||||
"",
|
|
||||||
],
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) zone neriakb",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/zone",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"args": [
|
|
||||||
"neriakb",
|
|
||||||
],
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) login",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/loginserver",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) ucs",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/ucs",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "(gdb) queryserv",
|
|
||||||
"type": "cppdbg",
|
|
||||||
"request": "launch",
|
|
||||||
"program": "${workspaceFolder}/build/bin/queryserv",
|
|
||||||
"cwd": "${workspaceFolder}/build/bin",
|
|
||||||
"MIMode": "gdb",
|
|
||||||
"setupCommands": [
|
|
||||||
{
|
|
||||||
"description": "Enable pretty-printing for gdb",
|
|
||||||
"text": "-enable-pretty-printing",
|
|
||||||
"ignoreFailures": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"description": "Set Disassembly Flavor to Intel",
|
|
||||||
"text": "-gdb-set disassembly-flavor intel",
|
|
||||||
"ignoreFailures": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
Vendored
+3
-134
@@ -1,136 +1,5 @@
|
|||||||
{
|
{
|
||||||
"editor.detectIndentation": false,
|
"files.associations": {
|
||||||
"editor.insertSpaces": false,
|
"*.ipp": "cpp"
|
||||||
"editor.tabSize": 4,
|
}
|
||||||
"editor.autoIndent": "full",
|
|
||||||
"editor.trimAutoWhitespace": true,
|
|
||||||
"files.trimTrailingWhitespace": true,
|
|
||||||
//"editor.formatOnSave": true,
|
|
||||||
"search.exclude": {
|
|
||||||
"dependencies": false,
|
|
||||||
},
|
|
||||||
"C_Cpp.default.includePath": [
|
|
||||||
"/usr/include/x86_64-linux-gnu",
|
|
||||||
"/usr/include/lua5.2",
|
|
||||||
"/usr/include/mariadb",
|
|
||||||
"${workspaceFolder}/dependencies/curl_x64/include",
|
|
||||||
"${workspaceFolder}/dependencies/fmt/include",
|
|
||||||
"${workspaceFolder}/dependencies/glm",
|
|
||||||
"${workspaceFolder}/dependencies/libuv/include",
|
|
||||||
"${workspaceFolder}/dependencies/sol2",
|
|
||||||
"${workspaceFolder}/dependencies/zlibng"
|
|
||||||
],
|
|
||||||
"telemetry.enableTelemetry": false,
|
|
||||||
"cmake.buildDirectory": "${workspaceFolder}/build",
|
|
||||||
"cmake.configureArgs": [
|
|
||||||
"-DEQEMU_BUILD_LOGIN=ON",
|
|
||||||
"-DEQEMU_BUILD_TESTS=ON",
|
|
||||||
"-DCMAKE_CXX_COMPILER_LAUNCHER=ccache",
|
|
||||||
"-DEQEMU_ADD_PROFILER=ON",
|
|
||||||
"Ninja"
|
|
||||||
],
|
|
||||||
"cmake.skipConfigureIfCachePresent": true,
|
|
||||||
"cmake.configureOnOpen": false,
|
|
||||||
"files.associations": {
|
|
||||||
"*.ipp": "cpp",
|
|
||||||
"functional": "cpp",
|
|
||||||
"string": "cpp",
|
|
||||||
"iostream": "cpp",
|
|
||||||
"map": "cpp",
|
|
||||||
"fstream": "cpp",
|
|
||||||
"type_traits": "cpp",
|
|
||||||
"utility": "cpp",
|
|
||||||
"cstring": "cpp",
|
|
||||||
"*.tcc": "cpp",
|
|
||||||
"cctype": "cpp",
|
|
||||||
"clocale": "cpp",
|
|
||||||
"cmath": "cpp",
|
|
||||||
"csignal": "cpp",
|
|
||||||
"cstdarg": "cpp",
|
|
||||||
"cstddef": "cpp",
|
|
||||||
"cstdio": "cpp",
|
|
||||||
"cstdlib": "cpp",
|
|
||||||
"ctime": "cpp",
|
|
||||||
"cwchar": "cpp",
|
|
||||||
"cwctype": "cpp",
|
|
||||||
"any": "cpp",
|
|
||||||
"array": "cpp",
|
|
||||||
"atomic": "cpp",
|
|
||||||
"strstream": "cpp",
|
|
||||||
"bit": "cpp",
|
|
||||||
"bitset": "cpp",
|
|
||||||
"chrono": "cpp",
|
|
||||||
"codecvt": "cpp",
|
|
||||||
"compare": "cpp",
|
|
||||||
"complex": "cpp",
|
|
||||||
"concepts": "cpp",
|
|
||||||
"condition_variable": "cpp",
|
|
||||||
"coroutine": "cpp",
|
|
||||||
"cstdint": "cpp",
|
|
||||||
"deque": "cpp",
|
|
||||||
"forward_list": "cpp",
|
|
||||||
"list": "cpp",
|
|
||||||
"set": "cpp",
|
|
||||||
"unordered_map": "cpp",
|
|
||||||
"unordered_set": "cpp",
|
|
||||||
"vector": "cpp",
|
|
||||||
"exception": "cpp",
|
|
||||||
"algorithm": "cpp",
|
|
||||||
"iterator": "cpp",
|
|
||||||
"memory": "cpp",
|
|
||||||
"memory_resource": "cpp",
|
|
||||||
"numeric": "cpp",
|
|
||||||
"optional": "cpp",
|
|
||||||
"random": "cpp",
|
|
||||||
"ratio": "cpp",
|
|
||||||
"regex": "cpp",
|
|
||||||
"source_location": "cpp",
|
|
||||||
"string_view": "cpp",
|
|
||||||
"system_error": "cpp",
|
|
||||||
"tuple": "cpp",
|
|
||||||
"future": "cpp",
|
|
||||||
"initializer_list": "cpp",
|
|
||||||
"iomanip": "cpp",
|
|
||||||
"iosfwd": "cpp",
|
|
||||||
"istream": "cpp",
|
|
||||||
"limits": "cpp",
|
|
||||||
"mutex": "cpp",
|
|
||||||
"new": "cpp",
|
|
||||||
"numbers": "cpp",
|
|
||||||
"ostream": "cpp",
|
|
||||||
"semaphore": "cpp",
|
|
||||||
"sstream": "cpp",
|
|
||||||
"stdexcept": "cpp",
|
|
||||||
"stop_token": "cpp",
|
|
||||||
"streambuf": "cpp",
|
|
||||||
"thread": "cpp",
|
|
||||||
"cfenv": "cpp",
|
|
||||||
"cinttypes": "cpp",
|
|
||||||
"typeindex": "cpp",
|
|
||||||
"typeinfo": "cpp",
|
|
||||||
"valarray": "cpp",
|
|
||||||
"variant": "cpp",
|
|
||||||
"csetjmp": "cpp",
|
|
||||||
"charconv": "cpp",
|
|
||||||
"format": "cpp",
|
|
||||||
"ranges": "cpp",
|
|
||||||
"span": "cpp"
|
|
||||||
},
|
|
||||||
"cmake.statusbar.advanced": {
|
|
||||||
"kit": {
|
|
||||||
"visibility": "hidden",
|
|
||||||
},
|
|
||||||
"debug": {
|
|
||||||
"visibility": "hidden",
|
|
||||||
},
|
|
||||||
"buildTarget": {
|
|
||||||
"visibility": "hidden",
|
|
||||||
},
|
|
||||||
"launch": {
|
|
||||||
"visibility": "hidden",
|
|
||||||
},
|
|
||||||
"ctest": {
|
|
||||||
"visibility": "icon",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Vendored
+164
@@ -0,0 +1,164 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
|
// for the documentation about the tasks.json format
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "make",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cd bin && make",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "make clean",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cd bin && make clean",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "cmake",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mkdir -p bin && cd bin && rm CMakeCache.txt && cmake -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_LUA=ON -G 'Unix Makefiles' ..",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher":{
|
||||||
|
"owner": "cpp",
|
||||||
|
"fileLocation": "relative",
|
||||||
|
"pattern":[
|
||||||
|
{
|
||||||
|
"regexp": "([\\w+|\\\\]*\\.\\w+)\\((\\d+)\\)\\: (warning|error) (.*)$",
|
||||||
|
"file": 1,
|
||||||
|
"location": 2,
|
||||||
|
"severity": 3,
|
||||||
|
"message": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "download maps",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mkdir -p bin && cd bin && wget https://codeload.github.com/Akkadius/EQEmuMaps/zip/master -O maps.zip && unzip -o maps.zip && rm ./maps -rf && mv EQEmuMaps-master maps && rm maps.zip",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "download quests",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mkdir -p bin && cd bin && cd server && git -C ./quests pull 2> /dev/null || git clone https://github.com/ProjectEQ/projecteqquests.git quests",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "download eqemu_config",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mkdir -p bin && cd bin && wget --no-check-certificate https://raw.githubusercontent.com/Akkadius/EQEmuInstall/master/eqemu_config_docker.json -O eqemu_config.json",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "rebuild database (mariadb must be started)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "mkdir -p bin && cd bin && docker run -i --rm --privileged -v ${HOST_PROJECT_PATH}/bin:/src --network=eqemu -it eqemu/server:0.0.3 bash -c './eqemu_server.pl source_peq_db && ./eqemu_server.pl check_db_updates && ./eqemu_server.pl linux_login_server_setup'",
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": [
|
||||||
|
"$gcc"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "zone 7000",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop zone7000 | true && docker network create eqemu | true && docker run -i --rm --name zone7000 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu -p 7000:7000/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7000:7000",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "zone 7001",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop zone7001 | true && docker network create eqemu | true && docker run -i --rm --name zone7001 --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu -p 7001:7001/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./zone dynamic_zone7001:7001",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "loginserver",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop loginserver | true && docker network create eqemu | true && docker run -i --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --privileged -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 --network=eqemu --name loginserver -p 5999:5999/udp -p 5998:5998/udp -e LD_LIBRARY_PATH=/src/ eqemu/server:0.0.3 gdb -ex run --args ./loginserver",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "shared_memory, world",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop sharedmemory | true && docker stop world | true && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --network=eqemu --name sharedmemory eqemu/server:0.0.3 ./shared_memory && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name world -p 9000:9000 -p 9000:9000/udp -p 9001:9001 -p 9080:9080 eqemu/server:0.0.3 gdb -ex run ./world",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "queryserv",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop queryserv | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src --ulimit core=10000000 -e LD_LIBRARY_PATH=/src/ --network=eqemu --name queryserv eqemu/server:0.0.3 gdb -ex run ./queryserv",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "mariadb",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop mariadb | true && cd bin && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin/db:/bitnami/mariadb -p 3306:3306 -e MARIADB_DATABASE=peq -e MARIADB_USER=eqemu -e MARIADB_PASSWORD=eqemupass -e ALLOW_EMPTY_PASSWORD=yes --name mariadb --network=eqemu bitnami/mariadb:latest",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "ucs",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "docker stop ucs | true && cd bin && docker network create eqemu | true && docker run --rm -v ${HOST_PROJECT_PATH}/bin:/src -p 7778:7778 --name ucs --network=eqemu eqemu/server:0.0.3 gdb -ex run ./ucs",
|
||||||
|
"group": {
|
||||||
|
"kind": "test",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -40,14 +40,14 @@ Assuming it is starting in c:/projects/eqemu and the x64 dependencies were extra
|
|||||||
|
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake -G "Visual Studio 15 2017 Win64" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_ZLIB=ON -DCMAKE_TOOLCHAIN_FILE="c:/projects/eqemu/vcpkg/vcpkg-export-20180828-145455/scripts/buildsystems/vcpkg.cmake" ..
|
cmake -G "Visual Studio 15 2017 Win64" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -DEQEMU_BUILD_ZLIB=ON -DEQEMU_ENABLE_BOTS=ON -DCMAKE_TOOLCHAIN_FILE="c:/projects/eqemu/vcpkg/vcpkg-export-20180828-145455/scripts/buildsystems/vcpkg.cmake" ..
|
||||||
|
|
||||||
##### Linux
|
##### Linux
|
||||||
Similarly to Windows running CMake on Linux is simple it just omits the toolchain file and uses a different generator.
|
Similarly to Windows running CMake on Linux is simple it just omits the toolchain file and uses a different generator.
|
||||||
|
|
||||||
mkdir build
|
mkdir build
|
||||||
cd build
|
cd build
|
||||||
cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON ..
|
cmake -G "Unix Makefiles" -DEQEMU_BUILD_TESTS=ON -DEQEMU_ENABLE_BOTS=ON -DEQEMU_BUILD_LOGIN=ON ..
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
|
|||||||
-4921
File diff suppressed because it is too large
Load Diff
+10
-45
@@ -16,31 +16,6 @@ SET(CMAKE_CXX_STANDARD 20)
|
|||||||
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
SET(CMAKE_CXX_EXTENSIONS OFF)
|
SET(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
OPTION(EQEMU_BUILD_STATIC "Build with static linking" OFF)
|
|
||||||
OPTION(EQEMU_BUILD_PCH "Build with precompiled headers (Windows)" ON)
|
|
||||||
|
|
||||||
IF (EQEMU_BUILD_STATIC)
|
|
||||||
SET(BUILD_SHARED_LIBS OFF)
|
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a")
|
|
||||||
MESSAGE(STATUS "Building with static linking")
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
|
||||||
IF (UNIX)
|
|
||||||
SET(PERL_LIBRARY "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/libperl.so")
|
|
||||||
SET(PERL_INCLUDE_PATH "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/")
|
|
||||||
SET(PERL_EXECUTABLE "/opt/eqemu-perl/bin/perl")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF (EQEMU_BUILD_STATIC)
|
|
||||||
|
|
||||||
|
|
||||||
# Requires libgoogle-perftools-dev google-perftools packages for linux (debian)
|
|
||||||
IF(EQEMU_ADD_PROFILER)
|
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--no-as-needed,-lprofiler,--as-needed")
|
|
||||||
ENDIF(EQEMU_ADD_PROFILER)
|
|
||||||
|
|
||||||
IF(USE_MAP_MMFS)
|
|
||||||
ADD_DEFINITIONS(-DUSE_MAP_MMFS)
|
|
||||||
ENDIF (USE_MAP_MMFS)
|
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
ADD_DEFINITIONS(-DNOMINMAX)
|
ADD_DEFINITIONS(-DNOMINMAX)
|
||||||
@@ -48,11 +23,6 @@ IF(MSVC)
|
|||||||
ADD_DEFINITIONS(-D_HAS_AUTO_PTR_ETC) # for Luabind on C++17
|
ADD_DEFINITIONS(-D_HAS_AUTO_PTR_ETC) # for Luabind on C++17
|
||||||
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||||
|
|
||||||
OPTION(EQEMU_DISABLE_MSVC_WARNINGS "Disable MSVC compile warnings." ON)
|
|
||||||
IF(EQEMU_DISABLE_MSVC_WARNINGS)
|
|
||||||
ADD_DEFINITIONS( "/W0 /D_CRT_SECURE_NO_WARNINGS /wd4005 /wd4996 /nologo /Os")
|
|
||||||
ENDIF(EQEMU_DISABLE_MSVC_WARNINGS)
|
|
||||||
ELSE(MSVC)
|
ELSE(MSVC)
|
||||||
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
|
ADD_DEFINITIONS(-DHAS_UNION_SEMUN)
|
||||||
ENDIF(MSVC)
|
ENDIF(MSVC)
|
||||||
@@ -149,16 +119,10 @@ ELSE()
|
|||||||
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
MESSAGE(STATUS "PERL_INCLUDE_PATH: ${PERL_INCLUDE_PATH}")
|
|
||||||
MESSAGE(STATUS "PERL_LIBRARY: ${PERL_LIBRARY}")
|
|
||||||
MESSAGE(STATUS "PERL_INCLUDE_DIR: ${PERL_INCLUDE_DIR}")
|
|
||||||
MESSAGE(STATUS "PERL_INCLUDE_DIRS: ${PERL_INCLUDE_DIRS}")
|
|
||||||
MESSAGE(STATUS "PERL_LIBRARIES: ${PERL_LIBRARIES}")
|
|
||||||
MESSAGE(STATUS "PERL_VERSION: ${PERL_VERSION}")
|
|
||||||
|
|
||||||
MESSAGE(STATUS "**************************************************")
|
MESSAGE(STATUS "**************************************************")
|
||||||
|
|
||||||
#options
|
#options
|
||||||
|
OPTION(EQEMU_ENABLE_BOTS "Enable Bots" OFF)
|
||||||
OPTION(EQEMU_COMMANDS_LOGGING "Enable GM Command logs" ON)
|
OPTION(EQEMU_COMMANDS_LOGGING "Enable GM Command logs" ON)
|
||||||
OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
|
OPTION(EQEMU_BUILD_SERVER "Build the game server." ON)
|
||||||
OPTION(EQEMU_BUILD_LOGIN "Build the login server." ON)
|
OPTION(EQEMU_BUILD_LOGIN "Build the login server." ON)
|
||||||
@@ -212,6 +176,10 @@ IF(EQEMU_COMMANDS_LOGGING)
|
|||||||
ADD_DEFINITIONS(-DCOMMANDS_LOGGING)
|
ADD_DEFINITIONS(-DCOMMANDS_LOGGING)
|
||||||
ENDIF(EQEMU_COMMANDS_LOGGING)
|
ENDIF(EQEMU_COMMANDS_LOGGING)
|
||||||
|
|
||||||
|
IF(EQEMU_ENABLE_BOTS)
|
||||||
|
ADD_DEFINITIONS(-DBOTS)
|
||||||
|
ENDIF(EQEMU_ENABLE_BOTS)
|
||||||
|
|
||||||
#database
|
#database
|
||||||
IF(MySQL_FOUND AND MariaDB_FOUND)
|
IF(MySQL_FOUND AND MariaDB_FOUND)
|
||||||
SET(DATABASE_LIBRARY_SELECTION MariaDB CACHE STRING "Database library to use:
|
SET(DATABASE_LIBRARY_SELECTION MariaDB CACHE STRING "Database library to use:
|
||||||
@@ -343,10 +311,6 @@ ELSE()
|
|||||||
SET(ZLIB_LIBRARY_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
|
SET(ZLIB_LIBRARY_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/libs/zlibng")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
IF (EQEMU_BUILD_STATIC)
|
|
||||||
SET(ZLIB_LIBRARY_LIBS libz.a)
|
|
||||||
ENDIF(EQEMU_BUILD_STATIC)
|
|
||||||
|
|
||||||
MESSAGE(STATUS "")
|
MESSAGE(STATUS "")
|
||||||
MESSAGE(STATUS "**************************************************")
|
MESSAGE(STATUS "**************************************************")
|
||||||
MESSAGE(STATUS "* Library Usage *")
|
MESSAGE(STATUS "* Library Usage *")
|
||||||
@@ -379,6 +343,11 @@ INCLUDE_DIRECTORIES(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/submodules/websocketpp")
|
|||||||
# silence obnoxious deprecation message
|
# silence obnoxious deprecation message
|
||||||
ADD_DEFINITIONS(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)
|
ADD_DEFINITIONS(-DBOOST_BIND_GLOBAL_PLACEHOLDERS)
|
||||||
|
|
||||||
|
OPTION(EQEMU_BUILD_LOGGING "Build Logging (To speed up compilation)" ON)
|
||||||
|
IF(EQEMU_BUILD_LOGGING)
|
||||||
|
ADD_DEFINITIONS(-DBUILD_LOGGING)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF(TLS_LIBRARY_ENABLED)
|
IF(TLS_LIBRARY_ENABLED)
|
||||||
SET(SERVER_LIBS ${SERVER_LIBS} ${TLS_LIBRARY_LIBS})
|
SET(SERVER_LIBS ${SERVER_LIBS} ${TLS_LIBRARY_LIBS})
|
||||||
INCLUDE_DIRECTORIES(SYSTEM "${TLS_LIBRARY_INCLUDE}")
|
INCLUDE_DIRECTORIES(SYSTEM "${TLS_LIBRARY_INCLUDE}")
|
||||||
@@ -411,10 +380,6 @@ IF(PERL_LIBRARY_ENABLED)
|
|||||||
INCLUDE_DIRECTORIES(SYSTEM "${PERL_LIBRARY_INCLUDE}")
|
INCLUDE_DIRECTORIES(SYSTEM "${PERL_LIBRARY_INCLUDE}")
|
||||||
ADD_DEFINITIONS(-DEMBPERL)
|
ADD_DEFINITIONS(-DEMBPERL)
|
||||||
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
||||||
ADD_DEFINITIONS(-DPERLBIND_NO_STRICT_SCALAR_TYPES)
|
|
||||||
IF (UNIX AND EQEMU_BUILD_STATIC)
|
|
||||||
SET(SERVER_LIBS ${SERVER_LIBS} libcrypt.a)
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|||||||
@@ -1,147 +1,79 @@
|
|||||||
<h1 align="center">EQEmulator Server Platform</h1>
|
# EQEmulator Core Server
|
||||||
|
|Travis CI (Linux)|Appveyor (Windows x86) |Appveyor (Windows x64) |
|
||||||
<p align="center">
|
|:---:|:---:|:---:|
|
||||||
<img src="https://github.com/user-attachments/assets/11942e15-b512-402d-a619-0543c7f1151e" style="border-radius: 10px">
|
|[](https://travis-ci.org/EQEmu/Server) |[](https://ci.appveyor.com/project/KimLS/server) |[](https://ci.appveyor.com/project/KimLS/server-87crp) |
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<b>EverQuest Emulator (EQEmu) - A Fan-Made Project Honoring the Legendary MMORPG</b>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://github.com/eqemu/server/graphs/contributors"><img src="https://img.shields.io/github/contributors/eqemu/server" alt="Contributors"></a>
|
|
||||||
<a href="https://discord.gg/QHsm7CD"><img src="https://img.shields.io/discord/212663220849213441?label=Discord&logo=discord&color=7289DA" alt="Discord"></a>
|
|
||||||
<a href="https://docs.eqemu.io"><img src="https://img.shields.io/badge/docs-MkDocs%20Powered-blueviolet" alt="Docs"></a>
|
|
||||||
<a href="./LICENSE"><img src="https://img.shields.io/github/license/EQEmu/Server" alt="License"></a>
|
|
||||||
<a href="https://github.com/eqemu/server/releases"><img src="https://img.shields.io/github/v/release/eqemu/server" alt="Latest Release"></a>
|
|
||||||
<a href="https://github.com/EQEmu/Server/releases"><img src="https://img.shields.io/github/release-date/EQEmu/Server" alt="Release Date"></a>
|
|
||||||
<img src="https://img.shields.io/github/downloads/eqemu/server/total.svg" alt="Github All Releases"></a>
|
|
||||||
<a href="http://drone.akkadius.com/EQEmu/Server"><img src="http://drone.akkadius.com/api/badges/EQEmu/Server/status.svg" alt="Build Status"></a>
|
|
||||||
<img src="https://img.shields.io/github/issues-pr-closed/eqemu/server" alt="GitHub Issues or Pull Requests">
|
|
||||||
<img src="https://img.shields.io/docker/pulls/akkadius/eqemu-server" alt="Docker Pulls">
|
|
||||||
<a href="http://drone.akkadius.com/EQEmu/Server"><img src="http://drone.akkadius.com/api/badges/EQEmu/Server/status.svg" alt="Build Status"></a> <img src="https://jb.gg/badges/official-plastic.svg" alt="Official">
|
|
||||||
|
|
||||||
</p>
|
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
<p align="center">
|
**EQEmulator is a custom completely from-scratch open source server implementation for EverQuest built mostly on C++**
|
||||||
EQEmulator is a <b>passion-driven</b>, <b>open source server emulator</b> project dedicated to preserving and celebrating the groundbreaking world of <b>EverQuest</b>, the massively multiplayer online role-playing game originally developed by <b>Verant Interactive</b> and <b>Sony Online Entertainment (now Daybreak Game Company)</b>.
|
* MySQL/MariaDB is used as the database engine (over 200+ tables)
|
||||||
</p>
|
* Perl and LUA are both supported scripting languages for NPC/Player/Quest oriented events
|
||||||
|
* Open source database (Project EQ) has content up to expansion OoW (included in server installs)
|
||||||
|
* Game server environments and databases can be heavily customized to create all new experiences
|
||||||
|
* Hundreds of Quests/events created and maintained by Project EQ
|
||||||
|
|
||||||
<p align="center">
|
## Server Installs
|
||||||
For over two decades and continuing, EQEmulator has served as a <strong>fan tribute</strong>, providing tools and technology that allow players to explore, customize, and experience EverQuest’s iconic gameplay in new ways. This project exists solely out of <strong>deep admiration</strong> for the original developers, artists, designers, and visionaries who created one of the most influential online worlds of all time.
|
| |Windows|Linux|
|
||||||
</p>
|
|:---:|:---:|:---:|
|
||||||
|
|**Install Count**|||
|
||||||
|
### > Windows
|
||||||
|
|
||||||
<p align="center">
|
* [Install Guide](https://docs.eqemu.io/server/installation/server-installation-windows/)
|
||||||
We do not claim ownership of EverQuest or its assets. <strong>All credit and respect belong to the original creators and Daybreak Game Company</strong>, whose work continues to inspire generations of players and developers alike.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
### > Debian/Ubuntu/CentOS/Fedora
|
||||||
EQEmulator has for over 20 years and always will be a <strong>fan-based, non-commercial open-source effort</strong> made by players, for players—preserving the legacy of EverQuest while empowering community-driven creativity, learning and joy that the game and its creators has so strongly inspired in us all.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
***
|
* [Install Guide](https://docs.eqemu.io/server/installation/server-installation-linux/)
|
||||||
|
|
||||||
<h3 align="center">
|
* You can use curl or wget to kick off the installer (whichever your OS has)
|
||||||
Technical Overview & Reverse Engineering Effort
|
> curl -O https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/linux_installer/install.sh install.sh && chmod 755 install.sh && ./install.sh
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">EQEmulator represents <strong>over two decades of collaborative reverse engineering</strong>, rebuilding the EverQuest server from the ground up without access to the original source code. This effort was achieved entirely through <strong>community-driven analysis, network protocol decoding, and in-game behavioral research</strong>.</p>
|
> wget --no-check-certificate https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/linux_installer/install.sh -O install.sh && chmod 755 install.sh && ./install.sh
|
||||||
|
|
||||||
<h1 align="center">
|
## Supported Clients
|
||||||
💡 How We Did It
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="https://github.com/user-attachments/assets/b6b48cf7-f64a-4497-9750-71f442a3d132" height="300px">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<strong>Reverse Engineering</strong>
|
|
||||||
Every system, packet, opcode, and game mechanic has been reconstructed through countless hours of live packet sniffing, client disassembly, and in-game experimentation by dedicated contributors over the years.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
No proprietary code or server sources were ever used.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
All implementations are the result of clean-room engineering.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<h1 align="center">
|
|
||||||
🛠️ Technology Stack
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="https://github.com/user-attachments/assets/df5ea809-86c5-439d-a8fa-651fb04ba477" style="border-radius: 10px">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
**C++ Core Engine**
|
|
||||||
|
|
||||||
* High-performance networking and gameplay logic built in C++
|
|
||||||
* Cross-platform support for Linux and Windows
|
|
||||||
|
|
||||||
**MySQL / MariaDB Backend**
|
|
||||||
|
|
||||||
* Fully structured schema with over 200+ tables
|
|
||||||
* Supports content customization, expansions, and custom worlds
|
|
||||||
|
|
||||||
**Scripting Engine**
|
|
||||||
|
|
||||||
* Native support for **Perl** and **Lua** scripting
|
|
||||||
* Powerfully extendable for quests, NPC behaviors, and custom events
|
|
||||||
|
|
||||||
**Open Source Content Database**
|
|
||||||
|
|
||||||
* Includes ProjectEQ’s world data up through *Dragons of Norrath*
|
|
||||||
* 100% customizable to create entirely new game worlds
|
|
||||||
|
|
||||||
<h1 align="center">
|
|
||||||
🚀 Why It Matters
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">🧬 EQEmulator stands as a <strong>technical preservation project</strong>, ensuring that the magic of classic and custom EverQuest servers lives on for future generations of players, tinkerers, and game designers.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
> We humbly acknowledge and thank the original developers at **Verant Interactive** and **Sony Online Entertainment (now Daybreak Game Company)** for creating one of the most influential online experiences in gaming history.
|
|
||||||
|
|
||||||
<h1 align="center">
|
|
||||||
🧑💻🖥️ Supported Clients
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
|Titanium Edition|Secrets of Faydwer|Seeds of Destruction|Underfoot|Rain of Fear|
|
|Titanium Edition|Secrets of Faydwer|Seeds of Destruction|Underfoot|Rain of Fear|
|
||||||
|:---:|:---:|:---:|:---:|:---:|
|
|:---:|:---:|:---:|:---:|:---:|
|
||||||
|<img src="http://i.imgur.com/hrwDxoM.jpg" height="150">|<img src="http://i.imgur.com/cRDW5tn.png" height="150">|<img src="http://i.imgur.com/V48kuVn.jpg" height="150">|<img src="http://i.imgur.com/IJQ0XMa.jpg" height="150">|<img src="http://i.imgur.com/OMpHkKa.png" height="100">|
|
|<img src="http://i.imgur.com/hrwDxoM.jpg" height="150">|<img src="http://i.imgur.com/cRDW5tn.png" height="150">|<img src="http://i.imgur.com/V48kuVn.jpg" height="150">|<img src="http://i.imgur.com/IJQ0XMa.jpg" height="150">|<img src="http://i.imgur.com/OMpHkKa.png" height="100">|
|
||||||
|
|
||||||
## 📚 Resources
|
## Bug Reports <img src="http://i.imgur.com/daf1Vjw.png" height="20">
|
||||||
|
* Please use the [issue tracker](https://github.com/EQEmu/Server/issues) provided by GitHub to send us bug
|
||||||
|
reports or feature requests.
|
||||||
|
* The [EQEmu Forums](http://www.eqemulator.org/forums/) are also a place to submit and get help with bugs.
|
||||||
|
|
||||||
| Resource | Badges | Link |
|
## Contributions <img src="http://image.flaticon.com/icons/png/512/25/25231.png" width="20">
|
||||||
|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
|
|
||||||
| **EQEmulator Docs** | [](https://docs.eqemu.io) | [docs.eqemu.io](https://docs.eqemu.io/) |
|
|
||||||
| **Discord Community**| [](https://discord.gg/QHsm7CD) | [Join Discord](https://discord.gg/QHsm7CD) |
|
|
||||||
| **Latest Release** | [](https://github.com/eqemu/server/releases) <br> [](https://github.com/EQEmu/Server/releases) <br> [](https://github.com/eqemu/server/releases) | [View Releases](https://github.com/eqemu/server/releases) |
|
|
||||||
| **License** | [](./LICENSE) | [View License](./LICENSE) |
|
|
||||||
| **Build Status** | [](http://drone.akkadius.com/EQEmu/Server) | [View Build Status](http://drone.akkadius.com/EQEmu/Server) |
|
|
||||||
| **Docker Pulls** | [](https://hub.docker.com/r/akkadius/eqemu-server) | [Docker Hub](https://hub.docker.com/r/akkadius/eqemu-server) |
|
|
||||||
| **Contributions** | [](https://github.com/eqemu/server/pulls?q=is%3Apr+is%3Aclosed) | [Closed PRs & Issues](https://github.com/eqemu/server/pulls?q=is%3Apr+is%3Aclosed) |
|
|
||||||
|
|
||||||
## 🛠️ Getting Started
|
* The preferred way to contribute is to fork the repo and submit a pull request on
|
||||||
|
GitHub. If you need help with your changes, you can always post on the forums or
|
||||||
|
try Discord. You can also post unified diffs (`git diff` should do the trick) on the
|
||||||
|
[Server Code Submissions](http://www.eqemulator.org/forums/forumdisplay.php?f=669)
|
||||||
|
forum, although pull requests will be much quicker and easier on all parties.
|
||||||
|
|
||||||
If you want to set up your own EQEmulator server, please refer to the current [server installation guides](https://docs.eqemu.io/#server-installation). We've had 100,000s of players and developers use our guides to set up their own servers, and we hope you will too!
|
## Contact <img src="http://gamerescape.com/wp-content/uploads/2015/06/discord.png" height="20">
|
||||||
|
|
||||||
## 🗂️ Related Repositories
|
- Discord Channel: https://discord.gg/QHsm7CD
|
||||||
|
- **User Discord Channel**: `#general`
|
||||||
|
- **Developer Discord Channel**: `#eqemucoders`
|
||||||
|
|
||||||
| Repository | Description |
|
## Resources
|
||||||
|--------------------|----------------------------------------------------------------------------------|
|
- [EQEmulator Forums](http://www.eqemulator.org/forums)
|
||||||
| [ProjectEQ Quests](https://github.com/ProjectEQ/projecteqquests) | Official quests and event scripts for ProjectEQ |
|
- [EQEmulator Wiki](https://docs.eqemu.io/)
|
||||||
| [Maps](https://github.com/Akkadius/EQEmuMaps) | EQEmu-compatible zone maps |
|
|
||||||
| [Installer Resources](https://github.com/Akkadius/EQEmuInstall) | Scripts and assets for setting up EQEmu servers |
|
|
||||||
| [Zone Utilities](https://github.com/EQEmu/zone-utilities) | Utilities for parsing, rendering, and manipulating EQ zone files |
|
|
||||||
|
|
||||||
|
## Related Repositories
|
||||||
|
* [ProjectEQ Quests](https://github.com/ProjectEQ/projecteqquests)
|
||||||
|
* [Maps](https://github.com/Akkadius/EQEmuMaps)
|
||||||
|
* [Installer Resources](https://github.com/Akkadius/EQEmuInstall)
|
||||||
|
* [Zone Utilities](https://github.com/EQEmu/zone-utilities) - Various utilities and libraries for parsing, rendering and manipulating EQ Zone files.
|
||||||
|
|
||||||
|
## Other License Info
|
||||||
|
|
||||||
|
* The server code and utilities are released under **GPLv3**
|
||||||
|
* We also include some small libraries for convienence that may be under different licensing
|
||||||
|
* SocketLib - GPL LibXML
|
||||||
|
* zlib - zlib license
|
||||||
|
* MariaDB/MySQL - GPL
|
||||||
|
* GPL Perl - GPL / ActiveState (under the assumption that this is a free project)
|
||||||
|
* CPPUnit - GLP StringUtilities - Apache
|
||||||
|
* LUA - MIT
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
version: 1.0.{build}
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
image: Visual Studio 2017
|
||||||
|
configuration: RelWithDebInfo
|
||||||
|
clone_folder: c:\projects\eqemu
|
||||||
|
init:
|
||||||
|
- ps: git config --global core.autocrlf input
|
||||||
|
cache: c:\tools\vcpkg\installed\
|
||||||
|
before_build:
|
||||||
|
- ps: "$wc = New-Object System.Net.WebClient\n$wc.DownloadFile(\"http://strawberryperl.com/download/5.26.2.1/strawberry-perl-5.26.2.1-64bit-portable.zip\", \"c:\\projects\\eqemu\\strawberry-perl-5.26.2.1-64bit-portable.zip\")\ncd c:\\projects\\eqemu\n7z x c:/projects/eqemu/strawberry-perl-5.26.2.1-64bit-portable.zip -oc:/projects/eqemu/strawberry-perl-portable -y\n(Get-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h).replace('#define PERL_STATIC_INLINE static __inline__', '#define PERL_STATIC_INLINE static __inline') | Set-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h\nvcpkg install boost-geometry:x64-windows boost-dynamic-bitset:x64-windows luajit:x64-windows libsodium:x64-windows libmysql:x64-windows openssl:x64-windows zlib:x64-windows \nmkdir build\ncd build\ncmake -G \"Visual Studio 15 2017 Win64\" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -EQEMU_ENABLE_BOTS=ON -DPERL_EXECUTABLE=\"C:/projects/eqemu/strawberry-perl-portable/perl/bin/perl.exe\" -DPERL_INCLUDE_PATH=\"C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE\" -DPERL_LIBRARY=\"C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/libperl526.a\" -DCMAKE_TOOLCHAIN_FILE=\"c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake\" .."
|
||||||
|
build:
|
||||||
|
project: C:\projects\eqemu\build\EQEmu.sln
|
||||||
|
parallel: true
|
||||||
|
verbosity: minimal
|
||||||
|
after_build:
|
||||||
|
- cmd: >-
|
||||||
|
7z a build_x64-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb C:\projects\eqemu\build\libs\zlibng\RelWithDebInfo\*.dll
|
||||||
|
|
||||||
|
appveyor PushArtifact build_x64-bots.zip
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
version: 1.0.{build}
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
||||||
|
image: Visual Studio 2017
|
||||||
|
configuration: RelWithDebInfo
|
||||||
|
clone_folder: c:\projects\eqemu
|
||||||
|
init:
|
||||||
|
- ps: git config --global core.autocrlf input
|
||||||
|
cache: c:\tools\vcpkg\installed\
|
||||||
|
before_build:
|
||||||
|
- ps: "$wc = New-Object System.Net.WebClient\n$wc.DownloadFile(\"http://strawberryperl.com/download/5.26.2.1/strawberry-perl-5.26.2.1-64bit-portable.zip\", \"c:\\projects\\eqemu\\strawberry-perl-5.26.2.1-64bit-portable.zip\")\ncd c:\\projects\\eqemu\n7z x c:/projects/eqemu/strawberry-perl-5.26.2.1-64bit-portable.zip -oc:/projects/eqemu/strawberry-perl-portable -y\n(Get-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h).replace('#define PERL_STATIC_INLINE static __inline__', '#define PERL_STATIC_INLINE static __inline') | Set-Content C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/config.h\nvcpkg install boost-geometry:x64-windows boost-dynamic-bitset:x64-windows luajit:x64-windows libsodium:x64-windows libmysql:x64-windows openssl:x64-windows zlib:x64-windows \nmkdir build\ncd build\ncmake -G \"Visual Studio 15 2017 Win64\" -DEQEMU_BUILD_TESTS=ON -DEQEMU_BUILD_LOGIN=ON -EQEMU_ENABLE_BOTS=OFF -DPERL_EXECUTABLE=\"C:/projects/eqemu/strawberry-perl-portable/perl/bin/perl.exe\" -DPERL_INCLUDE_PATH=\"C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE\" -DPERL_LIBRARY=\"C:/projects/eqemu/strawberry-perl-portable/perl/lib/CORE/libperl526.a\" -DCMAKE_TOOLCHAIN_FILE=\"c:/tools/vcpkg/scripts/buildsystems/vcpkg.cmake\" .."
|
||||||
|
build:
|
||||||
|
project: C:\projects\eqemu\build\EQEmu.sln
|
||||||
|
parallel: true
|
||||||
|
verbosity: minimal
|
||||||
|
after_build:
|
||||||
|
- cmd: >-
|
||||||
|
7z a build_x64-no-bots.zip C:\projects\eqemu\build\bin\RelWithDebInfo\*.exe C:\projects\eqemu\build\bin\RelWithDebInfo\*.dll C:\projects\eqemu\build\bin\RelWithDebInfo\*.pdb C:\projects\eqemu\build\libs\zlibng\RelWithDebInfo\*.dll
|
||||||
|
|
||||||
|
appveyor PushArtifact build_x64-no-bots.zip
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
|
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
|
||||||
|
|
||||||
add_subdirectory(import)
|
add_subdirectory(import)
|
||||||
add_subdirectory(export)
|
add_subdirectory(export)
|
||||||
|
|||||||
+155
-55
@@ -29,21 +29,11 @@
|
|||||||
#include "../../common/content/world_content_service.h"
|
#include "../../common/content/world_content_service.h"
|
||||||
#include "../../common/zone_store.h"
|
#include "../../common/zone_store.h"
|
||||||
#include "../../common/path_manager.h"
|
#include "../../common/path_manager.h"
|
||||||
#include "../../common/repositories/base_data_repository.h"
|
|
||||||
#include "../../common/repositories/db_str_repository.h"
|
|
||||||
#include "../../common/repositories/skill_caps_repository.h"
|
|
||||||
#include "../../common/repositories/spells_new_repository.h"
|
|
||||||
#include "../../common/file.h"
|
|
||||||
#include "../../common/events/player_event_logs.h"
|
|
||||||
#include "../../common/skill_caps.h"
|
|
||||||
#include "../../common/evolving_items.h"
|
|
||||||
|
|
||||||
EQEmuLogSys LogSys;
|
EQEmuLogSys LogSys;
|
||||||
WorldContentService content_service;
|
WorldContentService content_service;
|
||||||
ZoneStore zone_store;
|
ZoneStore zone_store;
|
||||||
PathManager path;
|
PathManager path;
|
||||||
PlayerEventLogs player_event_logs;
|
|
||||||
EvolvingItemsManager evolving_items_manager;
|
|
||||||
|
|
||||||
void ExportSpells(SharedDatabase *db);
|
void ExportSpells(SharedDatabase *db);
|
||||||
void ExportSkillCaps(SharedDatabase *db);
|
void ExportSkillCaps(SharedDatabase *db);
|
||||||
@@ -96,7 +86,7 @@ int main(int argc, char **argv)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
content_db.SetMySQL(database);
|
content_db.SetMysql(database.getMySQL());
|
||||||
}
|
}
|
||||||
|
|
||||||
LogSys.SetDatabase(&database)
|
LogSys.SetDatabase(&database)
|
||||||
@@ -104,22 +94,25 @@ int main(int argc, char **argv)
|
|||||||
->LoadLogDatabaseSettings()
|
->LoadLogDatabaseSettings()
|
||||||
->StartFileLogs();
|
->StartFileLogs();
|
||||||
|
|
||||||
std::string export_type;
|
std::string arg_1;
|
||||||
|
|
||||||
if (argv[1]) {
|
if (argv[1]) {
|
||||||
export_type = argv[1];
|
arg_1 = argv[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Strings::EqualFold(export_type, "spells")) {
|
if (arg_1 == "spells") {
|
||||||
ExportSpells(&content_db);
|
ExportSpells(&content_db);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (Strings::EqualFold(export_type, "skills")) {
|
}
|
||||||
|
if (arg_1 == "skills") {
|
||||||
ExportSkillCaps(&content_db);
|
ExportSkillCaps(&content_db);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (Strings::EqualFold(export_type, "basedata") || Strings::EqualFold(export_type, "base_data")) {
|
}
|
||||||
|
if (arg_1 == "basedata") {
|
||||||
ExportBaseData(&content_db);
|
ExportBaseData(&content_db);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (Strings::EqualFold(export_type, "dbstr") || Strings::EqualFold(export_type, "dbstring")) {
|
}
|
||||||
|
if (arg_1 == "dbstring") {
|
||||||
ExportDBStrings(&database);
|
ExportDBStrings(&database);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -134,79 +127,186 @@ int main(int argc, char **argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportSpells(SharedDatabase* db)
|
void ExportSpells(SharedDatabase *db)
|
||||||
{
|
{
|
||||||
std::ofstream file(fmt::format("{}/export/spells_us.txt", path.GetServerPath()));
|
LogInfo("Exporting Spells");
|
||||||
if (!file || !file.is_open()) {
|
|
||||||
|
std::string file = fmt::format("{}/export/spells_us.txt", path.GetServerPath());
|
||||||
|
FILE *f = fopen(file.c_str(), "w");
|
||||||
|
if (!f) {
|
||||||
LogError("Unable to open export/spells_us.txt to write, skipping.");
|
LogError("Unable to open export/spells_us.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& lines = SpellsNewRepository::GetSpellFileLines(*db);
|
const std::string query = "SELECT * FROM spells_new ORDER BY id";
|
||||||
|
auto results = db->QueryDatabase(query);
|
||||||
|
|
||||||
const std::string& file_string = Strings::Implode("\n", lines);
|
if (results.Success()) {
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
std::string line;
|
||||||
|
unsigned int fields = results.ColumnCount();
|
||||||
|
for (unsigned int i = 0; i < fields; ++i) {
|
||||||
|
if (i != 0) {
|
||||||
|
line.push_back('^');
|
||||||
|
}
|
||||||
|
|
||||||
file << file_string;
|
if (row[i] != nullptr) {
|
||||||
|
line += row[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file.close();
|
fprintf(f, "%s\n", line.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
|
||||||
LogInfo("Exported [{}] Spell{}", lines.size(), lines.size() != 1 ? "s" : "");
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportSkillCaps(SharedDatabase* db)
|
bool SkillUsable(SharedDatabase *db, int skill_id, int class_id)
|
||||||
{
|
{
|
||||||
std::ofstream file(fmt::format("{}/export/SkillCaps.txt", path.GetServerPath()));
|
|
||||||
if (!file || !file.is_open()) {
|
bool res = false;
|
||||||
|
|
||||||
|
std::string query = StringFormat(
|
||||||
|
"SELECT max(cap) FROM skill_caps WHERE class=%d AND skillID=%d",
|
||||||
|
class_id, skill_id
|
||||||
|
);
|
||||||
|
auto results = db->QueryDatabase(query);
|
||||||
|
if (!results.Success()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (results.RowCount() == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
if (row[0] && atoi(row[0]) > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int GetSkill(SharedDatabase *db, int skill_id, int class_id, int level)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string query = StringFormat(
|
||||||
|
"SELECT cap FROM skill_caps WHERE class=%d AND skillID=%d AND level=%d",
|
||||||
|
class_id, skill_id, level
|
||||||
|
);
|
||||||
|
auto results = db->QueryDatabase(query);
|
||||||
|
if (!results.Success()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (results.RowCount() == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
return atoi(row[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExportSkillCaps(SharedDatabase *db)
|
||||||
|
{
|
||||||
|
LogInfo("Exporting Skill Caps");
|
||||||
|
|
||||||
|
std::string file = fmt::format("{}/export/SkillCaps.txt", path.GetServerPath());
|
||||||
|
FILE *f = fopen(file.c_str(), "w");
|
||||||
|
if (!f) {
|
||||||
LogError("Unable to open export/SkillCaps.txt to write, skipping.");
|
LogError("Unable to open export/SkillCaps.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& lines = SkillCapsRepository::GetSkillCapFileLines(*db);
|
for (int cl = 1; cl <= 16; ++cl) {
|
||||||
|
for (int skill = 0; skill <= 77; ++skill) {
|
||||||
|
if (SkillUsable(db, skill, cl)) {
|
||||||
|
int previous_cap = 0;
|
||||||
|
for (int level = 1; level <= 100; ++level) {
|
||||||
|
int cap = GetSkill(db, skill, cl, level);
|
||||||
|
if (cap < previous_cap) {
|
||||||
|
cap = previous_cap;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& file_string = Strings::Implode("\n", lines);
|
fprintf(f, "%d^%d^%d^%d^0\n", cl, skill, level, cap);
|
||||||
|
previous_cap = cap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file << file_string;
|
fclose(f);
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
LogInfo("Exported [{}] Skill Cap{}", lines.size(), lines.size() != 1 ? "s" : "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportBaseData(SharedDatabase *db)
|
void ExportBaseData(SharedDatabase *db)
|
||||||
{
|
{
|
||||||
std::ofstream file(fmt::format("{}/export/BaseData.txt", path.GetServerPath()));
|
LogInfo("Exporting Base Data");
|
||||||
if (!file || !file.is_open()) {
|
|
||||||
|
std::string file = fmt::format("{}/export/BaseData.txt", path.GetServerPath());
|
||||||
|
FILE *f = fopen(file.c_str(), "w");
|
||||||
|
if (!f) {
|
||||||
LogError("Unable to open export/BaseData.txt to write, skipping.");
|
LogError("Unable to open export/BaseData.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& lines = BaseDataRepository::GetBaseDataFileLines(*db);
|
const std::string query = "SELECT * FROM base_data ORDER BY level, class";
|
||||||
|
auto results = db->QueryDatabase(query);
|
||||||
|
if (results.Success()) {
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
std::string line;
|
||||||
|
unsigned int fields = results.ColumnCount();
|
||||||
|
for (unsigned int rowIndex = 0; rowIndex < fields; ++rowIndex) {
|
||||||
|
if (rowIndex != 0) {
|
||||||
|
line.push_back('^');
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& file_string = Strings::Implode("\n", lines);
|
if (row[rowIndex] != nullptr) {
|
||||||
|
line += row[rowIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file << file_string;
|
fprintf(f, "%s\n", line.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file.close();
|
fclose(f);
|
||||||
|
|
||||||
LogInfo("Exported [{}] Base Data Entr{}", lines.size(), lines.size() != 1 ? "ies" : "y");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportDBStrings(SharedDatabase *db)
|
void ExportDBStrings(SharedDatabase *db)
|
||||||
{
|
{
|
||||||
std::ofstream file(fmt::format("{}/export/dbstr_us.txt", path.GetServerPath()));
|
LogInfo("Exporting DB Strings");
|
||||||
if (!file || !file.is_open()) {
|
|
||||||
|
std::string file = fmt::format("{}/export/dbstr_us.txt", path.GetServerPath());
|
||||||
|
FILE *f = fopen(file.c_str(), "w");
|
||||||
|
if (!f) {
|
||||||
LogError("Unable to open export/dbstr_us.txt to write, skipping.");
|
LogError("Unable to open export/dbstr_us.txt to write, skipping.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& lines = DbStrRepository::GetDBStrFileLines(*db);
|
fprintf(f, "Major^Minor^String(New)\n");
|
||||||
|
const std::string query = "SELECT * FROM db_str ORDER BY id, type";
|
||||||
|
auto results = db->QueryDatabase(query);
|
||||||
|
if (results.Success()) {
|
||||||
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
|
std::string line;
|
||||||
|
unsigned int fields = results.ColumnCount();
|
||||||
|
for (unsigned int rowIndex = 0; rowIndex < fields; ++rowIndex) {
|
||||||
|
if (rowIndex != 0) {
|
||||||
|
line.push_back('^');
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& file_string = Strings::Implode("\n", lines);
|
if (row[rowIndex] != nullptr) {
|
||||||
|
line += row[rowIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file << file_string;
|
fprintf(f, "%s\n", line.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
file.close();
|
fclose(f);
|
||||||
|
|
||||||
LogInfo("Exported [{}] Database String{}", lines.size(), lines.size() != 1 ? "s" : "");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,17 +27,11 @@
|
|||||||
#include "../../common/content/world_content_service.h"
|
#include "../../common/content/world_content_service.h"
|
||||||
#include "../../common/zone_store.h"
|
#include "../../common/zone_store.h"
|
||||||
#include "../../common/path_manager.h"
|
#include "../../common/path_manager.h"
|
||||||
#include "../../common/repositories/base_data_repository.h"
|
|
||||||
#include "../../common/file.h"
|
|
||||||
#include "../../common/events/player_event_logs.h"
|
|
||||||
#include "../../common/evolving_items.h"
|
|
||||||
|
|
||||||
EQEmuLogSys LogSys;
|
EQEmuLogSys LogSys;
|
||||||
WorldContentService content_service;
|
WorldContentService content_service;
|
||||||
ZoneStore zone_store;
|
ZoneStore zone_store;
|
||||||
PathManager path;
|
PathManager path;
|
||||||
PlayerEventLogs player_event_logs;
|
|
||||||
EvolvingItemsManager evolving_items_manager;
|
|
||||||
|
|
||||||
void ImportSpells(SharedDatabase *db);
|
void ImportSpells(SharedDatabase *db);
|
||||||
void ImportSkillCaps(SharedDatabase *db);
|
void ImportSkillCaps(SharedDatabase *db);
|
||||||
@@ -89,7 +83,7 @@ int main(int argc, char **argv) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
content_db.SetMySQL(database);
|
content_db.SetMysql(database.getMySQL());
|
||||||
}
|
}
|
||||||
|
|
||||||
LogSys.SetDatabase(&database)
|
LogSys.SetDatabase(&database)
|
||||||
@@ -247,10 +241,10 @@ void ImportSkillCaps(SharedDatabase *db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int class_id, skill_id, level, cap;
|
int class_id, skill_id, level, cap;
|
||||||
class_id = Strings::ToInt(split[0].c_str());
|
class_id = atoi(split[0].c_str());
|
||||||
skill_id = Strings::ToInt(split[1].c_str());
|
skill_id = atoi(split[1].c_str());
|
||||||
level = Strings::ToInt(split[2].c_str());
|
level = atoi(split[2].c_str());
|
||||||
cap = Strings::ToInt(split[3].c_str());
|
cap = atoi(split[3].c_str());
|
||||||
|
|
||||||
std::string sql = StringFormat("INSERT INTO skill_caps(class, skillID, level, cap) VALUES(%d, %d, %d, %d)",
|
std::string sql = StringFormat("INSERT INTO skill_caps(class, skillID, level, cap) VALUES(%d, %d, %d, %d)",
|
||||||
class_id, skill_id, level, cap);
|
class_id, skill_id, level, cap);
|
||||||
@@ -261,45 +255,50 @@ void ImportSkillCaps(SharedDatabase *db) {
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportBaseData(SharedDatabase *db)
|
void ImportBaseData(SharedDatabase *db) {
|
||||||
{
|
|
||||||
LogInfo("Importing Base Data");
|
LogInfo("Importing Base Data");
|
||||||
|
|
||||||
const std::string& file_name = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
|
std::string file = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
|
||||||
|
FILE *f = fopen(file.c_str(), "r");
|
||||||
const auto& file_contents = File::GetContents(file_name);
|
if(!f) {
|
||||||
if (!file_contents.error.empty()) {
|
LogError("Unable to open {} to read, skipping.", file);
|
||||||
LogError("{}", file_contents.error);
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
db->QueryDatabase("DELETE FROM base_data");
|
std::string delete_sql = "DELETE FROM base_data";
|
||||||
|
db->QueryDatabase(delete_sql);
|
||||||
|
|
||||||
std::vector<BaseDataRepository::BaseData> v;
|
char buffer[2048];
|
||||||
|
while(fgets(buffer, 2048, f)) {
|
||||||
|
auto split = Strings::Split(buffer, '^');
|
||||||
|
|
||||||
auto e = BaseDataRepository::NewEntity();
|
if(split.size() < 10) {
|
||||||
|
|
||||||
for (const auto& line: Strings::Split(file_contents.contents, "\n")) {
|
|
||||||
const auto& line_data = Strings::Split(line, '^');
|
|
||||||
|
|
||||||
if (line_data.size() < 10) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
e.level = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[0]));
|
std::string sql;
|
||||||
e.class_ = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[1]));
|
int level, class_id;
|
||||||
e.hp = Strings::ToFloat(line_data[2]);
|
double hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac;
|
||||||
e.mana = Strings::ToFloat(line_data[3]);
|
|
||||||
e.end = Strings::ToFloat(line_data[4]);
|
|
||||||
e.hp_regen = Strings::ToFloat(line_data[5]);
|
|
||||||
e.end_regen = Strings::ToFloat(line_data[6]);
|
|
||||||
e.hp_fac = Strings::ToFloat(line_data[7]);
|
|
||||||
e.mana_fac = Strings::ToFloat(line_data[8]);
|
|
||||||
e.end_fac = Strings::ToFloat(line_data[9]);
|
|
||||||
|
|
||||||
v.emplace_back(e);
|
level = atoi(split[0].c_str());
|
||||||
|
class_id = atoi(split[1].c_str());
|
||||||
|
hp = atof(split[2].c_str());
|
||||||
|
mana = atof(split[3].c_str());
|
||||||
|
end = atof(split[4].c_str());
|
||||||
|
unk1 = atof(split[5].c_str());
|
||||||
|
unk2 = atof(split[6].c_str());
|
||||||
|
hp_fac = atof(split[7].c_str());
|
||||||
|
mana_fac = atof(split[8].c_str());
|
||||||
|
end_fac = atof(split[9].c_str());
|
||||||
|
|
||||||
|
sql = StringFormat("INSERT INTO base_data(level, class, hp, mana, end, unk1, unk2, hp_fac, "
|
||||||
|
"mana_fac, end_fac) VALUES(%d, %d, %f, %f, %f, %f, %f, %f, %f, %f)",
|
||||||
|
level, class_id, hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac);
|
||||||
|
|
||||||
|
db->QueryDatabase(sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseDataRepository::InsertMany(*db, v);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportDBStrings(SharedDatabase *db) {
|
void ImportDBStrings(SharedDatabase *db) {
|
||||||
@@ -340,8 +339,8 @@ void ImportDBStrings(SharedDatabase *db) {
|
|||||||
int id, type;
|
int id, type;
|
||||||
std::string value;
|
std::string value;
|
||||||
|
|
||||||
id = Strings::ToInt(split[0].c_str());
|
id = atoi(split[0].c_str());
|
||||||
type = Strings::ToInt(split[1].c_str());
|
type = atoi(split[1].c_str());
|
||||||
|
|
||||||
if(split.size() >= 3) {
|
if(split.size() >= 3) {
|
||||||
value = ::Strings::Escape(split[2]);
|
value = ::Strings::Escape(split[2]);
|
||||||
|
|||||||
+29
-99
@@ -2,8 +2,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
|
|||||||
|
|
||||||
SET(common_sources
|
SET(common_sources
|
||||||
base_packet.cpp
|
base_packet.cpp
|
||||||
bazaar.cpp
|
|
||||||
bodytypes.cpp
|
|
||||||
classes.cpp
|
classes.cpp
|
||||||
cli/eqemu_command_handler.cpp
|
cli/eqemu_command_handler.cpp
|
||||||
compression.cpp
|
compression.cpp
|
||||||
@@ -15,15 +13,11 @@ SET(common_sources
|
|||||||
crc32.cpp
|
crc32.cpp
|
||||||
database/database_dump_service.cpp
|
database/database_dump_service.cpp
|
||||||
database.cpp
|
database.cpp
|
||||||
|
database_conversions.cpp
|
||||||
database_instances.cpp
|
database_instances.cpp
|
||||||
database/database_update_manifest.cpp
|
|
||||||
database/database_update_manifest_custom.cpp
|
|
||||||
database/database_update_manifest_bots.cpp
|
|
||||||
database/database_update.cpp
|
|
||||||
dbcore.cpp
|
dbcore.cpp
|
||||||
deity.cpp
|
deity.cpp
|
||||||
dynamic_zone_base.cpp
|
dynamic_zone_base.cpp
|
||||||
dynamic_zone_lockout.cpp
|
|
||||||
emu_constants.cpp
|
emu_constants.cpp
|
||||||
emu_limits.cpp
|
emu_limits.cpp
|
||||||
emu_opcodes.cpp
|
emu_opcodes.cpp
|
||||||
@@ -39,11 +33,9 @@ SET(common_sources
|
|||||||
eq_stream_proxy.cpp
|
eq_stream_proxy.cpp
|
||||||
eqtime.cpp
|
eqtime.cpp
|
||||||
event_sub.cpp
|
event_sub.cpp
|
||||||
events/player_event_logs.cpp
|
expedition_lockout_timer.cpp
|
||||||
events/player_event_discord_formatter.cpp
|
|
||||||
evolving_items.cpp
|
|
||||||
extprofile.cpp
|
extprofile.cpp
|
||||||
discord/discord_manager.cpp
|
discord_manager.cpp
|
||||||
faction.cpp
|
faction.cpp
|
||||||
file.cpp
|
file.cpp
|
||||||
guild_base.cpp
|
guild_base.cpp
|
||||||
@@ -64,7 +56,6 @@ SET(common_sources
|
|||||||
mutex.cpp
|
mutex.cpp
|
||||||
mysql_request_result.cpp
|
mysql_request_result.cpp
|
||||||
mysql_request_row.cpp
|
mysql_request_row.cpp
|
||||||
mysql_stmt.cpp
|
|
||||||
opcode_map.cpp
|
opcode_map.cpp
|
||||||
opcodemgr.cpp
|
opcodemgr.cpp
|
||||||
packet_dump.cpp
|
packet_dump.cpp
|
||||||
@@ -74,7 +65,6 @@ SET(common_sources
|
|||||||
perl_eqdb.cpp
|
perl_eqdb.cpp
|
||||||
perl_eqdb_res.cpp
|
perl_eqdb_res.cpp
|
||||||
process/process.cpp
|
process/process.cpp
|
||||||
process.cpp
|
|
||||||
proc_launcher.cpp
|
proc_launcher.cpp
|
||||||
profanity_manager.cpp
|
profanity_manager.cpp
|
||||||
ptimer.cpp
|
ptimer.cpp
|
||||||
@@ -88,19 +78,15 @@ SET(common_sources
|
|||||||
shared_tasks.cpp
|
shared_tasks.cpp
|
||||||
shareddb.cpp
|
shareddb.cpp
|
||||||
skills.cpp
|
skills.cpp
|
||||||
skill_caps.cpp
|
|
||||||
spdat.cpp
|
spdat.cpp
|
||||||
spdat_bot.cpp
|
|
||||||
strings.cpp
|
strings.cpp
|
||||||
struct_strategy.cpp
|
struct_strategy.cpp
|
||||||
textures.cpp
|
textures.cpp
|
||||||
timer.cpp
|
timer.cpp
|
||||||
unix.cpp
|
unix.cpp
|
||||||
platform.cpp
|
platform.cpp
|
||||||
json/json.hpp
|
|
||||||
json/jsoncpp.cpp
|
json/jsoncpp.cpp
|
||||||
zone_store.cpp
|
zone_store.cpp
|
||||||
memory/ksm.hpp
|
|
||||||
net/console_server.cpp
|
net/console_server.cpp
|
||||||
net/console_server_connection.cpp
|
net/console_server_connection.cpp
|
||||||
net/crc32.cpp
|
net/crc32.cpp
|
||||||
@@ -163,7 +149,6 @@ SET(repositories
|
|||||||
repositories/base/base_bugs_repository.h
|
repositories/base/base_bugs_repository.h
|
||||||
repositories/base/base_bug_reports_repository.h
|
repositories/base/base_bug_reports_repository.h
|
||||||
repositories/base/base_buyer_repository.h
|
repositories/base/base_buyer_repository.h
|
||||||
repositories/base/base_buyer_trade_items_repository.h
|
|
||||||
repositories/base/base_character_activities_repository.h
|
repositories/base/base_character_activities_repository.h
|
||||||
repositories/base/base_character_alternate_abilities_repository.h
|
repositories/base/base_character_alternate_abilities_repository.h
|
||||||
repositories/base/base_character_alt_currency_repository.h
|
repositories/base/base_character_alt_currency_repository.h
|
||||||
@@ -176,7 +161,6 @@ SET(repositories
|
|||||||
repositories/base/base_character_currency_repository.h
|
repositories/base/base_character_currency_repository.h
|
||||||
repositories/base/base_character_data_repository.h
|
repositories/base/base_character_data_repository.h
|
||||||
repositories/base/base_character_disciplines_repository.h
|
repositories/base/base_character_disciplines_repository.h
|
||||||
repositories/base/base_character_evolving_items_repository.h
|
|
||||||
repositories/base/base_character_expedition_lockouts_repository.h
|
repositories/base/base_character_expedition_lockouts_repository.h
|
||||||
repositories/base/base_character_exp_modifiers_repository.h
|
repositories/base/base_character_exp_modifiers_repository.h
|
||||||
repositories/base/base_character_inspect_messages_repository.h
|
repositories/base/base_character_inspect_messages_repository.h
|
||||||
@@ -186,8 +170,6 @@ SET(repositories
|
|||||||
repositories/base/base_character_leadership_abilities_repository.h
|
repositories/base/base_character_leadership_abilities_repository.h
|
||||||
repositories/base/base_character_material_repository.h
|
repositories/base/base_character_material_repository.h
|
||||||
repositories/base/base_character_memmed_spells_repository.h
|
repositories/base/base_character_memmed_spells_repository.h
|
||||||
repositories/base/base_character_parcels_repository.h
|
|
||||||
repositories/base/base_character_parcels_containers_repository.h
|
|
||||||
repositories/base/base_character_peqzone_flags_repository.h
|
repositories/base/base_character_peqzone_flags_repository.h
|
||||||
repositories/base/base_character_pet_buffs_repository.h
|
repositories/base/base_character_pet_buffs_repository.h
|
||||||
repositories/base/base_character_pet_info_repository.h
|
repositories/base/base_character_pet_info_repository.h
|
||||||
@@ -200,8 +182,6 @@ SET(repositories
|
|||||||
repositories/base/base_char_create_combinations_repository.h
|
repositories/base/base_char_create_combinations_repository.h
|
||||||
repositories/base/base_char_create_point_allocations_repository.h
|
repositories/base/base_char_create_point_allocations_repository.h
|
||||||
repositories/base/base_char_recipe_list_repository.h
|
repositories/base/base_char_recipe_list_repository.h
|
||||||
repositories/base/base_chatchannels_repository.h
|
|
||||||
repositories/base/base_chatchannel_reserved_names_repository.h
|
|
||||||
repositories/base/base_completed_shared_tasks_repository.h
|
repositories/base/base_completed_shared_tasks_repository.h
|
||||||
repositories/base/base_completed_shared_task_activity_state_repository.h
|
repositories/base/base_completed_shared_task_activity_state_repository.h
|
||||||
repositories/base/base_completed_shared_task_members_repository.h
|
repositories/base/base_completed_shared_task_members_repository.h
|
||||||
@@ -214,9 +194,11 @@ SET(repositories
|
|||||||
repositories/base/base_discovered_items_repository.h
|
repositories/base/base_discovered_items_repository.h
|
||||||
repositories/base/base_doors_repository.h
|
repositories/base/base_doors_repository.h
|
||||||
repositories/base/base_dynamic_zones_repository.h
|
repositories/base/base_dynamic_zones_repository.h
|
||||||
repositories/base/base_dynamic_zone_lockouts_repository.h
|
|
||||||
repositories/base/base_dynamic_zone_members_repository.h
|
repositories/base/base_dynamic_zone_members_repository.h
|
||||||
repositories/base/base_dynamic_zone_templates_repository.h
|
repositories/base/base_dynamic_zone_templates_repository.h
|
||||||
|
repositories/base/base_eventlog_repository.h
|
||||||
|
repositories/base/base_expeditions_repository.h
|
||||||
|
repositories/base/base_expedition_lockouts_repository.h
|
||||||
repositories/base/base_faction_association_repository.h
|
repositories/base/base_faction_association_repository.h
|
||||||
repositories/base/base_faction_base_data_repository.h
|
repositories/base/base_faction_base_data_repository.h
|
||||||
repositories/base/base_faction_list_repository.h
|
repositories/base/base_faction_list_repository.h
|
||||||
@@ -233,10 +215,8 @@ SET(repositories
|
|||||||
repositories/base/base_group_leaders_repository.h
|
repositories/base/base_group_leaders_repository.h
|
||||||
repositories/base/base_guilds_repository.h
|
repositories/base/base_guilds_repository.h
|
||||||
repositories/base/base_guild_ranks_repository.h
|
repositories/base/base_guild_ranks_repository.h
|
||||||
repositories/base/base_guild_permissions_repository.h
|
|
||||||
repositories/base/base_guild_members_repository.h
|
|
||||||
repositories/base/base_guild_bank_repository.h
|
|
||||||
repositories/base/base_guild_relations_repository.h
|
repositories/base/base_guild_relations_repository.h
|
||||||
|
repositories/base/base_hackers_repository.h
|
||||||
repositories/base/base_horses_repository.h
|
repositories/base/base_horses_repository.h
|
||||||
repositories/base/base_instance_list_repository.h
|
repositories/base/base_instance_list_repository.h
|
||||||
repositories/base/base_instance_list_player_repository.h
|
repositories/base/base_instance_list_player_repository.h
|
||||||
@@ -244,7 +224,7 @@ SET(repositories
|
|||||||
repositories/base/base_inventory_snapshots_repository.h
|
repositories/base/base_inventory_snapshots_repository.h
|
||||||
repositories/base/base_ip_exemptions_repository.h
|
repositories/base/base_ip_exemptions_repository.h
|
||||||
repositories/base/base_items_repository.h
|
repositories/base/base_items_repository.h
|
||||||
repositories/base/base_items_evolving_details_repository.h
|
repositories/base/base_item_tick_repository.h
|
||||||
repositories/base/base_ldon_trap_entries_repository.h
|
repositories/base/base_ldon_trap_entries_repository.h
|
||||||
repositories/base/base_ldon_trap_templates_repository.h
|
repositories/base/base_ldon_trap_templates_repository.h
|
||||||
repositories/base/base_level_exp_mods_repository.h
|
repositories/base/base_level_exp_mods_repository.h
|
||||||
@@ -282,20 +262,6 @@ SET(repositories
|
|||||||
repositories/base/base_pets_equipmentset_repository.h
|
repositories/base/base_pets_equipmentset_repository.h
|
||||||
repositories/base/base_pets_equipmentset_entries_repository.h
|
repositories/base/base_pets_equipmentset_entries_repository.h
|
||||||
repositories/base/base_player_titlesets_repository.h
|
repositories/base/base_player_titlesets_repository.h
|
||||||
repositories/base/base_player_event_aa_purchase_repository.h
|
|
||||||
repositories/base/base_player_event_killed_npc_repository.h
|
|
||||||
repositories/base/base_player_event_killed_named_npc_repository.h
|
|
||||||
repositories/base/base_player_event_killed_raid_npc_repository.h
|
|
||||||
repositories/base/base_player_event_log_settings_repository.h
|
|
||||||
repositories/base/base_player_event_logs_repository.h
|
|
||||||
repositories/base/base_player_event_loot_items_repository.h
|
|
||||||
repositories/base/base_player_event_merchant_purchase_repository.h
|
|
||||||
repositories/base/base_player_event_merchant_sell_repository.h
|
|
||||||
repositories/base/base_player_event_npc_handin_repository.h
|
|
||||||
repositories/base/base_player_event_npc_handin_entries_repository.h
|
|
||||||
repositories/base/base_player_event_speech_repository.h
|
|
||||||
repositories/base/base_player_event_trade_repository.h
|
|
||||||
repositories/base/base_player_event_trade_entries_repository.h
|
|
||||||
repositories/base/base_quest_globals_repository.h
|
repositories/base/base_quest_globals_repository.h
|
||||||
repositories/base/base_raid_details_repository.h
|
repositories/base/base_raid_details_repository.h
|
||||||
repositories/base/base_raid_members_repository.h
|
repositories/base/base_raid_members_repository.h
|
||||||
@@ -358,8 +324,7 @@ SET(repositories
|
|||||||
repositories/books_repository.h
|
repositories/books_repository.h
|
||||||
repositories/bugs_repository.h
|
repositories/bugs_repository.h
|
||||||
repositories/bug_reports_repository.h
|
repositories/bug_reports_repository.h
|
||||||
repositories/buyer_buy_lines_repository.h
|
repositories/buyer_repository.h
|
||||||
repositories/buyer_trade_items_repository.h
|
|
||||||
repositories/character_activities_repository.h
|
repositories/character_activities_repository.h
|
||||||
repositories/character_alternate_abilities_repository.h
|
repositories/character_alternate_abilities_repository.h
|
||||||
repositories/character_alt_currency_repository.h
|
repositories/character_alt_currency_repository.h
|
||||||
@@ -372,7 +337,6 @@ SET(repositories
|
|||||||
repositories/character_currency_repository.h
|
repositories/character_currency_repository.h
|
||||||
repositories/character_data_repository.h
|
repositories/character_data_repository.h
|
||||||
repositories/character_disciplines_repository.h
|
repositories/character_disciplines_repository.h
|
||||||
repositories/character_evolving_items_repository.h
|
|
||||||
repositories/character_expedition_lockouts_repository.h
|
repositories/character_expedition_lockouts_repository.h
|
||||||
repositories/character_exp_modifiers_repository.h
|
repositories/character_exp_modifiers_repository.h
|
||||||
repositories/character_inspect_messages_repository.h
|
repositories/character_inspect_messages_repository.h
|
||||||
@@ -382,8 +346,6 @@ SET(repositories
|
|||||||
repositories/character_leadership_abilities_repository.h
|
repositories/character_leadership_abilities_repository.h
|
||||||
repositories/character_material_repository.h
|
repositories/character_material_repository.h
|
||||||
repositories/character_memmed_spells_repository.h
|
repositories/character_memmed_spells_repository.h
|
||||||
repositories/character_parcels_repository.h
|
|
||||||
repositories/character_parcels_containers_repository.h
|
|
||||||
repositories/character_peqzone_flags_repository.h
|
repositories/character_peqzone_flags_repository.h
|
||||||
repositories/character_pet_buffs_repository.h
|
repositories/character_pet_buffs_repository.h
|
||||||
repositories/character_pet_info_repository.h
|
repositories/character_pet_info_repository.h
|
||||||
@@ -396,8 +358,6 @@ SET(repositories
|
|||||||
repositories/char_create_combinations_repository.h
|
repositories/char_create_combinations_repository.h
|
||||||
repositories/char_create_point_allocations_repository.h
|
repositories/char_create_point_allocations_repository.h
|
||||||
repositories/char_recipe_list_repository.h
|
repositories/char_recipe_list_repository.h
|
||||||
repositories/chatchannels_repository.h
|
|
||||||
repositories/chatchannel_reserved_names_repository.h
|
|
||||||
repositories/completed_shared_tasks_repository.h
|
repositories/completed_shared_tasks_repository.h
|
||||||
repositories/completed_shared_task_activity_state_repository.h
|
repositories/completed_shared_task_activity_state_repository.h
|
||||||
repositories/completed_shared_task_members_repository.h
|
repositories/completed_shared_task_members_repository.h
|
||||||
@@ -410,9 +370,11 @@ SET(repositories
|
|||||||
repositories/discovered_items_repository.h
|
repositories/discovered_items_repository.h
|
||||||
repositories/doors_repository.h
|
repositories/doors_repository.h
|
||||||
repositories/dynamic_zones_repository.h
|
repositories/dynamic_zones_repository.h
|
||||||
repositories/dynamic_zone_lockouts_repository.h
|
|
||||||
repositories/dynamic_zone_members_repository.h
|
repositories/dynamic_zone_members_repository.h
|
||||||
repositories/dynamic_zone_templates_repository.h
|
repositories/dynamic_zone_templates_repository.h
|
||||||
|
repositories/eventlog_repository.h
|
||||||
|
repositories/expeditions_repository.h
|
||||||
|
repositories/expedition_lockouts_repository.h
|
||||||
repositories/faction_association_repository.h
|
repositories/faction_association_repository.h
|
||||||
repositories/faction_base_data_repository.h
|
repositories/faction_base_data_repository.h
|
||||||
repositories/faction_list_repository.h
|
repositories/faction_list_repository.h
|
||||||
@@ -429,10 +391,8 @@ SET(repositories
|
|||||||
repositories/group_leaders_repository.h
|
repositories/group_leaders_repository.h
|
||||||
repositories/guilds_repository.h
|
repositories/guilds_repository.h
|
||||||
repositories/guild_ranks_repository.h
|
repositories/guild_ranks_repository.h
|
||||||
repositories/guild_permissions_repository.h
|
|
||||||
repositories/guild_members_repository.h
|
|
||||||
repositories/guild_bank_repository.h
|
|
||||||
repositories/guild_relations_repository.h
|
repositories/guild_relations_repository.h
|
||||||
|
repositories/hackers_repository.h
|
||||||
repositories/horses_repository.h
|
repositories/horses_repository.h
|
||||||
repositories/instance_list_repository.h
|
repositories/instance_list_repository.h
|
||||||
repositories/instance_list_player_repository.h
|
repositories/instance_list_player_repository.h
|
||||||
@@ -440,7 +400,7 @@ SET(repositories
|
|||||||
repositories/inventory_snapshots_repository.h
|
repositories/inventory_snapshots_repository.h
|
||||||
repositories/ip_exemptions_repository.h
|
repositories/ip_exemptions_repository.h
|
||||||
repositories/items_repository.h
|
repositories/items_repository.h
|
||||||
repositories/items_evolving_details_repository.h
|
repositories/item_tick_repository.h
|
||||||
repositories/ldon_trap_entries_repository.h
|
repositories/ldon_trap_entries_repository.h
|
||||||
repositories/ldon_trap_templates_repository.h
|
repositories/ldon_trap_templates_repository.h
|
||||||
repositories/level_exp_mods_repository.h
|
repositories/level_exp_mods_repository.h
|
||||||
@@ -478,20 +438,6 @@ SET(repositories
|
|||||||
repositories/pets_equipmentset_repository.h
|
repositories/pets_equipmentset_repository.h
|
||||||
repositories/pets_equipmentset_entries_repository.h
|
repositories/pets_equipmentset_entries_repository.h
|
||||||
repositories/player_titlesets_repository.h
|
repositories/player_titlesets_repository.h
|
||||||
repositories/player_event_aa_purchase_repository.h
|
|
||||||
repositories/player_event_killed_npc_repository.h
|
|
||||||
repositories/player_event_killed_named_npc_repository.h
|
|
||||||
repositories/player_event_killed_raid_npc_repository.h
|
|
||||||
repositories/player_event_log_settings_repository.h
|
|
||||||
repositories/player_event_logs_repository.h
|
|
||||||
repositories/player_event_loot_items_repository.h
|
|
||||||
repositories/player_event_merchant_purchase_repository.h
|
|
||||||
repositories/player_event_merchant_sell_repository.h
|
|
||||||
repositories/player_event_npc_handin_repository.h
|
|
||||||
repositories/player_event_npc_handin_entries_repository.h
|
|
||||||
repositories/player_event_speech_repository.h
|
|
||||||
repositories/player_event_trade_repository.h
|
|
||||||
repositories/player_event_trade_entries_repository.h
|
|
||||||
repositories/quest_globals_repository.h
|
repositories/quest_globals_repository.h
|
||||||
repositories/raid_details_repository.h
|
repositories/raid_details_repository.h
|
||||||
repositories/raid_members_repository.h
|
repositories/raid_members_repository.h
|
||||||
@@ -532,12 +478,12 @@ SET(repositories
|
|||||||
repositories/zone_repository.h
|
repositories/zone_repository.h
|
||||||
repositories/zone_points_repository.h
|
repositories/zone_points_repository.h
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(common_headers
|
SET(common_headers
|
||||||
additive_lagged_fibonacci_engine.h
|
additive_lagged_fibonacci_engine.h
|
||||||
bazaar.h
|
|
||||||
base_packet.h
|
base_packet.h
|
||||||
|
base_data.h
|
||||||
bodytypes.h
|
bodytypes.h
|
||||||
classes.h
|
classes.h
|
||||||
compression.h
|
compression.h
|
||||||
@@ -554,13 +500,11 @@ SET(common_headers
|
|||||||
data_verification.h
|
data_verification.h
|
||||||
database.h
|
database.h
|
||||||
database_schema.h
|
database_schema.h
|
||||||
database/database_update.h
|
|
||||||
dbcore.h
|
dbcore.h
|
||||||
deity.h
|
deity.h
|
||||||
discord/discord.h
|
discord/discord.h
|
||||||
discord/discord_manager.h
|
discord_manager.h
|
||||||
dynamic_zone_base.h
|
dynamic_zone_base.h
|
||||||
dynamic_zone_lockout.h
|
|
||||||
emu_constants.h
|
emu_constants.h
|
||||||
emu_limits.h
|
emu_limits.h
|
||||||
emu_opcodes.h
|
emu_opcodes.h
|
||||||
@@ -582,11 +526,9 @@ SET(common_headers
|
|||||||
eq_stream_locator.h
|
eq_stream_locator.h
|
||||||
eq_stream_proxy.h
|
eq_stream_proxy.h
|
||||||
eqtime.h
|
eqtime.h
|
||||||
events/player_event_logs.h
|
errmsg.h
|
||||||
events/player_event_discord_formatter.h
|
|
||||||
events/player_events.h
|
|
||||||
event_sub.h
|
event_sub.h
|
||||||
evolving_items.h
|
expedition_lockout_timer.h
|
||||||
extprofile.h
|
extprofile.h
|
||||||
faction.h
|
faction.h
|
||||||
file.h
|
file.h
|
||||||
@@ -606,9 +548,10 @@ SET(common_headers
|
|||||||
item_fieldlist.h
|
item_fieldlist.h
|
||||||
item_instance.h
|
item_instance.h
|
||||||
json_config.h
|
json_config.h
|
||||||
|
languages.h
|
||||||
light_source.h
|
light_source.h
|
||||||
linked_list.h
|
linked_list.h
|
||||||
loot.h
|
loottable.h
|
||||||
mail_oplist.h
|
mail_oplist.h
|
||||||
md5.h
|
md5.h
|
||||||
memory_buffer.h
|
memory_buffer.h
|
||||||
@@ -618,7 +561,6 @@ SET(common_headers
|
|||||||
mutex.h
|
mutex.h
|
||||||
mysql_request_result.h
|
mysql_request_result.h
|
||||||
mysql_request_row.h
|
mysql_request_row.h
|
||||||
mysql_stmt.h
|
|
||||||
op_codes.h
|
op_codes.h
|
||||||
opcode_dispatch.h
|
opcode_dispatch.h
|
||||||
opcodemgr.h
|
opcodemgr.h
|
||||||
@@ -628,14 +570,12 @@ SET(common_headers
|
|||||||
path_manager.cpp
|
path_manager.cpp
|
||||||
platform.h
|
platform.h
|
||||||
process/process.h
|
process/process.h
|
||||||
process.h
|
|
||||||
proc_launcher.h
|
proc_launcher.h
|
||||||
profanity_manager.h
|
profanity_manager.h
|
||||||
profiler.h
|
profiler.h
|
||||||
ptimer.h
|
ptimer.h
|
||||||
queue.h
|
queue.h
|
||||||
races.h
|
races.h
|
||||||
raid.h
|
|
||||||
random.h
|
random.h
|
||||||
rdtsc.h
|
rdtsc.h
|
||||||
rulesys.h
|
rulesys.h
|
||||||
@@ -646,11 +586,9 @@ SET(common_headers
|
|||||||
server_event_scheduler.h
|
server_event_scheduler.h
|
||||||
serverinfo.h
|
serverinfo.h
|
||||||
servertalk.h
|
servertalk.h
|
||||||
server_reload_types.h
|
|
||||||
shared_tasks.h
|
shared_tasks.h
|
||||||
shareddb.h
|
shareddb.h
|
||||||
skills.h
|
skills.h
|
||||||
skill_caps.h
|
|
||||||
spdat.h
|
spdat.h
|
||||||
strings.h
|
strings.h
|
||||||
struct_strategy.h
|
struct_strategy.h
|
||||||
@@ -661,18 +599,17 @@ SET(common_headers
|
|||||||
unix.h
|
unix.h
|
||||||
useperl.h
|
useperl.h
|
||||||
version.h
|
version.h
|
||||||
|
zone_numbers.h
|
||||||
zone_store.h
|
zone_store.h
|
||||||
event/event_loop.h
|
event/event_loop.h
|
||||||
event/task.h
|
event/task.h
|
||||||
event/timer.h
|
event/timer.h
|
||||||
json/json_archive_single_line.h
|
|
||||||
json/json.h
|
json/json.h
|
||||||
json/json-forwards.h
|
json/json-forwards.h
|
||||||
net/console_server.h
|
net/console_server.h
|
||||||
net/console_server_connection.h
|
net/console_server_connection.h
|
||||||
net/crc32.h
|
net/crc32.h
|
||||||
net/daybreak_connection.h
|
net/daybreak_connection.h
|
||||||
net/daybreak_pooling.h
|
|
||||||
net/daybreak_structs.h
|
net/daybreak_structs.h
|
||||||
net/dns.h
|
net/dns.h
|
||||||
net/endian.h
|
net/endian.h
|
||||||
@@ -684,7 +621,6 @@ SET(common_headers
|
|||||||
net/servertalk_server.h
|
net/servertalk_server.h
|
||||||
net/servertalk_server_connection.h
|
net/servertalk_server_connection.h
|
||||||
net/tcp_connection.h
|
net/tcp_connection.h
|
||||||
net/tcp_connection_pooling.h
|
|
||||||
net/tcp_server.h
|
net/tcp_server.h
|
||||||
net/websocket_server.h
|
net/websocket_server.h
|
||||||
net/websocket_server_connection.h
|
net/websocket_server_connection.h
|
||||||
@@ -716,25 +652,24 @@ SET(common_headers
|
|||||||
patches/uf_limits.h
|
patches/uf_limits.h
|
||||||
patches/uf_ops.h
|
patches/uf_ops.h
|
||||||
patches/uf_structs.h
|
patches/uf_structs.h
|
||||||
termcolor/rang.hpp
|
|
||||||
stacktrace/backward.hpp
|
stacktrace/backward.hpp
|
||||||
StackWalker/StackWalker.h
|
StackWalker/StackWalker.h
|
||||||
util/memory_stream.h
|
util/memory_stream.h
|
||||||
util/directory.h
|
util/directory.h
|
||||||
util/uuid.h
|
util/uuid.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Event FILES
|
SOURCE_GROUP(Event FILES
|
||||||
event/event_loop.h
|
event/event_loop.h
|
||||||
event/timer.h
|
event/timer.h
|
||||||
event/task.h
|
event/task.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Json FILES
|
SOURCE_GROUP(Json FILES
|
||||||
json/json.h
|
json/json.h
|
||||||
json/jsoncpp.cpp
|
json/jsoncpp.cpp
|
||||||
json/json-forwards.h
|
json/json-forwards.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Net FILES
|
SOURCE_GROUP(Net FILES
|
||||||
net/console_server.cpp
|
net/console_server.cpp
|
||||||
@@ -745,7 +680,6 @@ SOURCE_GROUP(Net FILES
|
|||||||
net/crc32.h
|
net/crc32.h
|
||||||
net/daybreak_connection.cpp
|
net/daybreak_connection.cpp
|
||||||
net/daybreak_connection.h
|
net/daybreak_connection.h
|
||||||
net/daybreak_pooling.h
|
|
||||||
net/daybreak_structs.h
|
net/daybreak_structs.h
|
||||||
net/dns.h
|
net/dns.h
|
||||||
net/endian.h
|
net/endian.h
|
||||||
@@ -766,14 +700,13 @@ SOURCE_GROUP(Net FILES
|
|||||||
net/servertalk_server_connection.h
|
net/servertalk_server_connection.h
|
||||||
net/tcp_connection.cpp
|
net/tcp_connection.cpp
|
||||||
net/tcp_connection.h
|
net/tcp_connection.h
|
||||||
net/tcp_connection_pooling.h
|
|
||||||
net/tcp_server.cpp
|
net/tcp_server.cpp
|
||||||
net/tcp_server.h
|
net/tcp_server.h
|
||||||
net/websocket_server.cpp
|
net/websocket_server.cpp
|
||||||
net/websocket_server.h
|
net/websocket_server.h
|
||||||
net/websocket_server_connection.cpp
|
net/websocket_server_connection.cpp
|
||||||
net/websocket_server_connection.h
|
net/websocket_server_connection.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Patches FILES
|
SOURCE_GROUP(Patches FILES
|
||||||
patches/patches.h
|
patches/patches.h
|
||||||
@@ -817,12 +750,12 @@ SOURCE_GROUP(Patches FILES
|
|||||||
patches/titanium_limits.cpp
|
patches/titanium_limits.cpp
|
||||||
patches/uf.cpp
|
patches/uf.cpp
|
||||||
patches/uf_limits.cpp
|
patches/uf_limits.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(StackWalker FILES
|
SOURCE_GROUP(StackWalker FILES
|
||||||
StackWalker/StackWalker.h
|
StackWalker/StackWalker.h
|
||||||
StackWalker/StackWalker.cpp
|
StackWalker/StackWalker.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP(Util FILES
|
SOURCE_GROUP(Util FILES
|
||||||
util/memory_stream.h
|
util/memory_stream.h
|
||||||
@@ -830,7 +763,7 @@ SOURCE_GROUP(Util FILES
|
|||||||
util/directory.h
|
util/directory.h
|
||||||
util/uuid.cpp
|
util/uuid.cpp
|
||||||
util/uuid.h
|
util/uuid.h
|
||||||
)
|
)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(Patches SocketLib StackWalker)
|
INCLUDE_DIRECTORIES(Patches SocketLib StackWalker)
|
||||||
|
|
||||||
@@ -841,8 +774,5 @@ IF (UNIX)
|
|||||||
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||||
ENDIF (UNIX)
|
ENDIF (UNIX)
|
||||||
|
|
||||||
IF (WIN32 AND EQEMU_BUILD_PCH)
|
|
||||||
TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/pch.h)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EQEMU_COMMON_BASE_DATA_H
|
||||||
|
#define __EQEMU_COMMON_BASE_DATA_H
|
||||||
|
|
||||||
|
struct BaseDataStruct
|
||||||
|
{
|
||||||
|
double base_hp;
|
||||||
|
double base_mana;
|
||||||
|
double base_end;
|
||||||
|
double hp_regen;
|
||||||
|
double end_regen;
|
||||||
|
double hp_factor;
|
||||||
|
double mana_factor;
|
||||||
|
double endurance_factor;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,334 +0,0 @@
|
|||||||
#include "bazaar.h"
|
|
||||||
|
|
||||||
#include "../../common/item_instance.h"
|
|
||||||
#include "repositories/trader_repository.h"
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
std::vector<BazaarSearchResultsFromDB_Struct>
|
|
||||||
Bazaar::GetSearchResults(
|
|
||||||
Database &db,
|
|
||||||
Database &content_db,
|
|
||||||
BazaarSearchCriteria_Struct search,
|
|
||||||
uint32 char_zone_id,
|
|
||||||
int32 char_zone_instance_id
|
|
||||||
)
|
|
||||||
{
|
|
||||||
LogTrading(
|
|
||||||
"Searching for items with search criteria - item_name [{}] min_cost [{}] max_cost [{}] min_level [{}] "
|
|
||||||
"max_level [{}] max_results [{}] prestige [{}] augment [{}] trader_entity_id [{}] trader_id [{}] "
|
|
||||||
"search_scope [{}] char_zone_id [{}], char_zone_instance_id [{}]",
|
|
||||||
search.item_name,
|
|
||||||
search.min_cost,
|
|
||||||
search.max_cost,
|
|
||||||
search.min_level,
|
|
||||||
search.max_level,
|
|
||||||
search.max_results,
|
|
||||||
search.prestige,
|
|
||||||
search.augment,
|
|
||||||
search.trader_entity_id,
|
|
||||||
search.trader_id,
|
|
||||||
search.search_scope,
|
|
||||||
char_zone_id,
|
|
||||||
char_zone_instance_id
|
|
||||||
);
|
|
||||||
|
|
||||||
static std::map<uint8, uint32> item_slot_searches_new = {
|
|
||||||
{EQ::invslot::slotCharm, 1},
|
|
||||||
{EQ::invslot::slotEar1, 2},
|
|
||||||
{EQ::invslot::slotHead, 4},
|
|
||||||
{EQ::invslot::slotFace, 8},
|
|
||||||
{EQ::invslot::slotEar2, 16},
|
|
||||||
{EQ::invslot::slotNeck, 32},
|
|
||||||
{EQ::invslot::slotShoulders, 64},
|
|
||||||
{EQ::invslot::slotArms, 128},
|
|
||||||
{EQ::invslot::slotBack, 256},
|
|
||||||
{EQ::invslot::slotWrist1, 512},
|
|
||||||
{EQ::invslot::slotWrist2, 1024},
|
|
||||||
{EQ::invslot::slotRange, 2048},
|
|
||||||
{EQ::invslot::slotHands, 4096},
|
|
||||||
{EQ::invslot::slotPrimary, 8192},
|
|
||||||
{EQ::invslot::slotSecondary, 16384},
|
|
||||||
{EQ::invslot::slotFinger1, 32768},
|
|
||||||
{EQ::invslot::slotFinger2, 65536},
|
|
||||||
{EQ::invslot::slotChest, 131072},
|
|
||||||
{EQ::invslot::slotLegs, 262144},
|
|
||||||
{EQ::invslot::slotFeet, 524288},
|
|
||||||
{EQ::invslot::slotWaist, 1048576},
|
|
||||||
{EQ::invslot::slotPowerSource, 2097152},
|
|
||||||
{EQ::invslot::slotAmmo, 4194304},
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ItemSearchType {
|
|
||||||
EQ::item::ItemType type;
|
|
||||||
std::string condition;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::vector<ItemSearchType> item_search_types_new = {
|
|
||||||
{EQ::item::ItemType::ItemTypeBook, " AND (items.itemclass = 2 or items.itemclass = 31)"},
|
|
||||||
{EQ::item::ItemType::ItemTypeContainer, " AND (items.itemclass = 1 or items.itemclass = 67)"},
|
|
||||||
{EQ::item::ItemType::ItemTypeAllEffects, " AND (items.scrolleffect > 0 && items.scrolleffect < 65000)"},
|
|
||||||
{EQ::item::ItemType::ItemTypeUnknown9, " AND items.worneffect = 998"},
|
|
||||||
{EQ::item::ItemType::ItemTypeUnknown10, " AND (items.worneffect >= 1298 && items.worneffect <= 1307)"},
|
|
||||||
{EQ::item::ItemType::ItemTypeFocusEffect, " AND items.focuseffect > 0"},
|
|
||||||
{EQ::item::ItemType::ItemTypeArmor, " AND items.itemtype = 10"},
|
|
||||||
{EQ::item::ItemType::ItemType1HBlunt, " AND items.itemtype = 3"},
|
|
||||||
{EQ::item::ItemType::ItemType1HPiercing, " AND items.itemtype = 2"},
|
|
||||||
{EQ::item::ItemType::ItemType1HSlash, " AND items.itemtype = 0"},
|
|
||||||
{EQ::item::ItemType::ItemType2HBlunt, " AND items.itemtype = 4"},
|
|
||||||
{EQ::item::ItemType::ItemType2HSlash, " AND items.itemtype = 1"},
|
|
||||||
{EQ::item::ItemType::ItemTypeBow, " AND items.itemtype = 5"},
|
|
||||||
{EQ::item::ItemType::ItemTypeShield, " AND items.itemtype = 8"},
|
|
||||||
{EQ::item::ItemType::ItemTypeMisc, " AND items.itemtype = 11"},
|
|
||||||
{EQ::item::ItemType::ItemTypeFood, " AND items.itemtype = 14"},
|
|
||||||
{EQ::item::ItemType::ItemTypeDrink, " AND items.itemtype = 15"},
|
|
||||||
{EQ::item::ItemType::ItemTypeLight, " AND items.itemtype = 16"},
|
|
||||||
{EQ::item::ItemType::ItemTypeCombinable, " AND items.itemtype = 17"},
|
|
||||||
{EQ::item::ItemType::ItemTypeBandage, " AND items.itemtype = 18"},
|
|
||||||
{EQ::item::ItemType::ItemTypeSmallThrowing, " AND (items.itemtype = 19 OR items.itemtype = 7)"},
|
|
||||||
{EQ::item::ItemType::ItemTypeSpell, " AND items.itemtype = 20"},
|
|
||||||
{EQ::item::ItemType::ItemTypePotion, " AND items.itemtype = 21"},
|
|
||||||
{EQ::item::ItemType::ItemTypeBrassInstrument, " AND items.itemtype = 25"},
|
|
||||||
{EQ::item::ItemType::ItemTypeWindInstrument, " AND items.itemtype = 23"},
|
|
||||||
{EQ::item::ItemType::ItemTypeStringedInstrument, " AND items.itemtype = 24"},
|
|
||||||
{EQ::item::ItemType::ItemTypePercussionInstrument, " AND items.itemtype = 26"},
|
|
||||||
{EQ::item::ItemType::ItemTypeArrow, " AND items.itemtype = 27"},
|
|
||||||
{EQ::item::ItemType::ItemTypeJewelry, " AND items.itemtype = 29"},
|
|
||||||
{EQ::item::ItemType::ItemTypeNote, " AND items.itemtype = 32"},
|
|
||||||
{EQ::item::ItemType::ItemTypeKey, " AND items.itemtype = 33"},
|
|
||||||
{EQ::item::ItemType::ItemType2HPiercing, " AND items.itemtype = 35"},
|
|
||||||
{EQ::item::ItemType::ItemTypeAlcohol, " AND items.itemtype = 38"},
|
|
||||||
{EQ::item::ItemType::ItemTypeMartial, " AND items.itemtype = 45"},
|
|
||||||
{EQ::item::ItemType::ItemTypeAugmentation, " AND items.itemtype = 54"},
|
|
||||||
{EQ::item::ItemType::ItemTypeAlternateAbility, " AND items.itemtype = 57"},
|
|
||||||
{EQ::item::ItemType::ItemTypeCount, " AND items.itemtype = 65"},
|
|
||||||
{EQ::item::ItemType::ItemTypeCollectible, " AND items.itemtype = 66"}
|
|
||||||
};
|
|
||||||
|
|
||||||
// item stat searches
|
|
||||||
struct ItemStatSearch {
|
|
||||||
std::string query_string;
|
|
||||||
EQ::skills::SkillType skill_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
std::map<uint32, ItemStatSearch> item_stat_searches_new = {
|
|
||||||
{STAT_AC, {" items.ac" , static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_AGI, {" items.aagi", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_CHA, {" items.acha", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_DEX, {" items.adex", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_INT, {" items.aint", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_STA, {" items.asta", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_STR, {" items.astr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_WIS, {" items.awis", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_COLD, {" items.cr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_DISEASE, {" items.dr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_FIRE, {" items.fr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_MAGIC, {" items.mr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_POISON, {" items.pr", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HP, {" items.hp", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_MANA, {" items.mana", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_ENDURANCE, {" items.endur", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_ATTACK, {" items.attack", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HP_REGEN, {" items.regen", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_MANA_REGEN, {" items.manaregen", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HASTE, {" items.haste", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_DAMAGE_SHIELD, {" items.damageshield", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_DS_MITIGATION, {" items.dsmitigation", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEAL_AMOUNT, {" items.healamt", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_SPELL_DAMAGE, {" items.spelldmg", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_CLAIRVOYANCE, {" items.clairvoyance", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_AGILITY, {" items.heroic_agi", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_CHARISMA, {" items.heroic_cha", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_DEXTERITY, {" items.heroic_dex", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_INTELLIGENCE, {" items.heroic_int", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_STAMINA, {" items.heroic_sta", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_STRENGTH, {" items.heroic_str", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_HEROIC_WISDOM, {" items.heroic_wis", static_cast<EQ::skills::SkillType>(0)} },
|
|
||||||
{STAT_BASH, {" items.skillmodvalue", EQ::skills::SkillBash} },
|
|
||||||
{STAT_BACKSTAB, {" items.backstabdmg", EQ::skills::SkillBackstab} },
|
|
||||||
{STAT_DRAGON_PUNCH, {" items.skillmodvalue", EQ::skills::SkillDragonPunch} },
|
|
||||||
{STAT_EAGLE_STRIKE, {" items.skillmodvalue", EQ::skills::SkillEagleStrike} },
|
|
||||||
{STAT_FLYING_KICK, {" items.skillmodvalue", EQ::skills::SkillFlyingKick} },
|
|
||||||
{STAT_KICK, {" items.skillmodvalue", EQ::skills::SkillKick} },
|
|
||||||
{STAT_ROUND_KICK, {" items.skillmodvalue", EQ::skills::SkillRoundKick} },
|
|
||||||
{STAT_TIGER_CLAW, {" items.skillmodvalue", EQ::skills::SkillTigerClaw} },
|
|
||||||
{STAT_FRENZY, {" items.skillmodvalue", EQ::skills::SkillFrenzy} },
|
|
||||||
};
|
|
||||||
|
|
||||||
bool convert = false;
|
|
||||||
std::string search_criteria_trader("TRUE");
|
|
||||||
std::string field_criteria_items("FALSE");
|
|
||||||
std::string where_criteria_items(" TRUE ");
|
|
||||||
|
|
||||||
if (search.search_scope == NonRoFBazaarSearchScope) {
|
|
||||||
search_criteria_trader.append(
|
|
||||||
fmt::format(
|
|
||||||
" AND trader.char_entity_id = {} AND trader.char_zone_id = {} AND trader.char_zone_instance_id = {}",
|
|
||||||
search.trader_entity_id,
|
|
||||||
Zones::BAZAAR,
|
|
||||||
char_zone_instance_id
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (search.search_scope == Local_Scope) {
|
|
||||||
search_criteria_trader.append(fmt::format(
|
|
||||||
" AND trader.char_zone_id = {} AND trader.char_zone_instance_id = {}",
|
|
||||||
char_zone_id,
|
|
||||||
char_zone_instance_id)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else if (search.trader_id > 0) {
|
|
||||||
if (RuleB(Bazaar, UseAlternateBazaarSearch)) {
|
|
||||||
if (search.trader_id >= TraderRepository::TRADER_CONVERT_ID) {
|
|
||||||
convert = true;
|
|
||||||
search_criteria_trader.append(fmt::format(
|
|
||||||
" AND trader.char_zone_id = {} AND trader.char_zone_instance_id = {}",
|
|
||||||
Zones::BAZAAR,
|
|
||||||
search.trader_id - TraderRepository::TRADER_CONVERT_ID)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
search_criteria_trader.append(fmt::format(" AND trader.char_id = {}", search.trader_id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
search_criteria_trader.append(fmt::format(" AND trader.char_id = {}", search.trader_id));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.min_cost != 0) {
|
|
||||||
search_criteria_trader.append(fmt::format(" AND trader.item_cost >= {}", search.min_cost * 1000));
|
|
||||||
}
|
|
||||||
if (search.max_cost != 0) {
|
|
||||||
search_criteria_trader.append(fmt::format(" AND trader.item_cost <= {}", (uint64) search.max_cost * 1000));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.slot != std::numeric_limits<uint32>::max()) {
|
|
||||||
if (item_slot_searches_new.contains(search.slot)) {
|
|
||||||
where_criteria_items.append(
|
|
||||||
fmt::format(" AND items.slots & {0} = {0}", item_slot_searches_new[search.slot]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.type != std::numeric_limits<uint32>::max()) {
|
|
||||||
for (auto const &[type, condition]: item_search_types_new) {
|
|
||||||
if (type == search.type) {
|
|
||||||
where_criteria_items.append(condition);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.race != std::numeric_limits<uint32>::max()) {
|
|
||||||
where_criteria_items.append(
|
|
||||||
fmt::format(" AND items.races & {0} = {0}", GetPlayerRaceBit(GetRaceIDFromPlayerRaceValue(search.race))));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search._class != std::numeric_limits<uint32>::max()) {
|
|
||||||
where_criteria_items.append(fmt::format(" AND items.classes & {0} = {0}", GetPlayerClassBit(search._class)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.item_stat != std::numeric_limits<uint32>::max()) {
|
|
||||||
if (item_stat_searches_new.contains(search.item_stat)) {
|
|
||||||
field_criteria_items = fmt::format("{}", item_stat_searches_new[search.item_stat].query_string);
|
|
||||||
if (item_stat_searches_new[search.item_stat].skill_type) {
|
|
||||||
where_criteria_items.append(
|
|
||||||
fmt::format(" AND items.skillmodtype = {} ", item_stat_searches_new[search.item_stat].skill_type));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
where_criteria_items.append(
|
|
||||||
fmt::format(" AND {} > 0 ", item_stat_searches_new[search.item_stat].query_string));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.augment) {
|
|
||||||
where_criteria_items.append(fmt::format(
|
|
||||||
" AND (items.augslot1type = {0} OR "
|
|
||||||
"items.augslot2type = {0} OR "
|
|
||||||
"items.augslot3type = {0} OR "
|
|
||||||
"items.augslot4type = {0} OR "
|
|
||||||
"items.augslot5type = {0} OR "
|
|
||||||
"items.augslot6type = {0})",
|
|
||||||
search.augment)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.min_level != 1) {
|
|
||||||
where_criteria_items.append(fmt::format(" AND items.reclevel >= {}", search.min_level));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (search.max_level != 100) {
|
|
||||||
where_criteria_items.append(fmt::format(" AND items.reclevel <= {}", search.max_level));
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<BazaarSearchResultsFromDB_Struct> all_entries;
|
|
||||||
std::vector<std::string> trader_items_ids{};
|
|
||||||
|
|
||||||
auto const trader_results = TraderRepository::GetBazaarTraderDetails(db, search_criteria_trader);
|
|
||||||
if (trader_results.empty()) {
|
|
||||||
LogTradingDetail("Bazaar - No traders found in bazaar search.");
|
|
||||||
return all_entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto const &i: trader_results) {
|
|
||||||
trader_items_ids.push_back(std::to_string(i.trader.item_id));
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const item_results = ItemsRepository::GetItemsForBazaarSearch(
|
|
||||||
content_db,
|
|
||||||
trader_items_ids,
|
|
||||||
std::string(search.item_name),
|
|
||||||
field_criteria_items,
|
|
||||||
where_criteria_items,
|
|
||||||
search.max_results
|
|
||||||
);
|
|
||||||
|
|
||||||
if (item_results.empty()) {
|
|
||||||
LogTradingDetail("Bazaar - No items found in bazaar search.");
|
|
||||||
return all_entries;
|
|
||||||
}
|
|
||||||
|
|
||||||
all_entries.reserve(trader_results.size());
|
|
||||||
|
|
||||||
for (auto const& t:trader_results) {
|
|
||||||
if (!item_results.contains(t.trader.item_id)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
BazaarSearchResultsFromDB_Struct r{};
|
|
||||||
r.count = 1;
|
|
||||||
r.trader_id = t.trader.char_id;
|
|
||||||
r.serial_number = t.trader.item_sn;
|
|
||||||
r.cost = t.trader.item_cost;
|
|
||||||
r.slot_id = t.trader.slot_id;
|
|
||||||
r.charges = t.trader.item_charges;
|
|
||||||
r.stackable = item_results.at(t.trader.item_id).stackable;
|
|
||||||
r.icon_id = item_results.at(t.trader.item_id).icon;
|
|
||||||
r.trader_zone_id = t.trader.char_zone_id;
|
|
||||||
r.trader_zone_instance_id = t.trader.char_zone_instance_id;
|
|
||||||
r.trader_entity_id = t.trader.char_entity_id;
|
|
||||||
r.serial_number_RoF = fmt::format("{:016}\0", t.trader.item_sn);
|
|
||||||
r.item_name = fmt::format("{:.63}\0", item_results.at(t.trader.item_id).name);
|
|
||||||
r.trader_name = fmt::format("{:.63}\0", t.trader_name);
|
|
||||||
r.item_stat = item_results.at(t.trader.item_id).stats;
|
|
||||||
|
|
||||||
if (RuleB(Bazaar, UseAlternateBazaarSearch)) {
|
|
||||||
if (convert ||
|
|
||||||
char_zone_id != Zones::BAZAAR ||
|
|
||||||
(char_zone_id == Zones::BAZAAR && r.trader_zone_instance_id != char_zone_instance_id)
|
|
||||||
) {
|
|
||||||
r.trader_id = TraderRepository::TRADER_CONVERT_ID + r.trader_zone_instance_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
all_entries.push_back(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (all_entries.size() > search.max_results) {
|
|
||||||
all_entries.resize(search.max_results);
|
|
||||||
}
|
|
||||||
|
|
||||||
LogTrading("Returning [{}] items from search results", all_entries.size());
|
|
||||||
|
|
||||||
return all_entries;
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
#ifndef EQEMU_BAZAAR_H
|
|
||||||
#define EQEMU_BAZAAR_H
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include "shareddb.h"
|
|
||||||
#include "../../common/item_instance.h"
|
|
||||||
|
|
||||||
class Bazaar {
|
|
||||||
public:
|
|
||||||
static std::vector<BazaarSearchResultsFromDB_Struct>
|
|
||||||
GetSearchResults(Database &content_db, Database &db, BazaarSearchCriteria_Struct search, unsigned int char_zone_id, int char_zone_instance_id);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //EQEMU_BAZAAR_H
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#include "../common/global_define.h"
|
|
||||||
#include "../common/bodytypes.h"
|
|
||||||
|
|
||||||
std::string BodyType::GetName(uint8 body_type_id)
|
|
||||||
{
|
|
||||||
return IsValid(body_type_id) ? body_type_names[body_type_id] : "UNKNOWN BODY TYPE";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool BodyType::IsValid(uint8 body_type_id)
|
|
||||||
{
|
|
||||||
return body_type_names.find(body_type_id) != body_type_names.end();
|
|
||||||
}
|
|
||||||
+45
-91
@@ -18,96 +18,50 @@
|
|||||||
#ifndef BODYTYPES_H
|
#ifndef BODYTYPES_H
|
||||||
#define BODYTYPES_H
|
#define BODYTYPES_H
|
||||||
|
|
||||||
#include "types.h"
|
typedef enum {
|
||||||
#include <map>
|
BT_Humanoid = 1,
|
||||||
#include <string>
|
BT_Lycanthrope = 2,
|
||||||
|
BT_Undead = 3,
|
||||||
// body types above 64 make the mob invisible
|
BT_Giant = 4,
|
||||||
namespace BodyType {
|
BT_Construct = 5,
|
||||||
constexpr uint8 Humanoid = 1;
|
BT_Extraplanar = 6,
|
||||||
constexpr uint8 Lycanthrope = 2;
|
BT_Magical = 7, //this name might be a bit off,
|
||||||
constexpr uint8 Undead = 3;
|
BT_SummonedUndead = 8,
|
||||||
constexpr uint8 Giant = 4;
|
BT_RaidGiant = 9, //Velious era Raid Giant
|
||||||
constexpr uint8 Construct = 5;
|
BT_RaidColdain = 10, //Velious era Raid Coldain
|
||||||
constexpr uint8 Extraplanar = 6;
|
BT_NoTarget = 11, //no name, can't target this bodytype
|
||||||
constexpr uint8 Magical = 7; // this name might be a bit off,
|
BT_Vampire = 12,
|
||||||
constexpr uint8 SummonedUndead = 8;
|
BT_Atenha_Ra = 13,
|
||||||
constexpr uint8 RaidGiant = 9; // Velious era Raid Giant
|
BT_Greater_Akheva = 14,
|
||||||
constexpr uint8 RaidColdain = 10; // Velious era Raid Coldain
|
BT_Khati_Sha = 15,
|
||||||
constexpr uint8 NoTarget = 11; // no name, can't target this bodytype
|
BT_Seru = 16,
|
||||||
constexpr uint8 Vampire = 12;
|
BT_Grieg_Veneficus = 17,
|
||||||
constexpr uint8 AtenHaRa = 13;
|
BT_Draz_Nurakk = 18,
|
||||||
constexpr uint8 GreaterAkheva = 14;
|
BT_Zek = 19, //"creatures from the Plane of War."
|
||||||
constexpr uint8 KhatiSha = 15;
|
BT_Luggald = 20,
|
||||||
constexpr uint8 Seru = 16;
|
BT_Animal = 21,
|
||||||
constexpr uint8 GriegVeneficus = 17;
|
BT_Insect = 22,
|
||||||
constexpr uint8 DrazNurakk = 18;
|
BT_Monster = 23,
|
||||||
constexpr uint8 Zek = 19; //"creatures from the Plane of War."
|
BT_Summoned = 24, //Elemental?
|
||||||
constexpr uint8 Luggald = 20;
|
BT_Plant = 25,
|
||||||
constexpr uint8 Animal = 21;
|
BT_Dragon = 26,
|
||||||
constexpr uint8 Insect = 22;
|
BT_Summoned2 = 27,
|
||||||
constexpr uint8 Monster = 23;
|
BT_Summoned3 = 28,
|
||||||
constexpr uint8 Summoned = 24; // Elemental?
|
BT_Dragon2 = 29, //database data indicates this is a dragon type (kunark and DoN?)
|
||||||
constexpr uint8 Plant = 25;
|
BT_VeliousDragon = 30, //might not be a tight set
|
||||||
constexpr uint8 Dragon = 26;
|
BT_Familiar = 31,
|
||||||
constexpr uint8 Summoned2 = 27;
|
BT_Dragon3 = 32,
|
||||||
constexpr uint8 Summoned3 = 28;
|
BT_Boxes = 33,
|
||||||
constexpr uint8 Dragon2 = 29; // database data indicates this is a dragon type (Kunark and DoN?)
|
BT_Muramite = 34, //tribal dudes
|
||||||
constexpr uint8 VeliousDragon = 30; // might not be a tight set
|
// ...
|
||||||
constexpr uint8 Familiar = 31;
|
BT_NoTarget2 = 60,
|
||||||
constexpr uint8 Dragon3 = 32;
|
// ...
|
||||||
constexpr uint8 Boxes = 33;
|
BT_SwarmPet = 63, //Looks like weapon proc related temp pets and few misc pets, should not be used for checking swarm pets in general.
|
||||||
constexpr uint8 Muramite = 34; // tribal dudes
|
BT_MonsterSummon = 64,
|
||||||
constexpr uint8 NoTarget2 = 60;
|
// 65, trap or effect related?
|
||||||
constexpr uint8 SwarmPet = 63; // Looks like weapon proc related temp pets and few misc pets, should not be used for checking swarm pets in general.
|
BT_InvisMan = 66, //no name, seen on 'InvisMan', can be /targeted
|
||||||
constexpr uint8 MonsterSummon = 64;
|
BT_Special = 67
|
||||||
constexpr uint8 InvisibleMan = 66; // no name, seen on 'InvisMan', can be /targeted
|
} bodyType;
|
||||||
constexpr uint8 Special = 67;
|
/* bodytypes above 64 make the mob not show up */
|
||||||
|
|
||||||
std::string GetName(uint8 body_type_id);
|
|
||||||
bool IsValid(uint8 body_type_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint8, std::string> body_type_names = {
|
|
||||||
{ BodyType::Humanoid, "Humanoid" },
|
|
||||||
{ BodyType::Lycanthrope, "Lycanthrope" },
|
|
||||||
{ BodyType::Undead, "Undead" },
|
|
||||||
{ BodyType::Giant, "Giant" },
|
|
||||||
{ BodyType::Construct, "Construct" },
|
|
||||||
{ BodyType::Extraplanar, "Extraplanar" },
|
|
||||||
{ BodyType::Magical, "Magical" },
|
|
||||||
{ BodyType::SummonedUndead, "Summoned Undead" },
|
|
||||||
{ BodyType::RaidGiant, "Raid Giant" },
|
|
||||||
{ BodyType::RaidColdain, "Raid Coldain" },
|
|
||||||
{ BodyType::NoTarget, "Untargetable" },
|
|
||||||
{ BodyType::Vampire, "Vampire" },
|
|
||||||
{ BodyType::AtenHaRa, "Aten Ha Ra" },
|
|
||||||
{ BodyType::GreaterAkheva, "Greater Akheva" },
|
|
||||||
{ BodyType::KhatiSha, "Khati Sha" },
|
|
||||||
{ BodyType::Seru, "Seru" },
|
|
||||||
{ BodyType::GriegVeneficus, "Grieg Veneficus" },
|
|
||||||
{ BodyType::DrazNurakk, "Draz Nurakk" },
|
|
||||||
{ BodyType::Zek, "Zek" },
|
|
||||||
{ BodyType::Luggald, "Luggald" },
|
|
||||||
{ BodyType::Animal, "Animal" },
|
|
||||||
{ BodyType::Insect, "Insect" },
|
|
||||||
{ BodyType::Monster, "Monster" },
|
|
||||||
{ BodyType::Summoned, "Summoned" },
|
|
||||||
{ BodyType::Plant, "Plant" },
|
|
||||||
{ BodyType::Dragon, "Dragon" },
|
|
||||||
{ BodyType::Summoned2, "Summoned 2" },
|
|
||||||
{ BodyType::Summoned3, "Summoned 3" },
|
|
||||||
{ BodyType::Dragon2, "Dragon 2" },
|
|
||||||
{ BodyType::VeliousDragon, "Velious Dragon" },
|
|
||||||
{ BodyType::Familiar, "Familiar" },
|
|
||||||
{ BodyType::Dragon3, "Dragon 3" },
|
|
||||||
{ BodyType::Boxes, "Boxes" },
|
|
||||||
{ BodyType::Muramite, "Muramite" },
|
|
||||||
{ BodyType::NoTarget2, "Untargetable 2" },
|
|
||||||
{ BodyType::SwarmPet, "Swarm Pet" },
|
|
||||||
{ BodyType::MonsterSummon, "Monster Summon" },
|
|
||||||
{ BodyType::InvisibleMan, "Invisible Man" },
|
|
||||||
{ BodyType::Special, "Special" },
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+447
-348
File diff suppressed because it is too large
Load Diff
+92
-103
@@ -19,106 +19,97 @@
|
|||||||
#define CLASSES_CH
|
#define CLASSES_CH
|
||||||
|
|
||||||
#include "../common/types.h"
|
#include "../common/types.h"
|
||||||
#include "../common/rulesys.h"
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace Class {
|
#define WARRIOR 1
|
||||||
constexpr uint8 None = 0;
|
#define CLERIC 2
|
||||||
constexpr uint8 Warrior = 1;
|
#define PALADIN 3
|
||||||
constexpr uint8 Cleric = 2;
|
#define RANGER 4
|
||||||
constexpr uint8 Paladin = 3;
|
#define SHADOWKNIGHT 5
|
||||||
constexpr uint8 Ranger = 4;
|
#define DRUID 6
|
||||||
constexpr uint8 ShadowKnight = 5;
|
#define MONK 7
|
||||||
constexpr uint8 Druid = 6;
|
#define BARD 8
|
||||||
constexpr uint8 Monk = 7;
|
#define ROGUE 9
|
||||||
constexpr uint8 Bard = 8;
|
#define SHAMAN 10
|
||||||
constexpr uint8 Rogue = 9;
|
#define NECROMANCER 11
|
||||||
constexpr uint8 Shaman = 10;
|
#define WIZARD 12
|
||||||
constexpr uint8 Necromancer = 11;
|
#define MAGICIAN 13
|
||||||
constexpr uint8 Wizard = 12;
|
#define ENCHANTER 14
|
||||||
constexpr uint8 Magician = 13;
|
#define BEASTLORD 15
|
||||||
constexpr uint8 Enchanter = 14;
|
#define BERSERKER 16
|
||||||
constexpr uint8 Beastlord = 15;
|
#define WARRIORGM 20
|
||||||
constexpr uint8 Berserker = 16;
|
#define CLERICGM 21
|
||||||
constexpr uint8 WarriorGM = 20;
|
#define PALADINGM 22
|
||||||
constexpr uint8 ClericGM = 21;
|
#define RANGERGM 23
|
||||||
constexpr uint8 PaladinGM = 22;
|
#define SHADOWKNIGHTGM 24
|
||||||
constexpr uint8 RangerGM = 23;
|
#define DRUIDGM 25
|
||||||
constexpr uint8 ShadowKnightGM = 24;
|
#define MONKGM 26
|
||||||
constexpr uint8 DruidGM = 25;
|
#define BARDGM 27
|
||||||
constexpr uint8 MonkGM = 26;
|
#define ROGUEGM 28
|
||||||
constexpr uint8 BardGM = 27;
|
#define SHAMANGM 29
|
||||||
constexpr uint8 RogueGM = 28;
|
#define NECROMANCERGM 30
|
||||||
constexpr uint8 ShamanGM = 29;
|
#define WIZARDGM 31
|
||||||
constexpr uint8 NecromancerGM = 30;
|
#define MAGICIANGM 32
|
||||||
constexpr uint8 WizardGM = 31;
|
#define ENCHANTERGM 33
|
||||||
constexpr uint8 MagicianGM = 32;
|
#define BEASTLORDGM 34
|
||||||
constexpr uint8 EnchanterGM = 33;
|
#define BERSERKERGM 35
|
||||||
constexpr uint8 BeastlordGM = 34;
|
#define BANKER 40
|
||||||
constexpr uint8 BerserkerGM = 35;
|
#define MERCHANT 41
|
||||||
constexpr uint8 Banker = 40;
|
#define DISCORD_MERCHANT 59
|
||||||
constexpr uint8 Merchant = 41;
|
#define ADVENTURE_RECRUITER 60
|
||||||
constexpr uint8 DiscordMerchant = 59;
|
#define ADVENTURE_MERCHANT 61
|
||||||
constexpr uint8 AdventureRecruiter = 60;
|
#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs, seen on Danvi's Corpse in Akheva
|
||||||
constexpr uint8 AdventureMerchant = 61;
|
#define TRIBUTE_MASTER 63
|
||||||
constexpr uint8 LDoNTreasure = 62;
|
#define GUILD_TRIBUTE_MASTER 64 // not sure
|
||||||
constexpr uint8 TributeMaster = 63;
|
#define GUILD_BANKER 66
|
||||||
constexpr uint8 GuildTributeMaster = 64;
|
#define NORRATHS_KEEPERS_MERCHANT 67
|
||||||
constexpr uint8 GuildBanker = 66;
|
#define DARK_REIGN_MERCHANT 68
|
||||||
constexpr uint8 NorrathsKeepersMerchant = 67;
|
#define FELLOWSHIP_MASTER 69
|
||||||
constexpr uint8 DarkReignMerchant = 68;
|
#define ALT_CURRENCY_MERCHANT 70
|
||||||
constexpr uint8 FellowshipMaster = 69;
|
#define MERCENARY_MASTER 71
|
||||||
constexpr uint8 AlternateCurrencyMerchant = 70;
|
|
||||||
constexpr uint8 MercenaryLiaison = 71;
|
|
||||||
|
|
||||||
constexpr uint8 PLAYER_CLASS_COUNT = 16;
|
|
||||||
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<uint8, uint16> player_class_bitmasks = {
|
// player class values
|
||||||
{Class::Warrior, 1},
|
#define PLAYER_CLASS_UNKNOWN 0
|
||||||
{Class::Cleric, 2},
|
#define PLAYER_CLASS_WARRIOR 1
|
||||||
{Class::Paladin, 4},
|
#define PLAYER_CLASS_CLERIC 2
|
||||||
{Class::Ranger, 8},
|
#define PLAYER_CLASS_PALADIN 3
|
||||||
{Class::ShadowKnight, 16},
|
#define PLAYER_CLASS_RANGER 4
|
||||||
{Class::Druid, 32},
|
#define PLAYER_CLASS_SHADOWKNIGHT 5
|
||||||
{Class::Monk, 64},
|
#define PLAYER_CLASS_DRUID 6
|
||||||
{Class::Bard, 128},
|
#define PLAYER_CLASS_MONK 7
|
||||||
{Class::Rogue, 256},
|
#define PLAYER_CLASS_BARD 8
|
||||||
{Class::Shaman, 512},
|
#define PLAYER_CLASS_ROGUE 9
|
||||||
{Class::Necromancer, 1024},
|
#define PLAYER_CLASS_SHAMAN 10
|
||||||
{Class::Wizard, 2048},
|
#define PLAYER_CLASS_NECROMANCER 11
|
||||||
{Class::Magician, 4096},
|
#define PLAYER_CLASS_WIZARD 12
|
||||||
{Class::Enchanter, 8192},
|
#define PLAYER_CLASS_MAGICIAN 13
|
||||||
{Class::Beastlord, 16384},
|
#define PLAYER_CLASS_ENCHANTER 14
|
||||||
{Class::Berserker, 32768},
|
#define PLAYER_CLASS_BEASTLORD 15
|
||||||
};
|
#define PLAYER_CLASS_BERSERKER 16
|
||||||
|
|
||||||
static std::string shadow_knight_class_name = (
|
#define PLAYER_CLASS_COUNT 16
|
||||||
RuleB(World, UseOldShadowKnightClassExport) ?
|
|
||||||
"Shadowknight" :
|
|
||||||
"Shadow Knight"
|
|
||||||
);
|
|
||||||
|
|
||||||
static std::map<uint8, std::string> class_names = {
|
|
||||||
{Class::Warrior, "Warrior"},
|
// player class bits
|
||||||
{Class::Cleric, "Cleric"},
|
#define PLAYER_CLASS_UNKNOWN_BIT 0
|
||||||
{Class::Paladin, "Paladin"},
|
#define PLAYER_CLASS_WARRIOR_BIT 1
|
||||||
{Class::Ranger, "Ranger"},
|
#define PLAYER_CLASS_CLERIC_BIT 2
|
||||||
{Class::ShadowKnight, shadow_knight_class_name},
|
#define PLAYER_CLASS_PALADIN_BIT 4
|
||||||
{Class::Druid, "Druid"},
|
#define PLAYER_CLASS_RANGER_BIT 8
|
||||||
{Class::Monk, "Monk"},
|
#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16
|
||||||
{Class::Bard, "Bard"},
|
#define PLAYER_CLASS_DRUID_BIT 32
|
||||||
{Class::Rogue, "Rogue"},
|
#define PLAYER_CLASS_MONK_BIT 64
|
||||||
{Class::Shaman, "Shaman"},
|
#define PLAYER_CLASS_BARD_BIT 128
|
||||||
{Class::Necromancer, "Necromancer"},
|
#define PLAYER_CLASS_ROGUE_BIT 256
|
||||||
{Class::Wizard, "Wizard"},
|
#define PLAYER_CLASS_SHAMAN_BIT 512
|
||||||
{Class::Magician, "Magician"},
|
#define PLAYER_CLASS_NECROMANCER_BIT 1024
|
||||||
{Class::Enchanter, "Enchanter"},
|
#define PLAYER_CLASS_WIZARD_BIT 2048
|
||||||
{Class::Beastlord, "Beastlord"},
|
#define PLAYER_CLASS_MAGICIAN_BIT 4096
|
||||||
{Class::Berserker, "Berserker"},
|
#define PLAYER_CLASS_ENCHANTER_BIT 8192
|
||||||
};
|
#define PLAYER_CLASS_BEASTLORD_BIT 16384
|
||||||
|
#define PLAYER_CLASS_BERSERKER_BIT 32768
|
||||||
|
|
||||||
|
#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
|
||||||
|
|
||||||
|
|
||||||
#define ARMOR_TYPE_UNKNOWN 0
|
#define ARMOR_TYPE_UNKNOWN 0
|
||||||
@@ -131,16 +122,15 @@ static std::map<uint8, std::string> class_names = {
|
|||||||
#define ARMOR_TYPE_LAST ARMOR_TYPE_PLATE
|
#define ARMOR_TYPE_LAST ARMOR_TYPE_PLATE
|
||||||
#define ARMOR_TYPE_COUNT 5
|
#define ARMOR_TYPE_COUNT 5
|
||||||
|
|
||||||
#define BOT_CLASS_BASE_ID_PREFIX 3000
|
|
||||||
|
|
||||||
|
|
||||||
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
||||||
|
const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
|
||||||
|
|
||||||
bool IsPlayerClass(uint8 class_id);
|
uint32 GetPlayerClassValue(uint8 class_id);
|
||||||
const std::string GetPlayerClassAbbreviation(uint8 class_id);
|
uint32 GetPlayerClassBit(uint8 class_id);
|
||||||
|
|
||||||
uint8 GetPlayerClassValue(uint8 class_id);
|
uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
|
||||||
uint16 GetPlayerClassBit(uint8 class_id);
|
uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
|
||||||
|
|
||||||
bool IsFighterClass(uint8 class_id);
|
bool IsFighterClass(uint8 class_id);
|
||||||
bool IsSpellFighterClass(uint8 class_id);
|
bool IsSpellFighterClass(uint8 class_id);
|
||||||
@@ -149,8 +139,7 @@ bool IsHybridClass(uint8 class_id);
|
|||||||
bool IsCasterClass(uint8 class_id);
|
bool IsCasterClass(uint8 class_id);
|
||||||
bool IsINTCasterClass(uint8 class_id);
|
bool IsINTCasterClass(uint8 class_id);
|
||||||
bool IsWISCasterClass(uint8 class_id);
|
bool IsWISCasterClass(uint8 class_id);
|
||||||
bool IsHeroicINTCasterClass(uint8 class_id);
|
|
||||||
bool IsHeroicWISCasterClass(uint8 class_id);
|
|
||||||
bool IsPlateClass(uint8 class_id);
|
bool IsPlateClass(uint8 class_id);
|
||||||
bool IsChainClass(uint8 class_id);
|
bool IsChainClass(uint8 class_id);
|
||||||
bool IsLeatherClass(uint8 class_id);
|
bool IsLeatherClass(uint8 class_id);
|
||||||
|
|||||||
@@ -39,15 +39,15 @@ namespace EQEmuCommand {
|
|||||||
{
|
{
|
||||||
if (cmd[{"-d", "--debug"}]) {
|
if (cmd[{"-d", "--debug"}]) {
|
||||||
std::cout << "Positional args:\n";
|
std::cout << "Positional args:\n";
|
||||||
for (auto &pos_arg: cmd.pos_args())
|
for (auto &pos_arg : cmd.pos_args())
|
||||||
std::cout << '\t' << pos_arg << std::endl;
|
std::cout << '\t' << pos_arg << std::endl;
|
||||||
|
|
||||||
std::cout << "\nFlags:\n";
|
std::cout << "\nFlags:\n";
|
||||||
for (auto &flag: cmd.flags())
|
for (auto &flag : cmd.flags())
|
||||||
std::cout << '\t' << flag << std::endl;
|
std::cout << '\t' << flag << std::endl;
|
||||||
|
|
||||||
std::cout << "\nParameters:\n";
|
std::cout << "\nParameters:\n";
|
||||||
for (auto ¶m: cmd.params())
|
for (auto ¶m : cmd.params())
|
||||||
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,22 +69,22 @@ namespace EQEmuCommand {
|
|||||||
{
|
{
|
||||||
bool arguments_filled = true;
|
bool arguments_filled = true;
|
||||||
|
|
||||||
int index = 2;
|
int index = 2;
|
||||||
for (auto &arg: arguments) {
|
for (auto &arg : arguments) {
|
||||||
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
||||||
arguments_filled = false;
|
arguments_filled = false;
|
||||||
}
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!arguments_filled || (argc == 2 && !cmd[{"-h", "--help"}]) || (argc == 3 && cmd[{"-h", "--help"}])) {
|
if (!arguments_filled || argc == 2 || cmd[{"-h", "--help"}]) {
|
||||||
std::string arguments_string;
|
std::string arguments_string;
|
||||||
for (auto &arg: arguments) {
|
for (auto &arg : arguments) {
|
||||||
arguments_string += " " + arg;
|
arguments_string += " " + arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string options_string;
|
std::string options_string;
|
||||||
for (auto &opt: options) {
|
for (auto &opt : options) {
|
||||||
options_string += " " + opt + "\n";
|
options_string += " " + opt + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,6 +124,14 @@ namespace EQEmuCommand {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
std::string description;
|
std::string description;
|
||||||
|
bool ran_command = false;
|
||||||
|
for (auto &it: in_function_map) {
|
||||||
|
if (it.first == argv[1]) {
|
||||||
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
ran_command = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd[{"-h", "--help"}]) {
|
if (cmd[{"-h", "--help"}]) {
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout <<
|
std::cout <<
|
||||||
@@ -134,7 +142,9 @@ namespace EQEmuCommand {
|
|||||||
<< std::endl
|
<< std::endl
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
// Get max command length for padding length
|
/**
|
||||||
|
* Get max command length for padding length
|
||||||
|
*/
|
||||||
int max_command_length = 0;
|
int max_command_length = 0;
|
||||||
|
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
@@ -145,14 +155,18 @@ namespace EQEmuCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display command menu
|
/**
|
||||||
|
* Display command menu
|
||||||
|
*/
|
||||||
std::string command_section;
|
std::string command_section;
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
description.clear();
|
description = "";
|
||||||
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
|
||||||
// Print section header
|
/**
|
||||||
|
* Print section header
|
||||||
|
*/
|
||||||
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
||||||
|
|
||||||
if (command_prefix.find("test") != std::string::npos) {
|
if (command_prefix.find("test") != std::string::npos) {
|
||||||
@@ -164,7 +178,9 @@ namespace EQEmuCommand {
|
|||||||
std::cout << termcolor::reset << command_prefix << std::endl;
|
std::cout << termcolor::reset << command_prefix << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print commands
|
/**
|
||||||
|
* Print commands
|
||||||
|
*/
|
||||||
std::stringstream command;
|
std::stringstream command;
|
||||||
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
||||||
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
||||||
@@ -175,15 +191,6 @@ namespace EQEmuCommand {
|
|||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ran_command = false;
|
|
||||||
|
|
||||||
for (auto &it: in_function_map) {
|
|
||||||
if (it.first == argv[1]) {
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
|
||||||
ran_command = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ran_command) {
|
if (ran_command) {
|
||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,29 @@
|
|||||||
#include "world_content_service.h"
|
/**
|
||||||
|
* EQEmulator: Everquest Server Emulator
|
||||||
|
* Copyright (C) 2001-2019 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
* are required to give you total support for your newly bought product;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#include <utility>
|
#include "world_content_service.h"
|
||||||
#include <glm/vec3.hpp>
|
|
||||||
#include "../database.h"
|
#include "../database.h"
|
||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../eqemu_logsys.h"
|
#include "../eqemu_logsys.h"
|
||||||
#include "../repositories/instance_list_repository.h"
|
#include "../loottable.h"
|
||||||
#include "../zone_store.h"
|
#include "../repositories/content_flags_repository.h"
|
||||||
|
|
||||||
|
|
||||||
WorldContentService::WorldContentService()
|
WorldContentService::WorldContentService()
|
||||||
@@ -103,7 +120,7 @@ std::vector<std::string> WorldContentService::GetContentFlagsDisabled()
|
|||||||
/**
|
/**
|
||||||
* @param content_flags
|
* @param content_flags
|
||||||
*/
|
*/
|
||||||
void WorldContentService::SetContentFlags(const std::vector<ContentFlagsRepository::ContentFlags> &content_flags)
|
void WorldContentService::SetContentFlags(std::vector<ContentFlagsRepository::ContentFlags> content_flags)
|
||||||
{
|
{
|
||||||
WorldContentService::content_flags = content_flags;
|
WorldContentService::content_flags = content_flags;
|
||||||
}
|
}
|
||||||
@@ -151,14 +168,14 @@ bool WorldContentService::DoesPassContentFiltering(const ContentFlags &f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if we don't have any enabled flag in enabled flags, we fail
|
// if we don't have any enabled flag in enabled flags, we fail
|
||||||
for (const auto &flag: Strings::Split(f.content_flags)) {
|
for (const auto& flag: Strings::Split(f.content_flags)) {
|
||||||
if (!Strings::Contains(GetContentFlagsEnabled(), flag)) {
|
if (!Strings::Contains(GetContentFlagsEnabled(), flag)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we don't have any disabled flag in disabled flags, we fail
|
// if we don't have any disabled flag in disabled flags, we fail
|
||||||
for (const auto &flag: Strings::Split(f.content_flags_disabled)) {
|
for (const auto& flag: Strings::Split(f.content_flags_disabled)) {
|
||||||
if (!Strings::Contains(GetContentFlagsDisabled(), flag)) {
|
if (!Strings::Contains(GetContentFlagsDisabled(), flag)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -179,13 +196,11 @@ void WorldContentService::ReloadContentFlags()
|
|||||||
LogInfo(
|
LogInfo(
|
||||||
"Loaded content flag [{}] [{}]",
|
"Loaded content flag [{}] [{}]",
|
||||||
f.flag_name,
|
f.flag_name,
|
||||||
(f.enabled ? "enabled" : "disabled")
|
(f.enabled ? "Enabled" : "Disabled")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetContentFlags(set_content_flags);
|
SetContentFlags(set_content_flags);
|
||||||
LoadStaticGlobalZoneInstances();
|
|
||||||
zone_store.LoadZones(*m_content_database);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Database *WorldContentService::GetDatabase() const
|
Database *WorldContentService::GetDatabase() const
|
||||||
@@ -200,18 +215,6 @@ WorldContentService *WorldContentService::SetDatabase(Database *database)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Database *WorldContentService::GetContentDatabase() const
|
|
||||||
{
|
|
||||||
return m_content_database;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldContentService *WorldContentService::SetContentDatabase(Database *database)
|
|
||||||
{
|
|
||||||
WorldContentService::m_content_database = database;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WorldContentService::SetContentFlag(const std::string &content_flag_name, bool enabled)
|
void WorldContentService::SetContentFlag(const std::string &content_flag_name, bool enabled)
|
||||||
{
|
{
|
||||||
auto flags = ContentFlagsRepository::GetWhere(
|
auto flags = ContentFlagsRepository::GetWhere(
|
||||||
@@ -236,114 +239,3 @@ void WorldContentService::SetContentFlag(const std::string &content_flag_name, b
|
|||||||
|
|
||||||
ReloadContentFlags();
|
ReloadContentFlags();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldContentService::HandleZoneRoutingMiddleware(ZoneChange_Struct *zc)
|
|
||||||
{
|
|
||||||
auto r = FindZone(zc->zoneID, zc->instanceID);
|
|
||||||
if (r.zone_id == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
zc->instanceID = r.instance.id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadStaticGlobalZoneInstances loads all static global zone instances
|
|
||||||
// these are zones that are never set to expire and are global
|
|
||||||
// these are used commonly in v1/v2/v3 versions of the same zone for expansion routing
|
|
||||||
WorldContentService *WorldContentService::LoadStaticGlobalZoneInstances()
|
|
||||||
{
|
|
||||||
m_zone_static_instances = InstanceListRepository::GetWhere(
|
|
||||||
*GetDatabase(),
|
|
||||||
fmt::format("never_expires = 1 AND is_global = 1")
|
|
||||||
);
|
|
||||||
|
|
||||||
LogInfo("Loaded [{}] zone_instances", m_zone_static_instances.size());
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FindZone handles content and context aware zone routing (middleware)
|
|
||||||
//
|
|
||||||
// this is a middleware function that is meant to be used in the zone change process
|
|
||||||
// this hooks all core zone changes within the server and routes the player to the correct zone
|
|
||||||
// returning a zone_id of non-zero means the middleware will route the player
|
|
||||||
// returning a zone_id of 0 means the middleware will not route the player
|
|
||||||
// this is useful for handling multiple versions of the same zone
|
|
||||||
//
|
|
||||||
// implementation >
|
|
||||||
// the zoning and process spawning logic already is handled by two keys "zone_id" and "instance_id"
|
|
||||||
// we leverage static, never expires instances to handle this and client still sees it as a normal zone
|
|
||||||
//
|
|
||||||
// content awareness >
|
|
||||||
// simply use the zone_id, server content settings and the middleware will handle the rest
|
|
||||||
// you don't have to think about instances in any data tables (use instance_id 0)
|
|
||||||
// you don't have to keep track of instance ids in scripts (use instance_id 0)
|
|
||||||
// the versions of zones are represented by two zone entries that have potentially different min/max expansion and/or different content flags
|
|
||||||
// we decide to route the client to the correct version of the zone based on the current server side expansion
|
|
||||||
//
|
|
||||||
// example >
|
|
||||||
// we want to route players to the correct version of lavastorm based on the current server side expansion (DoesZonePassContentFiltering)
|
|
||||||
// lavastorm (pre-don) version 0 (classic)
|
|
||||||
// zone table entry for version = 0, min_expansion = 0, max_expansion = 8
|
|
||||||
// instance_list table entry for lavastorm has version = 0, is_global = 1, never_expires = 1
|
|
||||||
// lavastorm (don) version 1
|
|
||||||
// zone table entry for version = 1, min_expansion = 9, max_expansion = 99
|
|
||||||
// instance_list table entry for lavastorm has version = 1, is_global = 1, never_expires = 1
|
|
||||||
WorldContentService::FindZoneResult WorldContentService::FindZone(uint32 zone_id, uint32 instance_id)
|
|
||||||
{
|
|
||||||
for (const auto &z: zone_store.GetZones()) {
|
|
||||||
for (auto &i: m_zone_static_instances) {
|
|
||||||
if (
|
|
||||||
z.zoneidnumber == zone_id &&
|
|
||||||
DoesZonePassContentFiltering(z) &&
|
|
||||||
i.zone == zone_id &&
|
|
||||||
i.version == z.version) {
|
|
||||||
|
|
||||||
if (instance_id > 0 && i.id != instance_id) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogInfo(
|
|
||||||
"Routed player to public static instance [{}] of zone [{}] ({}) version [{}] long_name [{}] notes [{}]",
|
|
||||||
i.id,
|
|
||||||
z.short_name,
|
|
||||||
z.zoneidnumber,
|
|
||||||
z.version,
|
|
||||||
z.long_name,
|
|
||||||
i.notes
|
|
||||||
);
|
|
||||||
|
|
||||||
return WorldContentService::FindZoneResult{
|
|
||||||
.zone_id = static_cast<uint32>(z.zoneidnumber),
|
|
||||||
.instance = i,
|
|
||||||
.zone = z
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return WorldContentService::FindZoneResult{.zone_id = 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WorldContentService::IsInPublicStaticInstance(uint32 instance_id)
|
|
||||||
{
|
|
||||||
for (auto &i: m_zone_static_instances) {
|
|
||||||
if (i.id == instance_id) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WorldContentService::DoesZonePassContentFiltering(const ZoneRepository::Zone &z)
|
|
||||||
{
|
|
||||||
auto f = ContentFlags{
|
|
||||||
.min_expansion = z.min_expansion,
|
|
||||||
.max_expansion = z.max_expansion,
|
|
||||||
.content_flags = z.content_flags,
|
|
||||||
.content_flags_disabled = z.content_flags_disabled
|
|
||||||
};
|
|
||||||
|
|
||||||
return DoesPassContentFiltering(f);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,21 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* EQEmulator: Everquest Server Emulator
|
||||||
|
* Copyright (C) 2001-2019 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
* are required to give you total support for your newly bought product;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_WORLD_CONTENT_SERVICE_H
|
#ifndef EQEMU_WORLD_CONTENT_SERVICE_H
|
||||||
#define EQEMU_WORLD_CONTENT_SERVICE_H
|
#define EQEMU_WORLD_CONTENT_SERVICE_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "../loottable.h"
|
||||||
#include "../repositories/content_flags_repository.h"
|
#include "../repositories/content_flags_repository.h"
|
||||||
#include "../repositories/zone_repository.h"
|
|
||||||
#include "../repositories/instance_list_repository.h"
|
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
struct ContentFlags {
|
|
||||||
int16 min_expansion;
|
|
||||||
int16 max_expansion;
|
|
||||||
std::string content_flags;
|
|
||||||
std::string content_flags_disabled;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace Expansion {
|
namespace Expansion {
|
||||||
static const int EXPANSION_ALL = -1;
|
static const int EXPANSION_ALL = -1;
|
||||||
static const int EXPANSION_FILTER_MAX = 99;
|
static const int EXPANSION_FILTER_MAX = 99;
|
||||||
@@ -155,43 +167,23 @@ public:
|
|||||||
std::vector<std::string> GetContentFlagsDisabled();
|
std::vector<std::string> GetContentFlagsDisabled();
|
||||||
bool IsContentFlagEnabled(const std::string& content_flag);
|
bool IsContentFlagEnabled(const std::string& content_flag);
|
||||||
bool IsContentFlagDisabled(const std::string& content_flag);
|
bool IsContentFlagDisabled(const std::string& content_flag);
|
||||||
void SetContentFlags(const std::vector<ContentFlagsRepository::ContentFlags>& content_flags);
|
void SetContentFlags(std::vector<ContentFlagsRepository::ContentFlags> content_flags);
|
||||||
void ReloadContentFlags();
|
void ReloadContentFlags();
|
||||||
WorldContentService * SetExpansionContext();
|
WorldContentService * SetExpansionContext();
|
||||||
|
|
||||||
bool DoesPassContentFiltering(const ContentFlags& f);
|
bool DoesPassContentFiltering(const ContentFlags& f);
|
||||||
bool DoesZonePassContentFiltering(const ZoneRepository::Zone& z);
|
|
||||||
|
|
||||||
WorldContentService * SetDatabase(Database *database);
|
WorldContentService * SetDatabase(Database *database);
|
||||||
Database *GetDatabase() const;
|
Database *GetDatabase() const;
|
||||||
|
|
||||||
WorldContentService * SetContentDatabase(Database *database);
|
|
||||||
Database *GetContentDatabase() const;
|
|
||||||
|
|
||||||
void SetContentFlag(const std::string &content_flag_name, bool enabled);
|
void SetContentFlag(const std::string &content_flag_name, bool enabled);
|
||||||
|
|
||||||
void HandleZoneRoutingMiddleware(ZoneChange_Struct *zc);
|
|
||||||
|
|
||||||
struct FindZoneResult {
|
|
||||||
uint32 zone_id = 0;
|
|
||||||
InstanceListRepository::InstanceList instance;
|
|
||||||
ZoneRepository::Zone zone;
|
|
||||||
};
|
|
||||||
|
|
||||||
FindZoneResult FindZone(uint32 zone_id, uint32 instance_id);
|
|
||||||
bool IsInPublicStaticInstance(uint32 instance_id);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int current_expansion{};
|
int current_expansion{};
|
||||||
std::vector<ContentFlagsRepository::ContentFlags> content_flags;
|
std::vector<ContentFlagsRepository::ContentFlags> content_flags;
|
||||||
|
|
||||||
// reference to database
|
// reference to database
|
||||||
Database *m_database;
|
Database *m_database;
|
||||||
Database *m_content_database;
|
|
||||||
|
|
||||||
// holds a record of the zone table from the database
|
|
||||||
WorldContentService *LoadStaticGlobalZoneInstances();
|
|
||||||
std::vector<InstanceListRepository::InstanceList> m_zone_static_instances;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WorldContentService content_service;
|
extern WorldContentService content_service;
|
||||||
|
|||||||
+6
-115
@@ -3,93 +3,13 @@
|
|||||||
#include "crash.h"
|
#include "crash.h"
|
||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
#include "process/process.h"
|
#include "process/process.h"
|
||||||
#include "http/httplib.h"
|
|
||||||
#include "http/uri.h"
|
|
||||||
#include "json/json.h"
|
|
||||||
#include "version.h"
|
|
||||||
#include "eqemu_config.h"
|
|
||||||
#include "serverinfo.h"
|
|
||||||
#include "rulesys.h"
|
|
||||||
#include "platform.h"
|
|
||||||
|
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#if WINDOWS
|
||||||
#define popen _popen
|
#define popen _popen
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void SendCrashReport(const std::string &crash_report)
|
|
||||||
{
|
|
||||||
// can configure multiple endpoints if need be
|
|
||||||
std::vector<std::string> endpoints = {
|
|
||||||
"https://spire.akkadius.com/api/v1/analytics/server-crash-report",
|
|
||||||
// "http://localhost:3010/api/v1/analytics/server-crash-report", // development
|
|
||||||
};
|
|
||||||
|
|
||||||
auto config = EQEmuConfig::get();
|
|
||||||
for (auto &e: endpoints) {
|
|
||||||
uri u(e);
|
|
||||||
|
|
||||||
std::string base_url = fmt::format("{}://{}", u.get_scheme(), u.get_host());
|
|
||||||
if (u.get_port()) {
|
|
||||||
base_url += fmt::format(":{}", u.get_port());
|
|
||||||
}
|
|
||||||
|
|
||||||
// client
|
|
||||||
httplib::Client r(base_url);
|
|
||||||
r.set_connection_timeout(1, 0);
|
|
||||||
r.set_read_timeout(1, 0);
|
|
||||||
r.set_write_timeout(1, 0);
|
|
||||||
|
|
||||||
// os info
|
|
||||||
auto os = EQ::GetOS();
|
|
||||||
auto cpus = EQ::GetCPUs();
|
|
||||||
auto process_id = EQ::GetPID();
|
|
||||||
auto rss = EQ::GetRSS() / 1048576.0;
|
|
||||||
auto uptime = static_cast<uint32>(EQ::GetUptime());
|
|
||||||
|
|
||||||
// payload
|
|
||||||
Json::Value p;
|
|
||||||
p["platform_name"] = GetPlatformName();
|
|
||||||
p["crash_report"] = crash_report;
|
|
||||||
p["server_version"] = CURRENT_VERSION;
|
|
||||||
p["compile_date"] = COMPILE_DATE;
|
|
||||||
p["compile_time"] = COMPILE_TIME;
|
|
||||||
p["server_name"] = config->LongName;
|
|
||||||
p["server_short_name"] = config->ShortName;
|
|
||||||
p["uptime"] = uptime;
|
|
||||||
p["os_machine"] = os.machine;
|
|
||||||
p["os_release"] = os.release;
|
|
||||||
p["os_version"] = os.version;
|
|
||||||
p["os_sysname"] = os.sysname;
|
|
||||||
p["process_id"] = process_id;
|
|
||||||
p["rss_memory"] = rss;
|
|
||||||
p["cpus"] = cpus.size();
|
|
||||||
p["origination_info"] = "";
|
|
||||||
|
|
||||||
if (!LogSys.origination_info.zone_short_name.empty()) {
|
|
||||||
p["origination_info"] = fmt::format(
|
|
||||||
"{} ({}) instance_id [{}]",
|
|
||||||
LogSys.origination_info.zone_short_name,
|
|
||||||
LogSys.origination_info.zone_long_name,
|
|
||||||
LogSys.origination_info.instance_id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::stringstream payload;
|
|
||||||
payload << p;
|
|
||||||
|
|
||||||
if (auto res = r.Post(e, payload.str(), "application/json")) {
|
|
||||||
if (res->status == 200) {
|
|
||||||
LogInfo("Sent crash report");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LogError("Failed to send crash report to [{}]", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(_WINDOWS) && defined(CRASH_LOGGING)
|
#if defined(_WINDOWS) && defined(CRASH_LOGGING)
|
||||||
#include "StackWalker.h"
|
#include "StackWalker.h"
|
||||||
@@ -101,30 +21,22 @@ public:
|
|||||||
EQEmuStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess) { }
|
EQEmuStackWalker(DWORD dwProcessId, HANDLE hProcess) : StackWalker(dwProcessId, hProcess) { }
|
||||||
virtual void OnOutput(LPCSTR szText) {
|
virtual void OnOutput(LPCSTR szText) {
|
||||||
char buffer[4096];
|
char buffer[4096];
|
||||||
for (int i = 0; i < 4096; ++i) {
|
for(int i = 0; i < 4096; ++i) {
|
||||||
if (szText[i] == 0) {
|
if(szText[i] == 0) {
|
||||||
buffer[i] = '\0';
|
buffer[i] = '\0';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (szText[i] == '\n' || szText[i] == '\r') {
|
if(szText[i] == '\n' || szText[i] == '\r') {
|
||||||
buffer[i] = ' ';
|
buffer[i] = ' ';
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
buffer[i] = szText[i];
|
buffer[i] = szText[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string line = buffer;
|
|
||||||
_lines.push_back(line);
|
|
||||||
|
|
||||||
Log(Logs::General, Logs::Crash, buffer);
|
Log(Logs::General, Logs::Crash, buffer);
|
||||||
StackWalker::OnOutput(szText);
|
StackWalker::OnOutput(szText);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<std::string>& GetLines() { return _lines; }
|
|
||||||
private:
|
|
||||||
std::vector<std::string> _lines;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
||||||
@@ -198,20 +110,7 @@ LONG WINAPI windows_exception_handler(EXCEPTION_POINTERS *ExceptionInfo)
|
|||||||
|
|
||||||
if(EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode)
|
if(EXCEPTION_STACK_OVERFLOW != ExceptionInfo->ExceptionRecord->ExceptionCode)
|
||||||
{
|
{
|
||||||
EQEmuStackWalker sw;
|
EQEmuStackWalker sw; sw.ShowCallstack(GetCurrentThread(), ExceptionInfo->ContextRecord);
|
||||||
sw.ShowCallstack(GetCurrentThread(), ExceptionInfo->ContextRecord);
|
|
||||||
|
|
||||||
if (RuleB(Analytics, CrashReporting)) {
|
|
||||||
std::string crash_report;
|
|
||||||
auto& lines = sw.GetLines();
|
|
||||||
|
|
||||||
for (auto& line : lines) {
|
|
||||||
crash_report += line;
|
|
||||||
crash_report += "\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
SendCrashReport(crash_report);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXCEPTION_EXECUTE_HANDLER;
|
return EXCEPTION_EXECUTE_HANDLER;
|
||||||
@@ -282,20 +181,12 @@ void print_trace()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::ifstream input(temp_output_file);
|
std::ifstream input(temp_output_file);
|
||||||
std::string crash_report;
|
|
||||||
for (std::string line; getline(input, line);) {
|
for (std::string line; getline(input, line);) {
|
||||||
LogCrash("{}", line);
|
LogCrash("{}", line);
|
||||||
crash_report += fmt::format("{}\n", line);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::remove(temp_output_file.c_str());
|
std::remove(temp_output_file.c_str());
|
||||||
|
|
||||||
if (RuleB(Analytics, CrashReporting)) {
|
|
||||||
SendCrashReport(crash_report);
|
|
||||||
}
|
|
||||||
|
|
||||||
LogSys.CloseFileLogs();
|
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -313,7 +313,7 @@ namespace cron
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return static_cast<cron_int>(Strings::ToUnsignedInt(text.data()));
|
return static_cast<cron_int>(std::stoul(text.data()));
|
||||||
}
|
}
|
||||||
catch (std::exception const & ex)
|
catch (std::exception const & ex)
|
||||||
{
|
{
|
||||||
|
|||||||
+1682
-1531
File diff suppressed because it is too large
Load Diff
+148
-156
@@ -18,8 +18,8 @@
|
|||||||
#ifndef EQEMU_DATABASE_H
|
#ifndef EQEMU_DATABASE_H
|
||||||
#define EQEMU_DATABASE_H
|
#define EQEMU_DATABASE_H
|
||||||
|
|
||||||
#define AUTHENTICATION_TIMEOUT 60
|
#define AUTHENTICATION_TIMEOUT 60
|
||||||
#define INVALID_ID 0xFFFFFFFF
|
#define INVALID_ID 0xFFFFFFFF
|
||||||
|
|
||||||
#include "global_define.h"
|
#include "global_define.h"
|
||||||
#include "eqemu_logsys.h"
|
#include "eqemu_logsys.h"
|
||||||
@@ -34,11 +34,14 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
//atoi is not uint32 or uint32 safe!!!!
|
||||||
|
#define atoul(str) strtoul(str, nullptr, 10)
|
||||||
|
|
||||||
class MySQLRequestResult;
|
class MySQLRequestResult;
|
||||||
class Client;
|
class Client;
|
||||||
|
|
||||||
namespace EQ {
|
namespace EQ
|
||||||
|
{
|
||||||
class InventoryProfile;
|
class InventoryProfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,11 +54,10 @@ struct npcDecayTimes_Struct {
|
|||||||
|
|
||||||
struct VarCache_Struct {
|
struct VarCache_Struct {
|
||||||
std::map<std::string, std::string> m_cache;
|
std::map<std::string, std::string> m_cache;
|
||||||
uint32 last_update;
|
uint32 last_update;
|
||||||
VarCache_Struct() : last_update(0) { }
|
VarCache_Struct() : last_update(0) { }
|
||||||
void Add(const std::string& key, const std::string& value) { m_cache[key] = value; }
|
void Add(const std::string &key, const std::string &value) { m_cache[key] = value; }
|
||||||
const std::string* Get(const std::string& key)
|
const std::string *Get(const std::string &key) {
|
||||||
{
|
|
||||||
auto it = m_cache.find(key);
|
auto it = m_cache.find(key);
|
||||||
return (it != m_cache.end() ? &it->second : nullptr);
|
return (it != m_cache.end() ? &it->second : nullptr);
|
||||||
}
|
}
|
||||||
@@ -76,34 +78,40 @@ class PTimerList;
|
|||||||
|
|
||||||
#define SQL(...) #__VA_ARGS__
|
#define SQL(...) #__VA_ARGS__
|
||||||
|
|
||||||
|
class LogSettings;
|
||||||
class Database : public DBcore {
|
class Database : public DBcore {
|
||||||
public:
|
public:
|
||||||
Database();
|
Database();
|
||||||
Database(
|
Database(const char* host, const char* user, const char* passwd, const char* database,uint32 port);
|
||||||
const std::string& host,
|
bool Connect(const char* host, const char* user, const char* passwd, const char* database, uint32 port, std::string connection_label = "default");
|
||||||
const std::string& user,
|
|
||||||
const std::string& password,
|
|
||||||
const std::string& database,
|
|
||||||
uint32 port
|
|
||||||
);
|
|
||||||
bool Connect(
|
|
||||||
const std::string& host,
|
|
||||||
const std::string& user,
|
|
||||||
const std::string& password,
|
|
||||||
const std::string& database,
|
|
||||||
uint32 port,
|
|
||||||
std::string connection_label = "default"
|
|
||||||
);
|
|
||||||
~Database();
|
~Database();
|
||||||
|
|
||||||
/* Character Creation */
|
/* Character Creation */
|
||||||
bool DeleteCharacter(const std::string& name);
|
|
||||||
bool MoveCharacterToZone(const std::string& name, uint32 zone_id);
|
bool CreateCharacter(
|
||||||
|
uint32 account_id,
|
||||||
|
char *name,
|
||||||
|
uint16 gender,
|
||||||
|
uint16 race,
|
||||||
|
uint16 class_,
|
||||||
|
uint8 str,
|
||||||
|
uint8 sta,
|
||||||
|
uint8 cha,
|
||||||
|
uint8 dex,
|
||||||
|
uint8 int_,
|
||||||
|
uint8 agi,
|
||||||
|
uint8 wis,
|
||||||
|
uint8 face
|
||||||
|
);
|
||||||
|
bool DeleteCharacter(char *character_name);
|
||||||
|
bool MoveCharacterToZone(const char *charname, uint32 zone_id);
|
||||||
bool MoveCharacterToZone(uint32 character_id, uint32 zone_id);
|
bool MoveCharacterToZone(uint32 character_id, uint32 zone_id);
|
||||||
bool ReserveName(uint32 account_id, const std::string& name);
|
bool ReserveName(uint32 account_id, char *name);
|
||||||
bool SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct* pp);
|
bool SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct *pp);
|
||||||
bool UpdateName(const std::string& old_name, const std::string& new_name);
|
bool SetHackerFlag(const char *accountname, const char *charactername, const char *hacked);
|
||||||
bool UpdateNameByID(const int character_id, const std::string& new_name);
|
bool SetMQDetectionFlag(const char *accountname, const char *charactername, const char *hacked, const char *zone);
|
||||||
|
bool SetMQDetectionFlag(const char *accountname, const char *charactername, const std::string &hacked, const char *zone);
|
||||||
|
bool UpdateName(const char *oldname, const char *newname);
|
||||||
bool CopyCharacter(
|
bool CopyCharacter(
|
||||||
const std::string& source_character_name,
|
const std::string& source_character_name,
|
||||||
const std::string& destination_character_name,
|
const std::string& destination_character_name,
|
||||||
@@ -111,181 +119,165 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
/* General Information Queries */
|
/* General Information Queries */
|
||||||
bool AddBannedIP(const std::string& banned_ip, const std::string& notes); //Add IP address to the banned_ips table.
|
|
||||||
bool AddToNameFilter(const std::string& name);
|
|
||||||
bool CheckBannedIPs(const std::string& login_ip); //Check incoming connection against banned IP table.
|
|
||||||
bool CheckGMIPs(const std::string& login_ip, uint32 account_id);
|
|
||||||
bool CheckNameFilter(const std::string& name, bool surname = false);
|
|
||||||
bool IsNameUsed(const std::string& name);
|
|
||||||
bool IsPetNameUsed(const std::string& name);
|
|
||||||
|
|
||||||
uint32 GetAccountIDByChar(const std::string& name, uint32* character_id = 0);
|
bool AddBannedIP(std::string banned_ip, std::string notes); //Add IP address to the banned_ips table.
|
||||||
uint32 GetAccountIDByChar(uint32 character_id);
|
bool AddToNameFilter(std::string name);
|
||||||
uint32 GetAccountIDByName(const std::string& account_name, const std::string& loginserver, int16* status = 0, uint32* lsid = 0);
|
bool CheckBannedIPs(std::string login_ip); //Check incoming connection against banned IP table.
|
||||||
uint32 GetCharacterID(const std::string& name);
|
bool CheckGMIPs(std::string login_ip, uint32 account_id);
|
||||||
uint32 GetGuildIDByCharID(uint32 character_id);
|
bool CheckNameFilter(std::string name, bool surname = false);
|
||||||
uint32 GetGroupIDByCharID(uint32 character_id);
|
bool CheckUsedName(std::string name);
|
||||||
uint32 GetRaidIDByCharID(uint32 character_id);
|
|
||||||
|
|
||||||
const std::string GetAccountName(uint32 account_id, uint32* lsaccount_id = 0);
|
uint32 GetAccountIDByChar(const char* charname, uint32* oCharID = 0);
|
||||||
const std::string GetCharName(uint32 character_id);
|
uint32 GetAccountIDByChar(uint32 char_id);
|
||||||
const std::string GetCharNameByID(uint32 character_id);
|
uint32 GetAccountIDByName(std::string account_name, std::string loginserver, int16* status = 0, uint32* lsid = 0);
|
||||||
const std::string GetNPCNameByID(uint32 npc_id);
|
uint32 GetCharacterID(const char *name);
|
||||||
const std::string GetCleanNPCNameByID(uint32 npc_id);
|
uint32 GetCharacterInfo(std::string character_name, uint32 *account_id, uint32 *zone_id, uint32 *instance_id);
|
||||||
void LoginIP(uint32 account_id, const std::string& login_ip);
|
uint32 GetGuildIDByCharID(uint32 char_id);
|
||||||
|
uint32 GetGroupIDByCharID(uint32 char_id);
|
||||||
|
uint32 GetRaidIDByCharID(uint32 char_id);
|
||||||
|
|
||||||
|
void GetAccountName(uint32 accountid, char* name, uint32* oLSAccountID = 0);
|
||||||
|
void GetCharName(uint32 char_id, char* name);
|
||||||
|
std::string GetCharNameByID(uint32 char_id);
|
||||||
|
std::string GetNPCNameByID(uint32 npc_id);
|
||||||
|
std::string GetCleanNPCNameByID(uint32 npc_id);
|
||||||
|
void LoginIP(uint32 account_id, std::string login_ip);
|
||||||
|
|
||||||
/* Instancing */
|
/* Instancing */
|
||||||
|
|
||||||
bool AddClientToInstance(uint16 instance_id, uint32 character_id);
|
bool AddClientToInstance(uint16 instance_id, uint32 character_id);
|
||||||
bool CheckInstanceByCharID(uint16 instance_id, uint32 character_id);
|
bool CheckInstanceByCharID(uint16 instance_id, uint32 character_id);
|
||||||
bool CheckInstanceExists(uint16 instance_id);
|
bool CheckInstanceExists(uint16 instance_id);
|
||||||
bool CheckInstanceExpired(uint16 instance_id);
|
bool CheckInstanceExpired(uint16 instance_id);
|
||||||
bool CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration);
|
bool CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration);
|
||||||
bool GetUnusedInstanceID(uint16& instance_id);
|
bool GetUnusedInstanceID(uint16 &instance_id);
|
||||||
bool TryGetUnusedInstanceID(uint16& instance_id);
|
|
||||||
bool IsGlobalInstance(uint16 instance_id);
|
bool IsGlobalInstance(uint16 instance_id);
|
||||||
bool RemoveClientFromInstance(uint16 instance_id, uint32 char_id);
|
bool RemoveClientFromInstance(uint16 instance_id, uint32 char_id);
|
||||||
bool RemoveClientsFromInstance(uint16 instance_id);
|
bool RemoveClientsFromInstance(uint16 instance_id);
|
||||||
bool VerifyInstanceAlive(uint16 instance_id, uint32 character_id);
|
bool VerifyInstanceAlive(uint16 instance_id, uint32 character_id);
|
||||||
bool VerifyZoneInstance(uint32 zone_id, uint16 instance_id);
|
bool VerifyZoneInstance(uint32 zone_id, uint16 instance_id);
|
||||||
|
|
||||||
uint16 GetInstanceID(uint32 zone, uint32 character_id, int16 version);
|
uint16 GetInstanceID(uint32 zone, uint32 charid, int16 version);
|
||||||
std::vector<uint16> GetInstanceIDs(uint32 zone_id, uint32 character_id);
|
std::vector<uint16> GetInstanceIDs(uint32 zone_id, uint32 character_id);
|
||||||
uint8_t GetInstanceVersion(uint16 instance_id);
|
uint8_t GetInstanceVersion(uint16 instance_id);
|
||||||
uint32 GetTimeRemainingInstance(uint16 instance_id, bool& is_perma);
|
uint32 GetTimeRemainingInstance(uint16 instance_id, bool &is_perma);
|
||||||
uint32 GetInstanceZoneID(uint16 instance_id);
|
uint32 GetInstanceZoneID(uint16 instance_id);
|
||||||
|
|
||||||
void AssignGroupToInstance(uint32 group_id, uint32 instance_id);
|
void AssignGroupToInstance(uint32 gid, uint32 instance_id);
|
||||||
void AssignRaidToInstance(uint32 raid_id, uint32 instance_id);
|
void AssignRaidToInstance(uint32 rid, uint32 instance_id);
|
||||||
void DeleteInstance(uint16 instance_id);
|
void DeleteInstance(uint16 instance_id);
|
||||||
void FlagInstanceByGroupLeader(uint32 zone_id, int16 version, uint32 character_id, uint32 group_id);
|
void FlagInstanceByGroupLeader(uint32 zone_id, int16 version, uint32 charid, uint32 group_id);
|
||||||
void FlagInstanceByRaidLeader(uint32 zone_id, int16 version, uint32 character_id, uint32 raid_id);
|
void FlagInstanceByRaidLeader(uint32 zone_id, int16 version, uint32 charid, uint32 raid_id);
|
||||||
void GetCharactersInInstance(uint16 instance_id, std::list<uint32>& character_ids);
|
void GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids);
|
||||||
void PurgeExpiredInstances();
|
void PurgeExpiredInstances();
|
||||||
void SetInstanceDuration(uint16 instance_id, uint32 new_duration);
|
void SetInstanceDuration(uint16 instance_id, uint32 new_duration);
|
||||||
void CleanupInstanceCorpses();
|
|
||||||
|
|
||||||
/* Adventure related. */
|
/* Adventure related. */
|
||||||
void UpdateAdventureStatsEntry(uint32 character_id, uint8 theme_id, bool is_win = false, bool is_remove = false);
|
|
||||||
bool GetAdventureStats(uint32 character_id, AdventureStats_Struct* as);
|
void UpdateAdventureStatsEntry(uint32 char_id, uint8 theme, bool win = false, bool remove = false);
|
||||||
|
bool GetAdventureStats(uint32 char_id, AdventureStats_Struct *as);
|
||||||
|
|
||||||
/* Account Related */
|
/* Account Related */
|
||||||
const std::string GetLiveChar(uint32 account_id);
|
|
||||||
bool SetAccountStatus(const std::string& account_name, int16 status);
|
|
||||||
bool SetLocalPassword(uint32 account_id, const std::string& password);
|
|
||||||
bool UpdateLiveChar(const std::string& name, uint32 account_id);
|
|
||||||
int16 GetAccountStatus(uint32 account_id);
|
|
||||||
void SetAccountCRCField(uint32 account_id, const std::string& field_name, uint64 checksum);
|
|
||||||
uint32 CheckLogin(const std::string& name, const std::string& password, const std::string& loginserver, int16* status = 0);
|
|
||||||
uint32 CreateAccount(
|
|
||||||
const std::string& name,
|
|
||||||
const std::string& password,
|
|
||||||
int16 status,
|
|
||||||
const std::string& loginserver,
|
|
||||||
uint32 lsaccount_id
|
|
||||||
);
|
|
||||||
uint32 GetAccountIDFromLSID(
|
|
||||||
const std::string& in_loginserver_id,
|
|
||||||
uint32 in_loginserver_account_id,
|
|
||||||
char* in_account_name = 0,
|
|
||||||
int16* in_status = 0
|
|
||||||
);
|
|
||||||
|
|
||||||
uint8 GetAgreementFlag(uint32 account_id);
|
bool DeleteAccount(const char *name, const char* loginserver);
|
||||||
void SetAgreementFlag(uint32 account_id);
|
bool GetLiveChar(uint32 account_id, char* cname);
|
||||||
|
bool SetAccountStatus(const char* name, int16 status);
|
||||||
|
bool SetAccountStatus(const std::string& account_name, int16 status);
|
||||||
|
bool SetLocalPassword(uint32 accid, const char* password);
|
||||||
|
bool UpdateLiveChar(char* charname, uint32 account_id);
|
||||||
|
|
||||||
int GetIPExemption(const std::string& account_ip);
|
int16 CheckStatus(uint32 account_id);
|
||||||
void SetIPExemption(const std::string& account_ip, int exemption_amount);
|
|
||||||
|
|
||||||
int GetInstanceID(uint32 character_id, uint32 zone_id);
|
void SetAccountCRCField(uint32 account_id, std::string field_name, uint64 checksum);
|
||||||
|
|
||||||
|
uint32 CheckLogin(const char* name, const char* password, const char *loginserver, int16* oStatus = 0);
|
||||||
|
uint32 CreateAccount(const char* name, const char* password, int16 status, const char* loginserver, uint32 lsaccount_id);
|
||||||
|
uint32 GetAccountIDFromLSID(const std::string& in_loginserver_id, uint32 in_loginserver_account_id, char* in_account_name = 0, int16* in_status = 0);
|
||||||
|
uint8 GetAgreementFlag(uint32 acctid);
|
||||||
|
|
||||||
|
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
||||||
|
void SetAgreementFlag(uint32 acctid);
|
||||||
|
|
||||||
|
int GetIPExemption(std::string account_ip);
|
||||||
|
void SetIPExemption(std::string account_ip, int exemption_amount);
|
||||||
|
|
||||||
|
int GetInstanceID(uint32 char_id, uint32 zone_id);
|
||||||
|
|
||||||
|
|
||||||
/* Groups */
|
/* Groups */
|
||||||
std::string GetGroupLeaderForLogin(const std::string& character_name);
|
|
||||||
char* GetGroupLeadershipInfo(
|
std::string GetGroupLeaderForLogin(std::string character_name);
|
||||||
uint32 group_id,
|
char* GetGroupLeadershipInfo(uint32 gid, char* leaderbuf, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr, char *mentoree = nullptr, int *mentor_percent = nullptr, GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||||
char* leaderbuf,
|
|
||||||
char* maintank = nullptr,
|
uint32 GetGroupID(const char* name);
|
||||||
char* assist = nullptr,
|
|
||||||
char* puller = nullptr,
|
void ClearGroup(uint32 gid = 0);
|
||||||
char* marknpc = nullptr,
|
void ClearGroupLeader(uint32 gid = 0);
|
||||||
char* mentoree = nullptr,
|
void SetGroupID(const char* name, uint32 id, uint32 charid, uint32 ismerc = false);
|
||||||
int* mentor_percent = nullptr,
|
void SetGroupLeaderName(uint32 gid, const char* name);
|
||||||
GroupLeadershipAA_Struct* GLAA = nullptr
|
|
||||||
);
|
|
||||||
std::string GetGroupLeaderName(uint32 group_id);
|
|
||||||
uint32 GetGroupID(const std::string& name);
|
|
||||||
void ClearGroup(uint32 group_id = 0);
|
|
||||||
void ClearGroupLeader(uint32 group_id = 0);
|
|
||||||
void SetGroupLeaderName(uint32 group_id, const std::string& name);
|
|
||||||
|
|
||||||
/* Raids */
|
/* Raids */
|
||||||
const std::string GetRaidLeaderName(uint32 raid_id);
|
|
||||||
uint32 GetRaidID(const std::string& name);
|
|
||||||
void ClearRaid(uint32 raid_id = 0);
|
|
||||||
void ClearRaidDetails(uint32 raid_id = 0);
|
|
||||||
void ClearRaidLeader(uint32 group_id = std::numeric_limits<uint32>::max(), uint32 raid_id = 0);
|
|
||||||
void GetGroupLeadershipInfo(
|
|
||||||
uint32 group_id,
|
|
||||||
uint32 raid_id,
|
|
||||||
char* maintank = nullptr,
|
|
||||||
char* assist = nullptr,
|
|
||||||
char* puller = nullptr,
|
|
||||||
char* marknpc = nullptr,
|
|
||||||
char* mentoree = nullptr,
|
|
||||||
int* mentor_percent = nullptr,
|
|
||||||
GroupLeadershipAA_Struct* GLAA = nullptr
|
|
||||||
);
|
|
||||||
void GetRaidLeadershipInfo(
|
|
||||||
uint32 raid_id,
|
|
||||||
char* maintank = nullptr,
|
|
||||||
char* assist = nullptr,
|
|
||||||
char* puller = nullptr,
|
|
||||||
char* marknpc = nullptr,
|
|
||||||
RaidLeadershipAA_Struct* RLAA = nullptr
|
|
||||||
);
|
|
||||||
void SetRaidGroupLeaderInfo(uint32 group_id, uint32 raid_id);
|
|
||||||
|
|
||||||
void PurgeAllDeletedDataBuckets();
|
const char *GetRaidLeaderName(uint32 rid);
|
||||||
void ClearGuildOnlineStatus();
|
|
||||||
void ClearTraderDetails();
|
|
||||||
void ClearBuyerDetails();
|
|
||||||
|
|
||||||
|
uint32 GetRaidID(const char* name);
|
||||||
|
|
||||||
|
void ClearRaid(uint32 rid = 0);
|
||||||
|
void ClearRaidDetails(uint32 rid = 0);
|
||||||
|
void ClearRaidLeader(uint32 gid = 0xFFFFFFFF, uint32 rid = 0);
|
||||||
|
void GetGroupLeadershipInfo(uint32 gid, uint32 rid, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr, char *mentoree = nullptr, int *mentor_percent = nullptr, GroupLeadershipAA_Struct* GLAA = nullptr);
|
||||||
|
void GetRaidLeadershipInfo(uint32 rid, char* maintank = nullptr, char* assist = nullptr, char* puller = nullptr, char *marknpc = nullptr, RaidLeadershipAA_Struct* RLAA = nullptr);
|
||||||
|
void SetRaidGroupLeaderInfo(uint32 gid, uint32 rid);
|
||||||
|
|
||||||
|
void PurgeAllDeletedDataBuckets();
|
||||||
|
|
||||||
|
/* Database Conversions 'database_conversions.cpp' */
|
||||||
|
|
||||||
|
bool CheckDatabaseConversions();
|
||||||
|
bool CheckDatabaseConvertCorpseDeblob();
|
||||||
|
bool CheckDatabaseConvertPPDeblob();
|
||||||
|
|
||||||
/* Database Variables */
|
/* Database Variables */
|
||||||
bool GetVariable(const std::string& name, std::string& value);
|
|
||||||
bool SetVariable(const std::string& name, const std::string& value);
|
|
||||||
bool LoadVariables();
|
|
||||||
|
|
||||||
uint8 GetPEQZone(uint32 zone_id, uint32 version);
|
bool GetVariable(std::string varname, std::string &varvalue);
|
||||||
uint32 GetServerType();
|
bool SetVariable(const std::string varname, const std::string &varvalue);
|
||||||
void AddReport(const std::string& who, const std::string& against, const std::string& lines);
|
bool LoadVariables();
|
||||||
struct TimeOfDay_Struct LoadTime(time_t& realtime);
|
|
||||||
bool SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year);
|
|
||||||
void ClearMerchantTemp();
|
|
||||||
void ClearPTimers(uint32 character_id);
|
|
||||||
void SetIngame(uint32 character_id, uint8 ingame);
|
|
||||||
void SetLFG(uint32 character_id, bool is_lfg);
|
|
||||||
void SetLFP(uint32 character_id, bool is_lfp);
|
|
||||||
void SetLoginFlags(uint32 character_id, bool is_lfp, bool is_lfg, uint8 first_logon);
|
|
||||||
|
|
||||||
int64 CountInvSnapshots();
|
/* General Queries */
|
||||||
void ClearInvSnapshots(bool from_now = false);
|
|
||||||
|
|
||||||
void SourceDatabaseTableFromUrl(const std::string& table_name, const std::string& url);
|
bool GetZoneGraveyard(const uint32 graveyard_id, uint32* graveyard_zoneid = 0, float* graveyard_x = 0, float* graveyard_y = 0, float* graveyard_z = 0, float* graveyard_heading = 0);
|
||||||
void SourceSqlFromUrl(const std::string& url);
|
bool LoadPTimers(uint32 charid, PTimerList &into);
|
||||||
void PurgeCharacterParcels();
|
|
||||||
void Encode(std::string &in);
|
uint8 GetPEQZone(uint32 zone_id, uint32 version);
|
||||||
void Decode(std::string &in);
|
uint8 GetMinStatus(uint32 zone_id, uint32 instance_version);
|
||||||
|
uint8 GetRaceSkill(uint8 skillid, uint8 in_race);
|
||||||
|
uint8 GetServerType();
|
||||||
|
uint8 GetSkillCap(uint8 skillid, uint8 in_race, uint8 in_class, uint16 in_level);
|
||||||
|
|
||||||
|
void AddReport(std::string who, std::string against, std::string lines);
|
||||||
|
struct TimeOfDay_Struct LoadTime(time_t &realtime);
|
||||||
|
bool SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year);
|
||||||
|
void ClearMerchantTemp();
|
||||||
|
void ClearPTimers(uint32 charid);
|
||||||
|
void SetFirstLogon(uint32 CharID, uint8 firstlogon);
|
||||||
|
void SetLFG(uint32 CharID, bool LFG);
|
||||||
|
void SetLFP(uint32 CharID, bool LFP);
|
||||||
|
void SetLoginFlags(uint32 CharID, bool LFP, bool LFG, uint8 firstlogon);
|
||||||
|
|
||||||
|
int CountInvSnapshots();
|
||||||
|
void ClearInvSnapshots(bool from_now = false);
|
||||||
|
|
||||||
|
void SourceDatabaseTableFromUrl(std::string table_name, std::string url);
|
||||||
|
|
||||||
uint64_t GetNextTableId(const std::string& table_name);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Mutex Mvarcache;
|
|
||||||
|
Mutex Mvarcache;
|
||||||
VarCache_Struct varcache;
|
VarCache_Struct varcache;
|
||||||
|
|
||||||
/* Groups, utility methods. */
|
/* Groups, utility methods. */
|
||||||
void ClearAllGroupLeaders();
|
void ClearAllGroupLeaders();
|
||||||
void ClearAllGroups();
|
void ClearAllGroups();
|
||||||
|
|
||||||
/* Raid, utility methods. */
|
/* Raid, utility methods. */
|
||||||
void ClearAllRaids();
|
void ClearAllRaids();
|
||||||
|
|||||||
@@ -28,7 +28,6 @@
|
|||||||
#include "../database_schema.h"
|
#include "../database_schema.h"
|
||||||
#include "../file.h"
|
#include "../file.h"
|
||||||
#include "../process/process.h"
|
#include "../process/process.h"
|
||||||
#include "../termcolor/rang.hpp"
|
|
||||||
|
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
|
||||||
@@ -37,7 +36,6 @@
|
|||||||
#else
|
#else
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <thread>
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -50,7 +48,7 @@ bool DatabaseDumpService::IsMySQLInstalled()
|
|||||||
{
|
{
|
||||||
std::string version_output = GetMySQLVersion();
|
std::string version_output = GetMySQLVersion();
|
||||||
|
|
||||||
return version_output.find("mysql") != std::string::npos && (version_output.find("Ver") != std::string::npos || version_output.find("from") != std::string::npos);
|
return version_output.find("mysql") != std::string::npos && version_output.find("Ver") != std::string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -93,8 +91,6 @@ std::string DatabaseDumpService::GetMySQLVersion()
|
|||||||
return Strings::Trim(version_output);
|
return Strings::Trim(version_output);
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string CREDENTIALS_FILE = "login.my.cnf";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@@ -103,61 +99,128 @@ std::string DatabaseDumpService::GetBaseMySQLDumpCommand()
|
|||||||
auto config = EQEmuConfig::get();
|
auto config = EQEmuConfig::get();
|
||||||
if (IsDumpContentTables() && !config->ContentDbHost.empty()) {
|
if (IsDumpContentTables() && !config->ContentDbHost.empty()) {
|
||||||
return fmt::format(
|
return fmt::format(
|
||||||
"mysqldump --defaults-extra-file={} {}",
|
"mysqldump -u {} -p{} -h {} --port={} {}",
|
||||||
CREDENTIALS_FILE,
|
config->ContentDbUsername,
|
||||||
|
config->ContentDbPassword,
|
||||||
|
config->ContentDbHost,
|
||||||
|
config->ContentDbPort,
|
||||||
config->ContentDbName
|
config->ContentDbName
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
return fmt::format(
|
return fmt::format(
|
||||||
"mysqldump --defaults-extra-file={} {}",
|
"mysqldump -u {} -p{} -h {} --port={} {}",
|
||||||
CREDENTIALS_FILE,
|
config->DatabaseUsername,
|
||||||
|
config->DatabasePassword,
|
||||||
|
config->DatabaseHost,
|
||||||
|
config->DatabasePort,
|
||||||
config->DatabaseDB
|
config->DatabaseDB
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetPlayerTablesList()
|
std::string DatabaseDumpService::GetPlayerTablesList()
|
||||||
{
|
{
|
||||||
return Strings::Join(DatabaseSchema::GetPlayerTables(), " ");
|
std::string tables_list;
|
||||||
|
std::vector<std::string> tables = DatabaseSchema::GetPlayerTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetBotTablesList()
|
std::string DatabaseDumpService::GetBotTablesList()
|
||||||
{
|
{
|
||||||
return Strings::Join(DatabaseSchema::GetBotTables(), " ");
|
std::string tables_list;
|
||||||
}
|
std::vector<std::string> tables = DatabaseSchema::GetBotTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
std::string DatabaseDumpService::GetMercTablesList()
|
tables_list += table + " ";
|
||||||
{
|
}
|
||||||
return Strings::Join(DatabaseSchema::GetMercTables(), " ");
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetLoginTableList()
|
std::string DatabaseDumpService::GetLoginTableList()
|
||||||
{
|
{
|
||||||
return Strings::Join(DatabaseSchema::GetLoginTables(), " ");
|
std::string tables_list;
|
||||||
|
std::vector<std::string> tables = DatabaseSchema::GetLoginTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
std::string DatabaseDumpService::GetQueryServTables()
|
||||||
|
{
|
||||||
|
std::string tables_list;
|
||||||
|
std::vector<std::string> tables = DatabaseSchema::GetQueryServerTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetSystemTablesList()
|
std::string DatabaseDumpService::GetSystemTablesList()
|
||||||
{
|
{
|
||||||
auto system_tables = DatabaseSchema::GetServerTables();
|
std::string tables_list;
|
||||||
auto version_tables = DatabaseSchema::GetVersionTables();
|
|
||||||
|
|
||||||
system_tables.insert(
|
std::vector<std::string> tables = DatabaseSchema::GetServerTables();
|
||||||
std::end(system_tables),
|
for (const auto &table : tables) {
|
||||||
std::begin(version_tables),
|
tables_list += table + " ";
|
||||||
std::end(version_tables)
|
}
|
||||||
);
|
|
||||||
|
|
||||||
return Strings::Join(system_tables, " ");
|
tables = DatabaseSchema::GetVersionTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetStateTablesList()
|
std::string DatabaseDumpService::GetStateTablesList()
|
||||||
{
|
{
|
||||||
return Strings::Join(DatabaseSchema::GetStateTables(), " ");
|
std::string tables_list;
|
||||||
|
|
||||||
|
std::vector<std::string> tables = DatabaseSchema::GetStateTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DatabaseDumpService::GetContentTablesList()
|
std::string DatabaseDumpService::GetContentTablesList()
|
||||||
{
|
{
|
||||||
return Strings::Join(DatabaseSchema::GetContentTables(), " ");
|
std::string tables_list;
|
||||||
|
|
||||||
|
std::vector<std::string> tables = DatabaseSchema::GetContentTables();
|
||||||
|
for (const auto &table : tables) {
|
||||||
|
tables_list += table + " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Strings::Trim(tables_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -192,7 +255,7 @@ std::string DatabaseDumpService::GetDumpFileNameWithPath()
|
|||||||
return GetSetDumpPath() + GetDumpFileName();
|
return GetSetDumpPath() + GetDumpFileName();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseDumpService::DatabaseDump()
|
void DatabaseDumpService::Dump()
|
||||||
{
|
{
|
||||||
if (!IsMySQLInstalled()) {
|
if (!IsMySQLInstalled()) {
|
||||||
LogError("MySQL is not installed; Please check your PATH for a valid MySQL installation");
|
LogError("MySQL is not installed; Please check your PATH for a valid MySQL installation");
|
||||||
@@ -243,11 +306,6 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
dump_descriptor += "-bots";
|
dump_descriptor += "-bots";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsDumpMercTables()) {
|
|
||||||
tables_to_dump += GetMercTablesList() + " ";
|
|
||||||
dump_descriptor += "-mercs";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IsDumpSystemTables()) {
|
if (IsDumpSystemTables()) {
|
||||||
tables_to_dump += GetSystemTablesList() + " ";
|
tables_to_dump += GetSystemTablesList() + " ";
|
||||||
dump_descriptor += "-system";
|
dump_descriptor += "-system";
|
||||||
@@ -267,11 +325,11 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
tables_to_dump += GetLoginTableList() + " ";
|
tables_to_dump += GetLoginTableList() + " ";
|
||||||
dump_descriptor += "-login";
|
dump_descriptor += "-login";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (IsDumpStaticInstanceData()) {
|
if (IsDumpQueryServerTables()) {
|
||||||
tables_to_dump += "instance_list";
|
tables_to_dump += GetQueryServTables();
|
||||||
options += " --no-create-info --where=\"instance_list.is_global > 0 and instance_list.never_expires > 0\"";
|
dump_descriptor += "-queryserv";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dump_descriptor.empty()) {
|
if (!dump_descriptor.empty()) {
|
||||||
@@ -286,6 +344,14 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
pipe_file = fmt::format(" > {}.sql", GetDumpFileNameWithPath());
|
pipe_file = fmt::format(" > {}.sql", GetDumpFileNameWithPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string execute_command = fmt::format(
|
||||||
|
"{} {} {} {}",
|
||||||
|
GetBaseMySQLDumpCommand(),
|
||||||
|
options,
|
||||||
|
tables_to_dump,
|
||||||
|
pipe_file
|
||||||
|
);
|
||||||
|
|
||||||
if (!File::Exists(GetSetDumpPath()) && !IsDumpOutputToConsole()) {
|
if (!File::Exists(GetSetDumpPath()) && !IsDumpOutputToConsole()) {
|
||||||
File::Makedir(GetSetDumpPath());
|
File::Makedir(GetSetDumpPath());
|
||||||
}
|
}
|
||||||
@@ -293,66 +359,30 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
if (IsDumpDropTableSyntaxOnly()) {
|
if (IsDumpDropTableSyntaxOnly()) {
|
||||||
std::vector<std::string> tables = Strings::Split(tables_to_dump, ' ');
|
std::vector<std::string> tables = Strings::Split(tables_to_dump, ' ');
|
||||||
|
|
||||||
for (auto &table: tables) {
|
for (auto &table : tables) {
|
||||||
std::cout << "DROP TABLE IF EXISTS `" << table << "`;" << std::endl;
|
std::cout << "DROP TABLE IF EXISTS `" << table << "`;" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tables_to_dump.empty()) {
|
if (tables_to_dump.empty()) {
|
||||||
std::cerr << "No tables were specified" << std::endl;
|
std::cerr << "No tables were specified" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const auto execute_command = fmt::format(
|
|
||||||
"{} {} {} {}",
|
|
||||||
GetBaseMySQLDumpCommand(),
|
|
||||||
options,
|
|
||||||
tables_to_dump,
|
|
||||||
pipe_file
|
|
||||||
);
|
|
||||||
|
|
||||||
LogInfo("Backing up database [{}]", execute_command);
|
|
||||||
LogInfo("This can take a few minutes depending on the size of your database");
|
|
||||||
LogInfo("LOADING... PLEASE WAIT...");
|
|
||||||
|
|
||||||
BuildCredentialsFile();
|
|
||||||
std::string execution_result = Process::execute(execute_command);
|
std::string execution_result = Process::execute(execute_command);
|
||||||
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
||||||
std::cout << execution_result;
|
std::cout << execution_result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsDumpOutputToConsole()) {
|
|
||||||
LogSys.LoadLogSettingsDefaults();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pipe_file.empty()) {
|
|
||||||
std::string file = fmt::format("{}.sql", GetDumpFileNameWithPath());
|
|
||||||
auto r = File::GetContents(file);
|
|
||||||
if (!r.error.empty()) {
|
|
||||||
LogError("{}", r.error);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto &line: Strings::Split(r.contents, "\n")) {
|
|
||||||
if (Strings::Contains(line, "mysqldump:")) {
|
|
||||||
LogError("{}", line);
|
|
||||||
LogError("Database dump failed. Correct the error before continuing or trying again");
|
|
||||||
LogError("This is to prevent data loss on behalf of the server operator");
|
|
||||||
RemoveSqlBackup();
|
|
||||||
std::exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!tables_to_dump.empty()) {
|
if (!tables_to_dump.empty()) {
|
||||||
LogInfo("Dumping Tables [{}]", Strings::Trim(tables_to_dump));
|
LogInfo("Dumping Tables [{}]", tables_to_dump);
|
||||||
}
|
}
|
||||||
|
|
||||||
LogInfo("Database dump created at [{}.sql]", GetDumpFileNameWithPath());
|
LogInfo("Database dump created at [{}.sql]", GetDumpFileNameWithPath());
|
||||||
|
|
||||||
if (IsDumpWithCompression() && !IsDumpOutputToConsole()) {
|
if (IsDumpWithCompression() && !IsDumpOutputToConsole()) {
|
||||||
if (HasCompressionBinary()) {
|
if (HasCompressionBinary()) {
|
||||||
LogInfo("Compression requested. Compressing dump [{}.sql]", GetDumpFileNameWithPath());
|
LogInfo("Compression requested... Compressing dump [{}.sql]", GetDumpFileNameWithPath());
|
||||||
|
|
||||||
if (IsTarAvailable()) {
|
if (IsTarAvailable()) {
|
||||||
Process::execute(
|
Process::execute(
|
||||||
@@ -364,7 +394,6 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
LogInfo("Compressed dump created at [{}.tar.gz]", GetDumpFileNameWithPath());
|
LogInfo("Compressed dump created at [{}.tar.gz]", GetDumpFileNameWithPath());
|
||||||
RemoveSqlBackup();
|
|
||||||
}
|
}
|
||||||
else if (Is7ZipAvailable()) {
|
else if (Is7ZipAvailable()) {
|
||||||
Process::execute(
|
Process::execute(
|
||||||
@@ -375,7 +404,6 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
LogInfo("Compressed dump created at [{}.zip]", GetDumpFileNameWithPath());
|
LogInfo("Compressed dump created at [{}.zip]", GetDumpFileNameWithPath());
|
||||||
RemoveSqlBackup();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LogInfo("Compression requested, but no available compression binary was found");
|
LogInfo("Compression requested, but no available compression binary was found");
|
||||||
@@ -386,11 +414,10 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveCredentialsFile();
|
|
||||||
|
|
||||||
// LogDebug("[{}] dump-to-console", IsDumpOutputToConsole());
|
// LogDebug("[{}] dump-to-console", IsDumpOutputToConsole());
|
||||||
// LogDebug("[{}] dump-path", GetSetDumpPath());
|
// LogDebug("[{}] dump-path", GetSetDumpPath());
|
||||||
// LogDebug("[{}] compression", (IsDumpWithCompression() ? "true" : "false"));
|
// LogDebug("[{}] compression", (IsDumpWithCompression() ? "true" : "false"));
|
||||||
|
// LogDebug("[{}] query-serv", (IsDumpQueryServerTables() ? "true" : "false"));
|
||||||
// LogDebug("[{}] has-compression-binary", (HasCompressionBinary() ? "true" : "false"));
|
// LogDebug("[{}] has-compression-binary", (HasCompressionBinary() ? "true" : "false"));
|
||||||
// LogDebug("[{}] content", (IsDumpContentTables() ? "true" : "false"));
|
// LogDebug("[{}] content", (IsDumpContentTables() ? "true" : "false"));
|
||||||
// LogDebug("[{}] no-data", (IsDumpWithNoData() ? "true" : "false"));
|
// LogDebug("[{}] no-data", (IsDumpWithNoData() ? "true" : "false"));
|
||||||
@@ -500,6 +527,16 @@ const std::string &DatabaseDumpService::GetDumpFileName() const
|
|||||||
return dump_file_name;
|
return dump_file_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DatabaseDumpService::IsDumpQueryServerTables() const
|
||||||
|
{
|
||||||
|
return dump_query_server_tables;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DatabaseDumpService::SetDumpQueryServerTables(bool dump_query_server_tables)
|
||||||
|
{
|
||||||
|
DatabaseDumpService::dump_query_server_tables = dump_query_server_tables;
|
||||||
|
}
|
||||||
|
|
||||||
bool DatabaseDumpService::IsDumpOutputToConsole() const
|
bool DatabaseDumpService::IsDumpOutputToConsole() const
|
||||||
{
|
{
|
||||||
return dump_output_to_console;
|
return dump_output_to_console;
|
||||||
@@ -539,78 +576,3 @@ void DatabaseDumpService::SetDumpBotTables(bool dump_bot_tables)
|
|||||||
{
|
{
|
||||||
DatabaseDumpService::dump_bot_tables = dump_bot_tables;
|
DatabaseDumpService::dump_bot_tables = dump_bot_tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DatabaseDumpService::IsDumpMercTables() const
|
|
||||||
{
|
|
||||||
return dump_merc_tables;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDumpService::SetDumpMercTables(bool dump_merc_tables)
|
|
||||||
{
|
|
||||||
DatabaseDumpService::dump_merc_tables = dump_merc_tables;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDumpService::RemoveSqlBackup()
|
|
||||||
{
|
|
||||||
std::string file = fmt::format("{}.sql", GetDumpFileNameWithPath());
|
|
||||||
if (File::Exists(file)) {
|
|
||||||
try {
|
|
||||||
std::filesystem::remove(file);
|
|
||||||
}
|
|
||||||
catch (std::exception &e) {
|
|
||||||
LogError("std::filesystem::remove err [{}]", e.what());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
RemoveCredentialsFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDumpService::BuildCredentialsFile()
|
|
||||||
{
|
|
||||||
auto config = EQEmuConfig::get();
|
|
||||||
std::ofstream out(CREDENTIALS_FILE);
|
|
||||||
if (out.is_open()) {
|
|
||||||
if (IsDumpContentTables() && !config->ContentDbHost.empty()) {
|
|
||||||
out << "[mysqldump]" << std::endl;
|
|
||||||
out << "user=" << config->ContentDbUsername << std::endl;
|
|
||||||
out << "password=" << config->ContentDbPassword << std::endl;
|
|
||||||
out << "host=" << config->ContentDbHost << std::endl;
|
|
||||||
out << "port=" << config->ContentDbPort << std::endl;
|
|
||||||
out << "default-character-set=utf8" << std::endl;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
out << "[mysqldump]" << std::endl;
|
|
||||||
out << "user=" << config->DatabaseUsername << std::endl;
|
|
||||||
out << "password=" << config->DatabasePassword << std::endl;
|
|
||||||
out << "host=" << config->DatabaseHost << std::endl;
|
|
||||||
out << "port=" << config->DatabasePort << std::endl;
|
|
||||||
out << "default-character-set=utf8" << std::endl;
|
|
||||||
}
|
|
||||||
out.close();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LogError("Failed to open credentials file for writing");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDumpService::RemoveCredentialsFile()
|
|
||||||
{
|
|
||||||
if (File::Exists(CREDENTIALS_FILE)) {
|
|
||||||
try {
|
|
||||||
std::filesystem::remove(CREDENTIALS_FILE);
|
|
||||||
}
|
|
||||||
catch (std::exception &e) {
|
|
||||||
LogError("std::filesystem::remove err [{}]", e.what());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseDumpService::IsDumpStaticInstanceData()
|
|
||||||
{
|
|
||||||
return dump_static_instance_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDumpService::SetDumpStaticInstanceData(bool b)
|
|
||||||
{
|
|
||||||
dump_static_instance_data = b;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
class DatabaseDumpService {
|
class DatabaseDumpService {
|
||||||
public:
|
public:
|
||||||
void DatabaseDump();
|
void Dump();
|
||||||
bool IsDumpAllTables() const;
|
bool IsDumpAllTables() const;
|
||||||
void SetDumpAllTables(bool dump_all_tables);
|
void SetDumpAllTables(bool dump_all_tables);
|
||||||
bool IsDumpWithNoData() const;
|
bool IsDumpWithNoData() const;
|
||||||
@@ -45,6 +45,8 @@ public:
|
|||||||
void SetDumpPath(const std::string &dump_path);
|
void SetDumpPath(const std::string &dump_path);
|
||||||
const std::string &GetDumpFileName() const;
|
const std::string &GetDumpFileName() const;
|
||||||
void SetDumpFileName(const std::string &dump_file_name);
|
void SetDumpFileName(const std::string &dump_file_name);
|
||||||
|
bool IsDumpQueryServerTables() const;
|
||||||
|
void SetDumpQueryServerTables(bool dump_query_server_tables);
|
||||||
bool IsDumpOutputToConsole() const;
|
bool IsDumpOutputToConsole() const;
|
||||||
void SetDumpOutputToConsole(bool dump_output_to_console);
|
void SetDumpOutputToConsole(bool dump_output_to_console);
|
||||||
bool IsDumpDropTableSyntaxOnly() const;
|
bool IsDumpDropTableSyntaxOnly() const;
|
||||||
@@ -53,11 +55,6 @@ public:
|
|||||||
void SetDumpStateTables(bool dump_state_tables);
|
void SetDumpStateTables(bool dump_state_tables);
|
||||||
bool IsDumpBotTables() const;
|
bool IsDumpBotTables() const;
|
||||||
void SetDumpBotTables(bool dump_bot_tables);
|
void SetDumpBotTables(bool dump_bot_tables);
|
||||||
bool IsDumpMercTables() const;
|
|
||||||
void SetDumpMercTables(bool dump_bot_tables);
|
|
||||||
|
|
||||||
void SetDumpStaticInstanceData(bool b);
|
|
||||||
bool IsDumpStaticInstanceData();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool dump_all_tables = false;
|
bool dump_all_tables = false;
|
||||||
@@ -65,6 +62,7 @@ private:
|
|||||||
bool dump_system_tables = false;
|
bool dump_system_tables = false;
|
||||||
bool dump_content_tables = false;
|
bool dump_content_tables = false;
|
||||||
bool dump_player_tables = false;
|
bool dump_player_tables = false;
|
||||||
|
bool dump_query_server_tables = false;
|
||||||
bool dump_login_server_tables = false;
|
bool dump_login_server_tables = false;
|
||||||
bool dump_with_no_data = false;
|
bool dump_with_no_data = false;
|
||||||
bool dump_table_lock = false;
|
bool dump_table_lock = false;
|
||||||
@@ -72,9 +70,6 @@ private:
|
|||||||
bool dump_output_to_console = false;
|
bool dump_output_to_console = false;
|
||||||
bool dump_drop_table_syntax_only = false;
|
bool dump_drop_table_syntax_only = false;
|
||||||
bool dump_bot_tables = false;
|
bool dump_bot_tables = false;
|
||||||
bool dump_merc_tables = false;
|
|
||||||
bool dump_static_instance_data = false;
|
|
||||||
|
|
||||||
std::string dump_path;
|
std::string dump_path;
|
||||||
std::string dump_file_name;
|
std::string dump_file_name;
|
||||||
|
|
||||||
@@ -83,7 +78,6 @@ private:
|
|||||||
std::string GetBaseMySQLDumpCommand();
|
std::string GetBaseMySQLDumpCommand();
|
||||||
std::string GetPlayerTablesList();
|
std::string GetPlayerTablesList();
|
||||||
std::string GetBotTablesList();
|
std::string GetBotTablesList();
|
||||||
std::string GetMercTablesList();
|
|
||||||
std::string GetSystemTablesList();
|
std::string GetSystemTablesList();
|
||||||
std::string GetStateTablesList();
|
std::string GetStateTablesList();
|
||||||
std::string GetContentTablesList();
|
std::string GetContentTablesList();
|
||||||
@@ -93,9 +87,7 @@ private:
|
|||||||
bool HasCompressionBinary();
|
bool HasCompressionBinary();
|
||||||
std::string GetDumpFileNameWithPath();
|
std::string GetDumpFileNameWithPath();
|
||||||
std::string GetSetDumpPath();
|
std::string GetSetDumpPath();
|
||||||
void RemoveSqlBackup();
|
std::string GetQueryServTables();
|
||||||
void BuildCredentialsFile();
|
|
||||||
void RemoveCredentialsFile();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,410 +0,0 @@
|
|||||||
#include <filesystem>
|
|
||||||
#include "database_update.h"
|
|
||||||
#include "../eqemu_logsys.h"
|
|
||||||
#include "../database.h"
|
|
||||||
#include "../strings.h"
|
|
||||||
#include "../rulesys.h"
|
|
||||||
#include "../http/httplib.h"
|
|
||||||
|
|
||||||
#include "database_update_manifest.cpp"
|
|
||||||
#include "database_update_manifest_custom.cpp"
|
|
||||||
#include "database_update_manifest_bots.cpp"
|
|
||||||
#include "database_dump_service.h"
|
|
||||||
|
|
||||||
constexpr int BREAK_LENGTH = 70;
|
|
||||||
|
|
||||||
DatabaseVersion DatabaseUpdate::GetDatabaseVersions()
|
|
||||||
{
|
|
||||||
auto results = m_database->QueryDatabase("SELECT `version`, `bots_version`, `custom_version` FROM `db_version` LIMIT 1");
|
|
||||||
if (!results.Success() || !results.RowCount()) {
|
|
||||||
LogError("Failed to read from [db_version] table!");
|
|
||||||
return DatabaseVersion{};
|
|
||||||
}
|
|
||||||
|
|
||||||
auto r = results.begin();
|
|
||||||
|
|
||||||
return DatabaseVersion{
|
|
||||||
.server_database_version = Strings::ToInt(r[0]),
|
|
||||||
.bots_database_version = Strings::ToInt(r[1]),
|
|
||||||
.custom_database_version = Strings::ToInt(r[2]),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseVersion DatabaseUpdate::GetBinaryDatabaseVersions()
|
|
||||||
{
|
|
||||||
return DatabaseVersion{
|
|
||||||
.server_database_version = CURRENT_BINARY_DATABASE_VERSION,
|
|
||||||
.bots_database_version = (RuleB(Bots, Enabled) ? CURRENT_BINARY_BOTS_DATABASE_VERSION : 0),
|
|
||||||
.custom_database_version = CUSTOM_BINARY_DATABASE_VERSION,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// the amount of versions we look-back to ensure we have all migrations
|
|
||||||
// we may not want to force these, but just warn about the look-backs
|
|
||||||
constexpr int LOOK_BACK_AMOUNT = 10;
|
|
||||||
|
|
||||||
// this check will take action
|
|
||||||
void DatabaseUpdate::CheckDbUpdates()
|
|
||||||
{
|
|
||||||
InjectCustomVersionColumn();
|
|
||||||
InjectBotsVersionColumn();
|
|
||||||
auto v = GetDatabaseVersions();
|
|
||||||
auto b = GetBinaryDatabaseVersions();
|
|
||||||
if (CheckVersionsUpToDate(v, b)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UpdateManifest(manifest_entries, v.server_database_version, b.server_database_version)) {
|
|
||||||
LogInfo(
|
|
||||||
"Updates ran successfully, setting database version to [{}] from [{}]",
|
|
||||||
b.server_database_version,
|
|
||||||
v.server_database_version
|
|
||||||
);
|
|
||||||
m_database->QueryDatabase(fmt::format("UPDATE `db_version` SET `version` = {}", b.server_database_version));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (UpdateManifest(manifest_entries_custom, v.custom_database_version, b.custom_database_version)) {
|
|
||||||
LogInfo(
|
|
||||||
"Updates ran successfully, setting database version to [{}] from [{}]",
|
|
||||||
b.custom_database_version,
|
|
||||||
v.custom_database_version
|
|
||||||
);
|
|
||||||
m_database->QueryDatabase(fmt::format("UPDATE `db_version` SET `custom_version` = {}", b.custom_database_version));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b.bots_database_version > 0) {
|
|
||||||
if (UpdateManifest(bot_manifest_entries, v.bots_database_version, b.bots_database_version)) {
|
|
||||||
LogInfo(
|
|
||||||
"Updates ran successfully, setting database version to [{}] from [{}]",
|
|
||||||
b.bots_database_version,
|
|
||||||
v.bots_database_version
|
|
||||||
);
|
|
||||||
m_database->QueryDatabase(
|
|
||||||
fmt::format(
|
|
||||||
"UPDATE `db_version` SET `bots_version` = {}",
|
|
||||||
b.bots_database_version
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string DatabaseUpdate::GetQueryResult(const ManifestEntry& e)
|
|
||||||
{
|
|
||||||
auto results = (e.content_schema_update ? m_content_database : m_database)->QueryDatabase(e.check);
|
|
||||||
|
|
||||||
std::vector<std::string> result_lines = {};
|
|
||||||
|
|
||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
|
||||||
std::vector<std::string> cols;
|
|
||||||
|
|
||||||
int field_count = results.ColumnCount();
|
|
||||||
cols.reserve(field_count);
|
|
||||||
for (int i = 0; i < field_count; ++i) {
|
|
||||||
if (row[i] != nullptr) {
|
|
||||||
cols.emplace_back(row[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result_lines.emplace_back(Strings::Join(cols, " "));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Strings::Join(result_lines, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseUpdate::ShouldRunMigration(ManifestEntry &e, std::string query_result)
|
|
||||||
{
|
|
||||||
std::string r = Strings::Trim(query_result);
|
|
||||||
if (e.condition == "contains") {
|
|
||||||
return Strings::Contains(r, e.match);
|
|
||||||
}
|
|
||||||
else if (e.condition == "match") {
|
|
||||||
return r == e.match;
|
|
||||||
}
|
|
||||||
else if (e.condition == "missing") {
|
|
||||||
return !Strings::Contains(r, e.match);
|
|
||||||
}
|
|
||||||
else if (e.condition == "empty") {
|
|
||||||
return r.empty();
|
|
||||||
}
|
|
||||||
else if (e.condition == "not_empty") {
|
|
||||||
return !r.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if we are running in a terminal
|
|
||||||
bool is_atty()
|
|
||||||
{
|
|
||||||
#ifdef _WINDOWS
|
|
||||||
return ::_isatty(_fileno(stdin));
|
|
||||||
#else
|
|
||||||
return isatty(fileno(stdin));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// return true if we ran updates
|
|
||||||
bool DatabaseUpdate::UpdateManifest(
|
|
||||||
std::vector<ManifestEntry> entries,
|
|
||||||
int version_low,
|
|
||||||
int version_high
|
|
||||||
)
|
|
||||||
{
|
|
||||||
std::vector<int> missing_migrations = {};
|
|
||||||
if (version_low != version_high) {
|
|
||||||
|
|
||||||
LogSys.DisableMySQLErrorLogs();
|
|
||||||
bool force_interactive = false;
|
|
||||||
for (int version = version_low + 1; version <= version_high; ++version) {
|
|
||||||
for (auto &e: entries) {
|
|
||||||
if (e.version == version) {
|
|
||||||
bool has_migration = true;
|
|
||||||
std::string r = GetQueryResult(e);
|
|
||||||
if (ShouldRunMigration(e, r)) {
|
|
||||||
has_migration = false;
|
|
||||||
missing_migrations.emplace_back(e.version);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string prefix = fmt::format(
|
|
||||||
"[{}]",
|
|
||||||
has_migration ? "ok" : "missing"
|
|
||||||
);
|
|
||||||
|
|
||||||
LogInfo(
|
|
||||||
"[{}] {:>10} | [{}]",
|
|
||||||
e.version,
|
|
||||||
prefix,
|
|
||||||
e.description
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!has_migration && e.force_interactive) {
|
|
||||||
force_interactive = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LogSys.EnableMySQLErrorLogs();
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
|
|
||||||
if (!missing_migrations.empty() && m_skip_backup) {
|
|
||||||
LogInfo("Skipping database backup");
|
|
||||||
}
|
|
||||||
else if (!missing_migrations.empty()) {
|
|
||||||
LogInfo("Automatically backing up database before applying updates");
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
auto s = DatabaseDumpService();
|
|
||||||
s.SetDumpAllTables(true);
|
|
||||||
s.SetDumpWithCompression(true);
|
|
||||||
s.DatabaseDump();
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!missing_migrations.empty()) {
|
|
||||||
LogInfo("Running database migrations. Please wait...");
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (force_interactive && !std::getenv("FORCE_INTERACTIVE")) {
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
LogInfo("Some migrations require user input. Running interactively");
|
|
||||||
LogInfo("This is usually due to a major change that could cause data loss");
|
|
||||||
LogInfo("Your server is automatically backed up before these updates are applied");
|
|
||||||
LogInfo("but you should also make sure you take a backup prior to running this update");
|
|
||||||
LogInfo("Would you like to run this update? [y/n] (Timeout 60s)");
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
|
|
||||||
// user input
|
|
||||||
std::string input;
|
|
||||||
bool gave_input = false;
|
|
||||||
time_t start_time = time(nullptr);
|
|
||||||
time_t wait_time_seconds = 60;
|
|
||||||
|
|
||||||
// spawn a concurrent thread that waits for input from std::cin
|
|
||||||
std::thread t1(
|
|
||||||
[&]() {
|
|
||||||
std::cin >> input;
|
|
||||||
gave_input = true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
t1.detach();
|
|
||||||
|
|
||||||
// check the inputReceived flag once every 50ms for 10 seconds
|
|
||||||
while (time(nullptr) < start_time + wait_time_seconds && !gave_input) {
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
|
||||||
}
|
|
||||||
|
|
||||||
// prompt for user skip
|
|
||||||
if (Strings::Trim(input) != "y") {
|
|
||||||
LogInfo("Exiting due to user input");
|
|
||||||
std::exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto &m: missing_migrations) {
|
|
||||||
for (auto &e: entries) {
|
|
||||||
if (e.version == m) {
|
|
||||||
bool errored_migration = false;
|
|
||||||
|
|
||||||
auto r = (e.content_schema_update ? m_content_database : m_database)->QueryDatabaseMulti(e.sql);
|
|
||||||
|
|
||||||
// ignore empty query result "errors"
|
|
||||||
if (r.ErrorNumber() != 1065 && !r.ErrorMessage().empty()) {
|
|
||||||
LogError("(#{}) [{}]", r.ErrorNumber(), r.ErrorMessage());
|
|
||||||
errored_migration = true;
|
|
||||||
|
|
||||||
LogInfo("Required database update failed. This could be a problem");
|
|
||||||
|
|
||||||
// if terminal attached then prompt for skip
|
|
||||||
if (is_atty()) {
|
|
||||||
LogInfo("Would you like to skip this update? [y/n] (Timeout 60s)");
|
|
||||||
|
|
||||||
// user input
|
|
||||||
std::string input;
|
|
||||||
bool gave_input = false;
|
|
||||||
time_t start_time = time(nullptr);
|
|
||||||
time_t wait_time_seconds = 60;
|
|
||||||
|
|
||||||
// spawn a concurrent thread that waits for input from std::cin
|
|
||||||
std::thread t1(
|
|
||||||
[&]() {
|
|
||||||
std::cin >> input;
|
|
||||||
gave_input = true;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
t1.detach();
|
|
||||||
|
|
||||||
// check the inputReceived flag once every 50ms for 10 seconds
|
|
||||||
while (time(nullptr) < start_time + wait_time_seconds && !gave_input) {
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
|
||||||
}
|
|
||||||
|
|
||||||
// prompt for user skip
|
|
||||||
if (Strings::Trim(input) == "y") {
|
|
||||||
errored_migration = false;
|
|
||||||
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
errored_migration = true;
|
|
||||||
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LogInfo(
|
|
||||||
"[{}] [{}] [{}]",
|
|
||||||
e.version,
|
|
||||||
e.description,
|
|
||||||
(errored_migration ? "error" : "ok")
|
|
||||||
);
|
|
||||||
|
|
||||||
if (errored_migration) {
|
|
||||||
LogError("Fatal | Database migration [{}] failed to run", e.description);
|
|
||||||
LogError("Fatal | Shutting down");
|
|
||||||
std::exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseUpdate *DatabaseUpdate::SetDatabase(Database *db)
|
|
||||||
{
|
|
||||||
m_database = db;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseUpdate *DatabaseUpdate::SetContentDatabase(Database *db)
|
|
||||||
{
|
|
||||||
m_content_database = db;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
DatabaseUpdate *DatabaseUpdate::SetSkipBackup(bool skip)
|
|
||||||
{
|
|
||||||
m_skip_backup = skip;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseUpdate::CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b)
|
|
||||||
{
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
|
|
||||||
LogInfo(
|
|
||||||
"{:>8} | database [{}] binary [{}] {}",
|
|
||||||
"Server",
|
|
||||||
v.server_database_version,
|
|
||||||
b.server_database_version,
|
|
||||||
(v.server_database_version == b.server_database_version) ? "up to date" : "checking updates"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (RuleB(Bots, Enabled) && b.bots_database_version > 0) {
|
|
||||||
LogInfo(
|
|
||||||
"{:>8} | database [{}] binary [{}] {}",
|
|
||||||
"Bots",
|
|
||||||
v.bots_database_version,
|
|
||||||
b.bots_database_version,
|
|
||||||
(v.bots_database_version == b.bots_database_version) ? "up to date" : "checking updates"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b.custom_database_version > 0) {
|
|
||||||
LogInfo(
|
|
||||||
"{:>8} | database [{}] binary [{}] {}",
|
|
||||||
"Custom",
|
|
||||||
v.custom_database_version,
|
|
||||||
b.custom_database_version,
|
|
||||||
(v.custom_database_version == b.custom_database_version) ? "up to date" : "checking updates"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
LogInfo("{:>8} | [server.auto_database_updates] [<green>true]", "Config");
|
|
||||||
|
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
|
||||||
|
|
||||||
// server database version is required
|
|
||||||
bool server_up_to_date = v.server_database_version >= b.server_database_version;
|
|
||||||
// bots database version is optional, if not enabled then it is always up-to-date
|
|
||||||
bool bots_up_to_date = RuleB(Bots, Enabled) ? v.bots_database_version >= b.bots_database_version : true;
|
|
||||||
|
|
||||||
// custom database version is optional, if not enabled then it is always up-to-date
|
|
||||||
bool custom_up_to_date = v.custom_database_version >= b.custom_database_version;
|
|
||||||
|
|
||||||
return server_up_to_date && bots_up_to_date && custom_up_to_date;
|
|
||||||
}
|
|
||||||
|
|
||||||
// checks to see if there are pending updates
|
|
||||||
// used by zone to prevent launch or boot loop until updates are applied
|
|
||||||
bool DatabaseUpdate::HasPendingUpdates()
|
|
||||||
{
|
|
||||||
auto v = GetDatabaseVersions();
|
|
||||||
auto b = GetBinaryDatabaseVersions();
|
|
||||||
|
|
||||||
return !CheckVersionsUpToDate(v, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseUpdate::InjectBotsVersionColumn()
|
|
||||||
{
|
|
||||||
auto r = m_database->QueryDatabase("show columns from db_version where Field like '%bots_version%'");
|
|
||||||
if (r.RowCount() == 0) {
|
|
||||||
m_database->QueryDatabase("ALTER TABLE db_version ADD bots_version int(11) DEFAULT '0' AFTER version");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseUpdate::InjectCustomVersionColumn()
|
|
||||||
{
|
|
||||||
auto results = m_database->QueryDatabase("SHOW COLUMNS FROM `db_version` LIKE 'custom_version'");
|
|
||||||
if (!results.Success() || results.RowCount() == 0) {
|
|
||||||
LogInfo("Adding custom_version column to db_version table");
|
|
||||||
m_database->QueryDatabase("ALTER TABLE `db_version` ADD COLUMN `custom_version` INT(11) UNSIGNED NOT NULL DEFAULT 0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
#ifndef EQEMU_DATABASE_UPDATE_H
|
|
||||||
#define EQEMU_DATABASE_UPDATE_H
|
|
||||||
|
|
||||||
#include "../database.h"
|
|
||||||
|
|
||||||
struct ManifestEntry {
|
|
||||||
int version{}; // database version of the migration
|
|
||||||
std::string description{}; // description of the migration ex: "add_new_table" or "add_index_to_table"
|
|
||||||
std::string check{}; // query that checks against the condition
|
|
||||||
std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
|
||||||
std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
|
||||||
std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
|
||||||
bool content_schema_update{}; // if true, this migration is a content schema update and should be ran against the content database
|
|
||||||
bool force_interactive; // if true, this migration will always be run interactively
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DatabaseVersion {
|
|
||||||
int server_database_version;
|
|
||||||
int bots_database_version;
|
|
||||||
int custom_database_version;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DatabaseUpdate {
|
|
||||||
public:
|
|
||||||
DatabaseVersion GetDatabaseVersions();
|
|
||||||
DatabaseVersion GetBinaryDatabaseVersions();
|
|
||||||
void CheckDbUpdates();
|
|
||||||
std::string GetQueryResult(const ManifestEntry& e);
|
|
||||||
static bool ShouldRunMigration(ManifestEntry &e, std::string query_result);
|
|
||||||
bool UpdateManifest(std::vector<ManifestEntry> entries, int version_low, int version_high);
|
|
||||||
|
|
||||||
DatabaseUpdate *SetDatabase(Database *db);
|
|
||||||
DatabaseUpdate *SetContentDatabase(Database *db);
|
|
||||||
DatabaseUpdate *SetSkipBackup(bool skip);
|
|
||||||
bool HasPendingUpdates();
|
|
||||||
private:
|
|
||||||
bool m_skip_backup = false;
|
|
||||||
Database *m_database;
|
|
||||||
Database *m_content_database;
|
|
||||||
static bool CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b);
|
|
||||||
void InjectBotsVersionColumn();
|
|
||||||
void InjectCustomVersionColumn();
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //EQEMU_DATABASE_UPDATE_H
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@@ -1,55 +0,0 @@
|
|||||||
#include "database_update.h"
|
|
||||||
|
|
||||||
std::vector<ManifestEntry> manifest_entries_custom = {
|
|
||||||
ManifestEntry{
|
|
||||||
.version = 1,
|
|
||||||
.description = "2025_05_16_new_database_check_test",
|
|
||||||
.check = "SHOW TABLES LIKE 'new_table'",
|
|
||||||
.condition = "empty",
|
|
||||||
.match = "",
|
|
||||||
.sql = R"(
|
|
||||||
CREATE TABLE `new_table` (
|
|
||||||
`id` int NOT NULL AUTO_INCREMENT,
|
|
||||||
PRIMARY KEY (`id`)
|
|
||||||
);
|
|
||||||
)",
|
|
||||||
.content_schema_update = false,
|
|
||||||
},
|
|
||||||
// Used for testing
|
|
||||||
// ManifestEntry{
|
|
||||||
// .version = 9229,
|
|
||||||
// .description = "new_database_check_test",
|
|
||||||
// .check = "SHOW TABLES LIKE 'new_table'",
|
|
||||||
// .condition = "empty",
|
|
||||||
// .match = "",
|
|
||||||
// .sql = R"(
|
|
||||||
//CREATE TABLE `new_table` (
|
|
||||||
// `id` int NOT NULL AUTO_INCREMENT,
|
|
||||||
// PRIMARY KEY (`id`)
|
|
||||||
//);
|
|
||||||
//CREATE TABLE `new_table1` (
|
|
||||||
// `id` int NOT NULL AUTO_INCREMENT,
|
|
||||||
// PRIMARY KEY (`id`)
|
|
||||||
//);
|
|
||||||
//CREATE TABLE `new_table2` (
|
|
||||||
// `id` int NOT NULL AUTO_INCREMENT,
|
|
||||||
// PRIMARY KEY (`id`)
|
|
||||||
//);
|
|
||||||
//CREATE TABLE `new_table3` (
|
|
||||||
// `id` int NOT NULL AUTO_INCREMENT,
|
|
||||||
// PRIMARY KEY (`id`)
|
|
||||||
//);
|
|
||||||
//)",
|
|
||||||
// }
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
// see struct definitions for what each field does
|
|
||||||
// struct ManifestEntry {
|
|
||||||
// int version{}; // database version of the migration
|
|
||||||
// std::string description{}; // description of the migration ex: "add_new_table" or "add_index_to_table"
|
|
||||||
// std::string check{}; // query that checks against the condition
|
|
||||||
// std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
|
||||||
// std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
|
||||||
// std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
|
||||||
// };
|
|
||||||
File diff suppressed because it is too large
Load Diff
+99
-193
@@ -29,9 +29,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "../common/repositories/raid_members_repository.h"
|
#include "../common/repositories/raid_members_repository.h"
|
||||||
#include "../common/repositories/respawn_times_repository.h"
|
#include "../common/repositories/respawn_times_repository.h"
|
||||||
#include "../common/repositories/spawn_condition_values_repository.h"
|
#include "../common/repositories/spawn_condition_values_repository.h"
|
||||||
#include "repositories/spawn2_disabled_repository.h"
|
|
||||||
#include "repositories/data_buckets_repository.h"
|
|
||||||
#include "repositories/zone_state_spawns_repository.h"
|
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
@@ -50,7 +49,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
||||||
{
|
{
|
||||||
auto e = InstanceListPlayerRepository::NewEntity();
|
auto e = InstanceListPlayerRepository::NewEntity();
|
||||||
@@ -114,9 +112,7 @@ bool Database::CheckInstanceExpired(uint16 instance_id)
|
|||||||
timeval tv{};
|
timeval tv{};
|
||||||
gettimeofday(&tv, nullptr);
|
gettimeofday(&tv, nullptr);
|
||||||
|
|
||||||
// Use uint64_t for the addition to prevent overflow
|
return (i.start_time + i.duration) <= tv.tv_sec;
|
||||||
uint64_t expiration_time = static_cast<uint64_t>(i.start_time) + static_cast<uint64_t>(i.duration);
|
|
||||||
return expiration_time <= tv.tv_sec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration)
|
bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration)
|
||||||
@@ -128,149 +124,92 @@ bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version
|
|||||||
e.version = version;
|
e.version = version;
|
||||||
e.start_time = std::time(nullptr);
|
e.start_time = std::time(nullptr);
|
||||||
e.duration = duration;
|
e.duration = duration;
|
||||||
e.expire_at = e.start_time + duration;
|
|
||||||
|
|
||||||
RespawnTimesRepository::ClearInstanceTimers(*this, e.id);
|
return InstanceListRepository::InsertOne(*this, e).id;
|
||||||
InstanceListRepository::ReplaceOne(*this, e);
|
|
||||||
return instance_id > 0 && e.id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::GetUnusedInstanceID(uint16 &instance_id)
|
bool Database::GetUnusedInstanceID(uint16 &instance_id)
|
||||||
{
|
|
||||||
// attempt to get an unused instance id
|
|
||||||
for (int a = 0; a < 10; a++) {
|
|
||||||
uint16 attempted_id = 0;
|
|
||||||
if (TryGetUnusedInstanceID(attempted_id)) {
|
|
||||||
auto i = InstanceListRepository::NewEntity();
|
|
||||||
i.id = attempted_id;
|
|
||||||
i.notes = "Prefetching";
|
|
||||||
auto n = InstanceListRepository::InsertOne(*this, i);
|
|
||||||
if (n.id > 0) {
|
|
||||||
instance_id = n.id;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Database::TryGetUnusedInstanceID(uint16 &instance_id)
|
|
||||||
{
|
{
|
||||||
uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances);
|
uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances);
|
||||||
uint32 max_instance_id = 32000;
|
uint32 max = 32000;
|
||||||
|
|
||||||
// sanity check reserved
|
|
||||||
if (max_reserved_instance_id >= max_instance_id) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// recycle instances
|
|
||||||
if (RuleB(Instances, RecycleInstanceIds)) {
|
|
||||||
|
|
||||||
//query to get first unused id above reserved
|
|
||||||
auto query = fmt::format(
|
|
||||||
SQL(
|
|
||||||
SELECT id
|
|
||||||
FROM instance_list
|
|
||||||
WHERE id = {};
|
|
||||||
),
|
|
||||||
max_reserved_instance_id + 1
|
|
||||||
);
|
|
||||||
|
|
||||||
auto results = QueryDatabase(query);
|
|
||||||
|
|
||||||
// could not successfully query - bail out
|
|
||||||
if (!results.Success()) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// first id is available
|
|
||||||
if (results.RowCount() == 0) {
|
|
||||||
instance_id = max_reserved_instance_id + 1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// now look for next available above reserved
|
|
||||||
query = fmt::format(
|
|
||||||
SQL(
|
|
||||||
SELECT MIN(i.id + 1) AS next_available
|
|
||||||
FROM instance_list i
|
|
||||||
LEFT JOIN instance_list i2 ON i.id + 1 = i2.id
|
|
||||||
WHERE i.id >= {}
|
|
||||||
AND i2.id IS NULL;
|
|
||||||
),
|
|
||||||
max_reserved_instance_id
|
|
||||||
);
|
|
||||||
|
|
||||||
results = QueryDatabase(query);
|
|
||||||
|
|
||||||
// could not successfully query - bail out
|
|
||||||
if (!results.Success()) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// did not retrieve any rows - bail out
|
|
||||||
if (results.RowCount() == 0) {
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto row = results.begin();
|
|
||||||
|
|
||||||
// check that id is within limits
|
|
||||||
if (row[0] && Strings::ToInt(row[0]) <= max_instance_id) {
|
|
||||||
instance_id = Strings::ToInt(row[0]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no available instance ids
|
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get max unused id above reserved
|
|
||||||
auto query = fmt::format(
|
auto query = fmt::format(
|
||||||
"SELECT IFNULL(MAX(id), {}) + 1 FROM instance_list WHERE id > {}",
|
"SELECT IFNULL(MAX(id), {}) + 1 FROM instance_list WHERE id > {}",
|
||||||
max_reserved_instance_id,
|
max_reserved_instance_id,
|
||||||
max_reserved_instance_id
|
max_reserved_instance_id
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (RuleB(Instances, RecycleInstanceIds)) {
|
||||||
|
query = (
|
||||||
|
SQL(
|
||||||
|
SELECT i.id + 1 AS next_available
|
||||||
|
FROM instance_list i
|
||||||
|
LEFT JOIN instance_list i2 ON i2.id = i.id + 1
|
||||||
|
WHERE i2.id IS NULL
|
||||||
|
ORDER BY i.id
|
||||||
|
LIMIT 0, 1;
|
||||||
|
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
// could not successfully query - bail out
|
|
||||||
if (!results.Success()) {
|
if (!results.Success()) {
|
||||||
instance_id = 0;
|
instance_id = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// did not retrieve any rows - bail out
|
if (results.RowCount() == 0) {
|
||||||
|
instance_id = max_reserved_instance_id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto row = results.begin();
|
||||||
|
|
||||||
|
if (atoi(row[0]) <= max) {
|
||||||
|
instance_id = atoi(row[0]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (instance_id < max_reserved_instance_id) {
|
||||||
|
instance_id = max_reserved_instance_id;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
query = fmt::format("SELECT id FROM instance_list where id > {} ORDER BY id", max_reserved_instance_id);
|
||||||
|
results = QueryDatabase(query);
|
||||||
|
|
||||||
|
if (!results.Success()) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (results.RowCount() == 0) {
|
if (results.RowCount() == 0) {
|
||||||
instance_id = 0;
|
instance_id = 0;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto row = results.begin();
|
max_reserved_instance_id++;
|
||||||
|
|
||||||
// no instances currently used
|
for (auto row : results) {
|
||||||
if (!row[0]) {
|
if (max_reserved_instance_id < std::stoul(row[0])) {
|
||||||
instance_id = max_reserved_instance_id + 1;
|
instance_id = max_reserved_instance_id;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_reserved_instance_id > max) {
|
||||||
|
instance_id = 0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
max_reserved_instance_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check that id is within limits
|
instance_id = max_reserved_instance_id;
|
||||||
if (Strings::ToInt(row[0]) <= max_instance_id) {
|
|
||||||
instance_id = Strings::ToInt(row[0]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// no available instance ids
|
return true;
|
||||||
instance_id = 0;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::IsGlobalInstance(uint16 instance_id)
|
bool Database::IsGlobalInstance(uint16 instance_id)
|
||||||
@@ -362,7 +301,7 @@ uint16 Database::GetInstanceID(uint32 zone_id, uint32 character_id, int16 versio
|
|||||||
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
|
|
||||||
return static_cast<uint16>(Strings::ToUnsignedInt(row[0]));
|
return static_cast<uint16>(std::stoul(row[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint16> Database::GetInstanceIDs(uint32 zone_id, uint32 character_id)
|
std::vector<uint16> Database::GetInstanceIDs(uint32 zone_id, uint32 character_id)
|
||||||
@@ -389,7 +328,7 @@ std::vector<uint16> Database::GetInstanceIDs(uint32 zone_id, uint32 character_id
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (auto row : results) {
|
for (auto row : results) {
|
||||||
l.push_back(static_cast<uint16>(Strings::ToUnsignedInt(row[0])));
|
l.push_back(static_cast<uint16>(std::stoul(row[0])));
|
||||||
}
|
}
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
@@ -447,25 +386,20 @@ void Database::AssignGroupToInstance(uint32 group_id, uint32 instance_id)
|
|||||||
auto zone_id = GetInstanceZoneID(instance_id);
|
auto zone_id = GetInstanceZoneID(instance_id);
|
||||||
auto version = GetInstanceVersion(instance_id);
|
auto version = GetInstanceVersion(instance_id);
|
||||||
|
|
||||||
const auto& l = GroupIdRepository::GetWhere(
|
auto l = GroupIdRepository::GetWhere(
|
||||||
*this,
|
*this,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"`group_id` = {}",
|
"groupid = {}",
|
||||||
group_id
|
group_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (l.empty()) {
|
if (l.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& e : l) {
|
for (const auto& e : l) {
|
||||||
if (!e.character_id) {
|
if (!GetInstanceID(zone_id, e.charid, version)) {
|
||||||
continue;
|
AddClientToInstance(instance_id, e.charid);
|
||||||
}
|
|
||||||
|
|
||||||
if (!GetInstanceID(zone_id, e.character_id, version)) {
|
|
||||||
AddClientToInstance(instance_id, e.character_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -475,7 +409,7 @@ void Database::AssignRaidToInstance(uint32 raid_id, uint32 instance_id)
|
|||||||
auto zone_id = GetInstanceZoneID(instance_id);
|
auto zone_id = GetInstanceZoneID(instance_id);
|
||||||
auto version = GetInstanceVersion(instance_id);
|
auto version = GetInstanceVersion(instance_id);
|
||||||
|
|
||||||
auto l = RaidMembersRepository::GetWhere(
|
auto l = GroupIdRepository::GetWhere(
|
||||||
*this,
|
*this,
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"raidid = {}",
|
"raidid = {}",
|
||||||
@@ -495,18 +429,18 @@ void Database::AssignRaidToInstance(uint32 raid_id, uint32 instance_id)
|
|||||||
|
|
||||||
void Database::DeleteInstance(uint16 instance_id)
|
void Database::DeleteInstance(uint16 instance_id)
|
||||||
{
|
{
|
||||||
// I'm not sure why this isn't in here but we should add it in a later change and make sure it's tested
|
std::string query;
|
||||||
// InstanceListRepository::DeleteWhere(*this, fmt::format("id = {}", instance_id));
|
|
||||||
InstanceListPlayerRepository::DeleteWhere(*this, fmt::format("id = {}", instance_id));
|
InstanceListPlayerRepository::DeleteWhere(*this, fmt::format("id = {}", instance_id));
|
||||||
|
|
||||||
RespawnTimesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
RespawnTimesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
||||||
|
|
||||||
SpawnConditionValuesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
SpawnConditionValuesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
||||||
|
|
||||||
DynamicZoneMembersRepository::DeleteByInstance(*this, instance_id);
|
DynamicZoneMembersRepository::DeleteByInstance(*this, instance_id);
|
||||||
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
||||||
|
|
||||||
CharacterCorpsesRepository::BuryInstance(*this, instance_id);
|
CharacterCorpsesRepository::BuryInstance(*this, instance_id);
|
||||||
DataBucketsRepository::DeleteWhere(*this, fmt::format("instance_id = {}", instance_id));
|
|
||||||
if (RuleB(Zone, StateSavingOnShutdown)) {
|
|
||||||
ZoneStateSpawnsRepository::DeleteWhere(*this, fmt::format("`instance_id` = {}", instance_id));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::FlagInstanceByGroupLeader(uint32 zone_id, int16 version, uint32 character_id, uint32 group_id)
|
void Database::FlagInstanceByGroupLeader(uint32 zone_id, int16 version, uint32 character_id, uint32 group_id)
|
||||||
@@ -537,7 +471,7 @@ void Database::FlagInstanceByRaidLeader(uint32 zone_id, int16 version, uint32 ch
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto raid_leader_id = GetCharacterID(GetRaidLeaderName(raid_id).c_str());
|
auto raid_leader_id = GetCharacterID(GetRaidLeaderName(raid_id));
|
||||||
auto raid_leader_instance_id = GetInstanceID(zone_id, raid_leader_id, version);
|
auto raid_leader_instance_id = GetInstanceID(zone_id, raid_leader_id, version);
|
||||||
|
|
||||||
if (!raid_leader_instance_id) {
|
if (!raid_leader_instance_id) {
|
||||||
@@ -561,12 +495,14 @@ void Database::GetCharactersInInstance(uint16 instance_id, std::list<uint32> &ch
|
|||||||
|
|
||||||
void Database::PurgeExpiredInstances()
|
void Database::PurgeExpiredInstances()
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Delay purging by a day so that we can continue using adjacent free instance id's
|
||||||
|
* from the table without risking the chance we immediately re-allocate a zone that freshly expired but
|
||||||
|
* has not been fully de-allocated
|
||||||
|
*/
|
||||||
auto l = InstanceListRepository::GetWhere(
|
auto l = InstanceListRepository::GetWhere(
|
||||||
*this,
|
*this,
|
||||||
fmt::format(
|
"(start_time + duration) <= (UNIX_TIMESTAMP() - 86400) AND never_expires = 0"
|
||||||
"expire_at <= (UNIX_TIMESTAMP() - {}) and expire_at != 0 AND never_expires = 0",
|
|
||||||
RuleI(Instances, ExpireOffsetTimeSeconds)
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
if (l.empty()) {
|
if (l.empty()) {
|
||||||
return;
|
return;
|
||||||
@@ -577,56 +513,26 @@ void Database::PurgeExpiredInstances()
|
|||||||
instance_ids.emplace_back(std::to_string(e.id));
|
instance_ids.emplace_back(std::to_string(e.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto ids = Strings::Implode(",", instance_ids);
|
|
||||||
|
|
||||||
TransactionBegin();
|
|
||||||
InstanceListRepository::DeleteWhere(*this, fmt::format("id IN ({})", ids));
|
|
||||||
InstanceListPlayerRepository::DeleteWhere(*this, fmt::format("id IN ({})", ids));
|
|
||||||
RespawnTimesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", ids));
|
|
||||||
SpawnConditionValuesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", ids));
|
|
||||||
CharacterCorpsesRepository::BuryInstances(*this, ids);
|
|
||||||
DynamicZoneMembersRepository::DeleteByManyInstances(*this, ids);
|
|
||||||
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", ids));
|
|
||||||
Spawn2DisabledRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", ids));
|
|
||||||
DataBucketsRepository::DeleteWhere(*this, fmt::format("instance_id != 0 and instance_id IN ({})", ids));
|
|
||||||
if (RuleB(Zone, StateSavingOnShutdown)) {
|
|
||||||
ZoneStateSpawnsRepository::DeleteWhere(*this, fmt::format("`instance_id` IN ({})", ids));
|
|
||||||
}
|
|
||||||
TransactionCommit();
|
|
||||||
|
|
||||||
LogInfo("Purged [{}] expired instances", l.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
|
||||||
{
|
|
||||||
auto i = InstanceListRepository::FindOne(*this, instance_id);
|
|
||||||
if (!i.id) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
i.start_time = std::time(nullptr);
|
|
||||||
i.duration = new_duration;
|
|
||||||
i.expire_at = i.start_time + i.duration;
|
|
||||||
|
|
||||||
InstanceListRepository::UpdateOne(*this, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Database::CleanupInstanceCorpses() {
|
|
||||||
auto l = InstanceListRepository::GetWhere(
|
|
||||||
*this,
|
|
||||||
"never_expires = 0"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (l.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> instance_ids;
|
|
||||||
for (const auto& e : l) {
|
|
||||||
instance_ids.emplace_back(std::to_string(e.id));
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto imploded_instance_ids = Strings::Implode(",", instance_ids);
|
const auto imploded_instance_ids = Strings::Implode(",", instance_ids);
|
||||||
|
|
||||||
|
InstanceListRepository::DeleteWhere(*this, fmt::format("id IN ({})", imploded_instance_ids));
|
||||||
|
InstanceListPlayerRepository::DeleteWhere(*this, fmt::format("id IN ({})", imploded_instance_ids));
|
||||||
|
RespawnTimesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
|
SpawnConditionValuesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
||||||
|
DynamicZoneMembersRepository::DeleteByManyInstances(*this, imploded_instance_ids);
|
||||||
|
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
||||||
|
{
|
||||||
|
auto i = InstanceListRepository::FindOne(*this, instance_id);
|
||||||
|
if (!i.id) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.start_time = std::time(nullptr);
|
||||||
|
i.duration = new_duration;
|
||||||
|
|
||||||
|
InstanceListRepository::UpdateOne(*this, i);
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-66
@@ -36,6 +36,7 @@ namespace DatabaseSchema {
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
{"adventure_stats", "player_id"},
|
{"adventure_stats", "player_id"},
|
||||||
|
{"buyer", "charid"},
|
||||||
{"char_recipe_list", "char_id"},
|
{"char_recipe_list", "char_id"},
|
||||||
{"character_activities", "charid"},
|
{"character_activities", "charid"},
|
||||||
{"character_alt_currency", "char_id"},
|
{"character_alt_currency", "char_id"},
|
||||||
@@ -51,7 +52,6 @@ namespace DatabaseSchema {
|
|||||||
{"character_enabledtasks", "charid"},
|
{"character_enabledtasks", "charid"},
|
||||||
{"character_expedition_lockouts", "character_id"},
|
{"character_expedition_lockouts", "character_id"},
|
||||||
{"character_exp_modifiers", "character_id"},
|
{"character_exp_modifiers", "character_id"},
|
||||||
{"character_evolving_items", "character_id"},
|
|
||||||
{"character_inspect_messages", "id"},
|
{"character_inspect_messages", "id"},
|
||||||
{"character_instance_safereturns", "character_id"},
|
{"character_instance_safereturns", "character_id"},
|
||||||
{"character_item_recast", "id"},
|
{"character_item_recast", "id"},
|
||||||
@@ -59,28 +59,24 @@ namespace DatabaseSchema {
|
|||||||
{"character_leadership_abilities", "id"},
|
{"character_leadership_abilities", "id"},
|
||||||
{"character_material", "id"},
|
{"character_material", "id"},
|
||||||
{"character_memmed_spells", "id"},
|
{"character_memmed_spells", "id"},
|
||||||
{"character_parcels", "char_id"},
|
|
||||||
{"character_parcels_containers", "id"},
|
|
||||||
{"character_pet_buffs", "char_id"},
|
{"character_pet_buffs", "char_id"},
|
||||||
{"character_pet_info", "char_id"},
|
{"character_pet_info", "char_id"},
|
||||||
{"character_pet_inventory", "char_id"},
|
{"character_pet_inventory", "char_id"},
|
||||||
{"character_pet_name", "character_id"},
|
|
||||||
{"character_peqzone_flags", "id"},
|
{"character_peqzone_flags", "id"},
|
||||||
{"character_potionbelt", "id"},
|
{"character_potionbelt", "id"},
|
||||||
{"character_skills", "id"},
|
{"character_skills", "id"},
|
||||||
{"character_spells", "id"},
|
{"character_spells", "id"},
|
||||||
{"character_stats_record", "character_id"},
|
|
||||||
{"character_task_timers", "character_id"},
|
{"character_task_timers", "character_id"},
|
||||||
{"character_tasks", "charid"},
|
{"character_tasks", "charid"},
|
||||||
{"character_tribute", "character_id"},
|
{"character_tribute", "id"},
|
||||||
{"completed_tasks", "charid"},
|
{"completed_tasks", "charid"},
|
||||||
{"data_buckets", "character_id"},
|
{"data_buckets", "id"},
|
||||||
{"faction_values", "char_id"},
|
{"faction_values", "char_id"},
|
||||||
{"friends", "charid"},
|
{"friends", "charid"},
|
||||||
{"guild_members", "char_id"},
|
{"guild_members", "char_id"},
|
||||||
{"guilds", "id"},
|
{"guilds", "id"},
|
||||||
{"instance_list_player", "id"},
|
{"instance_list_player", "id"},
|
||||||
{"inventory", "character_id"},
|
{"inventory", "charid"},
|
||||||
{"inventory_snapshots", "charid"},
|
{"inventory_snapshots", "charid"},
|
||||||
{"keyring", "char_id"},
|
{"keyring", "char_id"},
|
||||||
{"mail", "charid"},
|
{"mail", "charid"},
|
||||||
@@ -108,8 +104,6 @@ namespace DatabaseSchema {
|
|||||||
"adventure_details",
|
"adventure_details",
|
||||||
"adventure_stats",
|
"adventure_stats",
|
||||||
"buyer",
|
"buyer",
|
||||||
"buyer_buy_lines",
|
|
||||||
"buyer_trade_items",
|
|
||||||
"char_recipe_list",
|
"char_recipe_list",
|
||||||
"character_activities",
|
"character_activities",
|
||||||
"character_alt_currency",
|
"character_alt_currency",
|
||||||
@@ -126,7 +120,6 @@ namespace DatabaseSchema {
|
|||||||
"character_enabledtasks",
|
"character_enabledtasks",
|
||||||
"character_expedition_lockouts",
|
"character_expedition_lockouts",
|
||||||
"character_exp_modifiers",
|
"character_exp_modifiers",
|
||||||
"character_evolving_items",
|
|
||||||
"character_inspect_messages",
|
"character_inspect_messages",
|
||||||
"character_instance_safereturns",
|
"character_instance_safereturns",
|
||||||
"character_item_recast",
|
"character_item_recast",
|
||||||
@@ -134,17 +127,13 @@ namespace DatabaseSchema {
|
|||||||
"character_leadership_abilities",
|
"character_leadership_abilities",
|
||||||
"character_material",
|
"character_material",
|
||||||
"character_memmed_spells",
|
"character_memmed_spells",
|
||||||
"character_parcels",
|
|
||||||
"character_parcels_containers",
|
|
||||||
"character_pet_buffs",
|
"character_pet_buffs",
|
||||||
"character_pet_info",
|
"character_pet_info",
|
||||||
"character_pet_inventory",
|
"character_pet_inventory",
|
||||||
"character_pet_name",
|
|
||||||
"character_peqzone_flags",
|
"character_peqzone_flags",
|
||||||
"character_potionbelt",
|
"character_potionbelt",
|
||||||
"character_skills",
|
"character_skills",
|
||||||
"character_spells",
|
"character_spells",
|
||||||
"character_stats_record",
|
|
||||||
"character_task_timers",
|
"character_task_timers",
|
||||||
"character_tasks",
|
"character_tasks",
|
||||||
"character_tribute",
|
"character_tribute",
|
||||||
@@ -155,10 +144,8 @@ namespace DatabaseSchema {
|
|||||||
"friends",
|
"friends",
|
||||||
"guild_bank",
|
"guild_bank",
|
||||||
"guild_members",
|
"guild_members",
|
||||||
"guild_permissions",
|
|
||||||
"guild_ranks",
|
"guild_ranks",
|
||||||
"guild_relations",
|
"guild_relations",
|
||||||
"guild_tributes",
|
|
||||||
"guilds",
|
"guilds",
|
||||||
"instance_list_player",
|
"instance_list_player",
|
||||||
"inventory",
|
"inventory",
|
||||||
@@ -216,7 +203,6 @@ namespace DatabaseSchema {
|
|||||||
"ground_spawns",
|
"ground_spawns",
|
||||||
"horses",
|
"horses",
|
||||||
"items",
|
"items",
|
||||||
"items_evolving_details",
|
|
||||||
"ldon_trap_entries",
|
"ldon_trap_entries",
|
||||||
"ldon_trap_templates",
|
"ldon_trap_templates",
|
||||||
"lootdrop",
|
"lootdrop",
|
||||||
@@ -270,9 +256,7 @@ namespace DatabaseSchema {
|
|||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"chatchannels",
|
"chatchannels",
|
||||||
"chatchannel_reserved_names",
|
|
||||||
"command_settings",
|
"command_settings",
|
||||||
"command_subsettings",
|
|
||||||
"content_flags",
|
"content_flags",
|
||||||
"db_str",
|
"db_str",
|
||||||
"eqtime",
|
"eqtime",
|
||||||
@@ -292,6 +276,32 @@ namespace DatabaseSchema {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets QueryServer tables
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
static std::vector<std::string> GetQueryServerTables()
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
"qs_merchant_transaction_record",
|
||||||
|
"qs_merchant_transaction_record_entries",
|
||||||
|
"qs_player_aa_rate_hourly",
|
||||||
|
"qs_player_delete_record",
|
||||||
|
"qs_player_delete_record_entries",
|
||||||
|
"qs_player_events",
|
||||||
|
"qs_player_handin_record",
|
||||||
|
"qs_player_handin_record_entries",
|
||||||
|
"qs_player_move_record",
|
||||||
|
"qs_player_move_record_entries",
|
||||||
|
"qs_player_npc_kill_record",
|
||||||
|
"qs_player_npc_kill_record_entries",
|
||||||
|
"qs_player_speech",
|
||||||
|
"qs_player_trade_record",
|
||||||
|
"qs_player_trade_record_entries",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets state tables
|
* Gets state tables
|
||||||
* Tables that keep track of server state
|
* Tables that keep track of server state
|
||||||
@@ -305,25 +315,24 @@ namespace DatabaseSchema {
|
|||||||
"banned_ips",
|
"banned_ips",
|
||||||
"bug_reports",
|
"bug_reports",
|
||||||
"bugs",
|
"bugs",
|
||||||
"buyer",
|
|
||||||
"buyer_buy_lines",
|
|
||||||
"buyer_trade_items",
|
|
||||||
"completed_shared_task_activity_state",
|
"completed_shared_task_activity_state",
|
||||||
"completed_shared_task_members",
|
"completed_shared_task_members",
|
||||||
"completed_shared_tasks",
|
"completed_shared_tasks",
|
||||||
"discord_webhooks",
|
"discord_webhooks",
|
||||||
"dynamic_zone_lockouts",
|
|
||||||
"dynamic_zone_members",
|
"dynamic_zone_members",
|
||||||
"dynamic_zones",
|
"dynamic_zones",
|
||||||
|
"eventlog",
|
||||||
|
"expedition_lockouts",
|
||||||
|
"expeditions",
|
||||||
"gm_ips",
|
"gm_ips",
|
||||||
"group_id",
|
"group_id",
|
||||||
"group_leaders",
|
"group_leaders",
|
||||||
|
"hackers",
|
||||||
"instance_list",
|
"instance_list",
|
||||||
"ip_exemptions",
|
"ip_exemptions",
|
||||||
|
"item_tick",
|
||||||
"lfguild",
|
"lfguild",
|
||||||
"merc_buffs",
|
|
||||||
"merchantlist_temp",
|
"merchantlist_temp",
|
||||||
"mercs",
|
|
||||||
"object_contents",
|
"object_contents",
|
||||||
"raid_details",
|
"raid_details",
|
||||||
"raid_leaders",
|
"raid_leaders",
|
||||||
@@ -332,26 +341,10 @@ namespace DatabaseSchema {
|
|||||||
"respawn_times",
|
"respawn_times",
|
||||||
"saylink",
|
"saylink",
|
||||||
"server_scheduled_events",
|
"server_scheduled_events",
|
||||||
"spawn2_disabled",
|
|
||||||
"player_event_aa_purchase",
|
|
||||||
"player_event_killed_npc",
|
|
||||||
"player_event_killed_named_npc",
|
|
||||||
"player_event_killed_raid_npc",
|
|
||||||
"player_event_log_settings",
|
|
||||||
"player_event_logs",
|
|
||||||
"player_event_loot_items",
|
|
||||||
"player_event_merchant_purchase",
|
|
||||||
"player_event_merchant_sell",
|
|
||||||
"player_event_npc_handin",
|
|
||||||
"player_event_npc_handin_entries",
|
|
||||||
"player_event_speech",
|
|
||||||
"player_event_trade",
|
|
||||||
"player_event_trade_entries",
|
|
||||||
"shared_task_activity_state",
|
"shared_task_activity_state",
|
||||||
"shared_task_dynamic_zones",
|
"shared_task_dynamic_zones",
|
||||||
"shared_task_members",
|
"shared_task_members",
|
||||||
"shared_tasks",
|
"shared_tasks",
|
||||||
"zone_state_spawns",
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,11 +386,13 @@ namespace DatabaseSchema {
|
|||||||
static std::vector<std::string> GetBotTables()
|
static std::vector<std::string> GetBotTables()
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
"bot_blocked_buffs",
|
|
||||||
"bot_buffs",
|
"bot_buffs",
|
||||||
"bot_command_settings",
|
"bot_command_settings",
|
||||||
"bot_create_combinations",
|
"bot_create_combinations",
|
||||||
"bot_data",
|
"bot_data",
|
||||||
|
"bot_group_members",
|
||||||
|
"bot_groups",
|
||||||
|
"bot_guild_members",
|
||||||
"bot_heal_rotation_members",
|
"bot_heal_rotation_members",
|
||||||
"bot_heal_rotation_targets",
|
"bot_heal_rotation_targets",
|
||||||
"bot_heal_rotations",
|
"bot_heal_rotations",
|
||||||
@@ -407,33 +402,13 @@ namespace DatabaseSchema {
|
|||||||
"bot_pet_buffs",
|
"bot_pet_buffs",
|
||||||
"bot_pet_inventories",
|
"bot_pet_inventories",
|
||||||
"bot_pets",
|
"bot_pets",
|
||||||
"bot_settings",
|
|
||||||
"bot_spell_casting_chances",
|
"bot_spell_casting_chances",
|
||||||
"bot_spell_settings",
|
"bot_spell_settings",
|
||||||
"bot_spells_entries",
|
"bot_spells_entries",
|
||||||
"bot_stances",
|
"bot_stances",
|
||||||
"bot_timers"
|
"bot_timers",
|
||||||
};
|
"vw_bot_character_mobs",
|
||||||
}
|
"vw_bot_groups"
|
||||||
|
|
||||||
static std::vector<std::string> GetMercTables()
|
|
||||||
{
|
|
||||||
return {
|
|
||||||
"merc_armorinfo",
|
|
||||||
"merc_inventory",
|
|
||||||
"merc_merchant_entries",
|
|
||||||
"merc_merchant_template_entries",
|
|
||||||
"merc_merchant_templates",
|
|
||||||
"merc_name_types",
|
|
||||||
"merc_npc_types",
|
|
||||||
"merc_spell_list_entries",
|
|
||||||
"merc_spell_lists",
|
|
||||||
"merc_stance_entries",
|
|
||||||
"merc_stats",
|
|
||||||
"merc_subtypes",
|
|
||||||
"merc_templates",
|
|
||||||
"merc_types",
|
|
||||||
"merc_weaponinfo"
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+55
-200
@@ -7,13 +7,12 @@
|
|||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
#include "dbcore.h"
|
#include "dbcore.h"
|
||||||
#include "mysql_stmt.h"
|
|
||||||
|
|
||||||
|
#include <errmsg.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mysqld_error.h>
|
#include <mysqld_error.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "strings.h"
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
@@ -35,16 +34,14 @@
|
|||||||
|
|
||||||
DBcore::DBcore()
|
DBcore::DBcore()
|
||||||
{
|
{
|
||||||
mysql = mysql_init(nullptr);
|
mysql_init(&mysql);
|
||||||
mysqlOwner = true;
|
pHost = nullptr;
|
||||||
pHost = nullptr;
|
pUser = nullptr;
|
||||||
pUser = nullptr;
|
pPassword = nullptr;
|
||||||
pPassword = nullptr;
|
pDatabase = nullptr;
|
||||||
pDatabase = nullptr;
|
pCompress = false;
|
||||||
pCompress = false;
|
pSSL = false;
|
||||||
pSSL = false;
|
pStatus = Closed;
|
||||||
pStatus = Closed;
|
|
||||||
m_mutex = new Mutex;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBcore::~DBcore()
|
DBcore::~DBcore()
|
||||||
@@ -54,10 +51,16 @@ DBcore::~DBcore()
|
|||||||
* are re-using the default database connection pointer when we dont have an
|
* are re-using the default database connection pointer when we dont have an
|
||||||
* external configuration setup ex: (content_database)
|
* external configuration setup ex: (content_database)
|
||||||
*/
|
*/
|
||||||
if (mysqlOwner) {
|
std::string mysql_connection_host;
|
||||||
mysql_close(mysql);
|
if (mysql.host) {
|
||||||
|
mysql_connection_host = mysql.host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GetOriginHost() != mysql_connection_host) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mysql_close(&mysql);
|
||||||
safe_delete_array(pHost);
|
safe_delete_array(pHost);
|
||||||
safe_delete_array(pUser);
|
safe_delete_array(pUser);
|
||||||
safe_delete_array(pPassword);
|
safe_delete_array(pPassword);
|
||||||
@@ -67,21 +70,20 @@ DBcore::~DBcore()
|
|||||||
// Sends the MySQL server a keepalive
|
// Sends the MySQL server a keepalive
|
||||||
void DBcore::ping()
|
void DBcore::ping()
|
||||||
{
|
{
|
||||||
if (!m_mutex->trylock()) {
|
if (!MDatabase.trylock()) {
|
||||||
// well, if's it's locked, someone's using it. If someone's using it, it doesnt need a keepalive
|
// well, if's it's locked, someone's using it. If someone's using it, it doesnt need a keepalive
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mysql_ping(mysql);
|
mysql_ping(&mysql);
|
||||||
m_mutex->unlock();
|
MDatabase.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
MySQLRequestResult DBcore::QueryDatabase(const std::string& query, bool retryOnFailureOnce)
|
MySQLRequestResult DBcore::QueryDatabase(std::string query, bool retryOnFailureOnce)
|
||||||
{
|
{
|
||||||
auto r = QueryDatabase(query.c_str(), query.length(), retryOnFailureOnce);
|
return QueryDatabase(query.c_str(), query.length(), retryOnFailureOnce);
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DBcore::DoesTableExist(const std::string& table_name)
|
bool DBcore::DoesTableExist(std::string table_name)
|
||||||
{
|
{
|
||||||
auto results = QueryDatabase(fmt::format("SHOW TABLES LIKE '{}'", table_name));
|
auto results = QueryDatabase(fmt::format("SHOW TABLES LIKE '{}'", table_name));
|
||||||
|
|
||||||
@@ -93,16 +95,18 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
BenchTimer timer;
|
BenchTimer timer;
|
||||||
timer.reset();
|
timer.reset();
|
||||||
|
|
||||||
LockMutex lock(m_mutex);
|
LockMutex lock(&MDatabase);
|
||||||
|
|
||||||
// Reconnect if we are not connected before hand.
|
// Reconnect if we are not connected before hand.
|
||||||
if (pStatus != Connected) {
|
if (pStatus != Connected) {
|
||||||
Open();
|
Open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// request query. != 0 indicates some kind of error.
|
// request query. != 0 indicates some kind of error.
|
||||||
if (mysql_real_query(mysql, query, querylen) != 0) {
|
if (mysql_real_query(&mysql, query, querylen) != 0) {
|
||||||
unsigned int errorNumber = mysql_errno(mysql);
|
unsigned int errorNumber = mysql_errno(&mysql);
|
||||||
|
|
||||||
if (errorNumber == CR_SERVER_GONE_ERROR) {
|
if (errorNumber == CR_SERVER_GONE_ERROR) {
|
||||||
pStatus = Error;
|
pStatus = Error;
|
||||||
@@ -126,26 +130,26 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
|
|
||||||
auto errorBuffer = new char[MYSQL_ERRMSG_SIZE];
|
auto errorBuffer = new char[MYSQL_ERRMSG_SIZE];
|
||||||
|
|
||||||
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(mysql), mysql_error(mysql));
|
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||||
|
|
||||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, (uint32) mysql_errno(mysql), errorBuffer);
|
return MySQLRequestResult(nullptr, 0, 0, 0, 0, (uint32) mysql_errno(&mysql), errorBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto errorBuffer = new char[MYSQL_ERRMSG_SIZE];
|
auto errorBuffer = new char[MYSQL_ERRMSG_SIZE];
|
||||||
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(mysql), mysql_error(mysql));
|
snprintf(errorBuffer, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error logging
|
* Error logging
|
||||||
*/
|
*/
|
||||||
if (mysql_errno(mysql) > 0 && query[0] != '\0') {
|
if (mysql_errno(&mysql) > 0 && strlen(query) > 0) {
|
||||||
LogMySQLError("MySQL Error ({}) [{}] Query [{}]", mysql_errno(mysql), mysql_error(mysql), query);
|
LogMySQLError("[{}] [{}]\n[{}]", mysql_errno(&mysql), mysql_error(&mysql), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(mysql), errorBuffer);
|
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(&mysql), errorBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
// successful query. get results.
|
// successful query. get results.
|
||||||
MYSQL_RES *res = mysql_store_result(mysql);
|
MYSQL_RES *res = mysql_store_result(&mysql);
|
||||||
uint32 rowCount = 0;
|
uint32 rowCount = 0;
|
||||||
|
|
||||||
if (res != nullptr) {
|
if (res != nullptr) {
|
||||||
@@ -154,16 +158,16 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
|
|
||||||
MySQLRequestResult requestResult(
|
MySQLRequestResult requestResult(
|
||||||
res,
|
res,
|
||||||
(uint32) mysql_affected_rows(mysql),
|
(uint32) mysql_affected_rows(&mysql),
|
||||||
rowCount,
|
rowCount,
|
||||||
(uint32) mysql_field_count(mysql),
|
(uint32) mysql_field_count(&mysql),
|
||||||
(uint32) mysql_insert_id(mysql)
|
(uint32) mysql_insert_id(&mysql)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (LogSys.log_settings[Logs::MySQLQuery].is_category_enabled == 1) {
|
if (LogSys.log_settings[Logs::MySQLQuery].is_category_enabled == 1) {
|
||||||
if ((strncasecmp(query, "select", 6) == 0)) {
|
if ((strncasecmp(query, "select", 6) == 0)) {
|
||||||
LogMySQLQuery(
|
LogMySQLQuery(
|
||||||
"{0} -- ({1} row{2} returned) ({3}s)",
|
"{0}; -- ({1} row{2} returned) ({3}s)",
|
||||||
query,
|
query,
|
||||||
requestResult.RowCount(),
|
requestResult.RowCount(),
|
||||||
requestResult.RowCount() == 1 ? "" : "s",
|
requestResult.RowCount() == 1 ? "" : "s",
|
||||||
@@ -172,7 +176,7 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LogMySQLQuery(
|
LogMySQLQuery(
|
||||||
"{0} -- ({1} row{2} affected) ({3}s)",
|
"{0}; -- ({1} row{2} affected) ({3}s)",
|
||||||
query,
|
query,
|
||||||
requestResult.RowsAffected(),
|
requestResult.RowsAffected(),
|
||||||
requestResult.RowsAffected() == 1 ? "" : "s",
|
requestResult.RowsAffected() == 1 ? "" : "s",
|
||||||
@@ -189,9 +193,9 @@ void DBcore::TransactionBegin()
|
|||||||
QueryDatabase("START TRANSACTION");
|
QueryDatabase("START TRANSACTION");
|
||||||
}
|
}
|
||||||
|
|
||||||
MySQLRequestResult DBcore::TransactionCommit()
|
void DBcore::TransactionCommit()
|
||||||
{
|
{
|
||||||
return QueryDatabase("COMMIT");
|
QueryDatabase("COMMIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DBcore::TransactionRollback()
|
void DBcore::TransactionRollback()
|
||||||
@@ -203,7 +207,7 @@ uint32 DBcore::DoEscapeString(char *tobuf, const char *frombuf, uint32 fromlen)
|
|||||||
{
|
{
|
||||||
// No good reason to lock the DB, we only need it in the first place to check char encoding.
|
// No good reason to lock the DB, we only need it in the first place to check char encoding.
|
||||||
// LockMutex lock(&MDatabase);
|
// LockMutex lock(&MDatabase);
|
||||||
return mysql_real_escape_string(mysql, tobuf, frombuf, fromlen);
|
return mysql_real_escape_string(&mysql, tobuf, frombuf, fromlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DBcore::Open(
|
bool DBcore::Open(
|
||||||
@@ -218,7 +222,7 @@ bool DBcore::Open(
|
|||||||
bool iSSL
|
bool iSSL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LockMutex lock(m_mutex);
|
LockMutex lock(&MDatabase);
|
||||||
safe_delete_array(pHost);
|
safe_delete_array(pHost);
|
||||||
safe_delete_array(pUser);
|
safe_delete_array(pUser);
|
||||||
safe_delete_array(pPassword);
|
safe_delete_array(pPassword);
|
||||||
@@ -238,13 +242,13 @@ bool DBcore::Open(uint32 *errnum, char *errbuf)
|
|||||||
if (errbuf) {
|
if (errbuf) {
|
||||||
errbuf[0] = 0;
|
errbuf[0] = 0;
|
||||||
}
|
}
|
||||||
LockMutex lock(m_mutex);
|
LockMutex lock(&MDatabase);
|
||||||
if (GetStatus() == Connected) {
|
if (GetStatus() == Connected) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (GetStatus() == Error) {
|
if (GetStatus() == Error) {
|
||||||
mysql_close(mysql);
|
mysql_close(&mysql);
|
||||||
mysql_init(mysql); // Initialize structure again
|
mysql_init(&mysql); // Initialize structure again
|
||||||
}
|
}
|
||||||
if (!pHost) {
|
if (!pHost) {
|
||||||
return false;
|
return false;
|
||||||
@@ -261,7 +265,7 @@ bool DBcore::Open(uint32 *errnum, char *errbuf)
|
|||||||
if (pSSL) {
|
if (pSSL) {
|
||||||
flags |= CLIENT_SSL;
|
flags |= CLIENT_SSL;
|
||||||
}
|
}
|
||||||
if (mysql_real_connect(mysql, pHost, pUser, pPassword, pDatabase, pPort, 0, flags)) {
|
if (mysql_real_connect(&mysql, pHost, pUser, pPassword, pDatabase, pPort, 0, flags)) {
|
||||||
pStatus = Connected;
|
pStatus = Connected;
|
||||||
|
|
||||||
std::string connected_origin_host = pHost;
|
std::string connected_origin_host = pHost;
|
||||||
@@ -271,16 +275,21 @@ bool DBcore::Open(uint32 *errnum, char *errbuf)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (errnum) {
|
if (errnum) {
|
||||||
*errnum = mysql_errno(mysql);
|
*errnum = mysql_errno(&mysql);
|
||||||
}
|
}
|
||||||
if (errbuf) {
|
if (errbuf) {
|
||||||
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(mysql), mysql_error(mysql));
|
snprintf(errbuf, MYSQL_ERRMSG_SIZE, "#%i: %s", mysql_errno(&mysql), mysql_error(&mysql));
|
||||||
}
|
}
|
||||||
pStatus = Error;
|
pStatus = Error;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DBcore::SetMysql(MYSQL *mysql)
|
||||||
|
{
|
||||||
|
DBcore::mysql = *mysql;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string &DBcore::GetOriginHost() const
|
const std::string &DBcore::GetOriginHost() const
|
||||||
{
|
{
|
||||||
return origin_host;
|
return origin_host;
|
||||||
@@ -290,157 +299,3 @@ void DBcore::SetOriginHost(const std::string &origin_host)
|
|||||||
{
|
{
|
||||||
DBcore::origin_host = origin_host;
|
DBcore::origin_host = origin_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DBcore::Escape(const std::string& s)
|
|
||||||
{
|
|
||||||
const std::size_t s_len = s.length();
|
|
||||||
std::vector<char> temp((s_len * 2) + 1, '\0');
|
|
||||||
mysql_real_escape_string(mysql, temp.data(), s.c_str(), s_len);
|
|
||||||
|
|
||||||
return temp.data();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DBcore::SetMutex(Mutex *mutex)
|
|
||||||
{
|
|
||||||
if (m_mutex && m_mutex != mutex) {
|
|
||||||
safe_delete(m_mutex);
|
|
||||||
}
|
|
||||||
|
|
||||||
DBcore::m_mutex = mutex;
|
|
||||||
}
|
|
||||||
|
|
||||||
// executes multiple statements in one query
|
|
||||||
// do not use this in application logic
|
|
||||||
// this was built and maintained for database migrations only
|
|
||||||
MySQLRequestResult DBcore::QueryDatabaseMulti(const std::string &query)
|
|
||||||
{
|
|
||||||
SetMultiStatementsOn();
|
|
||||||
|
|
||||||
BenchTimer timer;
|
|
||||||
timer.reset();
|
|
||||||
|
|
||||||
LockMutex lock(m_mutex);
|
|
||||||
|
|
||||||
// Reconnect if we are not connected before hand.
|
|
||||||
if (pStatus != Connected) {
|
|
||||||
Open();
|
|
||||||
}
|
|
||||||
auto r = MySQLRequestResult{};
|
|
||||||
|
|
||||||
int status = mysql_real_query(mysql, query.c_str(), query.length());
|
|
||||||
|
|
||||||
// process single result
|
|
||||||
if (status != 0) {
|
|
||||||
unsigned int error_number = mysql_errno(mysql);
|
|
||||||
|
|
||||||
if (error_number == CR_SERVER_GONE_ERROR) {
|
|
||||||
pStatus = Error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// error logging
|
|
||||||
if (mysql_errno(mysql) > 0 && query.length() > 0 && mysql_errno(mysql) != 1065) {
|
|
||||||
std::string error_raw = fmt::format("{}", mysql_error(mysql));
|
|
||||||
std::string mysql_err = Strings::Trim(error_raw);
|
|
||||||
std::string clean_query = Strings::Replace(query, "\n", "");
|
|
||||||
LogMySQLError("[{}] ({}) query [{}]", mysql_err, mysql_errno(mysql), clean_query);
|
|
||||||
|
|
||||||
MYSQL_RES *res = mysql_store_result(mysql);
|
|
||||||
|
|
||||||
uint32 row_count = 0;
|
|
||||||
if (res) {
|
|
||||||
row_count = (uint32) mysql_num_rows(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = MySQLRequestResult(
|
|
||||||
res,
|
|
||||||
(uint32) mysql_affected_rows(mysql),
|
|
||||||
row_count,
|
|
||||||
(uint32) mysql_field_count(mysql),
|
|
||||||
(uint32) mysql_insert_id(mysql)
|
|
||||||
);
|
|
||||||
|
|
||||||
std::string error_message = mysql_error(mysql);
|
|
||||||
r.SetErrorMessage(error_message);
|
|
||||||
r.SetErrorNumber(mysql_errno(mysql));
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
mysql_free_result(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetMultiStatementsOff();
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
// there could be a query with a semicolon in the actual data, this is best effort for
|
|
||||||
// logging / display purposes
|
|
||||||
// rare that we see this when this is only used in DDL statements
|
|
||||||
auto pieces = Strings::Split(query, ";");
|
|
||||||
|
|
||||||
// process each statement result
|
|
||||||
do {
|
|
||||||
uint32 row_count = 0;
|
|
||||||
MYSQL_RES *res = mysql_store_result(mysql);
|
|
||||||
|
|
||||||
r = MySQLRequestResult(
|
|
||||||
res,
|
|
||||||
(uint32) mysql_affected_rows(mysql),
|
|
||||||
row_count,
|
|
||||||
(uint32) mysql_field_count(mysql),
|
|
||||||
(uint32) mysql_insert_id(mysql)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (pieces.size() >= index) {
|
|
||||||
auto piece = pieces[index];
|
|
||||||
LogMySQLQuery(
|
|
||||||
"{} -- ({} row{} affected) ({}s)",
|
|
||||||
piece,
|
|
||||||
r.RowsAffected(),
|
|
||||||
r.RowsAffected() == 1 ? "" : "s",
|
|
||||||
std::to_string(timer.elapsed())
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
row_count = (uint32) mysql_num_rows(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
// more results? -1 = no, >0 = error, 0 = yes (keep looping)
|
|
||||||
if ((status = mysql_next_result(mysql)) > 0) {
|
|
||||||
if (mysql_errno(mysql) > 0) {
|
|
||||||
LogMySQLError("[{}] [{}]", mysql_errno(mysql), mysql_error(mysql));
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql_free_result(res);
|
|
||||||
|
|
||||||
// error logging
|
|
||||||
std::string error_message = mysql_error(mysql);
|
|
||||||
r.SetErrorMessage(error_message);
|
|
||||||
r.SetErrorNumber(mysql_errno(mysql));
|
|
||||||
|
|
||||||
SetMultiStatementsOff();
|
|
||||||
|
|
||||||
// we handle errors elsewhere
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (res) {
|
|
||||||
mysql_free_result(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
index++;
|
|
||||||
} while (status == 0);
|
|
||||||
|
|
||||||
SetMultiStatementsOff();
|
|
||||||
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql::PreparedStmt DBcore::Prepare(std::string query)
|
|
||||||
{
|
|
||||||
return mysql::PreparedStmt(*mysql, std::move(query), m_mutex);
|
|
||||||
}
|
|
||||||
|
|||||||
+8
-41
@@ -12,12 +12,6 @@
|
|||||||
|
|
||||||
#include <mysql.h>
|
#include <mysql.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
#define CR_SERVER_GONE_ERROR 2006
|
|
||||||
#define CR_SERVER_LOST 2013
|
|
||||||
|
|
||||||
namespace mysql { class PreparedStmt; }
|
|
||||||
|
|
||||||
class DBcore {
|
class DBcore {
|
||||||
public:
|
public:
|
||||||
@@ -29,31 +23,19 @@ public:
|
|||||||
~DBcore();
|
~DBcore();
|
||||||
eStatus GetStatus() { return pStatus; }
|
eStatus GetStatus() { return pStatus; }
|
||||||
MySQLRequestResult QueryDatabase(const char *query, uint32 querylen, bool retryOnFailureOnce = true);
|
MySQLRequestResult QueryDatabase(const char *query, uint32 querylen, bool retryOnFailureOnce = true);
|
||||||
MySQLRequestResult QueryDatabase(const std::string& query, bool retryOnFailureOnce = true);
|
MySQLRequestResult QueryDatabase(std::string query, bool retryOnFailureOnce = true);
|
||||||
MySQLRequestResult QueryDatabaseMulti(const std::string &query);
|
|
||||||
void TransactionBegin();
|
void TransactionBegin();
|
||||||
MySQLRequestResult TransactionCommit();
|
void TransactionCommit();
|
||||||
void TransactionRollback();
|
void TransactionRollback();
|
||||||
std::string Escape(const std::string& s);
|
|
||||||
uint32 DoEscapeString(char *tobuf, const char *frombuf, uint32 fromlen);
|
uint32 DoEscapeString(char *tobuf, const char *frombuf, uint32 fromlen);
|
||||||
void ping();
|
void ping();
|
||||||
|
MYSQL *getMySQL() { return &mysql; }
|
||||||
|
void SetMysql(MYSQL *mysql);
|
||||||
|
|
||||||
const std::string &GetOriginHost() const;
|
const std::string &GetOriginHost() const;
|
||||||
void SetOriginHost(const std::string &origin_host);
|
void SetOriginHost(const std::string &origin_host);
|
||||||
|
|
||||||
bool DoesTableExist(const std::string& table_name);
|
bool DoesTableExist(std::string table_name);
|
||||||
|
|
||||||
void SetMySQL(const DBcore &o)
|
|
||||||
{
|
|
||||||
mysql = o.mysql;
|
|
||||||
mysqlOwner = false;
|
|
||||||
}
|
|
||||||
void SetMutex(Mutex *mutex);
|
|
||||||
|
|
||||||
// only safe on connections shared with other threads if results buffered
|
|
||||||
// unsafe to use off main thread due to internal server logging
|
|
||||||
// throws std::runtime_error on failure
|
|
||||||
mysql::PreparedStmt Prepare(std::string query);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool Open(
|
bool Open(
|
||||||
@@ -71,13 +53,10 @@ protected:
|
|||||||
private:
|
private:
|
||||||
bool Open(uint32 *errnum = nullptr, char *errbuf = nullptr);
|
bool Open(uint32 *errnum = nullptr, char *errbuf = nullptr);
|
||||||
|
|
||||||
MYSQL* mysql;
|
MYSQL mysql;
|
||||||
bool mysqlOwner;
|
Mutex MDatabase;
|
||||||
Mutex *m_mutex;
|
|
||||||
eStatus pStatus;
|
eStatus pStatus;
|
||||||
|
|
||||||
std::mutex m_query_lock{};
|
|
||||||
|
|
||||||
std::string origin_host;
|
std::string origin_host;
|
||||||
|
|
||||||
char *pHost;
|
char *pHost;
|
||||||
@@ -88,20 +67,8 @@ private:
|
|||||||
uint32 pPort;
|
uint32 pPort;
|
||||||
bool pSSL;
|
bool pSSL;
|
||||||
|
|
||||||
// allows multiple queries to be executed within the same query
|
|
||||||
// do not use this under normal operation
|
|
||||||
// we use this during database migrations only currently
|
|
||||||
void SetMultiStatementsOn()
|
|
||||||
{
|
|
||||||
mysql_set_server_option(mysql, MYSQL_OPTION_MULTI_STATEMENTS_ON);
|
|
||||||
}
|
|
||||||
|
|
||||||
// disables multiple statements to be executed in one query
|
|
||||||
void SetMultiStatementsOff()
|
|
||||||
{
|
|
||||||
mysql_set_server_option(mysql, MYSQL_OPTION_MULTI_STATEMENTS_OFF);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+121
-7
@@ -11,7 +11,7 @@
|
|||||||
are required to give you total support for your newly bought product;
|
are required to give you total support for your newly bought product;
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
@@ -19,17 +19,131 @@
|
|||||||
|
|
||||||
#include "deity.h"
|
#include "deity.h"
|
||||||
|
|
||||||
uint32 Deity::GetBitmask(uint32 deity_id)
|
|
||||||
|
EQ::deity::DeityTypeBit EQ::deity::ConvertDeityTypeToDeityTypeBit(DeityType deity_type)
|
||||||
{
|
{
|
||||||
return IsValid(deity_id) ? deity_bitmasks[deity_id] : Deity::Bitmask::All;
|
switch (deity_type) {
|
||||||
|
case DeityBertoxxulous:
|
||||||
|
return bit_DeityBertoxxulous;
|
||||||
|
case DeityBrellSirilis:
|
||||||
|
return bit_DeityBrellSirilis;
|
||||||
|
case DeityCazicThule:
|
||||||
|
return bit_DeityCazicThule;
|
||||||
|
case DeityErollisiMarr:
|
||||||
|
return bit_DeityErollisiMarr;
|
||||||
|
case DeityBristlebane:
|
||||||
|
return bit_DeityBristlebane;
|
||||||
|
case DeityInnoruuk:
|
||||||
|
return bit_DeityInnoruuk;
|
||||||
|
case DeityKarana:
|
||||||
|
return bit_DeityKarana;
|
||||||
|
case DeityMithanielMarr:
|
||||||
|
return bit_DeityMithanielMarr;
|
||||||
|
case DeityPrexus:
|
||||||
|
return bit_DeityPrexus;
|
||||||
|
case DeityQuellious:
|
||||||
|
return bit_DeityQuellious;
|
||||||
|
case DeityRallosZek:
|
||||||
|
return bit_DeityRallosZek;
|
||||||
|
case DeityRodcetNife:
|
||||||
|
return bit_DeityRodcetNife;
|
||||||
|
case DeitySolusekRo:
|
||||||
|
return bit_DeitySolusekRo;
|
||||||
|
case DeityTheTribunal:
|
||||||
|
return bit_DeityTheTribunal;
|
||||||
|
case DeityTunare:
|
||||||
|
return bit_DeityTunare;
|
||||||
|
case DeityVeeshan:
|
||||||
|
return bit_DeityVeeshan;
|
||||||
|
case DeityAgnostic_LB:
|
||||||
|
case DeityAgnostic:
|
||||||
|
return bit_DeityAgnostic;
|
||||||
|
default:
|
||||||
|
return bit_DeityAll;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Deity::GetName(uint32 deity_id)
|
EQ::deity::DeityType EQ::deity::ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit)
|
||||||
{
|
{
|
||||||
return IsValid(deity_id) ? deity_names[deity_id] : "UNKNOWN DEITY";
|
switch (deity_type_bit) {
|
||||||
|
case bit_DeityAgnostic:
|
||||||
|
return DeityAgnostic;
|
||||||
|
case bit_DeityBertoxxulous:
|
||||||
|
return DeityBertoxxulous;
|
||||||
|
case bit_DeityBrellSirilis:
|
||||||
|
return DeityBrellSirilis;
|
||||||
|
case bit_DeityCazicThule:
|
||||||
|
return DeityCazicThule;
|
||||||
|
case bit_DeityErollisiMarr:
|
||||||
|
return DeityErollisiMarr;
|
||||||
|
case bit_DeityBristlebane:
|
||||||
|
return DeityBristlebane;
|
||||||
|
case bit_DeityInnoruuk:
|
||||||
|
return DeityInnoruuk;
|
||||||
|
case bit_DeityKarana:
|
||||||
|
return DeityKarana;
|
||||||
|
case bit_DeityMithanielMarr:
|
||||||
|
return DeityMithanielMarr;
|
||||||
|
case bit_DeityPrexus:
|
||||||
|
return DeityPrexus;
|
||||||
|
case bit_DeityQuellious:
|
||||||
|
return DeityQuellious;
|
||||||
|
case bit_DeityRallosZek:
|
||||||
|
return DeityRallosZek;
|
||||||
|
case bit_DeityRodcetNife:
|
||||||
|
return DeityRodcetNife;
|
||||||
|
case bit_DeitySolusekRo:
|
||||||
|
return DeitySolusekRo;
|
||||||
|
case bit_DeityTheTribunal:
|
||||||
|
return DeityTheTribunal;
|
||||||
|
case bit_DeityTunare:
|
||||||
|
return DeityTunare;
|
||||||
|
case bit_DeityVeeshan:
|
||||||
|
return DeityVeeshan;
|
||||||
|
default:
|
||||||
|
return DeityUnknown;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Deity::IsValid(uint32 deity_id)
|
const char* EQ::deity::DeityName(DeityType deity_type)
|
||||||
{
|
{
|
||||||
return deity_names.find(deity_id) != deity_names.end();
|
switch (deity_type) {
|
||||||
|
case DeityBertoxxulous:
|
||||||
|
return "Bertoxxulous";
|
||||||
|
case DeityBrellSirilis:
|
||||||
|
return "Brell Serilis";
|
||||||
|
case DeityCazicThule:
|
||||||
|
return "Cazic-Thule";
|
||||||
|
case DeityErollisiMarr:
|
||||||
|
return "Erollisi Marr";
|
||||||
|
case DeityBristlebane:
|
||||||
|
return "Bristlebane";
|
||||||
|
case DeityInnoruuk:
|
||||||
|
return "Innoruuk";
|
||||||
|
case DeityKarana:
|
||||||
|
return "Karana";
|
||||||
|
case DeityMithanielMarr:
|
||||||
|
return "Mithaniel Marr";
|
||||||
|
case DeityPrexus:
|
||||||
|
return "Prexus";
|
||||||
|
case DeityQuellious:
|
||||||
|
return "Quellious";
|
||||||
|
case DeityRallosZek:
|
||||||
|
return "Rallos Zek";
|
||||||
|
case DeityRodcetNife:
|
||||||
|
return "Rodcet Nife";
|
||||||
|
case DeitySolusekRo:
|
||||||
|
return "Solusek Ro";
|
||||||
|
case DeityTheTribunal:
|
||||||
|
return "The Tribunal";
|
||||||
|
case DeityTunare:
|
||||||
|
return "Tunare";
|
||||||
|
case DeityVeeshan:
|
||||||
|
return "Veeshan";
|
||||||
|
case DeityAgnostic_LB:
|
||||||
|
case DeityAgnostic:
|
||||||
|
return "Agnostic";
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+51
-87
@@ -21,97 +21,61 @@
|
|||||||
#define COMMON_DEITY_H
|
#define COMMON_DEITY_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
namespace Deity {
|
|
||||||
constexpr uint32 Unknown = 0;
|
|
||||||
constexpr uint32 Agnostic1 = 140;
|
|
||||||
constexpr uint32 Bertoxxulous = 201;
|
|
||||||
constexpr uint32 BrellSirilis = 202;
|
|
||||||
constexpr uint32 CazicThule = 203;
|
|
||||||
constexpr uint32 ErollisiMarr = 204;
|
|
||||||
constexpr uint32 Bristlebane = 205;
|
|
||||||
constexpr uint32 Innoruuk = 206;
|
|
||||||
constexpr uint32 Karana = 207;
|
|
||||||
constexpr uint32 MithanielMarr = 208;
|
|
||||||
constexpr uint32 Prexus = 209;
|
|
||||||
constexpr uint32 Quellious = 210;
|
|
||||||
constexpr uint32 RallosZek = 211;
|
|
||||||
constexpr uint32 RodcetNife = 212;
|
|
||||||
constexpr uint32 SolusekRo = 213;
|
|
||||||
constexpr uint32 TheTribunal = 214;
|
|
||||||
constexpr uint32 Tunare = 215;
|
|
||||||
constexpr uint32 Veeshan = 216;
|
|
||||||
constexpr uint32 Agnostic2 = 396;
|
|
||||||
|
|
||||||
namespace Bitmask {
|
namespace EQ
|
||||||
constexpr uint32 Agnostic = 1;
|
{
|
||||||
constexpr uint32 Bertoxxulous = 2;
|
namespace deity {
|
||||||
constexpr uint32 BrellSirilis = 4;
|
enum DeityType {
|
||||||
constexpr uint32 CazicThule = 8;
|
DeityUnknown = 0,
|
||||||
constexpr uint32 ErollisiMarr = 16;
|
DeityAgnostic_LB = 140,
|
||||||
constexpr uint32 Bristlebane = 32;
|
DeityBertoxxulous = 201,
|
||||||
constexpr uint32 Innoruuk = 64;
|
DeityBrellSirilis,
|
||||||
constexpr uint32 Karana = 128;
|
DeityCazicThule,
|
||||||
constexpr uint32 MithanielMarr = 256;
|
DeityErollisiMarr,
|
||||||
constexpr uint32 Prexus = 512;
|
DeityBristlebane,
|
||||||
constexpr uint32 Quellious = 1024;
|
DeityInnoruuk,
|
||||||
constexpr uint32 RallosZek = 2048;
|
DeityKarana,
|
||||||
constexpr uint32 RodcetNife = 4096;
|
DeityMithanielMarr,
|
||||||
constexpr uint32 SolusekRo = 8192;
|
DeityPrexus,
|
||||||
constexpr uint32 TheTribunal = 16384;
|
DeityQuellious,
|
||||||
constexpr uint32 Tunare = 32768;
|
DeityRallosZek,
|
||||||
constexpr uint32 Veeshan = 65536;
|
DeityRodcetNife,
|
||||||
constexpr uint32 All = std::numeric_limits<uint32>::max();
|
DeitySolusekRo,
|
||||||
}
|
DeityTheTribunal,
|
||||||
|
DeityTunare,
|
||||||
|
DeityVeeshan,
|
||||||
|
DeityAgnostic = 396
|
||||||
|
};
|
||||||
|
|
||||||
uint32 GetBitmask(uint32 deity_id);
|
enum DeityTypeBit : uint32 {
|
||||||
std::string GetName(uint32 deity_id);
|
bit_DeityNone = 0x00000000,
|
||||||
bool IsValid(uint32 deity_id);
|
bit_DeityAgnostic = 0x00000001,
|
||||||
}
|
bit_DeityBertoxxulous = 0x00000002,
|
||||||
|
bit_DeityBrellSirilis = 0x00000004,
|
||||||
|
bit_DeityCazicThule = 0x00000008,
|
||||||
|
bit_DeityErollisiMarr = 0x00000010,
|
||||||
|
bit_DeityBristlebane = 0x00000020,
|
||||||
|
bit_DeityInnoruuk = 0x00000040,
|
||||||
|
bit_DeityKarana = 0x00000080,
|
||||||
|
bit_DeityMithanielMarr = 0x00000100,
|
||||||
|
bit_DeityPrexus = 0x00000200,
|
||||||
|
bit_DeityQuellious = 0x00000400,
|
||||||
|
bit_DeityRallosZek = 0x00000800,
|
||||||
|
bit_DeityRodcetNife = 0x00001000,
|
||||||
|
bit_DeitySolusekRo = 0x00002000,
|
||||||
|
bit_DeityTheTribunal = 0x00004000,
|
||||||
|
bit_DeityTunare = 0x00008000,
|
||||||
|
bit_DeityVeeshan = 0x00010000,
|
||||||
|
bit_DeityAll = 0xFFFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
static std::map<uint32, std::string> deity_names = {
|
extern DeityTypeBit ConvertDeityTypeToDeityTypeBit(DeityType deity_type);
|
||||||
{ Deity::Agnostic1, "Agnostic" },
|
extern DeityType ConvertDeityTypeBitToDeityType(DeityTypeBit deity_type_bit);
|
||||||
{ Deity::Agnostic2, "Agnostic" },
|
extern const char* DeityName(DeityType deity_type);
|
||||||
{ Deity::Bertoxxulous, "Bertoxxulous" },
|
|
||||||
{ Deity::BrellSirilis, "Brell Serilis" },
|
|
||||||
{ Deity::Bristlebane, "Bristlebane" },
|
|
||||||
{ Deity::CazicThule, "Cazic-Thule" },
|
|
||||||
{ Deity::ErollisiMarr, "Erollisi Marr" },
|
|
||||||
{ Deity::Innoruuk, "Innoruuk" },
|
|
||||||
{ Deity::Karana, "Karana" },
|
|
||||||
{ Deity::MithanielMarr, "Mithaniel Marr" },
|
|
||||||
{ Deity::Prexus, "Prexus" },
|
|
||||||
{ Deity::Quellious, "Quellious" },
|
|
||||||
{ Deity::RallosZek, "Rallos Zek" },
|
|
||||||
{ Deity::RodcetNife, "Rodcet Nife" },
|
|
||||||
{ Deity::SolusekRo, "Solusek Ro" },
|
|
||||||
{ Deity::TheTribunal, "The Tribunal" },
|
|
||||||
{ Deity::Tunare, "Tunare" },
|
|
||||||
{ Deity::Veeshan, "Veeshan" }
|
|
||||||
};
|
|
||||||
|
|
||||||
static std::map<uint32, uint32> deity_bitmasks = {
|
} /*deity*/
|
||||||
{ Deity::Agnostic1, Deity::Bitmask::Agnostic },
|
|
||||||
{ Deity::Agnostic2, Deity::Bitmask::Agnostic },
|
} /*EQEmu*/
|
||||||
{ Deity::Bertoxxulous, Deity::Bitmask::Bertoxxulous },
|
|
||||||
{ Deity::BrellSirilis, Deity::Bitmask::BrellSirilis },
|
|
||||||
{ Deity::CazicThule, Deity::Bitmask::CazicThule },
|
|
||||||
{ Deity::ErollisiMarr, Deity::Bitmask::ErollisiMarr },
|
|
||||||
{ Deity::Bristlebane, Deity::Bitmask::Bristlebane },
|
|
||||||
{ Deity::Innoruuk, Deity::Bitmask::Innoruuk },
|
|
||||||
{ Deity::Karana, Deity::Bitmask::Karana },
|
|
||||||
{ Deity::MithanielMarr, Deity::Bitmask::MithanielMarr },
|
|
||||||
{ Deity::Prexus, Deity::Bitmask::Prexus },
|
|
||||||
{ Deity::Quellious, Deity::Bitmask::Quellious },
|
|
||||||
{ Deity::RallosZek, Deity::Bitmask::RallosZek },
|
|
||||||
{ Deity::RodcetNife, Deity::Bitmask::RodcetNife },
|
|
||||||
{ Deity::SolusekRo, Deity::Bitmask::SolusekRo },
|
|
||||||
{ Deity::TheTribunal, Deity::Bitmask::TheTribunal },
|
|
||||||
{ Deity::Tunare, Deity::Bitmask::Tunare },
|
|
||||||
{ Deity::Veeshan, Deity::Bitmask::Veeshan }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* COMMON_DEITY_H */
|
#endif /* COMMON_DEITY_H */
|
||||||
|
|||||||
+15
-89
@@ -1,17 +1,22 @@
|
|||||||
#include <cereal/archives/json.hpp>
|
|
||||||
#include <cereal/archives/binary.hpp>
|
|
||||||
#include "discord.h"
|
#include "discord.h"
|
||||||
#include "../http/httplib.h"
|
#include "../http/httplib.h"
|
||||||
#include "../json/json.h"
|
#include "../json/json.h"
|
||||||
#include "../strings.h"
|
#include "../strings.h"
|
||||||
#include "../eqemu_logsys.h"
|
#include "../eqemu_logsys.h"
|
||||||
#include "../events/player_event_logs.h"
|
|
||||||
|
|
||||||
constexpr int MAX_RETRIES = 10;
|
constexpr int MAX_RETRIES = 10;
|
||||||
|
|
||||||
void Discord::SendWebhookMessage(const std::string &message, const std::string &webhook_url)
|
void Discord::SendWebhookMessage(const std::string &message, const std::string &webhook_url)
|
||||||
{
|
{
|
||||||
if (!ValidateWebhookUrl(webhook_url)) {
|
// validate
|
||||||
|
if (webhook_url.empty()) {
|
||||||
|
LogDiscord("[webhook_url] is empty");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// validate
|
||||||
|
if (webhook_url.find("http://") == std::string::npos && webhook_url.find("https://") == std::string::npos) {
|
||||||
|
LogDiscord("[webhook_url] [{}] does not contain a valid http/s prefix.", webhook_url);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,10 +28,13 @@ void Discord::SendWebhookMessage(const std::string &message, const std::string &
|
|||||||
std::string endpoint = Strings::Replace(webhook_url, base_url, "");
|
std::string endpoint = Strings::Replace(webhook_url, base_url, "");
|
||||||
|
|
||||||
// client
|
// client
|
||||||
httplib::Client cli(base_url);
|
httplib::Client cli(base_url.c_str());
|
||||||
cli.set_connection_timeout(0, 15000000); // 15 sec
|
cli.set_connection_timeout(0, 15000000); // 15 sec
|
||||||
cli.set_read_timeout(15, 0); // 15 seconds
|
cli.set_read_timeout(15, 0); // 15 seconds
|
||||||
cli.set_write_timeout(15, 0); // 15 seconds
|
cli.set_write_timeout(15, 0); // 15 seconds
|
||||||
|
httplib::Headers headers = {
|
||||||
|
{"Content-Type", "application/json"}
|
||||||
|
};
|
||||||
|
|
||||||
// payload
|
// payload
|
||||||
Json::Value p;
|
Json::Value p;
|
||||||
@@ -38,7 +46,7 @@ void Discord::SendWebhookMessage(const std::string &message, const std::string &
|
|||||||
int retries = 0;
|
int retries = 0;
|
||||||
int retry_timer = 1000;
|
int retry_timer = 1000;
|
||||||
while (retry) {
|
while (retry) {
|
||||||
if (auto res = cli.Post(endpoint, payload.str(), "application/json")) {
|
if (auto res = cli.Post(endpoint.c_str(), payload.str(), "application/json")) {
|
||||||
if (res->status != 200 && res->status != 204) {
|
if (res->status != 200 && res->status != 204) {
|
||||||
LogError("[Discord Client] Code [{}] Error [{}]", res->status, res->body);
|
LogError("[Discord Client] Code [{}] Error [{}]", res->status, res->body);
|
||||||
}
|
}
|
||||||
@@ -54,7 +62,7 @@ void Discord::SendWebhookMessage(const std::string &message, const std::string &
|
|||||||
LogDiscord("JSON serialization failure [{}] via [{}]", ex.what(), res->body);
|
LogDiscord("JSON serialization failure [{}] via [{}]", ex.what(), res->body);
|
||||||
}
|
}
|
||||||
|
|
||||||
retry_timer = Strings::ToInt(response["retry_after"].asString()) + 500;
|
retry_timer = std::stoi(response["retry_after"].asString()) + 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogDiscord("Rate limited... retrying message in [{}ms]", retry_timer);
|
LogDiscord("Rate limited... retrying message in [{}ms]", retry_timer);
|
||||||
@@ -73,71 +81,6 @@ void Discord::SendWebhookMessage(const std::string &message, const std::string &
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Discord::SendPlayerEventMessage(
|
|
||||||
const PlayerEvent::PlayerEventContainer &e,
|
|
||||||
const std::string &webhook_url
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (!ValidateWebhookUrl(webhook_url)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto s = Strings::Split(webhook_url, '/');
|
|
||||||
|
|
||||||
// url
|
|
||||||
std::string base_url = fmt::format("{}//{}", s[0], s[2]);
|
|
||||||
std::string endpoint = Strings::Replace(webhook_url, base_url, "");
|
|
||||||
|
|
||||||
// client
|
|
||||||
httplib::Client cli(base_url);
|
|
||||||
cli.set_connection_timeout(0, 15000000); // 15 sec
|
|
||||||
cli.set_read_timeout(15, 0); // 15 seconds
|
|
||||||
cli.set_write_timeout(15, 0); // 15 seconds
|
|
||||||
|
|
||||||
std::string payload = PlayerEventLogs::GetDiscordPayloadFromEvent(e);
|
|
||||||
if (payload.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool retry = true;
|
|
||||||
int retries = 0;
|
|
||||||
int retry_timer = 1000;
|
|
||||||
while (retry) {
|
|
||||||
if (auto res = cli.Post(endpoint, payload, "application/json")) {
|
|
||||||
if (res->status != 200 && res->status != 204) {
|
|
||||||
LogError("Code [{}] Error [{}]", res->status, res->body);
|
|
||||||
}
|
|
||||||
if (res->status == 429) {
|
|
||||||
if (!res->body.empty()) {
|
|
||||||
std::stringstream ss(res->body);
|
|
||||||
Json::Value response;
|
|
||||||
|
|
||||||
try {
|
|
||||||
ss >> response;
|
|
||||||
}
|
|
||||||
catch (std::exception const &ex) {
|
|
||||||
LogDiscord("JSON serialization failure [{}] via [{}]", ex.what(), res->body);
|
|
||||||
}
|
|
||||||
|
|
||||||
retry_timer = Strings::ToInt(response["retry_after"].asString()) + 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogDiscord("Rate limited... retrying message in [{}ms]", retry_timer);
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(retry_timer + 500));
|
|
||||||
}
|
|
||||||
if (res->status == 204) {
|
|
||||||
retry = false;
|
|
||||||
}
|
|
||||||
if (retries > MAX_RETRIES) {
|
|
||||||
LogDiscord("Retries exceeded for player event message");
|
|
||||||
retry = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
retries++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string Discord::FormatDiscordMessage(uint16 category_id, const std::string &message)
|
std::string Discord::FormatDiscordMessage(uint16 category_id, const std::string &message)
|
||||||
{
|
{
|
||||||
if (category_id == Logs::LogCategory::MySQLQuery) {
|
if (category_id == Logs::LogCategory::MySQLQuery) {
|
||||||
@@ -146,20 +89,3 @@ std::string Discord::FormatDiscordMessage(uint16 category_id, const std::string
|
|||||||
|
|
||||||
return message + "\n";
|
return message + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Discord::ValidateWebhookUrl(const std::string &webhook_url)
|
|
||||||
{
|
|
||||||
// validate
|
|
||||||
if (webhook_url.empty()) {
|
|
||||||
LogDiscord("[webhook_url] is empty");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// validate
|
|
||||||
if (!Strings::Contains(webhook_url, "http://") && !Strings::Contains(webhook_url, "https://")) {
|
|
||||||
LogDiscord("[webhook_url] [{}] does not contain a valid http/s prefix.", webhook_url);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -4,16 +4,11 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "../types.h"
|
#include "../types.h"
|
||||||
#include "../http/httplib.h"
|
|
||||||
#include "../repositories/player_event_logs_repository.h"
|
|
||||||
#include "../events/player_events.h"
|
|
||||||
|
|
||||||
class Discord {
|
class Discord {
|
||||||
public:
|
public:
|
||||||
static void SendWebhookMessage(const std::string& message, const std::string& webhook_url);
|
static void SendWebhookMessage(const std::string& message, const std::string& webhook_url);
|
||||||
static std::string FormatDiscordMessage(uint16 category_id, const std::string& message);
|
static std::string FormatDiscordMessage(uint16 category_id, const std::string& message);
|
||||||
static void SendPlayerEventMessage(const PlayerEvent::PlayerEventContainer& e, const std::string &webhook_url);
|
|
||||||
static bool ValidateWebhookUrl(const std::string &webhook_url);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "discord_manager.h"
|
#include "discord_manager.h"
|
||||||
#include "../../common/discord/discord.h"
|
#include "../common/discord/discord.h"
|
||||||
#include "../events/player_event_logs.h"
|
#include "../common/eqemu_logsys.h"
|
||||||
|
#include "../common/strings.h"
|
||||||
|
|
||||||
void DiscordManager::QueueWebhookMessage(uint32 webhook_id, const std::string &message)
|
void DiscordManager::QueueWebhookMessage(uint32 webhook_id, const std::string &message)
|
||||||
{
|
{
|
||||||
@@ -37,7 +38,7 @@ void DiscordManager::ProcessMessageQueue()
|
|||||||
message,
|
message,
|
||||||
webhook.webhook_url
|
webhook.webhook_url
|
||||||
);
|
);
|
||||||
message.clear();
|
message = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
message += m;
|
message += m;
|
||||||
@@ -51,9 +52,10 @@ void DiscordManager::ProcessMessageQueue()
|
|||||||
webhook.webhook_url
|
webhook.webhook_url
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
message.clear();
|
message = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// final flush
|
// final flush
|
||||||
if (!message.empty()) {
|
if (!message.empty()) {
|
||||||
Discord::SendWebhookMessage(
|
Discord::SendWebhookMessage(
|
||||||
@@ -65,11 +67,3 @@ void DiscordManager::ProcessMessageQueue()
|
|||||||
webhook_message_queue.clear();
|
webhook_message_queue.clear();
|
||||||
webhook_queue_lock.unlock();
|
webhook_queue_lock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiscordManager::QueuePlayerEventMessage(const PlayerEvent::PlayerEventContainer& e)
|
|
||||||
{
|
|
||||||
auto w = player_event_logs.GetDiscordWebhookUrlFromEventType(e.player_event_log.event_type_id);
|
|
||||||
if (!w.empty()) {
|
|
||||||
Discord::SendPlayerEventMessage(e, w);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4,15 +4,12 @@
|
|||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "../../common/types.h"
|
#include "../common/types.h"
|
||||||
#include "../repositories/player_event_logs_repository.h"
|
|
||||||
#include "../events/player_events.h"
|
|
||||||
|
|
||||||
class DiscordManager {
|
class DiscordManager {
|
||||||
public:
|
public:
|
||||||
void QueueWebhookMessage(uint32 webhook_id, const std::string& message);
|
void QueueWebhookMessage(uint32 webhook_id, const std::string& message);
|
||||||
void ProcessMessageQueue();
|
void ProcessMessageQueue();
|
||||||
void QueuePlayerEventMessage(const PlayerEvent::PlayerEventContainer& e);
|
|
||||||
private:
|
private:
|
||||||
std::mutex webhook_queue_lock{};
|
std::mutex webhook_queue_lock{};
|
||||||
std::map<uint32, std::vector<std::string>> webhook_message_queue{};
|
std::map<uint32, std::vector<std::string>> webhook_message_queue{};
|
||||||
+67
-297
@@ -1,13 +1,11 @@
|
|||||||
#include "dynamic_zone_base.h"
|
#include "dynamic_zone_base.h"
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
#include "eqemu_logsys.h"
|
#include "eqemu_logsys.h"
|
||||||
|
#include "repositories/instance_list_repository.h"
|
||||||
|
#include "repositories/instance_list_player_repository.h"
|
||||||
#include "rulesys.h"
|
#include "rulesys.h"
|
||||||
#include "servertalk.h"
|
#include "servertalk.h"
|
||||||
#include "util/uuid.h"
|
#include "util/uuid.h"
|
||||||
#include "repositories/character_expedition_lockouts_repository.h"
|
|
||||||
#include "repositories/dynamic_zone_lockouts_repository.h"
|
|
||||||
#include "repositories/instance_list_repository.h"
|
|
||||||
#include "repositories/instance_list_player_repository.h"
|
|
||||||
|
|
||||||
DynamicZoneBase::DynamicZoneBase(DynamicZonesRepository::DynamicZoneInstance&& entry)
|
DynamicZoneBase::DynamicZoneBase(DynamicZonesRepository::DynamicZoneInstance&& entry)
|
||||||
{
|
{
|
||||||
@@ -58,16 +56,15 @@ uint32_t DynamicZoneBase::CreateInstance()
|
|||||||
insert_instance.start_time = static_cast<int>(std::chrono::system_clock::to_time_t(m_start_time));
|
insert_instance.start_time = static_cast<int>(std::chrono::system_clock::to_time_t(m_start_time));
|
||||||
insert_instance.duration = static_cast<int>(m_duration.count());
|
insert_instance.duration = static_cast<int>(m_duration.count());
|
||||||
insert_instance.never_expires = m_never_expires;
|
insert_instance.never_expires = m_never_expires;
|
||||||
insert_instance.expire_at = insert_instance.start_time + insert_instance.duration;
|
|
||||||
|
|
||||||
auto instance = InstanceListRepository::ReplaceOne(GetDatabase(), insert_instance);
|
auto instance = InstanceListRepository::InsertOne(GetDatabase(), insert_instance);
|
||||||
if (!instance)
|
if (instance.id == 0)
|
||||||
{
|
{
|
||||||
LogDynamicZones("Failed to create instance [{}] for zone [{}]", unused_instance_id, m_zone_id);
|
LogDynamicZones("Failed to create instance [{}] for zone [{}]", unused_instance_id, m_zone_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_instance_id = unused_instance_id;
|
m_instance_id = instance.id;
|
||||||
|
|
||||||
return m_instance_id;
|
return m_instance_id;
|
||||||
}
|
}
|
||||||
@@ -96,15 +93,13 @@ void DynamicZoneBase::LoadRepositoryResult(DynamicZonesRepository::DynamicZoneIn
|
|||||||
m_zonein.y = dz_entry.zone_in_y;
|
m_zonein.y = dz_entry.zone_in_y;
|
||||||
m_zonein.z = dz_entry.zone_in_z;
|
m_zonein.z = dz_entry.zone_in_z;
|
||||||
m_zonein.heading = dz_entry.zone_in_heading;
|
m_zonein.heading = dz_entry.zone_in_heading;
|
||||||
m_has_zonein = dz_entry.has_zone_in != 0;
|
m_has_zonein = (dz_entry.has_zone_in != 0);
|
||||||
m_is_locked = dz_entry.is_locked;
|
|
||||||
m_add_replay = dz_entry.add_replay;
|
|
||||||
// instance_list portion
|
// instance_list portion
|
||||||
m_zone_id = dz_entry.zone;
|
m_zone_id = dz_entry.zone;
|
||||||
m_zone_version = dz_entry.version;
|
m_zone_version = dz_entry.version;
|
||||||
m_start_time = std::chrono::system_clock::from_time_t(dz_entry.start_time);
|
m_start_time = std::chrono::system_clock::from_time_t(dz_entry.start_time);
|
||||||
m_duration = std::chrono::seconds(dz_entry.duration);
|
m_duration = std::chrono::seconds(dz_entry.duration);
|
||||||
m_never_expires = dz_entry.never_expires != 0;
|
m_never_expires = (dz_entry.never_expires != 0);
|
||||||
m_expire_time = m_start_time + m_duration;
|
m_expire_time = m_start_time + m_duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,40 +119,37 @@ void DynamicZoneBase::AddMemberFromRepositoryResult(
|
|||||||
uint32_t DynamicZoneBase::SaveToDatabase()
|
uint32_t DynamicZoneBase::SaveToDatabase()
|
||||||
{
|
{
|
||||||
LogDynamicZonesDetail("Saving dz instance [{}] to database", m_instance_id);
|
LogDynamicZonesDetail("Saving dz instance [{}] to database", m_instance_id);
|
||||||
if (m_instance_id == 0)
|
|
||||||
|
if (m_instance_id != 0)
|
||||||
{
|
{
|
||||||
return 0;
|
auto insert_dz = DynamicZonesRepository::NewEntity();
|
||||||
|
insert_dz.uuid = m_uuid;
|
||||||
|
insert_dz.name = m_name;
|
||||||
|
insert_dz.leader_id = m_leader.id;
|
||||||
|
insert_dz.min_players = m_min_players;
|
||||||
|
insert_dz.max_players = m_max_players;
|
||||||
|
insert_dz.instance_id = m_instance_id,
|
||||||
|
insert_dz.type = static_cast<int>(m_type);
|
||||||
|
insert_dz.dz_switch_id = m_dz_switch_id;
|
||||||
|
insert_dz.compass_zone_id = m_compass.zone_id;
|
||||||
|
insert_dz.compass_x = m_compass.x;
|
||||||
|
insert_dz.compass_y = m_compass.y;
|
||||||
|
insert_dz.compass_z = m_compass.z;
|
||||||
|
insert_dz.safe_return_zone_id = m_safereturn.zone_id;
|
||||||
|
insert_dz.safe_return_x = m_safereturn.x;
|
||||||
|
insert_dz.safe_return_y = m_safereturn.y;
|
||||||
|
insert_dz.safe_return_z = m_safereturn.z;
|
||||||
|
insert_dz.safe_return_heading = m_safereturn.heading;
|
||||||
|
insert_dz.zone_in_x = m_zonein.x;
|
||||||
|
insert_dz.zone_in_y = m_zonein.y;
|
||||||
|
insert_dz.zone_in_z = m_zonein.z;
|
||||||
|
insert_dz.zone_in_heading = m_zonein.heading;
|
||||||
|
insert_dz.has_zone_in = m_has_zonein;
|
||||||
|
|
||||||
|
auto inserted_dz = DynamicZonesRepository::InsertOne(GetDatabase(), insert_dz);
|
||||||
|
return inserted_dz.id;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
auto dz = DynamicZonesRepository::NewEntity();
|
|
||||||
dz.uuid = m_uuid;
|
|
||||||
dz.name = m_name;
|
|
||||||
dz.leader_id = m_leader.id;
|
|
||||||
dz.min_players = m_min_players;
|
|
||||||
dz.max_players = m_max_players;
|
|
||||||
dz.instance_id = static_cast<int32_t>(m_instance_id),
|
|
||||||
dz.type = static_cast<uint8_t>(m_type);
|
|
||||||
dz.dz_switch_id = m_dz_switch_id;
|
|
||||||
dz.compass_zone_id = m_compass.zone_id;
|
|
||||||
dz.compass_x = m_compass.x;
|
|
||||||
dz.compass_y = m_compass.y;
|
|
||||||
dz.compass_z = m_compass.z;
|
|
||||||
dz.safe_return_zone_id = m_safereturn.zone_id;
|
|
||||||
dz.safe_return_x = m_safereturn.x;
|
|
||||||
dz.safe_return_y = m_safereturn.y;
|
|
||||||
dz.safe_return_z = m_safereturn.z;
|
|
||||||
dz.safe_return_heading = m_safereturn.heading;
|
|
||||||
dz.zone_in_x = m_zonein.x;
|
|
||||||
dz.zone_in_y = m_zonein.y;
|
|
||||||
dz.zone_in_z = m_zonein.z;
|
|
||||||
dz.zone_in_heading = m_zonein.heading;
|
|
||||||
dz.has_zone_in = static_cast<uint8_t>(m_has_zonein);
|
|
||||||
dz.is_locked = static_cast<int8_t>(m_is_locked);
|
|
||||||
dz.add_replay = static_cast<int8_t>(m_add_replay);
|
|
||||||
|
|
||||||
dz = DynamicZonesRepository::InsertOne(GetDatabase(), std::move(dz));
|
|
||||||
|
|
||||||
return dz.id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DynamicZoneBase::AddMember(const DynamicZoneMember& add_member)
|
bool DynamicZoneBase::AddMember(const DynamicZoneMember& add_member)
|
||||||
@@ -204,9 +196,10 @@ bool DynamicZoneBase::RemoveMember(const DynamicZoneMember& remove_member)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DynamicZoneBase::SwapMember(const DynamicZoneMember& add_member, const std::string& remove_name)
|
bool DynamicZoneBase::SwapMember(
|
||||||
|
const DynamicZoneMember& add_member, const std::string& remove_char_name)
|
||||||
{
|
{
|
||||||
auto remove_member = GetMemberData(remove_name);
|
auto remove_member = GetMemberData(remove_char_name);
|
||||||
if (!add_member.IsValid() || !remove_member.IsValid())
|
if (!add_member.IsValid() || !remove_member.IsValid())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@@ -237,18 +230,9 @@ void DynamicZoneBase::RemoveAllMembers()
|
|||||||
|
|
||||||
void DynamicZoneBase::SaveMembers(const std::vector<DynamicZoneMember>& members)
|
void DynamicZoneBase::SaveMembers(const std::vector<DynamicZoneMember>& members)
|
||||||
{
|
{
|
||||||
if (members.empty())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
LogDynamicZonesDetail("Saving [{}] member(s) for dz [{}]", members.size(), m_id);
|
LogDynamicZonesDetail("Saving [{}] member(s) for dz [{}]", members.size(), m_id);
|
||||||
|
|
||||||
m_members = members;
|
m_members = members;
|
||||||
if (m_members.size() > m_max_players)
|
|
||||||
{
|
|
||||||
m_members.resize(m_max_players);
|
|
||||||
}
|
|
||||||
|
|
||||||
// the lower level instance_list_players needs to be kept updated as well
|
// the lower level instance_list_players needs to be kept updated as well
|
||||||
std::vector<DynamicZoneMembersRepository::DynamicZoneMembers> insert_members;
|
std::vector<DynamicZoneMembersRepository::DynamicZoneMembers> insert_members;
|
||||||
@@ -258,12 +242,12 @@ void DynamicZoneBase::SaveMembers(const std::vector<DynamicZoneMember>& members)
|
|||||||
DynamicZoneMembersRepository::DynamicZoneMembers member_entry{};
|
DynamicZoneMembersRepository::DynamicZoneMembers member_entry{};
|
||||||
member_entry.dynamic_zone_id = m_id;
|
member_entry.dynamic_zone_id = m_id;
|
||||||
member_entry.character_id = member.id;
|
member_entry.character_id = member.id;
|
||||||
insert_members.push_back(member_entry);
|
insert_members.emplace_back(member_entry);
|
||||||
|
|
||||||
InstanceListPlayerRepository::InstanceListPlayer player_entry{};
|
InstanceListPlayerRepository::InstanceListPlayer player_entry;
|
||||||
player_entry.id = m_instance_id;
|
player_entry.id = static_cast<int>(m_instance_id);
|
||||||
player_entry.charid = member.id;
|
player_entry.charid = static_cast<int>(member.id);
|
||||||
insert_players.push_back(player_entry);
|
insert_players.emplace_back(player_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
DynamicZoneMembersRepository::InsertOrUpdateMany(GetDatabase(), insert_members);
|
DynamicZoneMembersRepository::InsertOrUpdateMany(GetDatabase(), insert_members);
|
||||||
@@ -355,44 +339,6 @@ void DynamicZoneBase::SetLeader(const DynamicZoneMember& new_leader, bool update
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DynamicZoneBase::SetLocked(bool lock, bool update_db, DzLockMsg lock_msg, uint32_t color)
|
|
||||||
{
|
|
||||||
m_is_locked = lock;
|
|
||||||
|
|
||||||
if (update_db)
|
|
||||||
{
|
|
||||||
DynamicZonesRepository::UpdateLocked(GetDatabase(), m_id, lock);
|
|
||||||
|
|
||||||
ServerPacket pack(ServerOP_DzLock, sizeof(ServerDzLock_Struct));
|
|
||||||
auto buf = reinterpret_cast<ServerDzLock_Struct*>(pack.pBuffer);
|
|
||||||
buf->dz_id = GetID();
|
|
||||||
buf->sender_zone_id = GetCurrentZoneID();
|
|
||||||
buf->sender_instance_id = GetCurrentInstanceID();
|
|
||||||
buf->lock = m_is_locked;
|
|
||||||
buf->lock_msg = static_cast<uint8_t>(lock_msg);
|
|
||||||
buf->color = color;
|
|
||||||
SendServerPacket(&pack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::SetReplayOnJoin(bool enabled, bool update_db)
|
|
||||||
{
|
|
||||||
m_add_replay = enabled;
|
|
||||||
|
|
||||||
if (update_db)
|
|
||||||
{
|
|
||||||
DynamicZonesRepository::UpdateReplayOnJoin(GetDatabase(), m_id, enabled);
|
|
||||||
|
|
||||||
ServerPacket pack(ServerOP_DzReplayOnJoin, sizeof(ServerDzBool_Struct));
|
|
||||||
auto buf = reinterpret_cast<ServerDzBool_Struct*>(pack.pBuffer);
|
|
||||||
buf->dz_id = GetID();
|
|
||||||
buf->sender_zone_id = GetCurrentZoneID();
|
|
||||||
buf->sender_instance_id = GetCurrentInstanceID();
|
|
||||||
buf->enabled = enabled;
|
|
||||||
SendServerPacket(&pack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t DynamicZoneBase::GetSecondsRemaining() const
|
uint32_t DynamicZoneBase::GetSecondsRemaining() const
|
||||||
{
|
{
|
||||||
auto remaining = std::chrono::duration_cast<std::chrono::seconds>(GetDurationRemaining()).count();
|
auto remaining = std::chrono::duration_cast<std::chrono::seconds>(GetDurationRemaining()).count();
|
||||||
@@ -532,13 +478,13 @@ void DynamicZoneBase::RemoveInternalMember(uint32_t character_id)
|
|||||||
), m_members.end());
|
), m_members.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DynamicZoneBase::HasMember(uint32_t character_id) const
|
bool DynamicZoneBase::HasMember(uint32_t character_id)
|
||||||
{
|
{
|
||||||
return std::any_of(m_members.begin(), m_members.end(),
|
return std::any_of(m_members.begin(), m_members.end(),
|
||||||
[&](const DynamicZoneMember& member) { return member.id == character_id; });
|
[&](const DynamicZoneMember& member) { return member.id == character_id; });
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DynamicZoneBase::HasMember(const std::string& character_name) const
|
bool DynamicZoneBase::HasMember(const std::string& character_name)
|
||||||
{
|
{
|
||||||
return std::any_of(m_members.begin(), m_members.end(),
|
return std::any_of(m_members.begin(), m_members.end(),
|
||||||
[&](const DynamicZoneMember& member) {
|
[&](const DynamicZoneMember& member) {
|
||||||
@@ -644,34 +590,35 @@ std::string DynamicZoneBase::GetDynamicZoneTypeName(DynamicZoneType dz_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<ServerPacket> DynamicZoneBase::CreateServerPacket(uint16_t zone_id, uint16_t instance_id)
|
EQ::Net::DynamicPacket DynamicZoneBase::GetSerializedDzPacket()
|
||||||
{
|
{
|
||||||
std::ostringstream ss = GetSerialized();
|
EQ::Net::DynamicPacket dyn_pack;
|
||||||
std::string_view sv = ss.view();
|
dyn_pack.PutSerialize(0, *this);
|
||||||
|
|
||||||
auto pack_size = sizeof(ServerDzCreate_Struct) + sv.size();
|
LogDynamicZonesDetail("Serialized server dz size [{}]", dyn_pack.Length());
|
||||||
|
return dyn_pack;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<ServerPacket> DynamicZoneBase::CreateServerDzCreatePacket(
|
||||||
|
uint16_t origin_zone_id, uint16_t origin_instance_id)
|
||||||
|
{
|
||||||
|
EQ::Net::DynamicPacket dyn_pack = GetSerializedDzPacket();
|
||||||
|
|
||||||
|
auto pack_size = sizeof(ServerDzCreateSerialized_Struct) + dyn_pack.Length();
|
||||||
auto pack = std::make_unique<ServerPacket>(ServerOP_DzCreated, static_cast<uint32_t>(pack_size));
|
auto pack = std::make_unique<ServerPacket>(ServerOP_DzCreated, static_cast<uint32_t>(pack_size));
|
||||||
auto buf = reinterpret_cast<ServerDzCreate_Struct*>(pack->pBuffer);
|
auto buf = reinterpret_cast<ServerDzCreateSerialized_Struct*>(pack->pBuffer);
|
||||||
buf->origin_zone_id = zone_id;
|
buf->origin_zone_id = origin_zone_id;
|
||||||
buf->origin_instance_id = instance_id;
|
buf->origin_instance_id = origin_instance_id;
|
||||||
buf->dz_id = GetID();
|
buf->cereal_size = static_cast<uint32_t>(dyn_pack.Length());
|
||||||
buf->cereal_size = static_cast<uint32_t>(sv.size());
|
memcpy(buf->cereal_data, dyn_pack.Data(), dyn_pack.Length());
|
||||||
memcpy(buf->cereal_data, sv.data(), sv.size());
|
|
||||||
|
|
||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostringstream DynamicZoneBase::GetSerialized()
|
void DynamicZoneBase::LoadSerializedDzPacket(char* cereal_data, uint32_t cereal_size)
|
||||||
{
|
{
|
||||||
std::ostringstream ss;
|
LogDynamicZonesDetail("Deserializing server dz size [{}]", cereal_size);
|
||||||
cereal::BinaryOutputArchive archive(ss);
|
EQ::Util::MemoryStreamReader ss(cereal_data, cereal_size);
|
||||||
archive(*this);
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::Unserialize(std::span<char> buf)
|
|
||||||
{
|
|
||||||
EQ::Util::MemoryStreamReader ss(buf.data(), buf.size());
|
|
||||||
cereal::BinaryInputArchive archive(ss);
|
cereal::BinaryInputArchive archive(ss);
|
||||||
archive(*this);
|
archive(*this);
|
||||||
}
|
}
|
||||||
@@ -700,180 +647,3 @@ void DynamicZoneBase::LoadTemplate(const DynamicZoneTemplatesRepository::Dynamic
|
|||||||
m_zonein.z = dz_template.zone_in_z;
|
m_zonein.z = dz_template.zone_in_z;
|
||||||
m_zonein.heading = dz_template.zone_in_h;
|
m_zonein.heading = dz_template.zone_in_h;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<uint32_t> DynamicZoneBase::GetMemberIds()
|
|
||||||
{
|
|
||||||
std::vector<uint32_t> ids;
|
|
||||||
ids.reserve(m_members.size());
|
|
||||||
for (const auto& member : m_members)
|
|
||||||
{
|
|
||||||
ids.push_back(member.id);
|
|
||||||
}
|
|
||||||
return ids;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DynamicZoneBase::HasLockout(const std::string& event)
|
|
||||||
{
|
|
||||||
return std::ranges::any_of(m_lockouts, [&](const auto& l) { return l.IsEvent(event); });
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DynamicZoneBase::HasReplayLockout()
|
|
||||||
{
|
|
||||||
return HasLockout(DzLockout::ReplayTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::AddLockout(const std::string& event, uint32_t seconds)
|
|
||||||
{
|
|
||||||
auto lockout = DzLockout::Create(m_name, event, seconds, m_uuid);
|
|
||||||
AddLockout(lockout);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::AddLockout(const DzLockout& lockout, bool members_only)
|
|
||||||
{
|
|
||||||
if (!members_only)
|
|
||||||
{
|
|
||||||
DynamicZoneLockoutsRepository::InsertLockouts(GetDatabase(), GetID(), { lockout });
|
|
||||||
}
|
|
||||||
|
|
||||||
CharacterExpeditionLockoutsRepository::InsertLockout(GetDatabase(), GetMemberIds(), lockout);
|
|
||||||
|
|
||||||
HandleLockoutUpdate(lockout, false, members_only);
|
|
||||||
SendServerPacket(CreateLockoutPacket(lockout, false, members_only).get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::AddLockoutDuration(const std::string& event, int seconds, bool members_only)
|
|
||||||
{
|
|
||||||
auto lockout = DzLockout::Create(m_name, event, std::max(0, seconds), m_uuid);
|
|
||||||
|
|
||||||
// lockout has unsigned duration, pass original seconds to support reducing existing timers
|
|
||||||
int secs = static_cast<int>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
|
||||||
CharacterExpeditionLockoutsRepository::AddLockoutDuration(GetDatabase(), GetMemberIds(), lockout, secs);
|
|
||||||
|
|
||||||
HandleLockoutDuration(lockout, seconds, members_only, true);
|
|
||||||
SendServerPacket(CreateLockoutDurationPacket(lockout, seconds, members_only).get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::UpdateLockoutDuration(const std::string& event, uint32_t seconds, bool members_only)
|
|
||||||
{
|
|
||||||
// some live expeditions update existing lockout timers during progression
|
|
||||||
auto it = std::ranges::find_if(m_lockouts, [&](const auto& l) { return l.IsEvent(event); });
|
|
||||||
if (it != m_lockouts.end())
|
|
||||||
{
|
|
||||||
seconds = static_cast<uint32_t>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
|
||||||
DzLockout lockout(m_uuid, m_name, event, it->GetStartTime() + seconds, seconds);
|
|
||||||
AddLockout(lockout, members_only);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::RemoveLockout(const std::string& event)
|
|
||||||
{
|
|
||||||
DynamicZoneLockoutsRepository::DeleteWhere(GetDatabase(), fmt::format(
|
|
||||||
"dynamic_zone_id = {} AND event_name = '{}'", GetID(), Strings::Escape(event)));
|
|
||||||
|
|
||||||
CharacterExpeditionLockoutsRepository::DeleteWhere(GetDatabase(), fmt::format(
|
|
||||||
"character_id IN ({}) AND expedition_name = '{}' AND event_name = '{}'",
|
|
||||||
fmt::join(GetMemberIds(), ","), Strings::Escape(m_name), Strings::Escape(event)));
|
|
||||||
|
|
||||||
DzLockout lockout{m_uuid, m_name, event, 0, 0};
|
|
||||||
HandleLockoutUpdate(lockout, true, false);
|
|
||||||
SendServerPacket(CreateLockoutPacket(lockout, true).get());
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::HandleLockoutUpdate(const DzLockout& lockout, bool remove, bool members_only)
|
|
||||||
{
|
|
||||||
if (!members_only)
|
|
||||||
{
|
|
||||||
std::erase_if(m_lockouts, [&](const auto& l) { return l.IsEvent(lockout.Event()); });
|
|
||||||
if (!remove)
|
|
||||||
{
|
|
||||||
m_lockouts.push_back(lockout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::HandleLockoutDuration(const DzLockout& lockout, int seconds, bool members_only, bool insert_db)
|
|
||||||
{
|
|
||||||
if (!members_only)
|
|
||||||
{
|
|
||||||
auto it = std::ranges::find_if(m_lockouts, [&](const auto& l) { return l.IsEvent(lockout.Event()); });
|
|
||||||
if (it != m_lockouts.end())
|
|
||||||
{
|
|
||||||
it->AddLockoutTime(seconds);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
it = m_lockouts.insert(m_lockouts.end(), lockout);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (insert_db)
|
|
||||||
{
|
|
||||||
DynamicZoneLockoutsRepository::InsertLockouts(GetDatabase(), GetID(), { *it });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<ServerPacket> DynamicZoneBase::CreateLockoutPacket(const DzLockout& lockout, bool remove, bool members_only) const
|
|
||||||
{
|
|
||||||
uint32_t pack_size = sizeof(ServerDzLockout_Struct);
|
|
||||||
auto pack = std::make_unique<ServerPacket>(ServerOP_DzLockout, pack_size);
|
|
||||||
auto buf = reinterpret_cast<ServerDzLockout_Struct*>(pack->pBuffer);
|
|
||||||
buf->dz_id = GetID();
|
|
||||||
buf->expire_time = lockout.GetExpireTime();
|
|
||||||
buf->duration = lockout.GetDuration();
|
|
||||||
buf->sender_zone_id = GetCurrentZoneID();
|
|
||||||
buf->sender_instance_id = GetCurrentInstanceID();
|
|
||||||
buf->remove = remove;
|
|
||||||
buf->members_only = members_only;
|
|
||||||
strn0cpy(buf->event_name, lockout.Event().c_str(), sizeof(buf->event_name));
|
|
||||||
return pack;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unique_ptr<ServerPacket> DynamicZoneBase::CreateLockoutDurationPacket(const DzLockout& lockout, int seconds, bool members_only) const
|
|
||||||
{
|
|
||||||
uint32_t pack_size = sizeof(ServerDzLockout_Struct);
|
|
||||||
auto pack = std::make_unique<ServerPacket>(ServerOP_DzLockoutDuration, pack_size);
|
|
||||||
auto buf = reinterpret_cast<ServerDzLockout_Struct*>(pack->pBuffer);
|
|
||||||
buf->dz_id = GetID();
|
|
||||||
buf->expire_time = lockout.GetExpireTime();
|
|
||||||
buf->duration = lockout.GetDuration();
|
|
||||||
buf->sender_zone_id = GetCurrentZoneID();
|
|
||||||
buf->sender_instance_id = GetCurrentInstanceID();
|
|
||||||
buf->members_only = members_only;
|
|
||||||
buf->seconds = seconds;
|
|
||||||
strn0cpy(buf->event_name, lockout.Event().c_str(), sizeof(buf->event_name));
|
|
||||||
return pack;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DynamicZoneBase::SyncCharacterLockouts(uint32_t char_id, std::vector<DzLockout>& lockouts)
|
|
||||||
{
|
|
||||||
// adds missing event lockouts to client for this expedition and updates
|
|
||||||
// client timers that are both shorter and from another expedition
|
|
||||||
bool modified = false;
|
|
||||||
|
|
||||||
for (const auto& lockout : m_lockouts)
|
|
||||||
{
|
|
||||||
if (lockout.IsReplay() || lockout.IsExpired() || lockout.UUID() != m_uuid)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto it = std::find_if(lockouts.begin(), lockouts.end(), [&](const DzLockout& l) { return l.IsSame(lockout); });
|
|
||||||
if (it == lockouts.end())
|
|
||||||
{
|
|
||||||
modified = true;
|
|
||||||
lockouts.push_back(lockout); // insert missing
|
|
||||||
}
|
|
||||||
else if (it->GetSecondsRemaining() < lockout.GetSecondsRemaining() && it->UUID() != m_uuid)
|
|
||||||
{
|
|
||||||
// only update lockout timer not uuid so loot event apis still work
|
|
||||||
modified = true;
|
|
||||||
it->SetDuration(lockout.GetDuration());
|
|
||||||
it->SetExpireTime(lockout.GetExpireTime());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modified)
|
|
||||||
{
|
|
||||||
CharacterExpeditionLockoutsRepository::InsertLockouts(GetDatabase(), char_id, lockouts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+14
-68
@@ -1,8 +1,8 @@
|
|||||||
#ifndef COMMON_DYNAMIC_ZONE_BASE_H
|
#ifndef COMMON_DYNAMIC_ZONE_BASE_H
|
||||||
#define COMMON_DYNAMIC_ZONE_BASE_H
|
#define COMMON_DYNAMIC_ZONE_BASE_H
|
||||||
|
|
||||||
#include "dynamic_zone_lockout.h"
|
|
||||||
#include "eq_constants.h"
|
#include "eq_constants.h"
|
||||||
|
#include "net/packet.h"
|
||||||
#include "repositories/dynamic_zones_repository.h"
|
#include "repositories/dynamic_zones_repository.h"
|
||||||
#include "repositories/dynamic_zone_members_repository.h"
|
#include "repositories/dynamic_zone_members_repository.h"
|
||||||
#include "repositories/dynamic_zone_templates_repository.h"
|
#include "repositories/dynamic_zone_templates_repository.h"
|
||||||
@@ -10,40 +10,12 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <span>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
class ServerPacket;
|
class ServerPacket;
|
||||||
|
|
||||||
// message string 8312 added in September 08 2020 Test patch (used by both dz and shared tasks)
|
|
||||||
inline constexpr char DzNotAllAdded[] = "Not all players in your {0} were added to the {1}. The {1} can take a maximum of {2} players, and your {0} has {3}.";
|
|
||||||
|
|
||||||
enum class DzLockMsg : uint8_t
|
|
||||||
{
|
|
||||||
None = 0, Close, Begin
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class DynamicZoneType
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
Expedition,
|
|
||||||
Tutorial,
|
|
||||||
Task,
|
|
||||||
Mission, // Shared Task
|
|
||||||
Quest
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class DynamicZoneMemberStatus
|
|
||||||
{
|
|
||||||
Unknown = 0,
|
|
||||||
Online,
|
|
||||||
Offline,
|
|
||||||
InDynamicZone,
|
|
||||||
LinkDead
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DynamicZoneMember
|
struct DynamicZoneMember
|
||||||
{
|
{
|
||||||
uint32_t id = 0;
|
uint32_t id = 0;
|
||||||
@@ -121,7 +93,6 @@ public:
|
|||||||
const std::string& GetName() const { return m_name; }
|
const std::string& GetName() const { return m_name; }
|
||||||
const std::string& GetUUID() const { return m_uuid; }
|
const std::string& GetUUID() const { return m_uuid; }
|
||||||
const DynamicZoneMember& GetLeader() const { return m_leader; }
|
const DynamicZoneMember& GetLeader() const { return m_leader; }
|
||||||
const std::vector<DzLockout>& GetLockouts() const { return m_lockouts; }
|
|
||||||
const std::vector<DynamicZoneMember>& GetMembers() const { return m_members; }
|
const std::vector<DynamicZoneMember>& GetMembers() const { return m_members; }
|
||||||
const DynamicZoneLocation& GetCompassLocation() const { return m_compass; }
|
const DynamicZoneLocation& GetCompassLocation() const { return m_compass; }
|
||||||
const DynamicZoneLocation& GetSafeReturnLocation() const { return m_safereturn; }
|
const DynamicZoneLocation& GetSafeReturnLocation() const { return m_safereturn; }
|
||||||
@@ -133,34 +104,31 @@ public:
|
|||||||
uint32_t GetDatabaseMemberCount();
|
uint32_t GetDatabaseMemberCount();
|
||||||
DynamicZoneMember GetMemberData(uint32_t character_id);
|
DynamicZoneMember GetMemberData(uint32_t character_id);
|
||||||
DynamicZoneMember GetMemberData(const std::string& character_name);
|
DynamicZoneMember GetMemberData(const std::string& character_name);
|
||||||
std::vector<uint32_t> GetMemberIds();
|
EQ::Net::DynamicPacket GetSerializedDzPacket();
|
||||||
std::ostringstream GetSerialized();
|
|
||||||
bool HasDatabaseMember(uint32_t character_id);
|
bool HasDatabaseMember(uint32_t character_id);
|
||||||
bool HasMember(uint32_t character_id) const;
|
bool HasMember(uint32_t character_id);
|
||||||
bool HasMember(const std::string& character_name) const;
|
bool HasMember(const std::string& character_name);
|
||||||
bool HasMembers() const { return !m_members.empty(); }
|
bool HasMembers() const { return !m_members.empty(); }
|
||||||
bool HasZoneInLocation() const { return m_has_zonein; }
|
bool HasZoneInLocation() const { return m_has_zonein; }
|
||||||
bool IsExpedition() const { return m_type == DynamicZoneType::Expedition; }
|
|
||||||
bool IsExpired() const { return m_expire_time < std::chrono::system_clock::now(); }
|
bool IsExpired() const { return m_expire_time < std::chrono::system_clock::now(); }
|
||||||
bool IsInstanceID(uint32_t instance_id) const { return (m_instance_id != 0 && m_instance_id == instance_id); }
|
bool IsInstanceID(uint32_t instance_id) const { return (m_instance_id != 0 && m_instance_id == instance_id); }
|
||||||
bool IsLocked() const { return m_is_locked; }
|
|
||||||
bool IsValid() const { return m_instance_id != 0; }
|
bool IsValid() const { return m_instance_id != 0; }
|
||||||
bool IsSameDz(uint32_t zone_id, uint32_t instance_id) const { return zone_id == m_zone_id && instance_id == m_instance_id; }
|
bool IsSameDz(uint32_t zone_id, uint32_t instance_id) const { return zone_id == m_zone_id && instance_id == m_instance_id; }
|
||||||
|
void LoadSerializedDzPacket(char* cereal_data, uint32_t cereal_size);
|
||||||
void LoadTemplate(const DynamicZoneTemplatesRepository::DynamicZoneTemplates& dz_template);
|
void LoadTemplate(const DynamicZoneTemplatesRepository::DynamicZoneTemplates& dz_template);
|
||||||
void RemoveAllMembers();
|
void RemoveAllMembers();
|
||||||
bool RemoveMember(uint32_t character_id);
|
bool RemoveMember(uint32_t character_id);
|
||||||
bool RemoveMember(const std::string& character_name);
|
bool RemoveMember(const std::string& character_name);
|
||||||
bool RemoveMember(const DynamicZoneMember& remove_member);
|
bool RemoveMember(const DynamicZoneMember& remove_member);
|
||||||
|
void SaveMembers(const std::vector<DynamicZoneMember>& members);
|
||||||
void SetCompass(const DynamicZoneLocation& location, bool update_db = false);
|
void SetCompass(const DynamicZoneLocation& location, bool update_db = false);
|
||||||
void SetCompass(uint32_t zone_id, float x, float y, float z, bool update_db = false);
|
void SetCompass(uint32_t zone_id, float x, float y, float z, bool update_db = false);
|
||||||
void SetDuration(uint32_t seconds) { m_duration = std::chrono::seconds(seconds); }
|
void SetDuration(uint32_t seconds) { m_duration = std::chrono::seconds(seconds); }
|
||||||
void SetLeader(const DynamicZoneMember& leader, bool update_db = false);
|
void SetLeader(const DynamicZoneMember& leader, bool update_db = false);
|
||||||
void SetLocked(bool lock, bool update_db = false, DzLockMsg lock_msg = DzLockMsg::None, uint32_t color = Chat::Yellow);
|
|
||||||
void SetMaxPlayers(uint32_t max_players) { m_max_players = max_players; }
|
void SetMaxPlayers(uint32_t max_players) { m_max_players = max_players; }
|
||||||
void SetMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status);
|
void SetMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status);
|
||||||
void SetMinPlayers(uint32_t min_players) { m_min_players = min_players; }
|
void SetMinPlayers(uint32_t min_players) { m_min_players = min_players; }
|
||||||
void SetName(const std::string& name) { m_name = name; }
|
void SetName(const std::string& name) { m_name = name; }
|
||||||
void SetReplayOnJoin(bool enabled, bool update_db = false);
|
|
||||||
void SetSafeReturn(const DynamicZoneLocation& location, bool update_db = false);
|
void SetSafeReturn(const DynamicZoneLocation& location, bool update_db = false);
|
||||||
void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading, bool update_db = false);
|
void SetSafeReturn(uint32_t zone_id, float x, float y, float z, float heading, bool update_db = false);
|
||||||
void SetSwitchID(int dz_switch_id, bool update_db = false);
|
void SetSwitchID(int dz_switch_id, bool update_db = false);
|
||||||
@@ -168,48 +136,34 @@ public:
|
|||||||
void SetUUID(std::string uuid) { m_uuid = std::move(uuid); }
|
void SetUUID(std::string uuid) { m_uuid = std::move(uuid); }
|
||||||
void SetZoneInLocation(const DynamicZoneLocation& location, bool update_db = false);
|
void SetZoneInLocation(const DynamicZoneLocation& location, bool update_db = false);
|
||||||
void SetZoneInLocation(float x, float y, float z, float heading, bool update_db = false);
|
void SetZoneInLocation(float x, float y, float z, float heading, bool update_db = false);
|
||||||
bool SwapMember(const DynamicZoneMember& add_member, const std::string& remove_name);
|
bool SwapMember(const DynamicZoneMember& add_member, const std::string& remove_char_name);
|
||||||
|
|
||||||
void AddLockout(const std::string& event, uint32_t seconds);
|
|
||||||
void AddLockoutDuration(const std::string& event, int seconds, bool members_only = true);
|
|
||||||
bool HasLockout(const std::string& event);
|
|
||||||
bool HasReplayLockout();
|
|
||||||
void RemoveLockout(const std::string& event);
|
|
||||||
void SyncCharacterLockouts(uint32_t char_id, std::vector<DzLockout>& lockouts);
|
|
||||||
void UpdateLockoutDuration(const std::string& event, uint32_t seconds, bool members_only = true);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual uint16_t GetCurrentInstanceID() const { return 0; }
|
virtual uint16_t GetCurrentInstanceID() { return 0; }
|
||||||
virtual uint16_t GetCurrentZoneID() const { return 0; }
|
virtual uint16_t GetCurrentZoneID() { return 0; }
|
||||||
virtual Database& GetDatabase() = 0;
|
virtual Database& GetDatabase() = 0;
|
||||||
virtual void HandleLockoutDuration(const DzLockout& lockout, int seconds, bool members_only, bool insert_db);
|
|
||||||
virtual void HandleLockoutUpdate(const DzLockout& lockout, bool remove, bool members_only);
|
|
||||||
virtual void ProcessCompassChange(const DynamicZoneLocation& location) { m_compass = location; }
|
virtual void ProcessCompassChange(const DynamicZoneLocation& location) { m_compass = location; }
|
||||||
virtual void ProcessMemberAddRemove(const DynamicZoneMember& member, bool removed);
|
virtual void ProcessMemberAddRemove(const DynamicZoneMember& member, bool removed);
|
||||||
virtual bool ProcessMemberStatusChange(uint32_t character_id, DynamicZoneMemberStatus status);
|
virtual bool ProcessMemberStatusChange(uint32_t member_id, DynamicZoneMemberStatus status);
|
||||||
virtual void ProcessRemoveAllMembers() { m_members.clear(); }
|
virtual void ProcessRemoveAllMembers(bool silent = false) { m_members.clear(); }
|
||||||
virtual void ProcessSetSwitchID(int dz_switch_id) { m_dz_switch_id = dz_switch_id; }
|
virtual void ProcessSetSwitchID(int dz_switch_id) { m_dz_switch_id = dz_switch_id; }
|
||||||
virtual bool SendServerPacket(ServerPacket* packet) = 0;
|
virtual bool SendServerPacket(ServerPacket* packet) = 0;
|
||||||
|
|
||||||
void AddLockout(const DzLockout& lockout, bool members_only = false);
|
|
||||||
void AddInternalMember(const DynamicZoneMember& member);
|
void AddInternalMember(const DynamicZoneMember& member);
|
||||||
uint32_t Create();
|
uint32_t Create();
|
||||||
uint32_t CreateInstance();
|
uint32_t CreateInstance();
|
||||||
void LoadRepositoryResult(DynamicZonesRepository::DynamicZoneInstance&& dz_entry);
|
void LoadRepositoryResult(DynamicZonesRepository::DynamicZoneInstance&& dz_entry);
|
||||||
void RemoveInternalMember(uint32_t character_id);
|
void RemoveInternalMember(uint32_t character_id);
|
||||||
void SaveMembers(const std::vector<DynamicZoneMember>& members);
|
|
||||||
uint32_t SaveToDatabase();
|
uint32_t SaveToDatabase();
|
||||||
bool SetInternalMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status);
|
bool SetInternalMemberStatus(uint32_t character_id, DynamicZoneMemberStatus status);
|
||||||
|
|
||||||
std::unique_ptr<ServerPacket> CreateServerPacket(uint16_t zone_id, uint16_t instance_id);
|
std::unique_ptr<ServerPacket> CreateServerDzCreatePacket(uint16_t origin_zone_id, uint16_t origin_instance_id);
|
||||||
std::unique_ptr<ServerPacket> CreateServerDzLocationPacket(uint16_t server_opcode, const DynamicZoneLocation& location);
|
std::unique_ptr<ServerPacket> CreateServerDzLocationPacket(uint16_t server_opcode, const DynamicZoneLocation& location);
|
||||||
std::unique_ptr<ServerPacket> CreateServerDzSwitchIDPacket();
|
std::unique_ptr<ServerPacket> CreateServerDzSwitchIDPacket();
|
||||||
std::unique_ptr<ServerPacket> CreateServerMemberAddRemovePacket(const DynamicZoneMember& member, bool removed);
|
std::unique_ptr<ServerPacket> CreateServerMemberAddRemovePacket(const DynamicZoneMember& member, bool removed);
|
||||||
std::unique_ptr<ServerPacket> CreateServerMemberStatusPacket(uint32_t character_id, DynamicZoneMemberStatus status);
|
std::unique_ptr<ServerPacket> CreateServerMemberStatusPacket(uint32_t character_id, DynamicZoneMemberStatus status);
|
||||||
std::unique_ptr<ServerPacket> CreateServerMemberSwapPacket(const DynamicZoneMember& remove_member, const DynamicZoneMember& add_member);
|
std::unique_ptr<ServerPacket> CreateServerMemberSwapPacket(const DynamicZoneMember& remove_member, const DynamicZoneMember& add_member);
|
||||||
std::unique_ptr<ServerPacket> CreateServerRemoveAllMembersPacket();
|
std::unique_ptr<ServerPacket> CreateServerRemoveAllMembersPacket();
|
||||||
std::unique_ptr<ServerPacket> CreateLockoutPacket(const DzLockout& lockout, bool remove, bool members_only = false) const;
|
|
||||||
std::unique_ptr<ServerPacket> CreateLockoutDurationPacket(const DzLockout& lockout, int seconds, bool members_only = false) const;
|
|
||||||
|
|
||||||
uint32_t m_id = 0;
|
uint32_t m_id = 0;
|
||||||
uint32_t m_zone_id = 0;
|
uint32_t m_zone_id = 0;
|
||||||
@@ -221,8 +175,6 @@ protected:
|
|||||||
bool m_never_expires = false;
|
bool m_never_expires = false;
|
||||||
bool m_has_zonein = false;
|
bool m_has_zonein = false;
|
||||||
bool m_has_member_statuses = false;
|
bool m_has_member_statuses = false;
|
||||||
bool m_is_locked = false;
|
|
||||||
bool m_add_replay = true;
|
|
||||||
std::string m_name;
|
std::string m_name;
|
||||||
std::string m_uuid;
|
std::string m_uuid;
|
||||||
DynamicZoneMember m_leader;
|
DynamicZoneMember m_leader;
|
||||||
@@ -230,15 +182,12 @@ protected:
|
|||||||
DynamicZoneLocation m_compass;
|
DynamicZoneLocation m_compass;
|
||||||
DynamicZoneLocation m_safereturn;
|
DynamicZoneLocation m_safereturn;
|
||||||
DynamicZoneLocation m_zonein;
|
DynamicZoneLocation m_zonein;
|
||||||
std::chrono::seconds m_duration = {};
|
std::chrono::seconds m_duration;
|
||||||
std::chrono::time_point<std::chrono::system_clock> m_start_time;
|
std::chrono::time_point<std::chrono::system_clock> m_start_time;
|
||||||
std::chrono::time_point<std::chrono::system_clock> m_expire_time;
|
std::chrono::time_point<std::chrono::system_clock> m_expire_time;
|
||||||
std::vector<DynamicZoneMember> m_members;
|
std::vector<DynamicZoneMember> m_members;
|
||||||
std::vector<DzLockout> m_lockouts;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Unserialize(std::span<char> buf);
|
|
||||||
|
|
||||||
template<class Archive>
|
template<class Archive>
|
||||||
void serialize(Archive& archive)
|
void serialize(Archive& archive)
|
||||||
{
|
{
|
||||||
@@ -253,8 +202,6 @@ public:
|
|||||||
m_never_expires,
|
m_never_expires,
|
||||||
m_has_zonein,
|
m_has_zonein,
|
||||||
m_has_member_statuses,
|
m_has_member_statuses,
|
||||||
m_is_locked,
|
|
||||||
m_add_replay,
|
|
||||||
m_name,
|
m_name,
|
||||||
m_uuid,
|
m_uuid,
|
||||||
m_leader,
|
m_leader,
|
||||||
@@ -265,8 +212,7 @@ public:
|
|||||||
m_duration,
|
m_duration,
|
||||||
m_start_time,
|
m_start_time,
|
||||||
m_expire_time,
|
m_expire_time,
|
||||||
m_members,
|
m_members
|
||||||
m_lockouts
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
#include "dynamic_zone_lockout.h"
|
|
||||||
#include "strings.h"
|
|
||||||
#include "rulesys.h"
|
|
||||||
#include "util/uuid.h"
|
|
||||||
#include <fmt/format.h>
|
|
||||||
#include <cereal/types/chrono.hpp>
|
|
||||||
|
|
||||||
DzLockout::DzLockout(std::string uuid, std::string expedition, std::string event, uint64_t expire_time, uint32_t duration)
|
|
||||||
: m_uuid(std::move(uuid))
|
|
||||||
, m_name(std::move(expedition))
|
|
||||||
, m_event(std::move(event))
|
|
||||||
, m_expire_time(std::chrono::system_clock::from_time_t(expire_time))
|
|
||||||
, m_duration(duration)
|
|
||||||
{
|
|
||||||
m_is_replay = m_event == ReplayTimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
DzLockout::DzLockout(std::string_view name, BaseDynamicZoneLockoutsRepository::DynamicZoneLockouts&& lockout)
|
|
||||||
: m_uuid(std::move(lockout.from_expedition_uuid))
|
|
||||||
, m_name(name)
|
|
||||||
, m_event(std::move(lockout.event_name))
|
|
||||||
, m_expire_time(std::chrono::system_clock::from_time_t(lockout.expire_time))
|
|
||||||
, m_duration(lockout.duration)
|
|
||||||
{
|
|
||||||
m_is_replay = m_event == ReplayTimer;
|
|
||||||
}
|
|
||||||
|
|
||||||
DzLockout DzLockout::Create(const std::string& expedition, const std::string& event, uint32_t seconds, std::string uuid)
|
|
||||||
{
|
|
||||||
seconds = static_cast<uint32_t>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
|
||||||
|
|
||||||
if (uuid.empty())
|
|
||||||
{
|
|
||||||
uuid = EQ::Util::UUID::Generate().ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
DzLockout lockout{uuid, expedition, event, 0, seconds};
|
|
||||||
lockout.Reset(); // sets expire time
|
|
||||||
return lockout;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t DzLockout::GetSecondsRemaining() const
|
|
||||||
{
|
|
||||||
auto now = std::chrono::system_clock::now();
|
|
||||||
if (m_expire_time > now)
|
|
||||||
{
|
|
||||||
auto remaining = m_expire_time - now;
|
|
||||||
return static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::seconds>(remaining).count());
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
DzLockout::TimeStrings DzLockout::GetTimeRemainingStrs() const
|
|
||||||
{
|
|
||||||
auto seconds = GetSecondsRemaining();
|
|
||||||
return DzLockout::TimeStrings{
|
|
||||||
fmt::format_int(seconds / 86400).str(), // days
|
|
||||||
fmt::format_int(seconds / 3600 % 24).str(), // hours
|
|
||||||
fmt::format_int(seconds / 60 % 60).str(), // minutes
|
|
||||||
fmt::format_int(seconds % 60).str() // seconds
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DzLockout::IsSame(const DzLockout& other) const
|
|
||||||
{
|
|
||||||
return other.IsSame(m_name, m_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DzLockout::IsSame(const std::string& expedition, const std::string& event) const
|
|
||||||
{
|
|
||||||
return m_name == expedition && m_event == event;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DzLockout::AddLockoutTime(int seconds)
|
|
||||||
{
|
|
||||||
seconds = static_cast<int>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
|
||||||
|
|
||||||
auto new_duration = std::max(0, static_cast<int>(m_duration.count()) + seconds);
|
|
||||||
|
|
||||||
auto start_time = m_expire_time - m_duration;
|
|
||||||
m_duration = std::chrono::seconds(new_duration);
|
|
||||||
m_expire_time = start_time + m_duration;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void DzLockout::serialize(T& archive)
|
|
||||||
{
|
|
||||||
archive(m_is_replay, m_uuid, m_name, m_event, m_duration, m_expire_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
template void DzLockout::serialize(cereal::BinaryOutputArchive&);
|
|
||||||
template void DzLockout::serialize(cereal::BinaryInputArchive&);
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <string>
|
|
||||||
#include "repositories/base/base_dynamic_zone_lockouts_repository.h"
|
|
||||||
|
|
||||||
class DzLockout
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DzLockout() = default;
|
|
||||||
DzLockout(std::string uuid, std::string expedition, std::string event, uint64_t expire_time, uint32_t duration);
|
|
||||||
DzLockout(std::string_view name, BaseDynamicZoneLockoutsRepository::DynamicZoneLockouts&& lockout);
|
|
||||||
|
|
||||||
static constexpr char ReplayTimer[] = "Replay Timer";
|
|
||||||
|
|
||||||
static DzLockout Create(const std::string& expedition, const std::string& event, uint32_t seconds, std::string uuid = {});
|
|
||||||
|
|
||||||
struct TimeStrings
|
|
||||||
{
|
|
||||||
std::string days;
|
|
||||||
std::string hours;
|
|
||||||
std::string mins;
|
|
||||||
std::string secs;
|
|
||||||
};
|
|
||||||
|
|
||||||
void AddLockoutTime(int seconds);
|
|
||||||
uint32_t GetDuration() const { return static_cast<uint32_t>(m_duration.count()); }
|
|
||||||
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
|
|
||||||
uint64_t GetStartTime() const { return std::chrono::system_clock::to_time_t(m_expire_time - m_duration); }
|
|
||||||
uint32_t GetSecondsRemaining() const;
|
|
||||||
TimeStrings GetTimeRemainingStrs() const;
|
|
||||||
const std::string& DzName() const { return m_name; }
|
|
||||||
const std::string& Event() const { return m_event; }
|
|
||||||
const std::string& UUID() const { return m_uuid; }
|
|
||||||
bool IsEvent(std::string_view event) const { return m_event == event; }
|
|
||||||
bool IsExpired() const { return GetSecondsRemaining() == 0; }
|
|
||||||
bool IsReplay() const { return m_is_replay; }
|
|
||||||
bool IsSame(const DzLockout& other) const;
|
|
||||||
bool IsSame(const std::string& expedition, const std::string& event) const;
|
|
||||||
bool IsUUID(const std::string& uuid) const { return uuid == m_uuid; }
|
|
||||||
void Reset() { m_expire_time = std::chrono::system_clock::now() + m_duration; }
|
|
||||||
void SetDuration(uint32_t seconds) { m_duration = std::chrono::seconds(seconds); }
|
|
||||||
void SetExpireTime(uint64_t expire_time) { m_expire_time = std::chrono::system_clock::from_time_t(expire_time); }
|
|
||||||
void SetUUID(const std::string& uuid) { m_uuid = uuid; }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void serialize(T& archive);
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool m_is_replay = false;
|
|
||||||
std::string m_uuid; // dz received in
|
|
||||||
std::string m_name;
|
|
||||||
std::string m_event;
|
|
||||||
std::chrono::seconds m_duration = {};
|
|
||||||
std::chrono::time_point<std::chrono::system_clock> m_expire_time;
|
|
||||||
};
|
|
||||||
+350
-222
@@ -22,6 +22,7 @@
|
|||||||
#include "data_verification.h"
|
#include "data_verification.h"
|
||||||
#include "eqemu_logsys.h"
|
#include "eqemu_logsys.h"
|
||||||
#include "eqemu_logsys_log_aliases.h"
|
#include "eqemu_logsys_log_aliases.h"
|
||||||
|
#include "languages.h"
|
||||||
#include "rulesys.h"
|
#include "rulesys.h"
|
||||||
|
|
||||||
int16 EQ::invtype::GetInvTypeSize(int16 inv_type) {
|
int16 EQ::invtype::GetInvTypeSize(int16 inv_type) {
|
||||||
@@ -59,85 +60,171 @@ int16 EQ::invtype::GetInvTypeSize(int16 inv_type) {
|
|||||||
return local_array[inv_type];
|
return local_array[inv_type];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Bug::GetID(const std::string& category_name)
|
const char* EQ::bug::CategoryIDToCategoryName(CategoryID category_id) {
|
||||||
{
|
switch (category_id) {
|
||||||
for (const auto& e : bug_category_names) {
|
case catVideo:
|
||||||
if (e.second == category_name) {
|
return "Video";
|
||||||
return e.first;
|
case catAudio:
|
||||||
}
|
return "Audio";
|
||||||
|
case catPathing:
|
||||||
|
return "Pathing";
|
||||||
|
case catQuest:
|
||||||
|
return "Quest";
|
||||||
|
case catTradeskills:
|
||||||
|
return "Tradeskills";
|
||||||
|
case catSpellStacking:
|
||||||
|
return "Spell stacking";
|
||||||
|
case catDoorsPortals:
|
||||||
|
return "Doors/Portals";
|
||||||
|
case catItems:
|
||||||
|
return "Items";
|
||||||
|
case catNPC:
|
||||||
|
return "NPC";
|
||||||
|
case catDialogs:
|
||||||
|
return "Dialogs";
|
||||||
|
case catLoNTCG:
|
||||||
|
return "LoN - TCG";
|
||||||
|
case catMercenaries:
|
||||||
|
return "Mercenaries";
|
||||||
|
case catOther:
|
||||||
|
default:
|
||||||
|
return "Other";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EQ::bug::CategoryID EQ::bug::CategoryNameToCategoryID(const char* category_name) {
|
||||||
|
if (!category_name)
|
||||||
|
return catOther;
|
||||||
|
|
||||||
|
if (!strcmp(category_name, "Video"))
|
||||||
|
return catVideo;
|
||||||
|
if (!strcmp(category_name, "Audio"))
|
||||||
|
return catAudio;
|
||||||
|
if (!strcmp(category_name, "Pathing"))
|
||||||
|
return catPathing;
|
||||||
|
if (!strcmp(category_name, "Quest"))
|
||||||
|
return catQuest;
|
||||||
|
if (!strcmp(category_name, "Tradeskills"))
|
||||||
|
return catTradeskills;
|
||||||
|
if (!strcmp(category_name, "Spell stacking"))
|
||||||
|
return catSpellStacking;
|
||||||
|
if (!strcmp(category_name, "Doors/Portals"))
|
||||||
|
return catDoorsPortals;
|
||||||
|
if (!strcmp(category_name, "Items"))
|
||||||
|
return catItems;
|
||||||
|
if (!strcmp(category_name, "NPC"))
|
||||||
|
return catNPC;
|
||||||
|
if (!strcmp(category_name, "Dialogs"))
|
||||||
|
return catDialogs;
|
||||||
|
if (!strcmp(category_name, "LoN - TCG"))
|
||||||
|
return catLoNTCG;
|
||||||
|
if (!strcmp(category_name, "Mercenaries"))
|
||||||
|
return catMercenaries;
|
||||||
|
|
||||||
|
return catOther;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *EQ::constants::GetStanceName(StanceType stance_type) {
|
||||||
|
switch (stance_type) {
|
||||||
|
case stanceUnknown:
|
||||||
|
return "Unknown";
|
||||||
|
case stancePassive:
|
||||||
|
return "Passive";
|
||||||
|
case stanceBalanced:
|
||||||
|
return "Balanced";
|
||||||
|
case stanceEfficient:
|
||||||
|
return "Efficient";
|
||||||
|
case stanceReactive:
|
||||||
|
return "Reactive";
|
||||||
|
case stanceAggressive:
|
||||||
|
return "Aggressive";
|
||||||
|
case stanceAssist:
|
||||||
|
return "Assist";
|
||||||
|
case stanceBurn:
|
||||||
|
return "Burn";
|
||||||
|
case stanceEfficient2:
|
||||||
|
return "Efficient2";
|
||||||
|
case stanceBurnAE:
|
||||||
|
return "BurnAE";
|
||||||
|
default:
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int EQ::constants::ConvertStanceTypeToIndex(StanceType stance_type) {
|
||||||
|
if (EQ::ValueWithin(stance_type, EQ::constants::stancePassive, EQ::constants::stanceBurnAE)) {
|
||||||
|
return (stance_type - EQ::constants::stancePassive);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Bug::Category::Other;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Bug::GetName(uint32 category_id)
|
const std::map<int, std::string>& EQ::constants::GetLanguageMap()
|
||||||
{
|
{
|
||||||
return IsValid(category_id) ? bug_category_names[category_id] : "UNKNOWN BUG CATEGORY";
|
static const std::map<int, std::string> language_map = {
|
||||||
}
|
{ LANG_COMMON_TONGUE, "Common Tongue" },
|
||||||
|
{ LANG_BARBARIAN, "Barbarian" },
|
||||||
bool Bug::IsValid(uint32 category_id)
|
{ LANG_ERUDIAN, "Erudian" },
|
||||||
{
|
{ LANG_ELVISH, "Elvish" },
|
||||||
return bug_category_names.find(category_id) != bug_category_names.end();
|
{ LANG_DARK_ELVISH, "Dark Elvish" },
|
||||||
}
|
{ LANG_DWARVISH, "Dwarvish" },
|
||||||
|
{ LANG_TROLL, "Troll" },
|
||||||
std::string Stance::GetName(uint8 stance_id)
|
{ LANG_OGRE, "Ogre" },
|
||||||
{
|
{ LANG_GNOMISH, "Gnomish" },
|
||||||
return IsValid(stance_id) ? stance_names[stance_id] : "UNKNOWN STANCE";
|
{ LANG_HALFLING, "Halfling" },
|
||||||
}
|
{ LANG_THIEVES_CANT, "Thieves Cant" },
|
||||||
|
{ LANG_OLD_ERUDIAN, "Old Erudian" },
|
||||||
bool Stance::IsValid(uint8 stance_id)
|
{ LANG_ELDER_ELVISH, "Elder Elvish" },
|
||||||
{
|
{ LANG_FROGLOK, "Froglok" },
|
||||||
return stance_names.find(stance_id) != stance_names.end();
|
{ LANG_GOBLIN, "Goblin" },
|
||||||
}
|
{ LANG_GNOLL, "Gnoll" },
|
||||||
|
{ LANG_COMBINE_TONGUE, "Combine Tongue" },
|
||||||
uint8 Stance::GetIndex(uint8 stance_id)
|
{ LANG_ELDER_TEIRDAL, "Elder Teirdal" },
|
||||||
{
|
{ LANG_LIZARDMAN, "Lizardman" },
|
||||||
return IsValid(stance_id) ? (stance_id - Stance::Passive) : 0;
|
{ LANG_ORCISH, "Orcish" },
|
||||||
}
|
{ LANG_FAERIE, "Faerie" },
|
||||||
|
{ LANG_DRAGON, "Dragon" },
|
||||||
const std::map<uint8, std::string>& EQ::constants::GetLanguageMap()
|
{ LANG_ELDER_DRAGON, "Elder Dragon" },
|
||||||
{
|
{ LANG_DARK_SPEECH, "Dark Speech" },
|
||||||
static const std::map<uint8, std::string> language_map = {
|
{ LANG_VAH_SHIR, "Vah Shir" },
|
||||||
{ Language::CommonTongue, "Common Tongue" },
|
{ LANG_ALARAN, "Alaran" },
|
||||||
{ Language::Barbarian, "Barbarian" },
|
{ LANG_HADAL, "Hadal" },
|
||||||
{ Language::Erudian, "Erudian" },
|
{ LANG_UNKNOWN, "Unknown" }
|
||||||
{ Language::Elvish, "Elvish" },
|
|
||||||
{ Language::DarkElvish, "Dark Elvish" },
|
|
||||||
{ Language::Dwarvish, "Dwarvish" },
|
|
||||||
{ Language::Troll, "Troll" },
|
|
||||||
{ Language::Ogre, "Ogre" },
|
|
||||||
{ Language::Gnomish, "Gnomish" },
|
|
||||||
{ Language::Halfling, "Halfling" },
|
|
||||||
{ Language::ThievesCant, "Thieves Cant" },
|
|
||||||
{ Language::OldErudian, "Old Erudian" },
|
|
||||||
{ Language::ElderElvish, "Elder Elvish" },
|
|
||||||
{ Language::Froglok, "Froglok" },
|
|
||||||
{ Language::Goblin, "Goblin" },
|
|
||||||
{ Language::Gnoll, "Gnoll" },
|
|
||||||
{ Language::CombineTongue, "Combine Tongue" },
|
|
||||||
{ Language::ElderTeirDal, "Elder Teir'Dal" },
|
|
||||||
{ Language::Lizardman, "Lizardman" },
|
|
||||||
{ Language::Orcish, "Orcish" },
|
|
||||||
{ Language::Faerie, "Faerie" },
|
|
||||||
{ Language::Dragon, "Dragon" },
|
|
||||||
{ Language::ElderDragon, "Elder Dragon" },
|
|
||||||
{ Language::DarkSpeech, "Dark Speech" },
|
|
||||||
{ Language::VahShir, "Vah Shir" },
|
|
||||||
{ Language::Alaran, "Alaran" },
|
|
||||||
{ Language::Hadal, "Hadal" },
|
|
||||||
{ Language::Unknown27, "Unknown" }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return language_map;
|
return language_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string EQ::constants::GetLanguageName(uint8 language_id)
|
std::string EQ::constants::GetLanguageName(int language_id)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(language_id, Language::CommonTongue, Language::Unknown27)) {
|
if (EQ::ValueWithin(language_id, LANG_COMMON_TONGUE, LANG_UNKNOWN)) {
|
||||||
return std::string();
|
return EQ::constants::GetLanguageMap().find(language_id)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetLanguageMap().find(language_id)->second;
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<uint32, std::string>& EQ::constants::GetLDoNThemeMap()
|
||||||
|
{
|
||||||
|
static const std::map<uint32, std::string> ldon_theme_map = {
|
||||||
|
{ LDoNThemes::Unused, "Unused" },
|
||||||
|
{ LDoNThemes::GUK, "Deepest Guk" },
|
||||||
|
{ LDoNThemes::MIR, "Miragul's Menagerie" },
|
||||||
|
{ LDoNThemes::MMC, "Mistmoore Catacombs" },
|
||||||
|
{ LDoNThemes::RUJ, "Rujarkian Hills" },
|
||||||
|
{ LDoNThemes::TAK, "Takish-Hiz" },
|
||||||
|
};
|
||||||
|
|
||||||
|
return ldon_theme_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetLDoNThemeName(uint32 theme_id)
|
||||||
|
{
|
||||||
|
if (EQ::ValueWithin(theme_id, LDoNThemes::Unused, LDoNThemes::TAK)) {
|
||||||
|
return EQ::constants::GetLDoNThemeMap().find(theme_id)->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<int8, std::string>& EQ::constants::GetFlyModeMap()
|
const std::map<int8, std::string>& EQ::constants::GetFlyModeMap()
|
||||||
@@ -156,11 +243,107 @@ const std::map<int8, std::string>& EQ::constants::GetFlyModeMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetFlyModeName(int8 flymode_id)
|
std::string EQ::constants::GetFlyModeName(int8 flymode_id)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(flymode_id, GravityBehavior::Ground, GravityBehavior::LevitateWhileRunning)) {
|
if (EQ::ValueWithin(flymode_id, GravityBehavior::Ground, GravityBehavior::LevitateWhileRunning)) {
|
||||||
return std::string();
|
return EQ::constants::GetFlyModeMap().find(flymode_id)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetFlyModeMap().find(flymode_id)->second;
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<bodyType, std::string>& EQ::constants::GetBodyTypeMap()
|
||||||
|
{
|
||||||
|
static const std::map<bodyType, std::string> bodytype_map = {
|
||||||
|
{ BT_Humanoid, "Humanoid" },
|
||||||
|
{ BT_Lycanthrope, "Lycanthrope" },
|
||||||
|
{ BT_Undead, "Undead" },
|
||||||
|
{ BT_Giant, "Giant" },
|
||||||
|
{ BT_Construct, "Construct" },
|
||||||
|
{ BT_Extraplanar, "Extraplanar" },
|
||||||
|
{ BT_Magical, "Magical" },
|
||||||
|
{ BT_SummonedUndead, "Summoned Undead" },
|
||||||
|
{ BT_RaidGiant, "Raid Giant" },
|
||||||
|
{ BT_RaidColdain, "Raid Coldain" },
|
||||||
|
{ BT_NoTarget, "Untargetable" },
|
||||||
|
{ BT_Vampire, "Vampire" },
|
||||||
|
{ BT_Atenha_Ra, "Aten Ha Ra" },
|
||||||
|
{ BT_Greater_Akheva, "Greater Akheva" },
|
||||||
|
{ BT_Khati_Sha, "Khati Sha" },
|
||||||
|
{ BT_Seru, "Seru" },
|
||||||
|
{ BT_Grieg_Veneficus, "Grieg Veneficus" },
|
||||||
|
{ BT_Draz_Nurakk, "Draz Nurakk" },
|
||||||
|
{ BT_Zek, "Zek" },
|
||||||
|
{ BT_Luggald, "Luggald" },
|
||||||
|
{ BT_Animal, "Animal" },
|
||||||
|
{ BT_Insect, "Insect" },
|
||||||
|
{ BT_Monster, "Monster" },
|
||||||
|
{ BT_Summoned, "Summoned" },
|
||||||
|
{ BT_Plant, "Plant" },
|
||||||
|
{ BT_Dragon, "Dragon" },
|
||||||
|
{ BT_Summoned2, "Summoned 2" },
|
||||||
|
{ BT_Summoned3, "Summoned 3" },
|
||||||
|
{ BT_Dragon2, "Dragon 2" },
|
||||||
|
{ BT_VeliousDragon, "Velious Dragon" },
|
||||||
|
{ BT_Familiar, "Familiar" },
|
||||||
|
{ BT_Dragon3, "Dragon 3" },
|
||||||
|
{ BT_Boxes, "Boxes" },
|
||||||
|
{ BT_Muramite, "Muramite" },
|
||||||
|
{ BT_NoTarget2, "Untargetable 2" },
|
||||||
|
{ BT_SwarmPet, "Swarm Pet" },
|
||||||
|
{ BT_MonsterSummon, "Monster Summon" },
|
||||||
|
{ BT_InvisMan, "Invisible Man" },
|
||||||
|
{ BT_Special, "Special" },
|
||||||
|
};
|
||||||
|
|
||||||
|
return bodytype_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetBodyTypeName(bodyType bodytype_id)
|
||||||
|
{
|
||||||
|
if (EQ::constants::GetBodyTypeMap().find(bodytype_id) != EQ::constants::GetBodyTypeMap().end()) {
|
||||||
|
return EQ::constants::GetBodyTypeMap().find(bodytype_id)->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<uint8, std::string>& EQ::constants::GetAccountStatusMap()
|
||||||
|
{
|
||||||
|
static const std::map<uint8, std::string> account_status_map = {
|
||||||
|
{ AccountStatus::Player, "Player" },
|
||||||
|
{ AccountStatus::Steward, "Steward" },
|
||||||
|
{ AccountStatus::ApprenticeGuide, "Apprentice Guide" },
|
||||||
|
{ AccountStatus::Guide, "Guide" },
|
||||||
|
{ AccountStatus::QuestTroupe, "Quest Troupe" },
|
||||||
|
{ AccountStatus::SeniorGuide, "Senior Guide" },
|
||||||
|
{ AccountStatus::GMTester, "GM Tester" },
|
||||||
|
{ AccountStatus::EQSupport, "EQ Support" },
|
||||||
|
{ AccountStatus::GMStaff, "GM Staff" },
|
||||||
|
{ AccountStatus::GMAdmin, "GM Admin" },
|
||||||
|
{ AccountStatus::GMLeadAdmin, "GM Lead Admin" },
|
||||||
|
{ AccountStatus::QuestMaster, "Quest Master" },
|
||||||
|
{ AccountStatus::GMAreas, "GM Areas" },
|
||||||
|
{ AccountStatus::GMCoder, "GM Coder" },
|
||||||
|
{ AccountStatus::GMMgmt, "GM Mgmt" },
|
||||||
|
{ AccountStatus::GMImpossible, "GM Impossible" },
|
||||||
|
{ AccountStatus::Max, "GM Max" }
|
||||||
|
};
|
||||||
|
|
||||||
|
return account_status_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetAccountStatusName(uint8 account_status)
|
||||||
|
{
|
||||||
|
for (
|
||||||
|
auto status_level = EQ::constants::GetAccountStatusMap().rbegin();
|
||||||
|
status_level != EQ::constants::GetAccountStatusMap().rend();
|
||||||
|
++status_level
|
||||||
|
) {
|
||||||
|
if (account_status >= status_level->first) {
|
||||||
|
return status_level->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string>& EQ::constants::GetConsiderLevelMap()
|
const std::map<uint8, std::string>& EQ::constants::GetConsiderLevelMap()
|
||||||
@@ -182,11 +365,11 @@ const std::map<uint8, std::string>& EQ::constants::GetConsiderLevelMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetConsiderLevelName(uint8 faction_consider_level)
|
std::string EQ::constants::GetConsiderLevelName(uint8 faction_consider_level)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(faction_consider_level, ConsiderLevel::Ally, ConsiderLevel::Scowls)) {
|
if (EQ::constants::GetConsiderLevelMap().find(faction_consider_level) != EQ::constants::GetConsiderLevelMap().end()) {
|
||||||
return std::string();;
|
return EQ::constants::GetConsiderLevelMap().find(faction_consider_level)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetConsiderLevelMap().find(faction_consider_level)->second;
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string>& EQ::constants::GetEnvironmentalDamageMap()
|
const std::map<uint8, std::string>& EQ::constants::GetEnvironmentalDamageMap()
|
||||||
@@ -203,11 +386,11 @@ const std::map<uint8, std::string>& EQ::constants::GetEnvironmentalDamageMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetEnvironmentalDamageName(uint8 damage_type)
|
std::string EQ::constants::GetEnvironmentalDamageName(uint8 damage_type)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(damage_type, EnvironmentalDamage::Lava, EnvironmentalDamage::Trap)) {
|
if (EQ::ValueWithin(damage_type, EnvironmentalDamage::Lava, EnvironmentalDamage::Trap)) {
|
||||||
return std::string();
|
return EQ::constants::GetEnvironmentalDamageMap().find(damage_type)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetEnvironmentalDamageMap().find(damage_type)->second;
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string>& EQ::constants::GetStuckBehaviorMap()
|
const std::map<uint8, std::string>& EQ::constants::GetStuckBehaviorMap()
|
||||||
@@ -224,11 +407,11 @@ const std::map<uint8, std::string>& EQ::constants::GetStuckBehaviorMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetStuckBehaviorName(uint8 behavior_id)
|
std::string EQ::constants::GetStuckBehaviorName(uint8 behavior_id)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(behavior_id, StuckBehavior::RunToTarget, StuckBehavior::EvadeCombat)) {
|
if (EQ::ValueWithin(behavior_id, StuckBehavior::RunToTarget, StuckBehavior::EvadeCombat)) {
|
||||||
return std::string();
|
return EQ::constants::GetStuckBehaviorMap().find(behavior_id)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetStuckBehaviorMap().find(behavior_id)->second;
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string>& EQ::constants::GetSpawnAnimationMap()
|
const std::map<uint8, std::string>& EQ::constants::GetSpawnAnimationMap()
|
||||||
@@ -246,11 +429,89 @@ const std::map<uint8, std::string>& EQ::constants::GetSpawnAnimationMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetSpawnAnimationName(uint8 animation_id)
|
std::string EQ::constants::GetSpawnAnimationName(uint8 animation_id)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(animation_id, SpawnAnimations::Standing, SpawnAnimations::Looting)) {
|
if (EQ::ValueWithin(animation_id, SpawnAnimations::Standing, SpawnAnimations::Looting)) {
|
||||||
return std::string();
|
return EQ::constants::GetSpawnAnimationMap().find(animation_id)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetSpawnAnimationMap().find(animation_id)->second;
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<int, std::string>& EQ::constants::GetObjectTypeMap()
|
||||||
|
{
|
||||||
|
static const std::map<int, std::string> object_type_map = {
|
||||||
|
{ ObjectTypes::SmallBag, "Small Bag" },
|
||||||
|
{ ObjectTypes::LargeBag, "Large Bag" },
|
||||||
|
{ ObjectTypes::Quiver, "Quiver" },
|
||||||
|
{ ObjectTypes::BeltPouch, "Belt Pouch" },
|
||||||
|
{ ObjectTypes::WristPouch, "Wrist Pouch" },
|
||||||
|
{ ObjectTypes::Backpack, "Backpack" },
|
||||||
|
{ ObjectTypes::SmallChest, "Small Chest" },
|
||||||
|
{ ObjectTypes::LargeChest, "Large Chest" },
|
||||||
|
{ ObjectTypes::Bandolier, "Bandolier" },
|
||||||
|
{ ObjectTypes::Medicine, "Medicine" },
|
||||||
|
{ ObjectTypes::Tinkering, "Tinkering" },
|
||||||
|
{ ObjectTypes::Lexicon, "Lexicon" },
|
||||||
|
{ ObjectTypes::PoisonMaking, "Mortar and Pestle" },
|
||||||
|
{ ObjectTypes::Quest, "Quest" },
|
||||||
|
{ ObjectTypes::MixingBowl, "Mixing Bowl" },
|
||||||
|
{ ObjectTypes::Baking, "Baking" },
|
||||||
|
{ ObjectTypes::Tailoring, "Tailoring" },
|
||||||
|
{ ObjectTypes::Blacksmithing, "Blacksmithing" },
|
||||||
|
{ ObjectTypes::Fletching, "Fletching" },
|
||||||
|
{ ObjectTypes::Brewing, "Brewing" },
|
||||||
|
{ ObjectTypes::JewelryMaking, "Jewelry Making" },
|
||||||
|
{ ObjectTypes::Pottery, "Pottery" },
|
||||||
|
{ ObjectTypes::Kiln, "Kiln" },
|
||||||
|
{ ObjectTypes::KeyMaker, "Key Maker" },
|
||||||
|
{ ObjectTypes::ResearchWIZ, "Lexicon" },
|
||||||
|
{ ObjectTypes::ResearchMAG, "Lexicon" },
|
||||||
|
{ ObjectTypes::ResearchNEC, "Lexicon" },
|
||||||
|
{ ObjectTypes::ResearchENC, "Lexicon" },
|
||||||
|
{ ObjectTypes::Unknown, "Unknown" },
|
||||||
|
{ ObjectTypes::ResearchPractice, "Lexicon" },
|
||||||
|
{ ObjectTypes::Alchemy, "Alchemy" },
|
||||||
|
{ ObjectTypes::HighElfForge, "High Elf Forge" },
|
||||||
|
{ ObjectTypes::DarkElfForge, "Dark Elf Forge" },
|
||||||
|
{ ObjectTypes::OgreForge, "Ogre Forge" },
|
||||||
|
{ ObjectTypes::DwarfForge, "Dwarf Forge" },
|
||||||
|
{ ObjectTypes::GnomeForge, "Gnome Forge" },
|
||||||
|
{ ObjectTypes::BarbarianForge, "Barbarian Forge" },
|
||||||
|
{ ObjectTypes::IksarForge, "Iksar Forge" },
|
||||||
|
{ ObjectTypes::HumanForgeOne, "Human Forge" },
|
||||||
|
{ ObjectTypes::HumanForgeTwo, "Human Forge" },
|
||||||
|
{ ObjectTypes::HalflingTailoringOne, "Halfling Tailoring" },
|
||||||
|
{ ObjectTypes::HalflingTailoringTwo, "Halfling Tailoring" },
|
||||||
|
{ ObjectTypes::EruditeTailoring, "Erudite Tailoring" },
|
||||||
|
{ ObjectTypes::WoodElfTailoring, "Wood Elf Tailoring" },
|
||||||
|
{ ObjectTypes::WoodElfFletching, "Wood Elf Fletching" },
|
||||||
|
{ ObjectTypes::IksarPottery, "Iksar Pottery" },
|
||||||
|
{ ObjectTypes::Fishing, "Fishing" },
|
||||||
|
{ ObjectTypes::TrollForge, "Troll Forge" },
|
||||||
|
{ ObjectTypes::WoodElfForge, "Wood Elf Forge" },
|
||||||
|
{ ObjectTypes::HalflingForge, "Halfling Forge" },
|
||||||
|
{ ObjectTypes::EruditeForge, "Erudite Forge" },
|
||||||
|
{ ObjectTypes::Merchant, "Merchant" },
|
||||||
|
{ ObjectTypes::FroglokForge, "Froglok Forge" },
|
||||||
|
{ ObjectTypes::Augmenter, "Augmenter" },
|
||||||
|
{ ObjectTypes::Churn, "Churn" },
|
||||||
|
{ ObjectTypes::TransformationMold, "Transformation Mold" },
|
||||||
|
{ ObjectTypes::DetransformationMold, "Detransformation Mold" },
|
||||||
|
{ ObjectTypes::Unattuner, "Unattuner" },
|
||||||
|
{ ObjectTypes::TradeskillBag, "Tradeskill Bag" },
|
||||||
|
{ ObjectTypes::CollectibleBag, "Collectible Bag" },
|
||||||
|
{ ObjectTypes::NoDeposit, "No Deposit" }
|
||||||
|
};
|
||||||
|
|
||||||
|
return object_type_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetObjectTypeName(int object_type)
|
||||||
|
{
|
||||||
|
if (EQ::ValueWithin(object_type, ObjectTypes::SmallBag, ObjectTypes::NoDeposit)) {
|
||||||
|
return EQ::constants::GetObjectTypeMap().find(object_type)->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string> &EQ::constants::GetWeatherTypeMap()
|
const std::map<uint8, std::string> &EQ::constants::GetWeatherTypeMap()
|
||||||
@@ -266,11 +527,11 @@ const std::map<uint8, std::string> &EQ::constants::GetWeatherTypeMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetWeatherTypeName(uint8 weather_type)
|
std::string EQ::constants::GetWeatherTypeName(uint8 weather_type)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(weather_type, WeatherTypes::None, WeatherTypes::Snowing)) {
|
if (EQ::ValueWithin(weather_type, WeatherTypes::None, WeatherTypes::Snowing)) {
|
||||||
return std::string();
|
return EQ::constants::GetWeatherTypeMap().find(weather_type)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetWeatherTypeMap().find(weather_type)->second;
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string> &EQ::constants::GetEmoteEventTypeMap()
|
const std::map<uint8, std::string> &EQ::constants::GetEmoteEventTypeMap()
|
||||||
@@ -292,17 +553,16 @@ const std::map<uint8, std::string> &EQ::constants::GetEmoteEventTypeMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetEmoteEventTypeName(uint8 emote_event_type)
|
std::string EQ::constants::GetEmoteEventTypeName(uint8 emote_event_type)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(emote_event_type, EmoteEventTypes::LeaveCombat, EmoteEventTypes::OnDespawn)) {
|
if (EQ::ValueWithin(emote_event_type, EmoteEventTypes::LeaveCombat, EmoteEventTypes::OnDespawn)) {
|
||||||
return std::string();
|
return EQ::constants::GetEmoteEventTypeMap().find(emote_event_type)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetEmoteEventTypeMap().find(emote_event_type)->second;
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
||||||
{
|
{
|
||||||
static const std::map<uint8, std::string> emote_type_map = {
|
static const std::map<uint8, std::string> emote_type_map = {
|
||||||
{ EmoteTypes::Say, "Say" },
|
|
||||||
{ EmoteTypes::Emote, "Emote" },
|
{ EmoteTypes::Emote, "Emote" },
|
||||||
{ EmoteTypes::Shout, "Shout" },
|
{ EmoteTypes::Shout, "Shout" },
|
||||||
{ EmoteTypes::Proximity, "Proximity" }
|
{ EmoteTypes::Proximity, "Proximity" }
|
||||||
@@ -313,141 +573,9 @@ const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetEmoteTypeName(uint8 emote_type)
|
std::string EQ::constants::GetEmoteTypeName(uint8 emote_type)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(emote_type, EmoteTypes::Say, EmoteTypes::Proximity)) {
|
if (EQ::ValueWithin(emote_type, EmoteTypes::Emote, EmoteTypes::Proximity)) {
|
||||||
return std::string();
|
return EQ::constants::GetEmoteTypeMap().find(emote_type)->second;
|
||||||
}
|
|
||||||
|
|
||||||
return EQ::constants::GetEmoteTypeMap().find(emote_type)->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::map<uint32, std::string>& EQ::constants::GetAppearanceTypeMap()
|
|
||||||
{
|
|
||||||
static const std::map<uint32, std::string> appearance_type_map = {
|
|
||||||
{ AppearanceType::Die, "Die" },
|
|
||||||
{ AppearanceType::WhoLevel, "Who Level" },
|
|
||||||
{ AppearanceType::MaxHealth, "Max Health" },
|
|
||||||
{ AppearanceType::Invisibility, "Invisibility" },
|
|
||||||
{ AppearanceType::PVP, "PVP" },
|
|
||||||
{ AppearanceType::Light, "Light" },
|
|
||||||
{ AppearanceType::Animation, "Animation" },
|
|
||||||
{ AppearanceType::Sneak, "Sneak" },
|
|
||||||
{ AppearanceType::SpawnID, "Spawn ID" },
|
|
||||||
{ AppearanceType::Health, "Health" },
|
|
||||||
{ AppearanceType::Linkdead, "Linkdead" },
|
|
||||||
{ AppearanceType::FlyMode, "Fly Mode" },
|
|
||||||
{ AppearanceType::GM, "GM" },
|
|
||||||
{ AppearanceType::Anonymous, "Anonymous" },
|
|
||||||
{ AppearanceType::GuildID, "Guild ID" },
|
|
||||||
{ AppearanceType::GuildRank, "Guild Rank" },
|
|
||||||
{ AppearanceType::AFK, "AFK" },
|
|
||||||
{ AppearanceType::Pet, "Pet" },
|
|
||||||
{ AppearanceType::Summoned, "Summoned" },
|
|
||||||
{ AppearanceType::Split, "Split" },
|
|
||||||
{ AppearanceType::Size, "Size" },
|
|
||||||
{ AppearanceType::SetType, "Set Type" },
|
|
||||||
{ AppearanceType::NPCName, "NPCName" },
|
|
||||||
{ AppearanceType::AARank, "AARank" },
|
|
||||||
{ AppearanceType::CancelSneakHide, "Cancel Sneak Hide" },
|
|
||||||
{ AppearanceType::AreaHealthRegen, "Area Health Regeneration" },
|
|
||||||
{ AppearanceType::AreaManaRegen, "Area Mana Regeneration" },
|
|
||||||
{ AppearanceType::AreaEnduranceRegen, "Area Endurance Regeneration" },
|
|
||||||
{ AppearanceType::FreezeBeneficialBuffs, "Freeze Beneficial Buffs" },
|
|
||||||
{ AppearanceType::NPCTintIndex, "NPC Tint Index" },
|
|
||||||
{ AppearanceType::GroupAutoConsent, "Group Auto Consent" },
|
|
||||||
{ AppearanceType::RaidAutoConsent, "Raid Auto Consent" },
|
|
||||||
{ AppearanceType::GuildAutoConsent, "Guild Auto Consent" },
|
|
||||||
{ AppearanceType::ShowHelm, "Show Helm" },
|
|
||||||
{ AppearanceType::DamageState, "Damage State" },
|
|
||||||
{ AppearanceType::EQPlayers, "EQ Players" },
|
|
||||||
{ AppearanceType::FindBits, "Find Bits" },
|
|
||||||
{ AppearanceType::TextureType, "Texture Type" },
|
|
||||||
{ AppearanceType::FacePick, "Face Pick" },
|
|
||||||
{ AppearanceType::AntiCheat, "Anti Cheat" },
|
|
||||||
{ AppearanceType::GuildShow, "Guild Show" },
|
|
||||||
{ AppearanceType::OfflineMode, "Offline Mode" }
|
|
||||||
};
|
|
||||||
|
|
||||||
return appearance_type_map;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EQ::constants::GetAppearanceTypeName(uint32 appearance_type)
|
|
||||||
{
|
|
||||||
const auto& a = EQ::constants::GetAppearanceTypeMap().find(appearance_type);
|
|
||||||
if (a != EQ::constants::GetAppearanceTypeMap().end()) {
|
|
||||||
return a->second;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SpecialAbility::GetName(int ability_id)
|
|
||||||
{
|
|
||||||
return IsValid(ability_id) ? special_ability_names[ability_id] : "UNKNOWN SPECIAL ABILITY";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SpecialAbility::IsValid(int ability_id)
|
|
||||||
{
|
|
||||||
return special_ability_names.find(ability_id) != special_ability_names.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::map<uint32, std::string>& EQ::constants::GetConsiderColorMap()
|
|
||||||
{
|
|
||||||
static const std::map<uint32, std::string> consider_color_map = {
|
|
||||||
{ ConsiderColor::Green, "Green" },
|
|
||||||
{ ConsiderColor::DarkBlue, "Dark Blue" },
|
|
||||||
{ ConsiderColor::Gray, "Gray" },
|
|
||||||
{ ConsiderColor::White, "White" },
|
|
||||||
{ ConsiderColor::Red, "Red" },
|
|
||||||
{ ConsiderColor::Yellow, "Yellow" },
|
|
||||||
{ ConsiderColor::LightBlue, "Light Blue" },
|
|
||||||
{ ConsiderColor::WhiteTitanium, "White" },
|
|
||||||
};
|
|
||||||
|
|
||||||
return consider_color_map;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string EQ::constants::GetConsiderColorName(uint32 consider_color)
|
|
||||||
{
|
|
||||||
const auto& c = EQ::constants::GetConsiderColorMap().find(consider_color);
|
|
||||||
return c != EQ::constants::GetConsiderColorMap().end() ? c->second : std::string();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string AccountStatus::GetName(uint8 account_status)
|
|
||||||
{
|
|
||||||
for (
|
|
||||||
auto e = account_status_names.rbegin();
|
|
||||||
e != account_status_names.rend();
|
|
||||||
++e
|
|
||||||
) {
|
|
||||||
if (account_status >= e->first) {
|
|
||||||
return e->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "UNKNOWN ACCOUNT STATUS";
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ComparisonType::GetName(uint8 type)
|
|
||||||
{
|
|
||||||
return IsValid(type) ? comparison_types[type] : "UNKNOWN COMPARISON TYPE";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ComparisonType::IsValid(uint8 type)
|
|
||||||
{
|
|
||||||
return comparison_types.find(type) != comparison_types.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 LDoNTheme::GetBitmask(uint32 theme_id)
|
|
||||||
{
|
|
||||||
return IsValid(theme_id) ? ldon_theme_names[theme_id].second : LDoNTheme::UnusedBit;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string LDoNTheme::GetName(uint32 theme_id)
|
|
||||||
{
|
|
||||||
return IsValid(theme_id) ? ldon_theme_names[theme_id].first : "UNKNOWN LDON THEME";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool LDoNTheme::IsValid(uint32 theme_id)
|
|
||||||
{
|
|
||||||
return ldon_theme_names.find(theme_id) != ldon_theme_names.end();
|
|
||||||
}
|
|
||||||
|
|||||||
+195
-394
@@ -26,76 +26,6 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
namespace AccountStatus {
|
|
||||||
constexpr uint8 Player = 0;
|
|
||||||
constexpr uint8 Steward = 10;
|
|
||||||
constexpr uint8 ApprenticeGuide = 20;
|
|
||||||
constexpr uint8 Guide = 50;
|
|
||||||
constexpr uint8 QuestTroupe = 80;
|
|
||||||
constexpr uint8 SeniorGuide = 81;
|
|
||||||
constexpr uint8 GMTester = 85;
|
|
||||||
constexpr uint8 EQSupport = 90;
|
|
||||||
constexpr uint8 GMStaff = 95;
|
|
||||||
constexpr uint8 GMAdmin = 100;
|
|
||||||
constexpr uint8 GMLeadAdmin = 150;
|
|
||||||
constexpr uint8 QuestMaster = 160;
|
|
||||||
constexpr uint8 GMAreas = 170;
|
|
||||||
constexpr uint8 GMCoder = 180;
|
|
||||||
constexpr uint8 GMMgmt = 200;
|
|
||||||
constexpr uint8 GMImpossible = 250;
|
|
||||||
constexpr uint8 Max = 255;
|
|
||||||
|
|
||||||
std::string GetName(uint8 account_status);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint8, std::string> account_status_names = {
|
|
||||||
{ AccountStatus::Player, "Player" },
|
|
||||||
{ AccountStatus::Steward, "Steward" },
|
|
||||||
{ AccountStatus::ApprenticeGuide, "Apprentice Guide" },
|
|
||||||
{ AccountStatus::Guide, "Guide" },
|
|
||||||
{ AccountStatus::QuestTroupe, "Quest Troupe" },
|
|
||||||
{ AccountStatus::SeniorGuide, "Senior Guide" },
|
|
||||||
{ AccountStatus::GMTester, "GM Tester" },
|
|
||||||
{ AccountStatus::EQSupport, "EQ Support" },
|
|
||||||
{ AccountStatus::GMStaff, "GM Staff" },
|
|
||||||
{ AccountStatus::GMAdmin, "GM Admin" },
|
|
||||||
{ AccountStatus::GMLeadAdmin, "GM Lead Admin" },
|
|
||||||
{ AccountStatus::QuestMaster, "Quest Master" },
|
|
||||||
{ AccountStatus::GMAreas, "GM Areas" },
|
|
||||||
{ AccountStatus::GMCoder, "GM Coder" },
|
|
||||||
{ AccountStatus::GMMgmt, "GM Mgmt" },
|
|
||||||
{ AccountStatus::GMImpossible, "GM Impossible" },
|
|
||||||
{ AccountStatus::Max, "GM Max" }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace ComparisonType {
|
|
||||||
constexpr uint8 Equal = 0;
|
|
||||||
constexpr uint8 NotEqual = 1;
|
|
||||||
constexpr uint8 GreaterOrEqual = 2;
|
|
||||||
constexpr uint8 LesserOrEqual = 3;
|
|
||||||
constexpr uint8 Greater = 4;
|
|
||||||
constexpr uint8 Lesser = 5;
|
|
||||||
constexpr uint8 Any = 6;
|
|
||||||
constexpr uint8 NotAny = 7;
|
|
||||||
constexpr uint8 Between = 8;
|
|
||||||
constexpr uint8 NotBetween = 9;
|
|
||||||
|
|
||||||
std::string GetName(uint8 type);
|
|
||||||
bool IsValid(uint8 type);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint8, std::string> comparison_types = {
|
|
||||||
{ ComparisonType::Equal, "Equal" },
|
|
||||||
{ ComparisonType::NotEqual, "Not Equal" },
|
|
||||||
{ ComparisonType::GreaterOrEqual, "Greater or Equal" },
|
|
||||||
{ ComparisonType::LesserOrEqual, "Lesser or Equal" },
|
|
||||||
{ ComparisonType::Greater, "Greater" },
|
|
||||||
{ ComparisonType::Lesser, "Lesser" },
|
|
||||||
{ ComparisonType::Any, "Any" },
|
|
||||||
{ ComparisonType::NotAny, "Not Any" },
|
|
||||||
{ ComparisonType::Between, "Between" },
|
|
||||||
{ ComparisonType::NotBetween, "Not Between" },
|
|
||||||
};
|
|
||||||
|
|
||||||
// local definitions are the result of using hybrid-client or server-only values and methods
|
// local definitions are the result of using hybrid-client or server-only values and methods
|
||||||
namespace EQ
|
namespace EQ
|
||||||
@@ -130,11 +60,9 @@ namespace EQ
|
|||||||
using RoF2::invtype::MAIL_SIZE;
|
using RoF2::invtype::MAIL_SIZE;
|
||||||
using RoF2::invtype::GUILD_TROPHY_TRIBUTE_SIZE;
|
using RoF2::invtype::GUILD_TROPHY_TRIBUTE_SIZE;
|
||||||
using RoF2::invtype::KRONO_SIZE;
|
using RoF2::invtype::KRONO_SIZE;
|
||||||
using RoF2::invtype::GUILD_BANK_MAIN_SIZE;
|
|
||||||
using RoF2::invtype::GUILD_BANK_DEPOSIT_SIZE;
|
|
||||||
using RoF2::invtype::OTHER_SIZE;
|
using RoF2::invtype::OTHER_SIZE;
|
||||||
|
|
||||||
using RoF2::invtype::TRADE_NPC_SIZE;
|
using Titanium::invtype::TRADE_NPC_SIZE;
|
||||||
|
|
||||||
using RoF2::invtype::TYPE_INVALID;
|
using RoF2::invtype::TYPE_INVALID;
|
||||||
using RoF2::invtype::TYPE_BEGIN;
|
using RoF2::invtype::TYPE_BEGIN;
|
||||||
@@ -161,7 +89,7 @@ namespace EQ
|
|||||||
using RoF2::invslot::SLOT_INVALID;
|
using RoF2::invslot::SLOT_INVALID;
|
||||||
using RoF2::invslot::SLOT_BEGIN;
|
using RoF2::invslot::SLOT_BEGIN;
|
||||||
|
|
||||||
using RoF2::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE;
|
using Titanium::invslot::SLOT_TRADESKILL_EXPERIMENT_COMBINE;
|
||||||
|
|
||||||
const int16 SLOT_AUGMENT_GENERIC_RETURN = 1001; // clients don't appear to use this method... (internal inventory return value)
|
const int16 SLOT_AUGMENT_GENERIC_RETURN = 1001; // clients don't appear to use this method... (internal inventory return value)
|
||||||
|
|
||||||
@@ -181,28 +109,28 @@ namespace EQ
|
|||||||
using RoF2::invslot::BONUS_STAT_END;
|
using RoF2::invslot::BONUS_STAT_END;
|
||||||
using RoF2::invslot::BONUS_SKILL_END;
|
using RoF2::invslot::BONUS_SKILL_END;
|
||||||
|
|
||||||
using RoF2::invslot::BANK_BEGIN;
|
using Titanium::invslot::BANK_BEGIN;
|
||||||
using RoF2::invslot::BANK_END;
|
using SoF::invslot::BANK_END;
|
||||||
|
|
||||||
using RoF2::invslot::SHARED_BANK_BEGIN;
|
using Titanium::invslot::SHARED_BANK_BEGIN;
|
||||||
using RoF2::invslot::SHARED_BANK_END;
|
using Titanium::invslot::SHARED_BANK_END;
|
||||||
|
|
||||||
using RoF2::invslot::TRADE_BEGIN;
|
using Titanium::invslot::TRADE_BEGIN;
|
||||||
using RoF2::invslot::TRADE_END;
|
using Titanium::invslot::TRADE_END;
|
||||||
|
|
||||||
using RoF2::invslot::TRADE_NPC_END;
|
using Titanium::invslot::TRADE_NPC_END;
|
||||||
|
|
||||||
using RoF2::invslot::WORLD_BEGIN;
|
using Titanium::invslot::WORLD_BEGIN;
|
||||||
using RoF2::invslot::WORLD_END;
|
using Titanium::invslot::WORLD_END;
|
||||||
|
|
||||||
using RoF2::invslot::TRIBUTE_BEGIN;
|
using Titanium::invslot::TRIBUTE_BEGIN;
|
||||||
using RoF2::invslot::TRIBUTE_END;
|
using Titanium::invslot::TRIBUTE_END;
|
||||||
|
|
||||||
using RoF2::invslot::GUILD_TRIBUTE_BEGIN;
|
using Titanium::invslot::GUILD_TRIBUTE_BEGIN;
|
||||||
using RoF2::invslot::GUILD_TRIBUTE_END;
|
using Titanium::invslot::GUILD_TRIBUTE_END;
|
||||||
|
|
||||||
const int16 CORPSE_BEGIN = invslot::slotGeneral1;
|
const int16 CORPSE_BEGIN = invslot::slotGeneral1;
|
||||||
const int16 CORPSE_END = CORPSE_BEGIN + invslot::slotCursor;
|
const int16 CORPSE_END = CORPSE_BEGIN + invslot::slotCursor;
|
||||||
|
|
||||||
using RoF2::invslot::EQUIPMENT_BITMASK;
|
using RoF2::invslot::EQUIPMENT_BITMASK;
|
||||||
using RoF2::invslot::GENERAL_BITMASK;
|
using RoF2::invslot::GENERAL_BITMASK;
|
||||||
@@ -216,40 +144,38 @@ namespace EQ
|
|||||||
} // namespace invslot
|
} // namespace invslot
|
||||||
|
|
||||||
namespace invbag {
|
namespace invbag {
|
||||||
using RoF2::invbag::SLOT_INVALID;
|
using Titanium::invbag::SLOT_INVALID;
|
||||||
using RoF2::invbag::SLOT_BEGIN;
|
using Titanium::invbag::SLOT_BEGIN;
|
||||||
using RoF2::invbag::SLOT_END;
|
using Titanium::invbag::SLOT_END;
|
||||||
using RoF2::invbag::SLOT_COUNT;
|
using Titanium::invbag::SLOT_COUNT;
|
||||||
|
|
||||||
using RoF2::invslot::WORLD_END;
|
using Titanium::invbag::GENERAL_BAGS_BEGIN;
|
||||||
|
|
||||||
const int16 GENERAL_BAGS_BEGIN = WORLD_END + 1;
|
|
||||||
const int16 GENERAL_BAGS_COUNT = invslot::GENERAL_COUNT * SLOT_COUNT;
|
const int16 GENERAL_BAGS_COUNT = invslot::GENERAL_COUNT * SLOT_COUNT;
|
||||||
const int16 GENERAL_BAGS_END = (GENERAL_BAGS_BEGIN + GENERAL_BAGS_COUNT) - 1;
|
const int16 GENERAL_BAGS_END = (GENERAL_BAGS_BEGIN + GENERAL_BAGS_COUNT) - 1;
|
||||||
|
|
||||||
const int16 GENERAL_BAGS_8_COUNT = 8 * SLOT_COUNT;
|
const int16 GENERAL_BAGS_8_COUNT = 8 * SLOT_COUNT;
|
||||||
const int16 GENERAL_BAGS_8_END = (GENERAL_BAGS_BEGIN + GENERAL_BAGS_8_COUNT) - 1;
|
const int16 GENERAL_BAGS_8_END = (GENERAL_BAGS_BEGIN + GENERAL_BAGS_8_COUNT) - 1;
|
||||||
|
|
||||||
const int16 CURSOR_BAG_BEGIN = GENERAL_BAGS_END + 1;
|
const int16 CURSOR_BAG_BEGIN = 351;
|
||||||
const int16 CURSOR_BAG_COUNT = SLOT_COUNT;
|
const int16 CURSOR_BAG_COUNT = SLOT_COUNT;
|
||||||
const int16 CURSOR_BAG_END = (CURSOR_BAG_BEGIN + CURSOR_BAG_COUNT) - 1;
|
const int16 CURSOR_BAG_END = (CURSOR_BAG_BEGIN + CURSOR_BAG_COUNT) - 1;
|
||||||
|
|
||||||
const int16 BANK_BAGS_BEGIN = CURSOR_BAG_END + 1;
|
using Titanium::invbag::BANK_BAGS_BEGIN;
|
||||||
const int16 BANK_BAGS_COUNT = (invtype::BANK_SIZE * SLOT_COUNT);
|
const int16 BANK_BAGS_COUNT = (invtype::BANK_SIZE * SLOT_COUNT);
|
||||||
const int16 BANK_BAGS_END = (BANK_BAGS_BEGIN + BANK_BAGS_COUNT) - 1;
|
const int16 BANK_BAGS_END = (BANK_BAGS_BEGIN + BANK_BAGS_COUNT) - 1;
|
||||||
|
|
||||||
const int16 BANK_BAGS_16_COUNT = 16 * SLOT_COUNT;
|
const int16 BANK_BAGS_16_COUNT = 16 * SLOT_COUNT;
|
||||||
const int16 BANK_BAGS_16_END = (BANK_BAGS_BEGIN + BANK_BAGS_16_COUNT) - 1;
|
const int16 BANK_BAGS_16_END = (BANK_BAGS_BEGIN + BANK_BAGS_16_COUNT) - 1;
|
||||||
|
|
||||||
const int16 SHARED_BANK_BAGS_BEGIN = BANK_BAGS_END + 1;
|
using Titanium::invbag::SHARED_BANK_BAGS_BEGIN;
|
||||||
const int16 SHARED_BANK_BAGS_COUNT = invtype::SHARED_BANK_SIZE * SLOT_COUNT;
|
const int16 SHARED_BANK_BAGS_COUNT = invtype::SHARED_BANK_SIZE * SLOT_COUNT;
|
||||||
const int16 SHARED_BANK_BAGS_END = (SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_COUNT) - 1;
|
const int16 SHARED_BANK_BAGS_END = (SHARED_BANK_BAGS_BEGIN + SHARED_BANK_BAGS_COUNT) - 1;
|
||||||
|
|
||||||
const int16 TRADE_BAGS_BEGIN = SHARED_BANK_BAGS_END + 1;
|
using Titanium::invbag::TRADE_BAGS_BEGIN;
|
||||||
const int16 TRADE_BAGS_COUNT = invtype::TRADE_SIZE * SLOT_COUNT;
|
const int16 TRADE_BAGS_COUNT = invtype::TRADE_SIZE * SLOT_COUNT;
|
||||||
const int16 TRADE_BAGS_END = (TRADE_BAGS_BEGIN + TRADE_BAGS_COUNT) - 1;
|
const int16 TRADE_BAGS_END = (TRADE_BAGS_BEGIN + TRADE_BAGS_COUNT) - 1;
|
||||||
|
|
||||||
using RoF2::invbag::GetInvBagIndexName;
|
using Titanium::invbag::GetInvBagIndexName;
|
||||||
|
|
||||||
} // namespace invbag
|
} // namespace invbag
|
||||||
|
|
||||||
@@ -278,6 +204,19 @@ namespace EQ
|
|||||||
const size_t SAY_LINK_CLOSER_SIZE = 1;
|
const size_t SAY_LINK_CLOSER_SIZE = 1;
|
||||||
const size_t SAY_LINK_MAXIMUM_SIZE = (SAY_LINK_OPENER_SIZE + SAY_LINK_BODY_SIZE + SAY_LINK_TEXT_SIZE + SAY_LINK_CLOSER_SIZE);
|
const size_t SAY_LINK_MAXIMUM_SIZE = (SAY_LINK_OPENER_SIZE + SAY_LINK_BODY_SIZE + SAY_LINK_TEXT_SIZE + SAY_LINK_CLOSER_SIZE);
|
||||||
|
|
||||||
|
enum StanceType : int {
|
||||||
|
stanceUnknown = 0,
|
||||||
|
stancePassive,
|
||||||
|
stanceBalanced,
|
||||||
|
stanceEfficient,
|
||||||
|
stanceReactive,
|
||||||
|
stanceAggressive,
|
||||||
|
stanceAssist,
|
||||||
|
stanceBurn,
|
||||||
|
stanceEfficient2,
|
||||||
|
stanceBurnAE
|
||||||
|
};
|
||||||
|
|
||||||
enum BotSpellIDs : int {
|
enum BotSpellIDs : int {
|
||||||
Warrior = 3001,
|
Warrior = 3001,
|
||||||
Cleric,
|
Cleric,
|
||||||
@@ -328,6 +267,70 @@ namespace EQ
|
|||||||
Looting
|
Looting
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ObjectTypes : int {
|
||||||
|
SmallBag,
|
||||||
|
LargeBag,
|
||||||
|
Quiver,
|
||||||
|
BeltPouch,
|
||||||
|
WristPouch,
|
||||||
|
Backpack,
|
||||||
|
SmallChest,
|
||||||
|
LargeChest,
|
||||||
|
Bandolier,
|
||||||
|
Medicine,
|
||||||
|
Tinkering,
|
||||||
|
Lexicon,
|
||||||
|
PoisonMaking,
|
||||||
|
Quest,
|
||||||
|
MixingBowl,
|
||||||
|
Baking,
|
||||||
|
Tailoring,
|
||||||
|
Blacksmithing,
|
||||||
|
Fletching,
|
||||||
|
Brewing,
|
||||||
|
JewelryMaking,
|
||||||
|
Pottery,
|
||||||
|
Kiln,
|
||||||
|
KeyMaker,
|
||||||
|
ResearchWIZ,
|
||||||
|
ResearchMAG,
|
||||||
|
ResearchNEC,
|
||||||
|
ResearchENC,
|
||||||
|
Unknown,
|
||||||
|
ResearchPractice,
|
||||||
|
Alchemy,
|
||||||
|
HighElfForge,
|
||||||
|
DarkElfForge,
|
||||||
|
OgreForge,
|
||||||
|
DwarfForge,
|
||||||
|
GnomeForge,
|
||||||
|
BarbarianForge,
|
||||||
|
IksarForge,
|
||||||
|
HumanForgeOne,
|
||||||
|
HumanForgeTwo,
|
||||||
|
HalflingTailoringOne,
|
||||||
|
HalflingTailoringTwo,
|
||||||
|
EruditeTailoring,
|
||||||
|
WoodElfTailoring,
|
||||||
|
WoodElfFletching,
|
||||||
|
IksarPottery,
|
||||||
|
Fishing,
|
||||||
|
TrollForge,
|
||||||
|
WoodElfForge,
|
||||||
|
HalflingForge,
|
||||||
|
EruditeForge,
|
||||||
|
Merchant,
|
||||||
|
FroglokForge,
|
||||||
|
Augmenter,
|
||||||
|
Churn,
|
||||||
|
TransformationMold,
|
||||||
|
DetransformationMold,
|
||||||
|
Unattuner,
|
||||||
|
TradeskillBag,
|
||||||
|
CollectibleBag,
|
||||||
|
NoDeposit
|
||||||
|
};
|
||||||
|
|
||||||
enum WeatherTypes : uint8 {
|
enum WeatherTypes : uint8 {
|
||||||
None,
|
None,
|
||||||
Raining,
|
Raining,
|
||||||
@@ -347,18 +350,29 @@ namespace EQ
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum EmoteTypes : uint8 {
|
enum EmoteTypes : uint8 {
|
||||||
Say,
|
|
||||||
Emote,
|
Emote,
|
||||||
Shout,
|
Shout,
|
||||||
Proximity
|
Proximity
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const std::map<uint8, std::string>& GetLanguageMap();
|
const char *GetStanceName(StanceType stance_type);
|
||||||
std::string GetLanguageName(uint8 language_id);
|
int ConvertStanceTypeToIndex(StanceType stance_type);
|
||||||
|
|
||||||
|
extern const std::map<int, std::string>& GetLanguageMap();
|
||||||
|
std::string GetLanguageName(int language_id);
|
||||||
|
|
||||||
|
extern const std::map<uint32, std::string>& GetLDoNThemeMap();
|
||||||
|
std::string GetLDoNThemeName(uint32 theme_id);
|
||||||
|
|
||||||
extern const std::map<int8, std::string>& GetFlyModeMap();
|
extern const std::map<int8, std::string>& GetFlyModeMap();
|
||||||
std::string GetFlyModeName(int8 flymode_id);
|
std::string GetFlyModeName(int8 flymode_id);
|
||||||
|
|
||||||
|
extern const std::map<bodyType, std::string>& GetBodyTypeMap();
|
||||||
|
std::string GetBodyTypeName(bodyType bodytype_id);
|
||||||
|
|
||||||
|
extern const std::map<uint8, std::string>& GetAccountStatusMap();
|
||||||
|
std::string GetAccountStatusName(uint8 account_status);
|
||||||
|
|
||||||
extern const std::map<uint8, std::string>& GetConsiderLevelMap();
|
extern const std::map<uint8, std::string>& GetConsiderLevelMap();
|
||||||
std::string GetConsiderLevelName(uint8 consider_level);
|
std::string GetConsiderLevelName(uint8 consider_level);
|
||||||
|
|
||||||
@@ -371,6 +385,9 @@ namespace EQ
|
|||||||
extern const std::map<uint8, std::string>& GetSpawnAnimationMap();
|
extern const std::map<uint8, std::string>& GetSpawnAnimationMap();
|
||||||
std::string GetSpawnAnimationName(uint8 animation_id);
|
std::string GetSpawnAnimationName(uint8 animation_id);
|
||||||
|
|
||||||
|
extern const std::map<int, std::string>& GetObjectTypeMap();
|
||||||
|
std::string GetObjectTypeName(int object_type);
|
||||||
|
|
||||||
extern const std::map<uint8, std::string>& GetWeatherTypeMap();
|
extern const std::map<uint8, std::string>& GetWeatherTypeMap();
|
||||||
std::string GetWeatherTypeName(uint8 weather_type);
|
std::string GetWeatherTypeName(uint8 weather_type);
|
||||||
|
|
||||||
@@ -380,11 +397,9 @@ namespace EQ
|
|||||||
extern const std::map<uint8, std::string>& GetEmoteTypeMap();
|
extern const std::map<uint8, std::string>& GetEmoteTypeMap();
|
||||||
std::string GetEmoteTypeName(uint8 emote_type);
|
std::string GetEmoteTypeName(uint8 emote_type);
|
||||||
|
|
||||||
extern const std::map<uint32, std::string>& GetAppearanceTypeMap();
|
const int STANCE_TYPE_FIRST = stancePassive;
|
||||||
std::string GetAppearanceTypeName(uint32 animation_type);
|
const int STANCE_TYPE_LAST = stanceBurnAE;
|
||||||
|
const int STANCE_TYPE_COUNT = stanceBurnAE;
|
||||||
extern const std::map<uint32, std::string>& GetConsiderColorMap();
|
|
||||||
std::string GetConsiderColorName(uint32 consider_color);
|
|
||||||
|
|
||||||
} /*constants*/
|
} /*constants*/
|
||||||
|
|
||||||
@@ -439,6 +454,37 @@ namespace EQ
|
|||||||
|
|
||||||
} // namespace spells
|
} // namespace spells
|
||||||
|
|
||||||
|
namespace bug {
|
||||||
|
enum CategoryID : uint32 {
|
||||||
|
catOther = 0,
|
||||||
|
catVideo,
|
||||||
|
catAudio,
|
||||||
|
catPathing,
|
||||||
|
catQuest,
|
||||||
|
catTradeskills,
|
||||||
|
catSpellStacking,
|
||||||
|
catDoorsPortals,
|
||||||
|
catItems,
|
||||||
|
catNPC,
|
||||||
|
catDialogs,
|
||||||
|
catLoNTCG,
|
||||||
|
catMercenaries
|
||||||
|
};
|
||||||
|
|
||||||
|
enum OptionalInfoFlag : uint32 {
|
||||||
|
infoNoOptionalInfo = 0x0,
|
||||||
|
infoCanDuplicate = 0x1,
|
||||||
|
infoCrashBug = 0x2,
|
||||||
|
infoTargetInfo = 0x4,
|
||||||
|
infoCharacterFlags = 0x8,
|
||||||
|
infoUnknownValue = 0xFFFFFFF0
|
||||||
|
};
|
||||||
|
|
||||||
|
const char* CategoryIDToCategoryName(CategoryID category_id);
|
||||||
|
CategoryID CategoryNameToCategoryID(const char* category_name);
|
||||||
|
|
||||||
|
} // namespace bug
|
||||||
|
|
||||||
enum WaypointStatus : int {
|
enum WaypointStatus : int {
|
||||||
RoamBoxPauseInProgress = -3,
|
RoamBoxPauseInProgress = -3,
|
||||||
QuestControlNoGrid = -2,
|
QuestControlNoGrid = -2,
|
||||||
@@ -452,7 +498,7 @@ namespace EQ
|
|||||||
Raid,
|
Raid,
|
||||||
Guild
|
Guild
|
||||||
};
|
};
|
||||||
};
|
}; // namespace consent
|
||||||
} /*EQEmu*/
|
} /*EQEmu*/
|
||||||
|
|
||||||
enum ServerLockType : int {
|
enum ServerLockType : int {
|
||||||
@@ -461,6 +507,26 @@ enum ServerLockType : int {
|
|||||||
Unlock
|
Unlock
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum AccountStatus : uint8 {
|
||||||
|
Player = 0,
|
||||||
|
Steward = 10,
|
||||||
|
ApprenticeGuide = 20,
|
||||||
|
Guide = 50,
|
||||||
|
QuestTroupe = 80,
|
||||||
|
SeniorGuide = 81,
|
||||||
|
GMTester = 85,
|
||||||
|
EQSupport = 90,
|
||||||
|
GMStaff = 95,
|
||||||
|
GMAdmin = 100,
|
||||||
|
GMLeadAdmin = 150,
|
||||||
|
QuestMaster = 160,
|
||||||
|
GMAreas = 170,
|
||||||
|
GMCoder = 180,
|
||||||
|
GMMgmt = 200,
|
||||||
|
GMImpossible = 250,
|
||||||
|
Max = 255
|
||||||
|
};
|
||||||
|
|
||||||
enum Invisibility : uint8 {
|
enum Invisibility : uint8 {
|
||||||
Visible,
|
Visible,
|
||||||
Invisible,
|
Invisible,
|
||||||
@@ -486,17 +552,6 @@ enum ConsiderLevel : uint8 {
|
|||||||
Scowls
|
Scowls
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace ConsiderColor {
|
|
||||||
constexpr uint32 Green = 2;
|
|
||||||
constexpr uint32 DarkBlue = 4;
|
|
||||||
constexpr uint32 Gray = 6;
|
|
||||||
constexpr uint32 White = 10;
|
|
||||||
constexpr uint32 Red = 13;
|
|
||||||
constexpr uint32 Yellow = 15;
|
|
||||||
constexpr uint32 LightBlue = 18;
|
|
||||||
constexpr uint32 WhiteTitanium = 20;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum TargetDescriptionType : uint8 {
|
enum TargetDescriptionType : uint8 {
|
||||||
LCSelf,
|
LCSelf,
|
||||||
UCSelf,
|
UCSelf,
|
||||||
@@ -512,6 +567,19 @@ enum ReloadWorld : uint8 {
|
|||||||
ForceRepop
|
ForceRepop
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum BucketComparison : uint8 {
|
||||||
|
BucketEqualTo = 0,
|
||||||
|
BucketNotEqualTo,
|
||||||
|
BucketGreaterThanOrEqualTo,
|
||||||
|
BucketLesserThanOrEqualTo,
|
||||||
|
BucketGreaterThan,
|
||||||
|
BucketLesserThan,
|
||||||
|
BucketIsAny,
|
||||||
|
BucketIsNotAny,
|
||||||
|
BucketIsBetween,
|
||||||
|
BucketIsNotBetween
|
||||||
|
};
|
||||||
|
|
||||||
enum class EntityFilterType {
|
enum class EntityFilterType {
|
||||||
All,
|
All,
|
||||||
Bots,
|
Bots,
|
||||||
@@ -525,271 +593,4 @@ enum class ApplySpellType {
|
|||||||
Raid
|
Raid
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace SpecialAbility {
|
|
||||||
constexpr int Summon = 1;
|
|
||||||
constexpr int Enrage = 2;
|
|
||||||
constexpr int Rampage = 3;
|
|
||||||
constexpr int AreaRampage = 4;
|
|
||||||
constexpr int Flurry = 5;
|
|
||||||
constexpr int TripleAttack = 6;
|
|
||||||
constexpr int QuadrupleAttack = 7;
|
|
||||||
constexpr int DualWield = 8;
|
|
||||||
constexpr int BaneAttack = 9;
|
|
||||||
constexpr int MagicalAttack = 10;
|
|
||||||
constexpr int RangedAttack = 11;
|
|
||||||
constexpr int SlowImmunity = 12;
|
|
||||||
constexpr int MesmerizeImmunity = 13;
|
|
||||||
constexpr int CharmImmunity = 14;
|
|
||||||
constexpr int StunImmunity = 15;
|
|
||||||
constexpr int SnareImmunity = 16;
|
|
||||||
constexpr int FearImmunity = 17;
|
|
||||||
constexpr int DispellImmunity = 18;
|
|
||||||
constexpr int MeleeImmunity = 19;
|
|
||||||
constexpr int MagicImmunity = 20;
|
|
||||||
constexpr int FleeingImmunity = 21;
|
|
||||||
constexpr int MeleeImmunityExceptBane = 22;
|
|
||||||
constexpr int MeleeImmunityExceptMagical = 23;
|
|
||||||
constexpr int AggroImmunity = 24;
|
|
||||||
constexpr int BeingAggroImmunity = 25;
|
|
||||||
constexpr int CastingFromRangeImmunity = 26;
|
|
||||||
constexpr int FeignDeathImmunity = 27;
|
|
||||||
constexpr int TauntImmunity = 28;
|
|
||||||
constexpr int TunnelVision = 29;
|
|
||||||
constexpr int NoBuffHealFriends = 30;
|
|
||||||
constexpr int PacifyImmunity = 31;
|
|
||||||
constexpr int Leash = 32;
|
|
||||||
constexpr int Tether = 33;
|
|
||||||
constexpr int DestructibleObject = 34;
|
|
||||||
constexpr int HarmFromClientImmunity = 35;
|
|
||||||
constexpr int AlwaysFlee = 36;
|
|
||||||
constexpr int FleePercent = 37;
|
|
||||||
constexpr int AllowBeneficial = 38;
|
|
||||||
constexpr int DisableMelee = 39;
|
|
||||||
constexpr int NPCChaseDistance = 40;
|
|
||||||
constexpr int AllowedToTank = 41;
|
|
||||||
constexpr int IgnoreRootAggroRules = 42;
|
|
||||||
constexpr int CastingResistDifficulty = 43;
|
|
||||||
constexpr int CounterAvoidDamage = 44;
|
|
||||||
constexpr int ProximityAggro = 45;
|
|
||||||
constexpr int RangedAttackImmunity = 46;
|
|
||||||
constexpr int ClientDamageImmunity = 47;
|
|
||||||
constexpr int NPCDamageImmunity = 48;
|
|
||||||
constexpr int ClientAggroImmunity = 49;
|
|
||||||
constexpr int NPCAggroImmunity = 50;
|
|
||||||
constexpr int ModifyAvoidDamage = 51;
|
|
||||||
constexpr int MemoryFadeImmunity = 52;
|
|
||||||
constexpr int OpenImmunity = 53;
|
|
||||||
constexpr int AssassinateImmunity = 54;
|
|
||||||
constexpr int HeadshotImmunity = 55;
|
|
||||||
constexpr int BotAggroImmunity = 56;
|
|
||||||
constexpr int BotDamageImmunity = 57;
|
|
||||||
constexpr int Max = 58;
|
|
||||||
|
|
||||||
constexpr int MaxParameters = 9;
|
|
||||||
|
|
||||||
std::string GetName(int ability_id);
|
|
||||||
bool IsValid(int ability_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<int, std::string> special_ability_names = {
|
|
||||||
{ SpecialAbility::Summon, "Summon" },
|
|
||||||
{ SpecialAbility::Enrage, "Enrage" },
|
|
||||||
{ SpecialAbility::Rampage, "Rampage" },
|
|
||||||
{ SpecialAbility::AreaRampage, "Area Rampage" },
|
|
||||||
{ SpecialAbility::Flurry, "Flurry" },
|
|
||||||
{ SpecialAbility::TripleAttack, "Triple Attack" },
|
|
||||||
{ SpecialAbility::QuadrupleAttack, "Quadruple Attack" },
|
|
||||||
{ SpecialAbility::DualWield, "Dual Wield" },
|
|
||||||
{ SpecialAbility::BaneAttack, "Bane Attack" },
|
|
||||||
{ SpecialAbility::MagicalAttack, "Magical Attack" },
|
|
||||||
{ SpecialAbility::RangedAttack, "Ranged Attack" },
|
|
||||||
{ SpecialAbility::SlowImmunity, "Immune to Slow" },
|
|
||||||
{ SpecialAbility::MesmerizeImmunity, "Immune to Mesmerize" },
|
|
||||||
{ SpecialAbility::CharmImmunity, "Immune to Charm" },
|
|
||||||
{ SpecialAbility::StunImmunity, "Immune to Stun" },
|
|
||||||
{ SpecialAbility::SnareImmunity, "Immune to Snare" },
|
|
||||||
{ SpecialAbility::FearImmunity, "Immune to Fear" },
|
|
||||||
{ SpecialAbility::DispellImmunity, "Immune to Dispell" },
|
|
||||||
{ SpecialAbility::MeleeImmunity, "Immune to Melee" },
|
|
||||||
{ SpecialAbility::MagicImmunity, "Immune to Magic" },
|
|
||||||
{ SpecialAbility::FleeingImmunity, "Immune to Fleeing" },
|
|
||||||
{ SpecialAbility::MeleeImmunityExceptBane, "Immune to Melee except Bane" },
|
|
||||||
{ SpecialAbility::MeleeImmunityExceptMagical, "Immune to Non-Magical Melee" },
|
|
||||||
{ SpecialAbility::AggroImmunity, "Immune to Aggro" },
|
|
||||||
{ SpecialAbility::BeingAggroImmunity, "Immune to Being Aggro" },
|
|
||||||
{ SpecialAbility::CastingFromRangeImmunity, "Immune to Ranged Spells" },
|
|
||||||
{ SpecialAbility::FeignDeathImmunity, "Immune to Feign Death" },
|
|
||||||
{ SpecialAbility::TauntImmunity, "Immune to Taunt" },
|
|
||||||
{ SpecialAbility::TunnelVision, "Tunnel Vision" },
|
|
||||||
{ SpecialAbility::NoBuffHealFriends, "Does Not Heal or Buff Allies" },
|
|
||||||
{ SpecialAbility::PacifyImmunity, "Immune to Pacify" },
|
|
||||||
{ SpecialAbility::Leash, "Leashed" },
|
|
||||||
{ SpecialAbility::Tether, "Tethered" },
|
|
||||||
{ SpecialAbility::DestructibleObject, "Destructible Object" },
|
|
||||||
{ SpecialAbility::HarmFromClientImmunity, "Immune to Harm from Client" },
|
|
||||||
{ SpecialAbility::AlwaysFlee, "Always Flees" },
|
|
||||||
{ SpecialAbility::FleePercent, "Flee Percentage" },
|
|
||||||
{ SpecialAbility::AllowBeneficial, "Allows Beneficial Spells" },
|
|
||||||
{ SpecialAbility::DisableMelee, "Melee is Disabled" },
|
|
||||||
{ SpecialAbility::NPCChaseDistance, "Chase Distance" },
|
|
||||||
{ SpecialAbility::AllowedToTank, "Allowed to Tank" },
|
|
||||||
{ SpecialAbility::IgnoreRootAggroRules, "Ignores Root Aggro" },
|
|
||||||
{ SpecialAbility::CastingResistDifficulty, "Casting Resist Difficulty" },
|
|
||||||
{ SpecialAbility::CounterAvoidDamage, "Counter Damage Avoidance" },
|
|
||||||
{ SpecialAbility::ProximityAggro, "Proximity Aggro" },
|
|
||||||
{ SpecialAbility::RangedAttackImmunity, "Immune to Ranged Attacks" },
|
|
||||||
{ SpecialAbility::ClientDamageImmunity, "Immune to Client Damage" },
|
|
||||||
{ SpecialAbility::NPCDamageImmunity, "Immune to NPC Damage" },
|
|
||||||
{ SpecialAbility::ClientAggroImmunity, "Immune to Client Aggro" },
|
|
||||||
{ SpecialAbility::NPCAggroImmunity, "Immune to NPC Aggro" },
|
|
||||||
{ SpecialAbility::ModifyAvoidDamage, "Modify Damage Avoidance" },
|
|
||||||
{ SpecialAbility::MemoryFadeImmunity, "Immune to Memory Fades" },
|
|
||||||
{ SpecialAbility::OpenImmunity, "Immune to Open" },
|
|
||||||
{ SpecialAbility::AssassinateImmunity, "Immune to Assassinate" },
|
|
||||||
{ SpecialAbility::HeadshotImmunity, "Immune to Headshot" },
|
|
||||||
{ SpecialAbility::BotAggroImmunity, "Immune to Bot Aggro" },
|
|
||||||
{ SpecialAbility::BotDamageImmunity, "Immune to Bot Damage" },
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace HeroicBonusBucket
|
|
||||||
{
|
|
||||||
const std::string WisMaxMana = "HWIS-MaxMana";
|
|
||||||
const std::string WisManaRegen = "HWIS-ManaRegen";
|
|
||||||
const std::string WisHealAmt = "HWIS-HealAmt";
|
|
||||||
const std::string IntMaxMana = "HINT-MaxMana";
|
|
||||||
const std::string IntManaRegen = "HINT-ManaRegen";
|
|
||||||
const std::string IntSpellDmg = "HINT-SpellDmg";
|
|
||||||
const std::string StrMeleeDamage = "HSTR-MeleeDamage";
|
|
||||||
const std::string StrShieldAC = "HSTR-ShieldAC";
|
|
||||||
const std::string StrMaxEndurance = "HSTR-MaxEndurance";
|
|
||||||
const std::string StrEnduranceRegen = "HSTR-EnduranceRegen";
|
|
||||||
const std::string StaMaxHP = "HSTA-MaxHP";
|
|
||||||
const std::string StaHPRegen = "HSTA-HPRegen";
|
|
||||||
const std::string StaMaxEndurance = "HSTA-MaxEndurance";
|
|
||||||
const std::string StaEnduranceRegen = "HSTA-EnduranceRegen";
|
|
||||||
const std::string AgiAvoidance = "HAGI-Avoidance";
|
|
||||||
const std::string AgiMaxEndurance = "HAGI-MaxEndurance";
|
|
||||||
const std::string AgiEnduranceRegen = "HAGI-EnduranceRegen";
|
|
||||||
const std::string DexRangedDamage = "HDEX-RangedDamage";
|
|
||||||
const std::string DexMaxEndurance = "HDEX-MaxEndurance";
|
|
||||||
const std::string DexEnduranceRegen = "HDEX-EnduranceRegen";
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Bug {
|
|
||||||
namespace Category {
|
|
||||||
constexpr uint32 Other = 0;
|
|
||||||
constexpr uint32 Video = 1;
|
|
||||||
constexpr uint32 Audio = 2;
|
|
||||||
constexpr uint32 Pathing = 3;
|
|
||||||
constexpr uint32 Quest = 4;
|
|
||||||
constexpr uint32 Tradeskills = 5;
|
|
||||||
constexpr uint32 SpellStacking = 6;
|
|
||||||
constexpr uint32 DoorsPortals = 7;
|
|
||||||
constexpr uint32 Items = 8;
|
|
||||||
constexpr uint32 NPC = 9;
|
|
||||||
constexpr uint32 Dialogs = 10;
|
|
||||||
constexpr uint32 LoNTCG = 11;
|
|
||||||
constexpr uint32 Mercenaries = 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace InformationFlag {
|
|
||||||
constexpr uint32 None = 0;
|
|
||||||
constexpr uint32 Repeatable = 1;
|
|
||||||
constexpr uint32 Crash = 2;
|
|
||||||
constexpr uint32 TargetInfo = 4;
|
|
||||||
constexpr uint32 CharacterFlags = 8;
|
|
||||||
constexpr uint32 Unknown = 4294967280;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 GetID(const std::string& category_name);
|
|
||||||
std::string GetName(uint32 category_id);
|
|
||||||
bool IsValid(uint32 category_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint32, std::string> bug_category_names = {
|
|
||||||
{ Bug::Category::Other, "Other" },
|
|
||||||
{ Bug::Category::Video, "Video" },
|
|
||||||
{ Bug::Category::Audio, "Audio" },
|
|
||||||
{ Bug::Category::Pathing, "Pathing" },
|
|
||||||
{ Bug::Category::Quest, "Quest" },
|
|
||||||
{ Bug::Category::Tradeskills, "Tradeskills" },
|
|
||||||
{ Bug::Category::SpellStacking, "Spell Stacking" },
|
|
||||||
{ Bug::Category::DoorsPortals, "Doors and Portals" },
|
|
||||||
{ Bug::Category::Items, "Items" },
|
|
||||||
{ Bug::Category::NPC, "NPC" },
|
|
||||||
{ Bug::Category::Dialogs, "Dialogs" },
|
|
||||||
{ Bug::Category::LoNTCG, "LoN - TCG" },
|
|
||||||
{ Bug::Category::Mercenaries, "Mercenaries" }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace Stance {
|
|
||||||
constexpr uint32 Unknown = 0;
|
|
||||||
constexpr uint32 Passive = 1;
|
|
||||||
constexpr uint32 Balanced = 2;
|
|
||||||
constexpr uint32 Efficient = 3;
|
|
||||||
constexpr uint32 Reactive = 4;
|
|
||||||
constexpr uint32 Aggressive = 5;
|
|
||||||
constexpr uint32 Assist = 6;
|
|
||||||
constexpr uint32 Burn = 7;
|
|
||||||
constexpr uint32 Efficient2 = 8;
|
|
||||||
constexpr uint32 AEBurn = 9;
|
|
||||||
|
|
||||||
std::string GetName(uint8 stance_id);
|
|
||||||
uint8 GetIndex(uint8 stance_id);
|
|
||||||
bool IsValid(uint8 stance_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint32, std::string> stance_names = {
|
|
||||||
{ Stance::Unknown, "Unknown" },
|
|
||||||
{ Stance::Passive, "Passive" },
|
|
||||||
{ Stance::Balanced, "Balanced" },
|
|
||||||
{ Stance::Efficient, "Efficient" },
|
|
||||||
{ Stance::Reactive, "Reactive" },
|
|
||||||
{ Stance::Aggressive, "Aggressive" },
|
|
||||||
{ Stance::Assist, "Assist" },
|
|
||||||
{ Stance::Burn, "Burn" },
|
|
||||||
{ Stance::Efficient2, "Efficient" },
|
|
||||||
{ Stance::AEBurn, "AE Burn" }
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace LDoNTheme {
|
|
||||||
constexpr uint32 Unused = 0;
|
|
||||||
constexpr uint32 GUK = 1;
|
|
||||||
constexpr uint32 MIR = 2;
|
|
||||||
constexpr uint32 MMC = 3;
|
|
||||||
constexpr uint32 RUJ = 4;
|
|
||||||
constexpr uint32 TAK = 5;
|
|
||||||
|
|
||||||
constexpr uint32 UnusedBit = 0;
|
|
||||||
constexpr uint32 GUKBit = 1;
|
|
||||||
constexpr uint32 MIRBit = 2;
|
|
||||||
constexpr uint32 MMCBit = 4;
|
|
||||||
constexpr uint32 RUJBit = 8;
|
|
||||||
constexpr uint32 TAKBit = 16;
|
|
||||||
|
|
||||||
uint32 GetBitmask(uint32 theme_id);
|
|
||||||
std::string GetName(uint32 theme_id);
|
|
||||||
bool IsValid(uint32 theme_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::map<uint32, std::pair<std::string, uint32>> ldon_theme_names = {
|
|
||||||
{ LDoNTheme::Unused, { "Unused", LDoNTheme::UnusedBit }, },
|
|
||||||
{ LDoNTheme::GUK, { "Deepest Guk", LDoNTheme::GUKBit }, },
|
|
||||||
{ LDoNTheme::MIR, { "Miragul's Menagerie", LDoNTheme::MIRBit }, },
|
|
||||||
{ LDoNTheme::MMC, { "Mistmoore Catacombs", LDoNTheme::MMCBit }, },
|
|
||||||
{ LDoNTheme::RUJ, { "Rujarkian Hills", LDoNTheme::RUJBit }, },
|
|
||||||
{ LDoNTheme::TAK, { "Takish-Hiz", LDoNTheme::TAKBit }, },
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace PCNPCOnlyFlagType {
|
|
||||||
constexpr int PC = 1;
|
|
||||||
constexpr int NPC = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace BookType {
|
|
||||||
constexpr uint8 Scroll = 0;
|
|
||||||
constexpr uint8 Book = 1;
|
|
||||||
constexpr uint8 ItemInfo = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*COMMON_EMU_CONSTANTS_H*/
|
#endif /*COMMON_EMU_CONSTANTS_H*/
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ typedef enum { //EQEmu internal opcodes list
|
|||||||
_maxEmuOpcode
|
_maxEmuOpcode
|
||||||
} EmuOpcode;
|
} EmuOpcode;
|
||||||
|
|
||||||
constexpr int format_as(EmuOpcode opcode) { return static_cast<int>(opcode); }
|
|
||||||
extern const char *OpcodeNames[_maxEmuOpcode+1];
|
extern const char *OpcodeNames[_maxEmuOpcode+1];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+2
-44
@@ -35,7 +35,7 @@ N(OP_AltCurrencyMerchantRequest),
|
|||||||
N(OP_AltCurrencyPurchase),
|
N(OP_AltCurrencyPurchase),
|
||||||
N(OP_AltCurrencyReclaim),
|
N(OP_AltCurrencyReclaim),
|
||||||
N(OP_AltCurrencySell),
|
N(OP_AltCurrencySell),
|
||||||
N(OP_AltCurrencySellSelection), // Used by eqstr_us.txt 8066, 8068, 8069
|
N(OP_AltCurrencySellSelection), // Used by eqstr_us.txt 8066, 8068, 8069
|
||||||
N(OP_Animation),
|
N(OP_Animation),
|
||||||
N(OP_AnnoyingZoneUnknown),
|
N(OP_AnnoyingZoneUnknown),
|
||||||
N(OP_ApplyPoison),
|
N(OP_ApplyPoison),
|
||||||
@@ -62,12 +62,10 @@ N(OP_BeginCast),
|
|||||||
N(OP_Bind_Wound),
|
N(OP_Bind_Wound),
|
||||||
N(OP_BlockedBuffs),
|
N(OP_BlockedBuffs),
|
||||||
N(OP_BoardBoat),
|
N(OP_BoardBoat),
|
||||||
N(OP_BookButton),
|
|
||||||
N(OP_Buff),
|
N(OP_Buff),
|
||||||
N(OP_BuffCreate),
|
N(OP_BuffCreate),
|
||||||
N(OP_BuffRemoveRequest),
|
N(OP_BuffRemoveRequest),
|
||||||
N(OP_Bug),
|
N(OP_Bug),
|
||||||
N(OP_BuyerItems),
|
|
||||||
N(OP_CameraEffect),
|
N(OP_CameraEffect),
|
||||||
N(OP_Camp),
|
N(OP_Camp),
|
||||||
N(OP_CancelSneakHide),
|
N(OP_CancelSneakHide),
|
||||||
@@ -77,7 +75,6 @@ N(OP_CashReward),
|
|||||||
N(OP_CastSpell),
|
N(OP_CastSpell),
|
||||||
N(OP_ChangeSize),
|
N(OP_ChangeSize),
|
||||||
N(OP_ChannelMessage),
|
N(OP_ChannelMessage),
|
||||||
N(OP_ChangePetName),
|
|
||||||
N(OP_CharacterCreate),
|
N(OP_CharacterCreate),
|
||||||
N(OP_CharacterCreateRequest),
|
N(OP_CharacterCreateRequest),
|
||||||
N(OP_CharInventory),
|
N(OP_CharInventory),
|
||||||
@@ -163,7 +160,6 @@ N(OP_EnduranceUpdate),
|
|||||||
N(OP_EnterChat),
|
N(OP_EnterChat),
|
||||||
N(OP_EnterWorld),
|
N(OP_EnterWorld),
|
||||||
N(OP_EnvDamage),
|
N(OP_EnvDamage),
|
||||||
N(OP_EvolveItem),
|
|
||||||
N(OP_ExpansionInfo),
|
N(OP_ExpansionInfo),
|
||||||
N(OP_ExpUpdate),
|
N(OP_ExpUpdate),
|
||||||
N(OP_FaceChange),
|
N(OP_FaceChange),
|
||||||
@@ -231,7 +227,6 @@ N(OP_GuildBank),
|
|||||||
N(OP_GuildBankItemList),
|
N(OP_GuildBankItemList),
|
||||||
N(OP_GuildCreate),
|
N(OP_GuildCreate),
|
||||||
N(OP_GuildDelete),
|
N(OP_GuildDelete),
|
||||||
N(OP_GuildDeleteGuild),
|
|
||||||
N(OP_GuildDemote),
|
N(OP_GuildDemote),
|
||||||
N(OP_GuildInvite),
|
N(OP_GuildInvite),
|
||||||
N(OP_GuildInviteAccept),
|
N(OP_GuildInviteAccept),
|
||||||
@@ -243,33 +238,15 @@ N(OP_GuildManageStatus),
|
|||||||
N(OP_GuildMemberLevelUpdate),
|
N(OP_GuildMemberLevelUpdate),
|
||||||
N(OP_GuildMemberList),
|
N(OP_GuildMemberList),
|
||||||
N(OP_GuildMemberUpdate),
|
N(OP_GuildMemberUpdate),
|
||||||
N(OP_GuildMemberLevel),
|
|
||||||
N(OP_GuildMemberRankAltBanker),
|
|
||||||
N(OP_GuildMemberPublicNote),
|
|
||||||
N(OP_GuildMemberAdd),
|
|
||||||
N(OP_GuildMemberRename),
|
|
||||||
N(OP_GuildMemberDelete),
|
|
||||||
N(OP_GuildMemberDetails),
|
|
||||||
N(OP_GuildRenameGuild),
|
|
||||||
N(OP_GuildMOTD),
|
N(OP_GuildMOTD),
|
||||||
N(OP_GuildPeace),
|
N(OP_GuildPeace),
|
||||||
N(OP_GuildPromote),
|
N(OP_GuildPromote),
|
||||||
N(OP_GuildPublicNote),
|
N(OP_GuildPublicNote),
|
||||||
N(OP_GuildRemove),
|
N(OP_GuildRemove),
|
||||||
N(OP_GuildSelectTribute),
|
|
||||||
N(OP_GuildModifyBenefits),
|
|
||||||
N(OP_GuildTributeToggleReq),
|
|
||||||
N(OP_GuildTributeToggleReply),
|
|
||||||
N(OP_GuildOptInOut),
|
|
||||||
N(OP_GuildSaveActiveTributes),
|
|
||||||
N(OP_GuildSendActiveTributes),
|
|
||||||
N(OP_GuildTributeFavorAndTimer),
|
|
||||||
N(OP_GuildsList),
|
N(OP_GuildsList),
|
||||||
N(OP_GuildStatus),
|
N(OP_GuildStatus),
|
||||||
N(OP_GuildTributeInfo),
|
N(OP_GuildTributeInfo),
|
||||||
N(OP_GuildUpdate),
|
N(OP_GuildUpdateURLAndChannel),
|
||||||
N(OP_GuildTributeDonateItem),
|
|
||||||
N(OP_GuildTributeDonatePlat),
|
|
||||||
N(OP_GuildWar),
|
N(OP_GuildWar),
|
||||||
N(OP_Heartbeat),
|
N(OP_Heartbeat),
|
||||||
N(OP_Hide),
|
N(OP_Hide),
|
||||||
@@ -285,17 +262,12 @@ N(OP_InspectMessageUpdate),
|
|||||||
N(OP_InspectRequest),
|
N(OP_InspectRequest),
|
||||||
N(OP_InstillDoubt),
|
N(OP_InstillDoubt),
|
||||||
N(OP_InterruptCast),
|
N(OP_InterruptCast),
|
||||||
N(OP_InvokeChangePetName),
|
|
||||||
N(OP_InvokeChangePetNameImmediate),
|
|
||||||
N(OP_InvokeNameChangeImmediate),
|
|
||||||
N(OP_InvokeNameChangeLazy),
|
|
||||||
N(OP_ItemLinkClick),
|
N(OP_ItemLinkClick),
|
||||||
N(OP_ItemLinkResponse),
|
N(OP_ItemLinkResponse),
|
||||||
N(OP_ItemLinkText),
|
N(OP_ItemLinkText),
|
||||||
N(OP_ItemName),
|
N(OP_ItemName),
|
||||||
N(OP_ItemPacket),
|
N(OP_ItemPacket),
|
||||||
N(OP_ItemPreview),
|
N(OP_ItemPreview),
|
||||||
N(OP_ItemPreviewRequest),
|
|
||||||
N(OP_ItemRecastDelay),
|
N(OP_ItemRecastDelay),
|
||||||
N(OP_ItemVerifyReply),
|
N(OP_ItemVerifyReply),
|
||||||
N(OP_ItemVerifyRequest),
|
N(OP_ItemVerifyRequest),
|
||||||
@@ -344,7 +316,6 @@ N(OP_LootRequest),
|
|||||||
N(OP_ManaChange),
|
N(OP_ManaChange),
|
||||||
N(OP_ManaUpdate),
|
N(OP_ManaUpdate),
|
||||||
N(OP_MarkNPC),
|
N(OP_MarkNPC),
|
||||||
N(OP_MarkRaidNPC),
|
|
||||||
N(OP_Marquee),
|
N(OP_Marquee),
|
||||||
N(OP_MemorizeSpell),
|
N(OP_MemorizeSpell),
|
||||||
N(OP_Mend),
|
N(OP_Mend),
|
||||||
@@ -407,8 +378,6 @@ N(OP_PetitionSearchText),
|
|||||||
N(OP_PetitionUnCheckout),
|
N(OP_PetitionUnCheckout),
|
||||||
N(OP_PetitionUpdate),
|
N(OP_PetitionUpdate),
|
||||||
N(OP_PickPocket),
|
N(OP_PickPocket),
|
||||||
N(OP_PickZone),
|
|
||||||
N(OP_PickZoneWindow),
|
|
||||||
N(OP_PlayerProfile),
|
N(OP_PlayerProfile),
|
||||||
N(OP_PlayerStateAdd),
|
N(OP_PlayerStateAdd),
|
||||||
N(OP_PlayerStateRemove),
|
N(OP_PlayerStateRemove),
|
||||||
@@ -429,8 +398,6 @@ N(OP_PVPLeaderBoardRequest),
|
|||||||
N(OP_PVPStats),
|
N(OP_PVPStats),
|
||||||
N(OP_QueryResponseThing),
|
N(OP_QueryResponseThing),
|
||||||
N(OP_QueryUCSServerStatus),
|
N(OP_QueryUCSServerStatus),
|
||||||
N(OP_RaidDelegateAbility),
|
|
||||||
N(OP_RaidClearNPCMarks),
|
|
||||||
N(OP_RaidInvite),
|
N(OP_RaidInvite),
|
||||||
N(OP_RaidJoin),
|
N(OP_RaidJoin),
|
||||||
N(OP_RaidUpdate),
|
N(OP_RaidUpdate),
|
||||||
@@ -454,7 +421,6 @@ N(OP_ReqClientSpawn),
|
|||||||
N(OP_ReqNewZone),
|
N(OP_ReqNewZone),
|
||||||
N(OP_RequestClientZoneChange),
|
N(OP_RequestClientZoneChange),
|
||||||
N(OP_RequestDuel),
|
N(OP_RequestDuel),
|
||||||
N(OP_RequestGuildTributes),
|
|
||||||
N(OP_RequestKnowledgeBase),
|
N(OP_RequestKnowledgeBase),
|
||||||
N(OP_RequestTitles),
|
N(OP_RequestTitles),
|
||||||
N(OP_RespawnWindow),
|
N(OP_RespawnWindow),
|
||||||
@@ -520,11 +486,6 @@ N(OP_ShopEndConfirm),
|
|||||||
N(OP_ShopItem),
|
N(OP_ShopItem),
|
||||||
N(OP_ShopPlayerBuy),
|
N(OP_ShopPlayerBuy),
|
||||||
N(OP_ShopPlayerSell),
|
N(OP_ShopPlayerSell),
|
||||||
N(OP_ShopSendParcel),
|
|
||||||
N(OP_ShopDeleteParcel),
|
|
||||||
N(OP_ShopRespondParcel),
|
|
||||||
N(OP_ShopRetrieveParcel),
|
|
||||||
N(OP_ShopParcelIcon),
|
|
||||||
N(OP_ShopRequest),
|
N(OP_ShopRequest),
|
||||||
N(OP_SimpleMessage),
|
N(OP_SimpleMessage),
|
||||||
N(OP_SkillUpdate),
|
N(OP_SkillUpdate),
|
||||||
@@ -543,7 +504,6 @@ N(OP_Stamina),
|
|||||||
N(OP_Stun),
|
N(OP_Stun),
|
||||||
N(OP_Surname),
|
N(OP_Surname),
|
||||||
N(OP_SwapSpell),
|
N(OP_SwapSpell),
|
||||||
N(OP_SystemFingerprint),
|
|
||||||
N(OP_TargetBuffs),
|
N(OP_TargetBuffs),
|
||||||
N(OP_TargetCommand),
|
N(OP_TargetCommand),
|
||||||
N(OP_TargetHoTT),
|
N(OP_TargetHoTT),
|
||||||
@@ -568,7 +528,6 @@ N(OP_TradeBusy),
|
|||||||
N(OP_TradeCoins),
|
N(OP_TradeCoins),
|
||||||
N(OP_TradeMoneyUpdate),
|
N(OP_TradeMoneyUpdate),
|
||||||
N(OP_Trader),
|
N(OP_Trader),
|
||||||
N(OP_TraderBulkSend),
|
|
||||||
N(OP_TraderBuy),
|
N(OP_TraderBuy),
|
||||||
N(OP_TraderDelItem),
|
N(OP_TraderDelItem),
|
||||||
N(OP_TradeRequest),
|
N(OP_TradeRequest),
|
||||||
@@ -576,7 +535,6 @@ N(OP_TradeRequestAck),
|
|||||||
N(OP_TraderItemUpdate),
|
N(OP_TraderItemUpdate),
|
||||||
N(OP_TraderShop),
|
N(OP_TraderShop),
|
||||||
N(OP_TradeSkillCombine),
|
N(OP_TradeSkillCombine),
|
||||||
N(OP_TradeSkillRecipeInspect),
|
|
||||||
N(OP_Translocate),
|
N(OP_Translocate),
|
||||||
N(OP_TributeInfo),
|
N(OP_TributeInfo),
|
||||||
N(OP_TributeItem),
|
N(OP_TributeItem),
|
||||||
|
|||||||
+163
-233
@@ -23,61 +23,61 @@
|
|||||||
#include "skills.h"
|
#include "skills.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
namespace AppearanceType {
|
|
||||||
constexpr uint32 Die = 0; // Causes the client to keel over and zone to bind point (default action)
|
|
||||||
constexpr uint32 WhoLevel = 1; // Level that shows up on /who
|
|
||||||
constexpr uint32 MaxHealth = 2;
|
|
||||||
constexpr uint32 Invisibility = 3; // 0 = Visible, 1 = Invisible
|
|
||||||
constexpr uint32 PVP = 4; // 0 = Non-PVP, 1 = PVP
|
|
||||||
constexpr uint32 Light = 5; // Light type emitted by player (lightstone, shiny shield)
|
|
||||||
constexpr uint32 Animation = 14; // 100 = Standing, 102 = Freeze, 105 = Looting, 110 = Sitting, 111 = Crouching, 115 = Lying
|
|
||||||
constexpr uint32 Sneak = 15; // 0 = Normal, 1 = Sneaking
|
|
||||||
constexpr uint32 SpawnID = 16; // Server -> Client, sets player spawn ID
|
|
||||||
constexpr uint32 Health = 17; // Client->Server, my HP has changed (like regen tic)
|
|
||||||
constexpr uint32 Linkdead = 18; // 0 = Normal, 1 = Linkdead
|
|
||||||
constexpr uint32 FlyMode = 19; // 0 = Off, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating while Running
|
|
||||||
constexpr uint32 GM = 20; // 0 = Non-GM, 1 = GM
|
|
||||||
constexpr uint32 Anonymous = 21; // 0 = Non-Anonymous, 1 = Anonymous, 2 = Roleplaying
|
|
||||||
constexpr uint32 GuildID = 22;
|
|
||||||
constexpr uint32 GuildRank = 23;
|
|
||||||
constexpr uint32 AFK = 24; // 0 = Non-AFK, 1 = AFK
|
|
||||||
constexpr uint32 Pet = 25; // Parameter is Entity ID of owner, or 0 for when charm breaks
|
|
||||||
constexpr uint32 Summoned = 27;
|
|
||||||
constexpr uint32 Split = 28; // 0 = No Split, 1 = Auto Split
|
|
||||||
constexpr uint32 Size = 29; // Spawn's Size
|
|
||||||
constexpr uint32 SetType = 30; // 0 = PC, 1 = NPC, 2 = Corpse
|
|
||||||
constexpr uint32 NPCName = 31; // Change PC name color to NPC name color
|
|
||||||
constexpr uint32 AARank = 32; // AA Rank Title ID, title in /who?
|
|
||||||
constexpr uint32 CancelSneakHide = 33; // Turns off Hide and Sneak
|
|
||||||
constexpr uint32 AreaHealthRegen = 35; // Guild Hall Regeneration Pool sets to value * 0.001
|
|
||||||
constexpr uint32 AreaManaRegen = 36; // Guild Hall Regeneration Pool sets to value * 0.001
|
|
||||||
constexpr uint32 AreaEnduranceRegen = 37; // Guild Hall Regeneration Pool sets to value * 0.001
|
|
||||||
constexpr uint32 FreezeBeneficialBuffs = 38; // Freezes beneficial buff timers for PCs
|
|
||||||
constexpr uint32 NPCTintIndex = 39;
|
|
||||||
constexpr uint32 GroupAutoConsent = 40; // Auto Consent Group
|
|
||||||
constexpr uint32 RaidAutoConsent = 41; // Auto Consent Raid
|
|
||||||
constexpr uint32 GuildAutoConsent = 42; // Auto Consent Guild
|
|
||||||
constexpr uint32 ShowHelm = 43; // 0 = Hide, 1 = Show
|
|
||||||
constexpr uint32 DamageState = 44; // The damage state of a destructible object (0 through 10) plays sound IDs, most only have 2 or 4 states though
|
|
||||||
constexpr uint32 EQPlayers = 45; // EQ Players Update
|
|
||||||
constexpr uint32 FindBits = 46; // Set Find Bits?
|
|
||||||
constexpr uint32 TextureType = 48; // Texture Type?
|
|
||||||
constexpr uint32 FacePick = 49; // Turns off face pick window?
|
|
||||||
constexpr uint32 AntiCheat = 51; // Sent by the client randomly telling the server how long since last action has occurred
|
|
||||||
constexpr uint32 GuildShow = 52;
|
|
||||||
constexpr uint32 OfflineMode = 53; // Offline Mode
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Animation {
|
//SpawnAppearance types: (compared two clients for server-originating types: SoF & RoF2)
|
||||||
constexpr uint32 Standing = 100;
|
#define AT_Die 0 // this causes the client to keel over and zone to bind point (default action)
|
||||||
constexpr uint32 Freeze = 102;
|
#define AT_WhoLevel 1 // the level that shows up on /who
|
||||||
constexpr uint32 Looting = 105;
|
#define AT_HPMax 2 // idk
|
||||||
constexpr uint32 Sitting = 110;
|
#define AT_Invis 3 // 0 = visible, 1 = invisible
|
||||||
constexpr uint32 Crouching = 111;
|
#define AT_PVP 4 // 0 = blue, 1 = pvp (red)
|
||||||
constexpr uint32 Lying = 115;
|
#define AT_Light 5 // light type emitted by player (lightstone, shiny shield)
|
||||||
}
|
#define AT_Anim 14 // 100=standing, 110=sitting, 111=ducking, 115=feigned, 105=looting
|
||||||
|
#define AT_Sneak 15 // 0 = normal, 1 = sneaking
|
||||||
|
#define AT_SpawnID 16 // server to client, sets player spawn id
|
||||||
|
#define AT_HP 17 // Client->Server, my HP has changed (like regen tic)
|
||||||
|
#define AT_Linkdead 18 // 0 = normal, 1 = linkdead
|
||||||
|
#define AT_Levitate 19 // 0=off, 1=flymode, 2=levitate max 5, see GravityBehavior enum
|
||||||
|
#define AT_GM 20 // 0 = normal, 1 = GM - all odd numbers seem to make it GM
|
||||||
|
#define AT_Anon 21 // 0 = normal, 1 = anon, 2 = roleplay
|
||||||
|
#define AT_GuildID 22
|
||||||
|
#define AT_GuildRank 23 // 0=member, 1=officer, 2=leader
|
||||||
|
#define AT_AFK 24 // 0 = normal, 1 = afk
|
||||||
|
#define AT_Pet 25 // Param is EntityID of owner, or 0 for when charm breaks
|
||||||
|
#define AT_Summoned 27 // Unsure
|
||||||
|
#define AT_Split 28 // 0 = normal, 1 = autosplit on (not showing in SoF+) (client-to-server only)
|
||||||
|
#define AT_Size 29 // spawn's size (present: SoF, absent: RoF2)
|
||||||
|
#define AT_SetType 30 // 0 = PC, 1 = NPC, 2 <= = corpse
|
||||||
|
#define AT_NPCName 31 // change PC's name's color to NPC color 0 = normal, 1 = npc name, Trader on RoF2?
|
||||||
|
#define AT_AARank 32 // AA Rank Title ID thingy, does is this the title in /who?
|
||||||
|
#define AT_CancelSneakHide 33 // Turns off Hide and Sneak
|
||||||
|
//#define AT_34 34 // unknown (present: SoF, absent: RoF2)
|
||||||
|
#define AT_AreaHPRegen 35 // guild hall regen pool sets to value * 0.001
|
||||||
|
#define AT_AreaManaRegen 36 // guild hall regen pool sets to value * 0.001
|
||||||
|
#define AT_AreaEndRegen 37 // guild hall regen pool sets to value * 0.001
|
||||||
|
#define AT_FreezeBuffs 38 // Freezes beneficial buff timers
|
||||||
|
#define AT_NpcTintIndex 39 // not 100% sure
|
||||||
|
#define AT_GroupConsent 40 // auto consent group
|
||||||
|
#define AT_RaidConsent 41 // auto consent raid
|
||||||
|
#define AT_GuildConsent 42 // auto consent guild
|
||||||
|
#define AT_ShowHelm 43 // 0 = hide graphic, 1 = show graphic
|
||||||
|
#define AT_DamageState 44 // The damage state of a destructible object (0 through 10) plays soundids most only have 2 or 4 states though
|
||||||
|
#define AT_EQPlayers 45 // /eqplayersupdate
|
||||||
|
#define AT_FindBits 46 // set FindBits, whatever those are!
|
||||||
|
#define AT_TextureType 48 // TextureType
|
||||||
|
#define AT_FacePick 49 // Turns off face pick window? maybe ...
|
||||||
|
#define AT_AntiCheat 51 // sent by the client randomly telling the server how long since last action has occured
|
||||||
|
#define AT_GuildShow 52 // this is what MQ2 call sit, not sure
|
||||||
|
#define AT_Offline 53 // Offline mode
|
||||||
|
|
||||||
constexpr int16 RECAST_TYPE_UNLINKED_ITEM = -1;
|
//#define AT_Trader 300 // Bazaar Trader Mode (not present in SoF or RoF2)
|
||||||
|
|
||||||
|
// animations for AT_Anim
|
||||||
|
#define ANIM_FREEZE 102
|
||||||
|
#define ANIM_STAND 0x64
|
||||||
|
#define ANIM_SIT 0x6e
|
||||||
|
#define ANIM_CROUCH 0x6f
|
||||||
|
#define ANIM_DEATH 0x73
|
||||||
|
#define ANIM_LOOT 0x69
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
eaStanding = 0,
|
eaStanding = 0,
|
||||||
@@ -684,53 +684,6 @@ namespace Zones {
|
|||||||
constexpr uint16 APPRENTICE = 999; // Designer Apprentice
|
constexpr uint16 APPRENTICE = 999; // Designer Apprentice
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Language {
|
|
||||||
constexpr uint8 CommonTongue = 0;
|
|
||||||
constexpr uint8 Barbarian = 1;
|
|
||||||
constexpr uint8 Erudian = 2;
|
|
||||||
constexpr uint8 Elvish = 3;
|
|
||||||
constexpr uint8 DarkElvish = 4;
|
|
||||||
constexpr uint8 Dwarvish = 5;
|
|
||||||
constexpr uint8 Troll = 6;
|
|
||||||
constexpr uint8 Ogre = 7;
|
|
||||||
constexpr uint8 Gnomish = 8;
|
|
||||||
constexpr uint8 Halfling = 9;
|
|
||||||
constexpr uint8 ThievesCant = 10;
|
|
||||||
constexpr uint8 OldErudian = 11;
|
|
||||||
constexpr uint8 ElderElvish = 12;
|
|
||||||
constexpr uint8 Froglok = 13;
|
|
||||||
constexpr uint8 Goblin = 14;
|
|
||||||
constexpr uint8 Gnoll = 15;
|
|
||||||
constexpr uint8 CombineTongue = 16;
|
|
||||||
constexpr uint8 ElderTeirDal = 17;
|
|
||||||
constexpr uint8 Lizardman = 18;
|
|
||||||
constexpr uint8 Orcish = 19;
|
|
||||||
constexpr uint8 Faerie = 20;
|
|
||||||
constexpr uint8 Dragon = 21;
|
|
||||||
constexpr uint8 ElderDragon = 22;
|
|
||||||
constexpr uint8 DarkSpeech = 23;
|
|
||||||
constexpr uint8 VahShir = 24;
|
|
||||||
constexpr uint8 Alaran = 25;
|
|
||||||
constexpr uint8 Hadal = 26;
|
|
||||||
constexpr uint8 Unknown27 = 27;
|
|
||||||
|
|
||||||
constexpr uint8 MaxValue = 100;
|
|
||||||
}
|
|
||||||
namespace PetInfoType {
|
|
||||||
constexpr int Current = 0;
|
|
||||||
constexpr int Suspended = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace BuffEffectType {
|
|
||||||
constexpr uint8 None = 0;
|
|
||||||
constexpr uint8 Buff = 2;
|
|
||||||
constexpr uint8 InverseBuff = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace AlternateCurrencyMode {
|
|
||||||
constexpr uint32 Update = 7;
|
|
||||||
constexpr uint32 Populate = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FilterNone = 0,
|
FilterNone = 0,
|
||||||
@@ -758,10 +711,10 @@ typedef enum {
|
|||||||
FilterFocusEffects = 22, //0=show, 1=hide
|
FilterFocusEffects = 22, //0=show, 1=hide
|
||||||
FilterPetSpells = 23, //0=show, 1=hide
|
FilterPetSpells = 23, //0=show, 1=hide
|
||||||
FilterHealOverTime = 24, //0=show, 1=mine only, 2=hide
|
FilterHealOverTime = 24, //0=show, 1=mine only, 2=hide
|
||||||
FilterItemSpeech = 25, //0=show, 1=hide // RoF2 Confirmed
|
FilterUnknown25 = 25,
|
||||||
FilterStrikethrough = 26, //0=show, 1=hide // RoF2 Confirmed
|
FilterUnknown26 = 26,
|
||||||
FilterStuns = 27, //0=show, 1=hide // RoF2 Confirmed
|
FilterUnknown27 = 27,
|
||||||
FilterBardSongsOnPets = 28, //0=show, 1=hide // RoF2 Confirmed
|
FilterUnknown28 = 28,
|
||||||
_FilterCount
|
_FilterCount
|
||||||
} eqFilterType;
|
} eqFilterType;
|
||||||
|
|
||||||
@@ -772,47 +725,67 @@ typedef enum {
|
|||||||
FilterShowSelfOnly
|
FilterShowSelfOnly
|
||||||
} eqFilterMode;
|
} eqFilterMode;
|
||||||
|
|
||||||
#define STAT_STR 0
|
#define STAT_STR 0
|
||||||
#define STAT_STA 1
|
#define STAT_STA 1
|
||||||
#define STAT_AGI 2
|
#define STAT_AGI 2
|
||||||
#define STAT_DEX 3
|
#define STAT_DEX 3
|
||||||
#define STAT_INT 4
|
#define STAT_INT 4
|
||||||
#define STAT_WIS 5
|
#define STAT_WIS 5
|
||||||
#define STAT_CHA 6
|
#define STAT_CHA 6
|
||||||
#define STAT_MAGIC 7
|
#define STAT_MAGIC 7
|
||||||
#define STAT_COLD 8
|
#define STAT_COLD 8
|
||||||
#define STAT_FIRE 9
|
#define STAT_FIRE 9
|
||||||
#define STAT_POISON 10
|
#define STAT_POISON 10
|
||||||
#define STAT_DISEASE 11
|
#define STAT_DISEASE 11
|
||||||
#define STAT_MANA 12
|
#define STAT_MANA 12
|
||||||
#define STAT_HP 13
|
#define STAT_HP 13
|
||||||
#define STAT_AC 14
|
#define STAT_AC 14
|
||||||
#define STAT_ENDURANCE 15
|
#define STAT_ENDURANCE 15
|
||||||
#define STAT_ATTACK 16
|
#define STAT_ATTACK 16
|
||||||
#define STAT_HP_REGEN 17
|
#define STAT_HP_REGEN 17
|
||||||
#define STAT_MANA_REGEN 18
|
#define STAT_MANA_REGEN 18
|
||||||
#define STAT_HASTE 19
|
#define STAT_HASTE 19
|
||||||
#define STAT_DAMAGE_SHIELD 20
|
#define STAT_DAMAGE_SHIELD 20
|
||||||
#define STAT_DS_MITIGATION 22
|
|
||||||
#define STAT_HEAL_AMOUNT 23
|
/*
|
||||||
#define STAT_SPELL_DAMAGE 24
|
** Recast timer types. Used as an off set to charProfileStruct timers.
|
||||||
#define STAT_CLAIRVOYANCE 25
|
**
|
||||||
#define STAT_HEROIC_AGILITY 26
|
** (Another orphaned enumeration...)
|
||||||
#define STAT_HEROIC_CHARISMA 27
|
*/
|
||||||
#define STAT_HEROIC_DEXTERITY 28
|
enum RecastTimerTypes
|
||||||
#define STAT_HEROIC_INTELLIGENCE 29
|
{
|
||||||
#define STAT_HEROIC_STAMINA 30
|
RecTimer_0 = 0,
|
||||||
#define STAT_HEROIC_STRENGTH 31
|
RecTimer_1,
|
||||||
#define STAT_HEROIC_WISDOM 32
|
RecTimer_WeaponHealClick, // 2
|
||||||
#define STAT_BASH 33
|
RecTimer_MuramiteBaneNukeClick, // 3
|
||||||
#define STAT_BACKSTAB 34
|
RecTimer_4,
|
||||||
#define STAT_DRAGON_PUNCH 35
|
RecTimer_DispellClick, // 5 (also click heal orbs?)
|
||||||
#define STAT_EAGLE_STRIKE 36
|
RecTimer_Epic, // 6
|
||||||
#define STAT_FLYING_KICK 37
|
RecTimer_OoWBPClick, // 7
|
||||||
#define STAT_KICK 38
|
RecTimer_VishQuestClassItem, // 8
|
||||||
#define STAT_ROUND_KICK 39
|
RecTimer_HealPotion, // 9
|
||||||
#define STAT_TIGER_CLAW 40
|
RecTimer_10,
|
||||||
#define STAT_FRENZY 41
|
RecTimer_11,
|
||||||
|
RecTimer_12,
|
||||||
|
RecTimer_13,
|
||||||
|
RecTimer_14,
|
||||||
|
RecTimer_15,
|
||||||
|
RecTimer_16,
|
||||||
|
RecTimer_17,
|
||||||
|
RecTimer_18,
|
||||||
|
RecTimer_ModRod, // 19
|
||||||
|
_RecTimerCount
|
||||||
|
};
|
||||||
|
|
||||||
|
enum GroupUpdateAction
|
||||||
|
{
|
||||||
|
GUA_Joined = 0,
|
||||||
|
GUA_Left = 1,
|
||||||
|
GUA_LastLeft = 6,
|
||||||
|
GUA_FullGroupInfo = 7,
|
||||||
|
GUA_MakeLeader = 8,
|
||||||
|
GUA_Started = 9
|
||||||
|
};
|
||||||
|
|
||||||
static const uint8 DamageTypeSomething = 0x1C; //0x1c is something...
|
static const uint8 DamageTypeSomething = 0x1C; //0x1c is something...
|
||||||
static const uint8 DamageTypeFalling = 0xFC;
|
static const uint8 DamageTypeFalling = 0xFC;
|
||||||
@@ -974,6 +947,43 @@ namespace ZoneBlockedSpellTypes {
|
|||||||
const uint8 Region = 2;
|
const uint8 Region = 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class DynamicZoneType
|
||||||
|
{
|
||||||
|
None = 0,
|
||||||
|
Expedition,
|
||||||
|
Tutorial,
|
||||||
|
Task,
|
||||||
|
Mission, // Shared Task
|
||||||
|
Quest
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class DynamicZoneMemberStatus : uint8_t
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
Online,
|
||||||
|
Offline,
|
||||||
|
InDynamicZone,
|
||||||
|
LinkDead
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LDoNThemes {
|
||||||
|
Unused = 0,
|
||||||
|
GUK,
|
||||||
|
MIR,
|
||||||
|
MMC,
|
||||||
|
RUJ,
|
||||||
|
TAK
|
||||||
|
};
|
||||||
|
|
||||||
|
enum LDoNThemeBits {
|
||||||
|
UnusedBit = 0,
|
||||||
|
GUKBit = 1,
|
||||||
|
MIRBit = 2,
|
||||||
|
MMCBit = 4,
|
||||||
|
RUJBit = 8,
|
||||||
|
TAKBit = 16
|
||||||
|
};
|
||||||
|
|
||||||
enum StartZoneIndex {
|
enum StartZoneIndex {
|
||||||
Odus = 0,
|
Odus = 0,
|
||||||
Qeynos,
|
Qeynos,
|
||||||
@@ -1005,95 +1015,15 @@ enum Anonymity : uint8
|
|||||||
Roleplaying
|
Roleplaying
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ZoningMessage : int8 {
|
enum ZoningMessage : int8
|
||||||
ZoneNoMessage = 0,
|
{
|
||||||
ZoneSuccess = 1,
|
ZoneNoMessage = 0,
|
||||||
ZoneNotReady = -1,
|
ZoneSuccess = 1,
|
||||||
ZoneValidPC = -2,
|
ZoneNotReady = -1,
|
||||||
ZoneStoryZone = -3,
|
ZoneValidPC = -2,
|
||||||
ZoneNoExpansion = -6,
|
ZoneStoryZone = -3,
|
||||||
|
ZoneNoExpansion = -6,
|
||||||
ZoneNoExperience = -7
|
ZoneNoExperience = -7
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class RecipeCountType : uint8
|
|
||||||
{
|
|
||||||
Component,
|
|
||||||
Container,
|
|
||||||
Fail,
|
|
||||||
Salvage,
|
|
||||||
Success
|
|
||||||
};
|
|
||||||
|
|
||||||
#define ALT_CURRENCY_ID_RADIANT 4
|
|
||||||
#define ALT_CURRENCY_ID_EBON 5
|
|
||||||
|
|
||||||
enum ResurrectionActions
|
|
||||||
{
|
|
||||||
Decline,
|
|
||||||
Accept
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ScribeSpellActions
|
|
||||||
{
|
|
||||||
Scribe,
|
|
||||||
Memorize,
|
|
||||||
Unmemorize
|
|
||||||
};
|
|
||||||
|
|
||||||
enum SpellTimeRestrictions
|
|
||||||
{
|
|
||||||
NoRestriction,
|
|
||||||
Day,
|
|
||||||
Night
|
|
||||||
};
|
|
||||||
|
|
||||||
enum MoneyTypes
|
|
||||||
{
|
|
||||||
Copper,
|
|
||||||
Silver,
|
|
||||||
Gold,
|
|
||||||
Platinum
|
|
||||||
};
|
|
||||||
|
|
||||||
enum MoneySubtypes
|
|
||||||
{
|
|
||||||
Personal,
|
|
||||||
Bank,
|
|
||||||
Cursor,
|
|
||||||
SharedBank // Platinum Only
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace RaidLootType {
|
|
||||||
constexpr uint32 LeaderOnly = 1;
|
|
||||||
constexpr uint32 LeaderAndGroupLeadersOnly = 2;
|
|
||||||
constexpr uint32 LeaderSelected = 3;
|
|
||||||
constexpr uint32 EntireRaid = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace LeadershipAbilitySlot {
|
|
||||||
constexpr uint16 HealthOfTargetsTarget = 14;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ExpSource
|
|
||||||
{
|
|
||||||
Quest,
|
|
||||||
GM,
|
|
||||||
Kill,
|
|
||||||
Death,
|
|
||||||
Resurrection,
|
|
||||||
LDoNChest,
|
|
||||||
Task,
|
|
||||||
Sacrifice
|
|
||||||
};
|
|
||||||
|
|
||||||
#define PARCEL_SEND_ITEMS 0
|
|
||||||
#define PARCEL_SEND_MONEY 1
|
|
||||||
#define PARCEL_MONEY_ITEM_ID 99990 // item id of money
|
|
||||||
#define PARCEL_LIMIT 5
|
|
||||||
#define PARCEL_BEGIN_SLOT 1
|
|
||||||
|
|
||||||
namespace DoorType {
|
|
||||||
constexpr uint32 BuyerStall = 155;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /*COMMON_EQ_CONSTANTS_H*/
|
#endif /*COMMON_EQ_CONSTANTS_H*/
|
||||||
|
|||||||
+28
-36
@@ -47,7 +47,6 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
ClientUnknown::constants::EXPANSION_BIT,
|
ClientUnknown::constants::EXPANSION_BIT,
|
||||||
ClientUnknown::constants::EXPANSIONS_MASK,
|
ClientUnknown::constants::EXPANSIONS_MASK,
|
||||||
ClientUnknown::INULL,
|
ClientUnknown::INULL,
|
||||||
ClientUnknown::INULL,
|
|
||||||
ClientUnknown::INULL
|
ClientUnknown::INULL
|
||||||
),
|
),
|
||||||
/*[ClientVersion::Client62] =*/
|
/*[ClientVersion::Client62] =*/
|
||||||
@@ -56,7 +55,6 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
Client62::constants::EXPANSION_BIT,
|
Client62::constants::EXPANSION_BIT,
|
||||||
Client62::constants::EXPANSIONS_MASK,
|
Client62::constants::EXPANSIONS_MASK,
|
||||||
Client62::INULL,
|
Client62::INULL,
|
||||||
Client62::INULL,
|
|
||||||
Client62::INULL
|
Client62::INULL
|
||||||
),
|
),
|
||||||
/*[ClientVersion::Titanium] =*/
|
/*[ClientVersion::Titanium] =*/
|
||||||
@@ -65,8 +63,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
Titanium::constants::EXPANSION_BIT,
|
Titanium::constants::EXPANSION_BIT,
|
||||||
Titanium::constants::EXPANSIONS_MASK,
|
Titanium::constants::EXPANSIONS_MASK,
|
||||||
Titanium::constants::CHARACTER_CREATION_LIMIT,
|
Titanium::constants::CHARACTER_CREATION_LIMIT,
|
||||||
Titanium::constants::SAY_LINK_BODY_SIZE,
|
Titanium::constants::SAY_LINK_BODY_SIZE
|
||||||
Titanium::INULL
|
|
||||||
),
|
),
|
||||||
/*[ClientVersion::SoF] =*/
|
/*[ClientVersion::SoF] =*/
|
||||||
EQ::constants::LookupEntry(
|
EQ::constants::LookupEntry(
|
||||||
@@ -74,8 +71,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
SoF::constants::EXPANSION_BIT,
|
SoF::constants::EXPANSION_BIT,
|
||||||
SoF::constants::EXPANSIONS_MASK,
|
SoF::constants::EXPANSIONS_MASK,
|
||||||
SoF::constants::CHARACTER_CREATION_LIMIT,
|
SoF::constants::CHARACTER_CREATION_LIMIT,
|
||||||
SoF::constants::SAY_LINK_BODY_SIZE,
|
SoF::constants::SAY_LINK_BODY_SIZE
|
||||||
SoF::INULL
|
|
||||||
),
|
),
|
||||||
/*[ClientVersion::SoD] =*/
|
/*[ClientVersion::SoD] =*/
|
||||||
EQ::constants::LookupEntry(
|
EQ::constants::LookupEntry(
|
||||||
@@ -83,8 +79,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
SoD::constants::EXPANSION_BIT,
|
SoD::constants::EXPANSION_BIT,
|
||||||
SoD::constants::EXPANSIONS_MASK,
|
SoD::constants::EXPANSIONS_MASK,
|
||||||
SoD::constants::CHARACTER_CREATION_LIMIT,
|
SoD::constants::CHARACTER_CREATION_LIMIT,
|
||||||
SoD::constants::SAY_LINK_BODY_SIZE,
|
SoD::constants::SAY_LINK_BODY_SIZE
|
||||||
SoD::INULL
|
|
||||||
),
|
),
|
||||||
/*[ClientVersion::UF] =*/
|
/*[ClientVersion::UF] =*/
|
||||||
EQ::constants::LookupEntry(
|
EQ::constants::LookupEntry(
|
||||||
@@ -92,8 +87,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
UF::constants::EXPANSION_BIT,
|
UF::constants::EXPANSION_BIT,
|
||||||
UF::constants::EXPANSIONS_MASK,
|
UF::constants::EXPANSIONS_MASK,
|
||||||
UF::constants::CHARACTER_CREATION_LIMIT,
|
UF::constants::CHARACTER_CREATION_LIMIT,
|
||||||
UF::constants::SAY_LINK_BODY_SIZE,
|
UF::constants::SAY_LINK_BODY_SIZE
|
||||||
UF::INULL
|
|
||||||
),
|
),
|
||||||
/*[ClientVersion::RoF] =*/
|
/*[ClientVersion::RoF] =*/
|
||||||
EQ::constants::LookupEntry(
|
EQ::constants::LookupEntry(
|
||||||
@@ -101,8 +95,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
RoF::constants::EXPANSION_BIT,
|
RoF::constants::EXPANSION_BIT,
|
||||||
RoF::constants::EXPANSIONS_MASK,
|
RoF::constants::EXPANSIONS_MASK,
|
||||||
RoF::constants::CHARACTER_CREATION_LIMIT,
|
RoF::constants::CHARACTER_CREATION_LIMIT,
|
||||||
RoF::constants::SAY_LINK_BODY_SIZE,
|
RoF::constants::SAY_LINK_BODY_SIZE
|
||||||
RoF::INULL
|
|
||||||
),
|
),
|
||||||
/*[ClientVersion::RoF2] =*/
|
/*[ClientVersion::RoF2] =*/
|
||||||
EQ::constants::LookupEntry(
|
EQ::constants::LookupEntry(
|
||||||
@@ -110,8 +103,7 @@ static const EQ::constants::LookupEntry constants_static_lookup_entries[EQ::vers
|
|||||||
RoF2::constants::EXPANSION_BIT,
|
RoF2::constants::EXPANSION_BIT,
|
||||||
RoF2::constants::EXPANSIONS_MASK,
|
RoF2::constants::EXPANSIONS_MASK,
|
||||||
RoF2::constants::CHARACTER_CREATION_LIMIT,
|
RoF2::constants::CHARACTER_CREATION_LIMIT,
|
||||||
RoF2::constants::SAY_LINK_BODY_SIZE,
|
RoF2::constants::SAY_LINK_BODY_SIZE
|
||||||
RoF2::constants::MAX_BAZAAR_TRADERS
|
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -173,7 +165,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
||||||
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
||||||
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL,
|
||||||
ClientUnknown::INULL, ClientUnknown::INULL, ClientUnknown::INULL
|
ClientUnknown::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
ClientUnknown::INULL,
|
ClientUnknown::INULL,
|
||||||
@@ -200,7 +192,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
Client62::INULL, Client62::INULL, Client62::INULL,
|
Client62::INULL, Client62::INULL, Client62::INULL,
|
||||||
Client62::INULL, Client62::INULL, Client62::INULL,
|
Client62::INULL, Client62::INULL, Client62::INULL,
|
||||||
Client62::INULL, Client62::INULL, Client62::INULL,
|
Client62::INULL, Client62::INULL, Client62::INULL,
|
||||||
Client62::INULL, Client62::INULL, Client62::INULL
|
Client62::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
Client62::INULL,
|
Client62::INULL,
|
||||||
@@ -227,7 +219,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
Titanium::invtype::VIEW_MOD_PC_SIZE, Titanium::invtype::VIEW_MOD_BANK_SIZE, Titanium::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
Titanium::invtype::VIEW_MOD_PC_SIZE, Titanium::invtype::VIEW_MOD_BANK_SIZE, Titanium::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
Titanium::invtype::VIEW_MOD_LIMBO_SIZE, Titanium::invtype::ALT_STORAGE_SIZE, Titanium::invtype::ARCHIVED_SIZE,
|
Titanium::invtype::VIEW_MOD_LIMBO_SIZE, Titanium::invtype::ALT_STORAGE_SIZE, Titanium::invtype::ARCHIVED_SIZE,
|
||||||
Titanium::INULL, Titanium::INULL, Titanium::INULL,
|
Titanium::INULL, Titanium::INULL, Titanium::INULL,
|
||||||
Titanium::INULL, Titanium::INULL, Titanium::invtype::OTHER_SIZE
|
Titanium::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
Titanium::invslot::EQUIPMENT_BITMASK,
|
Titanium::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -254,7 +246,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
SoF::invtype::VIEW_MOD_PC_SIZE, SoF::invtype::VIEW_MOD_BANK_SIZE, SoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
SoF::invtype::VIEW_MOD_PC_SIZE, SoF::invtype::VIEW_MOD_BANK_SIZE, SoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
SoF::invtype::VIEW_MOD_LIMBO_SIZE, SoF::invtype::ALT_STORAGE_SIZE, SoF::invtype::ARCHIVED_SIZE,
|
SoF::invtype::VIEW_MOD_LIMBO_SIZE, SoF::invtype::ALT_STORAGE_SIZE, SoF::invtype::ARCHIVED_SIZE,
|
||||||
SoF::INULL, SoF::INULL, SoF::INULL,
|
SoF::INULL, SoF::INULL, SoF::INULL,
|
||||||
SoF::INULL, SoF::INULL, SoF::invtype::OTHER_SIZE
|
SoF::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
SoF::invslot::EQUIPMENT_BITMASK,
|
SoF::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -281,7 +273,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
SoD::invtype::VIEW_MOD_PC_SIZE, SoD::invtype::VIEW_MOD_BANK_SIZE, SoD::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
SoD::invtype::VIEW_MOD_PC_SIZE, SoD::invtype::VIEW_MOD_BANK_SIZE, SoD::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
SoD::invtype::VIEW_MOD_LIMBO_SIZE, SoD::invtype::ALT_STORAGE_SIZE, SoD::invtype::ARCHIVED_SIZE,
|
SoD::invtype::VIEW_MOD_LIMBO_SIZE, SoD::invtype::ALT_STORAGE_SIZE, SoD::invtype::ARCHIVED_SIZE,
|
||||||
SoD::INULL, SoD::INULL, SoD::INULL,
|
SoD::INULL, SoD::INULL, SoD::INULL,
|
||||||
SoD::INULL, SoD::INULL, SoD::invtype::OTHER_SIZE
|
SoD::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
SoD::invslot::EQUIPMENT_BITMASK,
|
SoD::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -308,7 +300,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
UF::invtype::VIEW_MOD_PC_SIZE, UF::invtype::VIEW_MOD_BANK_SIZE, UF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
UF::invtype::VIEW_MOD_PC_SIZE, UF::invtype::VIEW_MOD_BANK_SIZE, UF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
UF::invtype::VIEW_MOD_LIMBO_SIZE, UF::invtype::ALT_STORAGE_SIZE, UF::invtype::ARCHIVED_SIZE,
|
UF::invtype::VIEW_MOD_LIMBO_SIZE, UF::invtype::ALT_STORAGE_SIZE, UF::invtype::ARCHIVED_SIZE,
|
||||||
UF::INULL, UF::INULL, UF::INULL,
|
UF::INULL, UF::INULL, UF::INULL,
|
||||||
UF::INULL, UF::INULL, UF::invtype::OTHER_SIZE
|
UF::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
UF::invslot::EQUIPMENT_BITMASK,
|
UF::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -335,7 +327,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
RoF::invtype::VIEW_MOD_PC_SIZE, RoF::invtype::VIEW_MOD_BANK_SIZE, RoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
RoF::invtype::VIEW_MOD_PC_SIZE, RoF::invtype::VIEW_MOD_BANK_SIZE, RoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
RoF::invtype::VIEW_MOD_LIMBO_SIZE, RoF::invtype::ALT_STORAGE_SIZE, RoF::invtype::ARCHIVED_SIZE,
|
RoF::invtype::VIEW_MOD_LIMBO_SIZE, RoF::invtype::ALT_STORAGE_SIZE, RoF::invtype::ARCHIVED_SIZE,
|
||||||
RoF::invtype::MAIL_SIZE, RoF::invtype::GUILD_TROPHY_TRIBUTE_SIZE, RoF::INULL,
|
RoF::invtype::MAIL_SIZE, RoF::invtype::GUILD_TROPHY_TRIBUTE_SIZE, RoF::INULL,
|
||||||
RoF::INULL,RoF::INULL,RoF::invtype::OTHER_SIZE
|
RoF::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
RoF::invslot::EQUIPMENT_BITMASK,
|
RoF::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -362,7 +354,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::invtype::ALT_STORAGE_SIZE, RoF2::invtype::ARCHIVED_SIZE,
|
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::invtype::ALT_STORAGE_SIZE, RoF2::invtype::ARCHIVED_SIZE,
|
||||||
RoF2::invtype::MAIL_SIZE, RoF2::invtype::GUILD_TROPHY_TRIBUTE_SIZE, RoF2::invtype::KRONO_SIZE,
|
RoF2::invtype::MAIL_SIZE, RoF2::invtype::GUILD_TROPHY_TRIBUTE_SIZE, RoF2::invtype::KRONO_SIZE,
|
||||||
RoF2::invtype::GUILD_BANK_MAIN_SIZE,RoF2::invtype::GUILD_BANK_DEPOSIT_SIZE, RoF2::invtype::OTHER_SIZE
|
RoF2::invtype::OTHER_SIZE
|
||||||
),
|
),
|
||||||
|
|
||||||
RoF2::invslot::EQUIPMENT_BITMASK,
|
RoF2::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -389,7 +381,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
||||||
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
||||||
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,
|
||||||
EntityLimits::NPC::INULL, EntityLimits::NPC::INULL,EntityLimits::NPC::INULL
|
EntityLimits::NPC::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::NPC::INULL,
|
EntityLimits::NPC::INULL,
|
||||||
@@ -416,7 +408,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
||||||
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
||||||
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL,
|
||||||
EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL, EntityLimits::NPCMerchant::INULL
|
EntityLimits::NPCMerchant::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::NPCMerchant::INULL,
|
EntityLimits::NPCMerchant::INULL,
|
||||||
@@ -443,7 +435,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
||||||
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
||||||
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL,
|
||||||
EntityLimits::Merc::INULL, EntityLimits::Merc::INULL, EntityLimits::Merc::INULL
|
EntityLimits::Merc::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::Merc::INULL,
|
EntityLimits::Merc::INULL,
|
||||||
@@ -470,7 +462,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
||||||
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
||||||
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL,
|
||||||
EntityLimits::Bot::INULL, EntityLimits::Bot::INULL, EntityLimits::Bot::INULL
|
EntityLimits::Bot::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::Bot::invslot::EQUIPMENT_BITMASK,
|
EntityLimits::Bot::invslot::EQUIPMENT_BITMASK,
|
||||||
@@ -497,7 +489,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
||||||
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
||||||
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL,
|
||||||
EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL, EntityLimits::ClientPet::INULL
|
EntityLimits::ClientPet::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::ClientPet::INULL,
|
EntityLimits::ClientPet::INULL,
|
||||||
@@ -524,7 +516,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
||||||
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
||||||
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL,
|
||||||
EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL, EntityLimits::NPCPet::INULL
|
EntityLimits::NPCPet::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::NPCPet::INULL,
|
EntityLimits::NPCPet::INULL,
|
||||||
@@ -551,7 +543,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
||||||
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
||||||
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL,
|
||||||
EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL, EntityLimits::MercPet::INULL
|
EntityLimits::MercPet::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::MercPet::INULL,
|
EntityLimits::MercPet::INULL,
|
||||||
@@ -578,7 +570,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
||||||
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
||||||
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL,
|
||||||
EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL, EntityLimits::BotPet::INULL
|
EntityLimits::BotPet::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
EntityLimits::BotPet::INULL,
|
EntityLimits::BotPet::INULL,
|
||||||
@@ -605,7 +597,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
Titanium::invtype::VIEW_MOD_PC_SIZE, Titanium::invtype::VIEW_MOD_BANK_SIZE, Titanium::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
Titanium::invtype::VIEW_MOD_PC_SIZE, Titanium::invtype::VIEW_MOD_BANK_SIZE, Titanium::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
Titanium::invtype::VIEW_MOD_LIMBO_SIZE, Titanium::INULL, Titanium::INULL,
|
Titanium::invtype::VIEW_MOD_LIMBO_SIZE, Titanium::INULL, Titanium::INULL,
|
||||||
Titanium::INULL, Titanium::INULL, Titanium::INULL,
|
Titanium::INULL, Titanium::INULL, Titanium::INULL,
|
||||||
Titanium::INULL, Titanium::INULL, Titanium::INULL
|
Titanium::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
Titanium::INULL,
|
Titanium::INULL,
|
||||||
@@ -632,7 +624,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
SoF::invtype::VIEW_MOD_PC_SIZE, SoF::invtype::VIEW_MOD_BANK_SIZE, SoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
SoF::invtype::VIEW_MOD_PC_SIZE, SoF::invtype::VIEW_MOD_BANK_SIZE, SoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
SoF::invtype::VIEW_MOD_LIMBO_SIZE, SoF::INULL, SoF::INULL,
|
SoF::invtype::VIEW_MOD_LIMBO_SIZE, SoF::INULL, SoF::INULL,
|
||||||
SoF::INULL, SoF::INULL, SoF::INULL,
|
SoF::INULL, SoF::INULL, SoF::INULL,
|
||||||
SoF::INULL, SoF::INULL, SoF::INULL
|
SoF::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
SoF::INULL,
|
SoF::INULL,
|
||||||
@@ -659,7 +651,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
SoD::invtype::VIEW_MOD_PC_SIZE, SoD::invtype::VIEW_MOD_BANK_SIZE, SoD::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
SoD::invtype::VIEW_MOD_PC_SIZE, SoD::invtype::VIEW_MOD_BANK_SIZE, SoD::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
SoD::invtype::VIEW_MOD_LIMBO_SIZE, SoD::INULL, SoD::INULL,
|
SoD::invtype::VIEW_MOD_LIMBO_SIZE, SoD::INULL, SoD::INULL,
|
||||||
SoD::INULL, SoD::INULL, SoD::INULL,
|
SoD::INULL, SoD::INULL, SoD::INULL,
|
||||||
SoD::INULL, SoD::INULL, SoD::INULL
|
SoD::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
SoD::INULL,
|
SoD::INULL,
|
||||||
@@ -686,7 +678,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
UF::invtype::VIEW_MOD_PC_SIZE, UF::invtype::VIEW_MOD_BANK_SIZE, UF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
UF::invtype::VIEW_MOD_PC_SIZE, UF::invtype::VIEW_MOD_BANK_SIZE, UF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
UF::invtype::VIEW_MOD_LIMBO_SIZE, UF::INULL, UF::INULL,
|
UF::invtype::VIEW_MOD_LIMBO_SIZE, UF::INULL, UF::INULL,
|
||||||
UF::INULL, UF::INULL, UF::INULL,
|
UF::INULL, UF::INULL, UF::INULL,
|
||||||
UF::INULL, UF::INULL, UF::INULL
|
UF::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
UF::INULL,
|
UF::INULL,
|
||||||
@@ -713,7 +705,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
RoF::invtype::VIEW_MOD_PC_SIZE, RoF::invtype::VIEW_MOD_BANK_SIZE, RoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
RoF::invtype::VIEW_MOD_PC_SIZE, RoF::invtype::VIEW_MOD_BANK_SIZE, RoF::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
RoF::invtype::VIEW_MOD_LIMBO_SIZE, RoF::INULL, RoF::INULL,
|
RoF::invtype::VIEW_MOD_LIMBO_SIZE, RoF::INULL, RoF::INULL,
|
||||||
RoF::INULL, RoF::INULL, RoF::INULL,
|
RoF::INULL, RoF::INULL, RoF::INULL,
|
||||||
RoF::INULL, RoF::INULL, RoF::INULL
|
RoF::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
RoF::INULL,
|
RoF::INULL,
|
||||||
@@ -740,7 +732,7 @@ static const EQ::inventory::LookupEntry inventory_static_lookup_entries[EQ::vers
|
|||||||
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
RoF2::invtype::VIEW_MOD_PC_SIZE, RoF2::invtype::VIEW_MOD_BANK_SIZE, RoF2::invtype::VIEW_MOD_SHARED_BANK_SIZE,
|
||||||
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::INULL, RoF2::INULL,
|
RoF2::invtype::VIEW_MOD_LIMBO_SIZE, RoF2::INULL, RoF2::INULL,
|
||||||
RoF2::INULL, RoF2::INULL, RoF2::INULL,
|
RoF2::INULL, RoF2::INULL, RoF2::INULL,
|
||||||
RoF2::INULL, RoF2::INULL, RoF2::INULL
|
RoF2::INULL
|
||||||
),
|
),
|
||||||
|
|
||||||
RoF2::INULL,
|
RoF2::INULL,
|
||||||
|
|||||||
+6
-9
@@ -42,7 +42,6 @@ namespace EQ
|
|||||||
uint32 ExpansionsMask;
|
uint32 ExpansionsMask;
|
||||||
int16 CharacterCreationLimit;
|
int16 CharacterCreationLimit;
|
||||||
size_t SayLinkBodySize;
|
size_t SayLinkBodySize;
|
||||||
uint32 BazaarTraderLimit;
|
|
||||||
|
|
||||||
LookupEntry(const LookupEntry *lookup_entry) { }
|
LookupEntry(const LookupEntry *lookup_entry) { }
|
||||||
LookupEntry(
|
LookupEntry(
|
||||||
@@ -50,15 +49,13 @@ namespace EQ
|
|||||||
uint32 ExpansionBit,
|
uint32 ExpansionBit,
|
||||||
uint32 ExpansionsMask,
|
uint32 ExpansionsMask,
|
||||||
int16 CharacterCreationLimit,
|
int16 CharacterCreationLimit,
|
||||||
size_t SayLinkBodySize,
|
size_t SayLinkBodySize
|
||||||
uint32 BazaarTraderLimit
|
|
||||||
) :
|
) :
|
||||||
Expansion(Expansion),
|
Expansion(Expansion),
|
||||||
ExpansionBit(ExpansionBit),
|
ExpansionBit(ExpansionBit),
|
||||||
ExpansionsMask(ExpansionsMask),
|
ExpansionsMask(ExpansionsMask),
|
||||||
CharacterCreationLimit(CharacterCreationLimit),
|
CharacterCreationLimit(CharacterCreationLimit),
|
||||||
SayLinkBodySize(SayLinkBodySize),
|
SayLinkBodySize(SayLinkBodySize)
|
||||||
BazaarTraderLimit(BazaarTraderLimit)
|
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -87,7 +84,7 @@ namespace EQ
|
|||||||
int16 ViewMODPC, ViewMODBank, ViewMODSharedBank;
|
int16 ViewMODPC, ViewMODBank, ViewMODSharedBank;
|
||||||
int16 ViewMODLimbo, AltStorage, Archived;
|
int16 ViewMODLimbo, AltStorage, Archived;
|
||||||
int16 Mail, GuildTrophyTribute, Krono;
|
int16 Mail, GuildTrophyTribute, Krono;
|
||||||
int16 GuildBankMain,GuildBankDeposit, Other;
|
int16 Other;
|
||||||
|
|
||||||
InventoryTypeSize_Struct(
|
InventoryTypeSize_Struct(
|
||||||
int16 Possessions, int16 Bank, int16 SharedBank,
|
int16 Possessions, int16 Bank, int16 SharedBank,
|
||||||
@@ -98,7 +95,7 @@ namespace EQ
|
|||||||
int16 ViewMODPC, int16 ViewMODBank, int16 ViewMODSharedBank,
|
int16 ViewMODPC, int16 ViewMODBank, int16 ViewMODSharedBank,
|
||||||
int16 ViewMODLimbo, int16 AltStorage, int16 Archived,
|
int16 ViewMODLimbo, int16 AltStorage, int16 Archived,
|
||||||
int16 Mail, int16 GuildTrophyTribute, int16 Krono,
|
int16 Mail, int16 GuildTrophyTribute, int16 Krono,
|
||||||
int16 GuildBankMain,int16 GuildBankDeposit, int16 Other
|
int16 Other
|
||||||
) :
|
) :
|
||||||
Possessions(Possessions), Bank(Bank), SharedBank(SharedBank),
|
Possessions(Possessions), Bank(Bank), SharedBank(SharedBank),
|
||||||
Trade(Trade), World(World), Limbo(Limbo),
|
Trade(Trade), World(World), Limbo(Limbo),
|
||||||
@@ -108,7 +105,7 @@ namespace EQ
|
|||||||
ViewMODPC(ViewMODPC), ViewMODBank(ViewMODBank), ViewMODSharedBank(ViewMODSharedBank),
|
ViewMODPC(ViewMODPC), ViewMODBank(ViewMODBank), ViewMODSharedBank(ViewMODSharedBank),
|
||||||
ViewMODLimbo(ViewMODLimbo), AltStorage(AltStorage), Archived(Archived),
|
ViewMODLimbo(ViewMODLimbo), AltStorage(AltStorage), Archived(Archived),
|
||||||
Mail(Mail), GuildTrophyTribute(GuildTrophyTribute), Krono(Krono),
|
Mail(Mail), GuildTrophyTribute(GuildTrophyTribute), Krono(Krono),
|
||||||
GuildBankMain(GuildBankMain), GuildBankDeposit(GuildBankDeposit), Other(Other)
|
Other(Other)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -132,7 +129,7 @@ namespace EQ
|
|||||||
|
|
||||||
LookupEntry(const LookupEntry *lookup_entry) { }
|
LookupEntry(const LookupEntry *lookup_entry) { }
|
||||||
LookupEntry(
|
LookupEntry(
|
||||||
const InventoryTypeSize_Struct& InventoryTypeSize,
|
InventoryTypeSize_Struct InventoryTypeSize,
|
||||||
uint64 EquipmentBitmask,
|
uint64 EquipmentBitmask,
|
||||||
uint64 GeneralBitmask,
|
uint64 GeneralBitmask,
|
||||||
uint64 CursorBitmask,
|
uint64 CursorBitmask,
|
||||||
|
|||||||
+138
-1
@@ -236,6 +236,26 @@ uint32 EQApplicationPacket::serialize(uint16 opcode, unsigned char *dest) const
|
|||||||
return size+OpCodeBytes;
|
return size+OpCodeBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*EQProtocolPacket::EQProtocolPacket(uint16 op, const unsigned char *buf, uint32 len)
|
||||||
|
: BasePacket(buf, len),
|
||||||
|
opcode(op)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint32 offset;
|
||||||
|
opcode=ntohs(*(const uint16 *)buf);
|
||||||
|
offset=2;
|
||||||
|
|
||||||
|
if (len-offset) {
|
||||||
|
pBuffer= new unsigned char[len-offset];
|
||||||
|
memcpy(pBuffer,buf+offset,len-offset);
|
||||||
|
size=len-offset;
|
||||||
|
} else {
|
||||||
|
pBuffer=nullptr;
|
||||||
|
size=0;
|
||||||
|
}
|
||||||
|
OpMgr=&RawOpcodeManager;
|
||||||
|
}*/
|
||||||
|
|
||||||
bool EQProtocolPacket::combine(const EQProtocolPacket *rhs)
|
bool EQProtocolPacket::combine(const EQProtocolPacket *rhs)
|
||||||
{
|
{
|
||||||
bool result=false;
|
bool result=false;
|
||||||
@@ -267,6 +287,74 @@ bool result=false;
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
this is the code to do app-layer combining, instead of protocol layer.
|
||||||
|
this was taken out due to complex interactions with the opcode manager,
|
||||||
|
and will require a bit more thinking (likely moving into EQStream) to
|
||||||
|
get running again... but might be a good thing some day.
|
||||||
|
|
||||||
|
bool EQApplicationPacket::combine(const EQApplicationPacket *rhs)
|
||||||
|
{
|
||||||
|
uint32 newsize=0, offset=0;
|
||||||
|
unsigned char *tmpbuffer=nullptr;
|
||||||
|
|
||||||
|
if (opcode!=OP_AppCombined) {
|
||||||
|
newsize=app_opcode_size+size+(size>254?3:1)+app_opcode_size+rhs->size+(rhs->size>254?3:1);
|
||||||
|
tmpbuffer=new unsigned char [newsize];
|
||||||
|
offset=0;
|
||||||
|
if (size>254) {
|
||||||
|
tmpbuffer[offset++]=0xff;
|
||||||
|
*(uint16 *)(tmpbuffer+offset)=htons(size);
|
||||||
|
offset+=1;
|
||||||
|
} else {
|
||||||
|
tmpbuffer[offset++]=size;
|
||||||
|
}
|
||||||
|
offset+=serialize(tmpbuffer+offset);
|
||||||
|
} else {
|
||||||
|
newsize=size+app_opcode_size+rhs->size+(rhs->size>254?3:1);
|
||||||
|
tmpbuffer=new unsigned char [newsize];
|
||||||
|
memcpy(tmpbuffer,pBuffer,size);
|
||||||
|
offset=size;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rhs->size>254) {
|
||||||
|
tmpbuffer[offset++]=0xff;
|
||||||
|
*(uint16 *)(tmpbuffer+offset)=htons(rhs->size);
|
||||||
|
offset+=1;
|
||||||
|
} else {
|
||||||
|
tmpbuffer[offset++]=rhs->size;
|
||||||
|
}
|
||||||
|
offset+=rhs->serialize(tmpbuffer+offset);
|
||||||
|
|
||||||
|
size=offset;
|
||||||
|
opcode=OP_AppCombined;
|
||||||
|
|
||||||
|
delete[] pBuffer;
|
||||||
|
pBuffer=tmpbuffer;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool EQProtocolPacket::ValidateCRC(const unsigned char *buffer, int length, uint32 Key)
|
||||||
|
{
|
||||||
|
bool valid=false;
|
||||||
|
// OP_SessionRequest, OP_SessionResponse, OP_OutOfSession are not CRC'd
|
||||||
|
if (buffer[0]==0x00 && (buffer[1]==OP_SessionRequest || buffer[1]==OP_SessionResponse || buffer[1]==OP_OutOfSession)) {
|
||||||
|
valid=true;
|
||||||
|
} else {
|
||||||
|
uint16 comp_crc=CRC16(buffer,length-2,Key);
|
||||||
|
uint16 packet_crc=ntohs(*(const uint16 *)(buffer+length-2));
|
||||||
|
#ifdef EQN_DEBUG
|
||||||
|
if (packet_crc && comp_crc != packet_crc) {
|
||||||
|
std::cout << "CRC mismatch: comp=" << std::hex << comp_crc << ", packet=" << packet_crc << std::dec << std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
valid = (!packet_crc || comp_crc == packet_crc);
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
|
||||||
uint32 EQProtocolPacket::Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize)
|
uint32 EQProtocolPacket::Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize)
|
||||||
{
|
{
|
||||||
uint32 newlen=0;
|
uint32 newlen=0;
|
||||||
@@ -315,6 +403,55 @@ uint32 flag_offset=1,newlength;
|
|||||||
return newlength;
|
return newlength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EQProtocolPacket::ChatDecode(unsigned char *buffer, int size, int DecodeKey)
|
||||||
|
{
|
||||||
|
if ((size >= 2) && buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) {
|
||||||
|
int Key=DecodeKey;
|
||||||
|
unsigned char *test=(unsigned char *)malloc(size);
|
||||||
|
buffer+=2;
|
||||||
|
size-=2;
|
||||||
|
|
||||||
|
int i;
|
||||||
|
for (i = 0 ; i+4 <= size ; i+=4)
|
||||||
|
{
|
||||||
|
int pt = (*(int*)&buffer[i])^(Key);
|
||||||
|
Key = (*(int*)&buffer[i]);
|
||||||
|
*(int*)&test[i]=pt;
|
||||||
|
}
|
||||||
|
unsigned char KC=Key&0xFF;
|
||||||
|
for ( ; i < size ; i++)
|
||||||
|
{
|
||||||
|
test[i]=buffer[i]^KC;
|
||||||
|
}
|
||||||
|
memcpy(buffer,test,size);
|
||||||
|
free(test);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQProtocolPacket::ChatEncode(unsigned char *buffer, int size, int EncodeKey)
|
||||||
|
{
|
||||||
|
if (buffer[1]!=0x01 && buffer[0]!=0x02 && buffer[0]!=0x1d) {
|
||||||
|
int Key=EncodeKey;
|
||||||
|
char *test=(char*)malloc(size);
|
||||||
|
int i;
|
||||||
|
buffer+=2;
|
||||||
|
size-=2;
|
||||||
|
for ( i = 0 ; i+4 <= size ; i+=4)
|
||||||
|
{
|
||||||
|
int pt = (*(int*)&buffer[i])^(Key);
|
||||||
|
Key = pt;
|
||||||
|
*(int*)&test[i]=pt;
|
||||||
|
}
|
||||||
|
unsigned char KC=Key&0xFF;
|
||||||
|
for ( ; i < size ; i++)
|
||||||
|
{
|
||||||
|
test[i]=buffer[i]^KC;
|
||||||
|
}
|
||||||
|
memcpy(buffer,test,size);
|
||||||
|
free(test);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EQApplicationPacket *EQApplicationPacket::Copy() const {
|
EQApplicationPacket *EQApplicationPacket::Copy() const {
|
||||||
return(new EQApplicationPacket(*this));
|
return(new EQApplicationPacket(*this));
|
||||||
}
|
}
|
||||||
@@ -378,4 +515,4 @@ std::string DumpPacketToString(const EQApplicationPacket* app){
|
|||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
out << DumpPacketHexToString(app->pBuffer, app->size);
|
out << DumpPacketHexToString(app->pBuffer, app->size);
|
||||||
return out.str();
|
return out.str();
|
||||||
}
|
}
|
||||||
@@ -80,8 +80,11 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
static bool ValidateCRC(const unsigned char *buffer, int length, uint32 Key);
|
||||||
static uint32 Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize);
|
static uint32 Decompress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize);
|
||||||
static uint32 Compress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize);
|
static uint32 Compress(const unsigned char *buffer, const uint32 length, unsigned char *newbuf, uint32 newbufsize);
|
||||||
|
static void ChatDecode(unsigned char *buffer, int size, int DecodeKey);
|
||||||
|
static void ChatEncode(unsigned char *buffer, int size, int EncodeKey);
|
||||||
|
|
||||||
uint16 GetRawOpcode() const { return(opcode); }
|
uint16 GetRawOpcode() const { return(opcode); }
|
||||||
|
|
||||||
|
|||||||
+300
-1243
File diff suppressed because it is too large
Load Diff
@@ -26,7 +26,7 @@ EQStreamIdentifier::~EQStreamIdentifier() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQStreamIdentifier::RegisterPatch(EQStreamInterface::Signature sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs) {
|
void EQStreamIdentifier::RegisterPatch(const EQStreamInterface::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs) {
|
||||||
auto p = new Patch;
|
auto p = new Patch;
|
||||||
p->signature = sig;
|
p->signature = sig;
|
||||||
p->name = name;
|
p->name = name;
|
||||||
@@ -145,7 +145,7 @@ void EQStreamIdentifier::Process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EQStreamIdentifier::AddStream(std::shared_ptr<EQStreamInterface> eqs) {
|
void EQStreamIdentifier::AddStream(std::shared_ptr<EQStreamInterface> eqs) {
|
||||||
m_streams.emplace_back(Record(eqs));
|
m_streams.push_back(Record(eqs));
|
||||||
eqs = nullptr;
|
eqs = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public:
|
|||||||
~EQStreamIdentifier();
|
~EQStreamIdentifier();
|
||||||
|
|
||||||
//registration interface.
|
//registration interface.
|
||||||
void RegisterPatch(EQStreamInterface::Signature sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs);
|
void RegisterPatch(const EQStreamInterface::Signature &sig, const char *name, OpcodeManager ** opcodes, const StructStrategy *structs);
|
||||||
|
|
||||||
//main processing interface
|
//main processing interface
|
||||||
void Process();
|
void Process();
|
||||||
|
|||||||
@@ -23,6 +23,9 @@
|
|||||||
|
|
||||||
EQDB EQDB::s_EQDB;
|
EQDB EQDB::s_EQDB;
|
||||||
|
|
||||||
|
EQDB::EQDB() {
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int EQDB::field_count() {
|
unsigned int EQDB::field_count() {
|
||||||
return mysql_field_count(mysql_ref);
|
return mysql_field_count(mysql_ref);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
//this is the main object exported to perl.
|
//this is the main object exported to perl.
|
||||||
class EQDB {
|
class EQDB {
|
||||||
EQDB() = default;
|
EQDB();
|
||||||
public:
|
public:
|
||||||
static EQDB *Singleton() { return(&s_EQDB); }
|
static EQDB *Singleton() { return(&s_EQDB); }
|
||||||
|
|
||||||
|
|||||||
+32
-137
@@ -19,13 +19,9 @@
|
|||||||
#include "../common/global_define.h"
|
#include "../common/global_define.h"
|
||||||
#include "eqemu_config.h"
|
#include "eqemu_config.h"
|
||||||
#include "misc_functions.h"
|
#include "misc_functions.h"
|
||||||
#include "strings.h"
|
|
||||||
#include "eqemu_logsys.h"
|
|
||||||
#include "json/json.hpp"
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
std::string EQEmuConfig::ConfigFile = "eqemu_config.json";
|
std::string EQEmuConfig::ConfigFile = "eqemu_config.json";
|
||||||
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
||||||
@@ -37,13 +33,13 @@ void EQEmuConfig::parse_config()
|
|||||||
LongName = _root["server"]["world"].get("longname", "").asString();
|
LongName = _root["server"]["world"].get("longname", "").asString();
|
||||||
WorldAddress = _root["server"]["world"].get("address", "").asString();
|
WorldAddress = _root["server"]["world"].get("address", "").asString();
|
||||||
LocalAddress = _root["server"]["world"].get("localaddress", "").asString();
|
LocalAddress = _root["server"]["world"].get("localaddress", "").asString();
|
||||||
MaxClients = Strings::ToInt(_root["server"]["world"].get("maxclients", "-1").asString());
|
MaxClients = atoi(_root["server"]["world"].get("maxclients", "-1").asString().c_str());
|
||||||
SharedKey = _root["server"]["world"].get("key", "").asString();
|
SharedKey = _root["server"]["world"].get("key", "").asString();
|
||||||
LoginCount = 0;
|
LoginCount = 0;
|
||||||
|
|
||||||
if (_root["server"]["world"]["loginserver"].isObject()) {
|
if (_root["server"]["world"]["loginserver"].isObject()) {
|
||||||
LoginHost = _root["server"]["world"]["loginserver"].get("host", "login.eqemulator.net").asString();
|
LoginHost = _root["server"]["world"]["loginserver"].get("host", "login.eqemulator.net").asString();
|
||||||
LoginPort = Strings::ToUnsignedInt(_root["server"]["world"]["loginserver"].get("port", "5998").asString());
|
LoginPort = atoi(_root["server"]["world"]["loginserver"].get("port", "5998").asString().c_str());
|
||||||
LoginLegacy = false;
|
LoginLegacy = false;
|
||||||
if (_root["server"]["world"]["loginserver"].get("legacy", "0").asString() == "1") { LoginLegacy = true; }
|
if (_root["server"]["world"]["loginserver"].get("legacy", "0").asString() == "1") { LoginLegacy = true; }
|
||||||
LoginAccount = _root["server"]["world"]["loginserver"].get("account", "").asString();
|
LoginAccount = _root["server"]["world"]["loginserver"].get("account", "").asString();
|
||||||
@@ -66,7 +62,7 @@ void EQEmuConfig::parse_config()
|
|||||||
|
|
||||||
auto loginconfig = new LoginConfig;
|
auto loginconfig = new LoginConfig;
|
||||||
loginconfig->LoginHost = _root["server"]["world"][str].get("host", "login.eqemulator.net").asString();
|
loginconfig->LoginHost = _root["server"]["world"][str].get("host", "login.eqemulator.net").asString();
|
||||||
loginconfig->LoginPort = Strings::ToUnsignedInt(_root["server"]["world"][str].get("port", "5998").asString());
|
loginconfig->LoginPort = atoi(_root["server"]["world"][str].get("port", "5998").asString().c_str());
|
||||||
loginconfig->LoginAccount = _root["server"]["world"][str].get("account", "").asString();
|
loginconfig->LoginAccount = _root["server"]["world"][str].get("account", "").asString();
|
||||||
loginconfig->LoginPassword = _root["server"]["world"][str].get("password", "").asString();
|
loginconfig->LoginPassword = _root["server"]["world"][str].get("password", "").asString();
|
||||||
|
|
||||||
@@ -88,22 +84,16 @@ void EQEmuConfig::parse_config()
|
|||||||
//The only way to enable locked is by switching to true, meaning this value is always false until manually set true
|
//The only way to enable locked is by switching to true, meaning this value is always false until manually set true
|
||||||
Locked = false;
|
Locked = false;
|
||||||
if (_root["server"]["world"].get("locked", "false").asString() == "true") { Locked = true; }
|
if (_root["server"]["world"].get("locked", "false").asString() == "true") { Locked = true; }
|
||||||
|
WorldIP = _root["server"]["world"]["tcp"].get("host", "127.0.0.1").asString();
|
||||||
auto_database_updates = false;
|
WorldTCPPort = atoi(_root["server"]["world"]["tcp"].get("port", "9000").asString().c_str());
|
||||||
if (_root["server"].get("auto_database_updates", "true").asString() == "true") {
|
|
||||||
auto_database_updates = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
WorldIP = _root["server"]["world"]["tcp"].get("ip", "127.0.0.1").asString();
|
|
||||||
WorldTCPPort = Strings::ToUnsignedInt(_root["server"]["world"]["tcp"].get("port", "9000").asString());
|
|
||||||
|
|
||||||
TelnetIP = _root["server"]["world"]["telnet"].get("ip", "127.0.0.1").asString();
|
TelnetIP = _root["server"]["world"]["telnet"].get("ip", "127.0.0.1").asString();
|
||||||
TelnetTCPPort = Strings::ToUnsignedInt(_root["server"]["world"]["telnet"].get("port", "9001").asString());
|
TelnetTCPPort = atoi(_root["server"]["world"]["telnet"].get("port", "9001").asString().c_str());
|
||||||
TelnetEnabled = false;
|
TelnetEnabled = false;
|
||||||
if (_root["server"]["world"]["telnet"].get("enabled", "false").asString() == "true") { TelnetEnabled = true; }
|
if (_root["server"]["world"]["telnet"].get("enabled", "false").asString() == "true") { TelnetEnabled = true; }
|
||||||
|
|
||||||
WorldHTTPMimeFile = _root["server"]["world"]["http"].get("mimefile", "mime.types").asString();
|
WorldHTTPMimeFile = _root["server"]["world"]["http"].get("mimefile", "mime.types").asString();
|
||||||
WorldHTTPPort = Strings::ToUnsignedInt(_root["server"]["world"]["http"].get("port", "9080").asString());
|
WorldHTTPPort = atoi(_root["server"]["world"]["http"].get("port", "9080").asString().c_str());
|
||||||
WorldHTTPEnabled = false;
|
WorldHTTPEnabled = false;
|
||||||
|
|
||||||
if (_root["server"]["world"]["http"].get("enabled", "false").asString() == "true") {
|
if (_root["server"]["world"]["http"].get("enabled", "false").asString() == "true") {
|
||||||
@@ -114,12 +104,13 @@ void EQEmuConfig::parse_config()
|
|||||||
DisableConfigChecks = true;
|
DisableConfigChecks = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* UCS
|
||||||
CheckUcsConfigConversion();
|
*/
|
||||||
|
ChatHost = _root["server"]["chatserver"].get("host", "eqchat.eqemulator.net").asString();
|
||||||
m_ucs_host = _root["server"]["ucs"].get("host", "eqchat.eqemulator.net").asString();
|
ChatPort = atoi(_root["server"]["chatserver"].get("port", "7778").asString().c_str());
|
||||||
m_ucs_port = Strings::ToUnsignedInt(_root["server"]["ucs"].get("port", "7778").asString());
|
MailHost = _root["server"]["mailserver"].get("host", "eqmail.eqemulator.net").asString();
|
||||||
|
MailPort = atoi(_root["server"]["mailserver"].get("port", "7778").asString().c_str());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database
|
* Database
|
||||||
@@ -127,7 +118,7 @@ void EQEmuConfig::parse_config()
|
|||||||
DatabaseUsername = _root["server"]["database"].get("username", "eq").asString();
|
DatabaseUsername = _root["server"]["database"].get("username", "eq").asString();
|
||||||
DatabasePassword = _root["server"]["database"].get("password", "eq").asString();
|
DatabasePassword = _root["server"]["database"].get("password", "eq").asString();
|
||||||
DatabaseHost = _root["server"]["database"].get("host", "localhost").asString();
|
DatabaseHost = _root["server"]["database"].get("host", "localhost").asString();
|
||||||
DatabasePort = Strings::ToUnsignedInt(_root["server"]["database"].get("port", "3306").asString());
|
DatabasePort = atoi(_root["server"]["database"].get("port", "3306").asString().c_str());
|
||||||
DatabaseDB = _root["server"]["database"].get("db", "eq").asString();
|
DatabaseDB = _root["server"]["database"].get("db", "eq").asString();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -136,26 +127,24 @@ void EQEmuConfig::parse_config()
|
|||||||
ContentDbUsername = _root["server"]["content_database"].get("username", "").asString();
|
ContentDbUsername = _root["server"]["content_database"].get("username", "").asString();
|
||||||
ContentDbPassword = _root["server"]["content_database"].get("password", "").asString();
|
ContentDbPassword = _root["server"]["content_database"].get("password", "").asString();
|
||||||
ContentDbHost = _root["server"]["content_database"].get("host", "").asString();
|
ContentDbHost = _root["server"]["content_database"].get("host", "").asString();
|
||||||
ContentDbPort = Strings::ToUnsignedInt(_root["server"]["content_database"].get("port", 0).asString());
|
ContentDbPort = atoi(_root["server"]["content_database"].get("port", 0).asString().c_str());
|
||||||
ContentDbName = _root["server"]["content_database"].get("db", "").asString();
|
ContentDbName = _root["server"]["content_database"].get("db", "").asString();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QS
|
* QS
|
||||||
*/
|
*/
|
||||||
QSDatabaseHost = _root["server"]["qsdatabase"].get("host", "localhost").asString();
|
QSDatabaseHost = _root["server"]["qsdatabase"].get("host", "localhost").asString();
|
||||||
QSDatabasePort = Strings::ToUnsignedInt(_root["server"]["qsdatabase"].get("port", "3306").asString());
|
QSDatabasePort = atoi(_root["server"]["qsdatabase"].get("port", "3306").asString().c_str());
|
||||||
QSDatabaseUsername = _root["server"]["qsdatabase"].get("username", "eq").asString();
|
QSDatabaseUsername = _root["server"]["qsdatabase"].get("username", "eq").asString();
|
||||||
QSDatabasePassword = _root["server"]["qsdatabase"].get("password", "eq").asString();
|
QSDatabasePassword = _root["server"]["qsdatabase"].get("password", "eq").asString();
|
||||||
QSDatabaseDB = _root["server"]["qsdatabase"].get("db", "eq").asString();
|
QSDatabaseDB = _root["server"]["qsdatabase"].get("db", "eq").asString();
|
||||||
QSHost = _root["server"]["queryserver"].get("host", "localhost").asString();
|
|
||||||
QSPort = Strings::ToUnsignedInt(_root["server"]["queryserver"].get("port", "9500").asString());
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Zones
|
* Zones
|
||||||
*/
|
*/
|
||||||
DefaultStatus = Strings::ToUnsignedInt(_root["server"]["zones"].get("defaultstatus", 0).asString());
|
DefaultStatus = atoi(_root["server"]["zones"].get("defaultstatus", 0).asString().c_str());
|
||||||
ZonePortLow = Strings::ToUnsignedInt(_root["server"]["zones"]["ports"].get("low", "7000").asString());
|
ZonePortLow = atoi(_root["server"]["zones"]["ports"].get("low", "7000").asString().c_str());
|
||||||
ZonePortHigh = Strings::ToUnsignedInt(_root["server"]["zones"]["ports"].get("high", "7999").asString());
|
ZonePortHigh = atoi(_root["server"]["zones"]["ports"].get("high", "7999").asString().c_str());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Files
|
* Files
|
||||||
@@ -173,7 +162,6 @@ void EQEmuConfig::parse_config()
|
|||||||
PluginDir = _root["server"]["directories"].get("plugins", "plugins/").asString();
|
PluginDir = _root["server"]["directories"].get("plugins", "plugins/").asString();
|
||||||
LuaModuleDir = _root["server"]["directories"].get("lua_modules", "lua_modules/").asString();
|
LuaModuleDir = _root["server"]["directories"].get("lua_modules", "lua_modules/").asString();
|
||||||
PatchDir = _root["server"]["directories"].get("patches", "./").asString();
|
PatchDir = _root["server"]["directories"].get("patches", "./").asString();
|
||||||
OpcodeDir = _root["server"]["directories"].get("opcodes", "./").asString();
|
|
||||||
SharedMemDir = _root["server"]["directories"].get("shared_memory", "shared/").asString();
|
SharedMemDir = _root["server"]["directories"].get("shared_memory", "shared/").asString();
|
||||||
LogDir = _root["server"]["directories"].get("logs", "logs/").asString();
|
LogDir = _root["server"]["directories"].get("logs", "logs/").asString();
|
||||||
|
|
||||||
@@ -186,10 +174,10 @@ void EQEmuConfig::parse_config()
|
|||||||
/**
|
/**
|
||||||
* Launcher
|
* Launcher
|
||||||
*/
|
*/
|
||||||
RestartWait = Strings::ToInt(_root["server"]["launcher"]["timers"].get("restart", "10000").asString());
|
RestartWait = atoi(_root["server"]["launcher"]["timers"].get("restart", "10000").asString().c_str());
|
||||||
TerminateWait = Strings::ToInt(_root["server"]["launcher"]["timers"].get("reterminate", "10000").asString());
|
TerminateWait = atoi(_root["server"]["launcher"]["timers"].get("reterminate", "10000").asString().c_str());
|
||||||
InitialBootWait = Strings::ToInt(_root["server"]["launcher"]["timers"].get("initial", "20000").asString());
|
InitialBootWait = atoi(_root["server"]["launcher"]["timers"].get("initial", "20000").asString().c_str());
|
||||||
ZoneBootInterval = Strings::ToInt(_root["server"]["launcher"]["timers"].get("interval", "2000").asString());
|
ZoneBootInterval = atoi(_root["server"]["launcher"]["timers"].get("interval", "2000").asString().c_str());
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
ZoneExe = _root["server"]["launcher"].get("exe", "zone.exe").asString();
|
ZoneExe = _root["server"]["launcher"].get("exe", "zone.exe").asString();
|
||||||
#else
|
#else
|
||||||
@@ -251,16 +239,16 @@ std::string EQEmuConfig::GetByName(const std::string &var_name) const
|
|||||||
return (WorldHTTPEnabled ? "true" : "false");
|
return (WorldHTTPEnabled ? "true" : "false");
|
||||||
}
|
}
|
||||||
if (var_name == "ChatHost") {
|
if (var_name == "ChatHost") {
|
||||||
return (m_ucs_host);
|
return (ChatHost);
|
||||||
}
|
}
|
||||||
if (var_name == "ChatPort") {
|
if (var_name == "ChatPort") {
|
||||||
return (itoa(m_ucs_port));
|
return (itoa(ChatPort));
|
||||||
}
|
}
|
||||||
if (var_name == "MailHost") {
|
if (var_name == "MailHost") {
|
||||||
return (m_ucs_host);
|
return (MailHost);
|
||||||
}
|
}
|
||||||
if (var_name == "MailPort") {
|
if (var_name == "MailPort") {
|
||||||
return (itoa(m_ucs_port));
|
return (itoa(MailPort));
|
||||||
}
|
}
|
||||||
if (var_name == "DatabaseHost") {
|
if (var_name == "DatabaseHost") {
|
||||||
return (DatabaseHost);
|
return (DatabaseHost);
|
||||||
@@ -367,8 +355,10 @@ void EQEmuConfig::Dump() const
|
|||||||
std::cout << "WorldHTTPPort = " << WorldHTTPPort << std::endl;
|
std::cout << "WorldHTTPPort = " << WorldHTTPPort << std::endl;
|
||||||
std::cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << std::endl;
|
std::cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << std::endl;
|
||||||
std::cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << std::endl;
|
std::cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << std::endl;
|
||||||
std::cout << "UCSHost = " << m_ucs_host << std::endl;
|
std::cout << "ChatHost = " << ChatHost << std::endl;
|
||||||
std::cout << "UCSPort = " << m_ucs_port << std::endl;
|
std::cout << "ChatPort = " << ChatPort << std::endl;
|
||||||
|
std::cout << "MailHost = " << MailHost << std::endl;
|
||||||
|
std::cout << "MailPort = " << MailPort << std::endl;
|
||||||
std::cout << "DatabaseHost = " << DatabaseHost << std::endl;
|
std::cout << "DatabaseHost = " << DatabaseHost << std::endl;
|
||||||
std::cout << "DatabaseUsername = " << DatabaseUsername << std::endl;
|
std::cout << "DatabaseUsername = " << DatabaseUsername << std::endl;
|
||||||
std::cout << "DatabasePassword = " << DatabasePassword << std::endl;
|
std::cout << "DatabasePassword = " << DatabasePassword << std::endl;
|
||||||
@@ -395,98 +385,3 @@ void EQEmuConfig::Dump() const
|
|||||||
std::cout << "DefaultStatus = " << (int) DefaultStatus << std::endl;
|
std::cout << "DefaultStatus = " << (int) DefaultStatus << std::endl;
|
||||||
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string &EQEmuConfig::GetUCSHost() const
|
|
||||||
{
|
|
||||||
return m_ucs_host;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16 EQEmuConfig::GetUCSPort() const
|
|
||||||
{
|
|
||||||
return m_ucs_port;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuConfig::CheckUcsConfigConversion()
|
|
||||||
{
|
|
||||||
std::string chat_host = _root["server"]["chatserver"].get("host", "").asString();
|
|
||||||
uint32 chat_port = Strings::ToUnsignedInt(_root["server"]["chatserver"].get("port", "0").asString());
|
|
||||||
std::string mail_host = _root["server"]["mailserver"].get("host", "").asString();
|
|
||||||
uint32 mail_port = Strings::ToUnsignedInt(_root["server"]["mailserver"].get("port", "0").asString());
|
|
||||||
std::string ucs_host = _root["server"]["ucs"].get("host", "").asString();
|
|
||||||
|
|
||||||
// automatic ucs legacy configuration migration
|
|
||||||
// if old configuration values are set, let's backup the existing configuration
|
|
||||||
// and migrate to to use the new fields and write the new config
|
|
||||||
if ((!chat_host.empty() || !mail_host.empty()) && ucs_host.empty()) {
|
|
||||||
LogInfo("Migrating old [eqemu_config] UCS configuration to new configuration");
|
|
||||||
|
|
||||||
std::string config_file_path = std::filesystem::path{
|
|
||||||
path.GetServerPath() + "/eqemu_config.json"
|
|
||||||
}.string();
|
|
||||||
|
|
||||||
std::string config_file_bak_path = std::filesystem::path{
|
|
||||||
path.GetServerPath() + "/eqemu_config.ucs-migrate-json.bak"
|
|
||||||
}.string();
|
|
||||||
|
|
||||||
// copy eqemu_config.json to eqemu_config.json.bak
|
|
||||||
std::ifstream src(config_file_path, std::ios::binary);
|
|
||||||
std::ofstream dst(config_file_bak_path, std::ios::binary);
|
|
||||||
dst << src.rdbuf();
|
|
||||||
src.close();
|
|
||||||
|
|
||||||
LogInfo("Old configuration backed up to [{}]", config_file_bak_path);
|
|
||||||
|
|
||||||
// read eqemu_config.json, transplant new fields and write to eqemu_config.json
|
|
||||||
Json::Value root;
|
|
||||||
Json::Reader reader;
|
|
||||||
std::ifstream file(config_file_path);
|
|
||||||
if (!reader.parse(file, root)) {
|
|
||||||
LogError("Failed to parse configuration file");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
// get old fields
|
|
||||||
std::string host = !chat_host.empty() ? chat_host : mail_host;
|
|
||||||
if (host.empty()) {
|
|
||||||
host = "eqchat.eqemulator.net";
|
|
||||||
}
|
|
||||||
std::string port = chat_port > 0 ? std::to_string(chat_port) : std::to_string(mail_port);
|
|
||||||
if (port.empty()) {
|
|
||||||
port = "7778";
|
|
||||||
}
|
|
||||||
|
|
||||||
// set new fields
|
|
||||||
root["server"]["ucs"]["host"] = host;
|
|
||||||
root["server"]["ucs"]["port"] = port;
|
|
||||||
|
|
||||||
// unset old fields
|
|
||||||
root["server"].removeMember("chatserver");
|
|
||||||
root["server"].removeMember("mailserver");
|
|
||||||
|
|
||||||
// get Json::Value raw string
|
|
||||||
std::string config = root.toStyledString();
|
|
||||||
|
|
||||||
// format using more modern json library
|
|
||||||
nlohmann::json data = nlohmann::json::parse(config);
|
|
||||||
|
|
||||||
// write to file
|
|
||||||
std::ofstream o(config_file_path);
|
|
||||||
o << std::setw(1) << data << std::endl;
|
|
||||||
o.close();
|
|
||||||
|
|
||||||
// write new config
|
|
||||||
LogInfo("New configuration written to [{}]", config_file_path);
|
|
||||||
LogInfo("Migration complete, please review the new configuration file");
|
|
||||||
|
|
||||||
// reload config internally
|
|
||||||
try {
|
|
||||||
std::ifstream fconfig(config_file_path, std::ifstream::binary);
|
|
||||||
fconfig >> _config->_root;
|
|
||||||
_config->parse_config();
|
|
||||||
}
|
|
||||||
catch (std::exception &) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+16
-14
@@ -62,6 +62,14 @@ class EQEmuConfig
|
|||||||
std::string SharedKey;
|
std::string SharedKey;
|
||||||
bool DisableConfigChecks;
|
bool DisableConfigChecks;
|
||||||
|
|
||||||
|
// From <chatserver/>
|
||||||
|
std::string ChatHost;
|
||||||
|
uint16 ChatPort;
|
||||||
|
|
||||||
|
// From <mailserver/>
|
||||||
|
std::string MailHost;
|
||||||
|
uint16 MailPort;
|
||||||
|
|
||||||
// From <database/>
|
// From <database/>
|
||||||
std::string DatabaseHost;
|
std::string DatabaseHost;
|
||||||
std::string DatabaseUsername;
|
std::string DatabaseUsername;
|
||||||
@@ -81,9 +89,7 @@ class EQEmuConfig
|
|||||||
std::string QSDatabaseUsername;
|
std::string QSDatabaseUsername;
|
||||||
std::string QSDatabasePassword;
|
std::string QSDatabasePassword;
|
||||||
std::string QSDatabaseDB;
|
std::string QSDatabaseDB;
|
||||||
uint16 QSDatabasePort;
|
uint16 QSDatabasePort;
|
||||||
std::string QSHost;
|
|
||||||
int QSPort;
|
|
||||||
|
|
||||||
// From <files/>
|
// From <files/>
|
||||||
std::string SpellsFile;
|
std::string SpellsFile;
|
||||||
@@ -97,7 +103,6 @@ class EQEmuConfig
|
|||||||
std::string PluginDir;
|
std::string PluginDir;
|
||||||
std::string LuaModuleDir;
|
std::string LuaModuleDir;
|
||||||
std::string PatchDir;
|
std::string PatchDir;
|
||||||
std::string OpcodeDir;
|
|
||||||
std::string SharedMemDir;
|
std::string SharedMemDir;
|
||||||
std::string LogDir;
|
std::string LogDir;
|
||||||
|
|
||||||
@@ -115,20 +120,12 @@ class EQEmuConfig
|
|||||||
uint16 ZonePortHigh;
|
uint16 ZonePortHigh;
|
||||||
uint8 DefaultStatus;
|
uint8 DefaultStatus;
|
||||||
|
|
||||||
bool auto_database_updates;
|
|
||||||
|
|
||||||
const std::string &GetUCSHost() const;
|
|
||||||
uint16 GetUCSPort() const;
|
|
||||||
|
|
||||||
// uint16 DynamicCount;
|
// uint16 DynamicCount;
|
||||||
|
|
||||||
// map<string,uint16> StaticZones;
|
// map<string,uint16> StaticZones;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
std::string m_ucs_host;
|
|
||||||
uint16 m_ucs_port;
|
|
||||||
|
|
||||||
static EQEmuConfig *_config;
|
static EQEmuConfig *_config;
|
||||||
Json::Value _root;
|
Json::Value _root;
|
||||||
static std::string ConfigFile;
|
static std::string ConfigFile;
|
||||||
@@ -139,9 +136,9 @@ class EQEmuConfig
|
|||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
virtual ~EQEmuConfig() {}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual ~EQEmuConfig() {}
|
|
||||||
|
|
||||||
// Produce a const singleton
|
// Produce a const singleton
|
||||||
static const EQEmuConfig *get()
|
static const EQEmuConfig *get()
|
||||||
@@ -150,6 +147,12 @@ class EQEmuConfig
|
|||||||
return (_config);
|
return (_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Allow the use to set the conf file to be used.
|
||||||
|
static void SetConfigFile(std::string file)
|
||||||
|
{
|
||||||
|
EQEmuConfig::ConfigFile = file;
|
||||||
|
}
|
||||||
|
|
||||||
// Load the config
|
// Load the config
|
||||||
static bool LoadConfig(const std::string& path = "")
|
static bool LoadConfig(const std::string& path = "")
|
||||||
{
|
{
|
||||||
@@ -187,7 +190,6 @@ class EQEmuConfig
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Dump() const;
|
void Dump() const;
|
||||||
void CheckUcsConfigConversion();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+202
-291
@@ -22,21 +22,21 @@
|
|||||||
#include "rulesys.h"
|
#include "rulesys.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "discord/discord.h"
|
||||||
#include "repositories/discord_webhooks_repository.h"
|
#include "repositories/discord_webhooks_repository.h"
|
||||||
#include "repositories/logsys_categories_repository.h"
|
#include "repositories/logsys_categories_repository.h"
|
||||||
#include "termcolor/rang.hpp"
|
|
||||||
#include "path_manager.h"
|
|
||||||
#include "file.h"
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <iomanip>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
std::ofstream process_log;
|
std::ofstream process_log;
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <direct.h>
|
#include <direct.h>
|
||||||
#include <conio.h>
|
#include <conio.h>
|
||||||
@@ -52,12 +52,46 @@ std::ofstream process_log;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Linux ANSI console color defines
|
||||||
|
*/
|
||||||
|
#define LC_RESET "\033[0m"
|
||||||
|
#define LC_BLACK "\033[30m" /* Black */
|
||||||
|
#define LC_RED "\033[31m" /* Red */
|
||||||
|
#define LC_GREEN "\033[32m" /* Green */
|
||||||
|
#define LC_YELLOW "\033[33m" /* Yellow */
|
||||||
|
#define LC_BLUE "\033[34m" /* Blue */
|
||||||
|
#define LC_MAGENTA "\033[35m" /* Magenta */
|
||||||
|
#define LC_CYAN "\033[36m" /* Cyan */
|
||||||
|
#define LC_WHITE "\033[37m" /* White */
|
||||||
|
|
||||||
|
namespace Console {
|
||||||
|
enum Color {
|
||||||
|
Black = 0,
|
||||||
|
Blue = 1,
|
||||||
|
Green = 2,
|
||||||
|
Cyan = 3,
|
||||||
|
Red = 4,
|
||||||
|
Magenta = 5,
|
||||||
|
Brown = 6,
|
||||||
|
LightGray = 7,
|
||||||
|
DarkGray = 8,
|
||||||
|
LightBlue = 9,
|
||||||
|
LightGreen = 10,
|
||||||
|
LightCyan = 11,
|
||||||
|
LightRed = 12,
|
||||||
|
LightMagenta = 13,
|
||||||
|
Yellow = 14,
|
||||||
|
White = 15
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EQEmuLogSys Constructor
|
* EQEmuLogSys Constructor
|
||||||
*/
|
*/
|
||||||
EQEmuLogSys::EQEmuLogSys()
|
EQEmuLogSys::EQEmuLogSys()
|
||||||
{
|
{
|
||||||
m_on_log_gmsay_hook = [](uint16 log_type, const char *func, const std::string &) {};
|
m_on_log_gmsay_hook = [](uint16 log_type, const std::string &) {};
|
||||||
m_on_log_console_hook = [](uint16 log_type, const std::string &) {};
|
m_on_log_console_hook = [](uint16 log_type, const std::string &) {};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,9 +120,14 @@ EQEmuLogSys *EQEmuLogSys::LoadLogSettingsDefaults()
|
|||||||
/**
|
/**
|
||||||
* Set Defaults
|
* Set Defaults
|
||||||
*/
|
*/
|
||||||
|
log_settings[Logs::WorldServer].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::ZoneServer].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::QSServer].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::UCSServer].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Crash].log_to_file = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::MySQLError].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::MySQLError].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Loginserver].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::HeadlessClient].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::NPCScaling].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::NPCScaling].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::HotReload].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::HotReload].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::HotReload].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::HotReload].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
@@ -103,17 +142,17 @@ EQEmuLogSys *EQEmuLogSys::LoadLogSettingsDefaults()
|
|||||||
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::EqTime].log_to_console = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::EqTime].log_to_gmsay = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::NpcHandin].log_to_console = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::NpcHandin].log_to_gmsay = static_cast<uint8>(Logs::General);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RFC 5424
|
* RFC 5424
|
||||||
*/
|
*/
|
||||||
log_settings[Logs::Error].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Emergency].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Warning].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Alert].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Info].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Critical].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Error].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Warning].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Notice].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Info].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set Category enabled status on defaults
|
* Set Category enabled status on defaults
|
||||||
@@ -157,6 +196,24 @@ EQEmuLogSys *EQEmuLogSys::LoadLogSettingsDefaults()
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param log_category
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool EQEmuLogSys::IsRfc5424LogCategory(uint16 log_category)
|
||||||
|
{
|
||||||
|
return (
|
||||||
|
log_category == Logs::Emergency ||
|
||||||
|
log_category == Logs::Alert ||
|
||||||
|
log_category == Logs::Critical ||
|
||||||
|
log_category == Logs::Error ||
|
||||||
|
log_category == Logs::Warning ||
|
||||||
|
log_category == Logs::Notice ||
|
||||||
|
log_category == Logs::Info ||
|
||||||
|
log_category == Logs::Debug
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param debug_level
|
* @param debug_level
|
||||||
* @param log_category
|
* @param log_category
|
||||||
@@ -187,6 +244,66 @@ void EQEmuLogSys::ProcessLogWrite(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param log_category
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
uint16 EQEmuLogSys::GetWindowsConsoleColorFromCategory(uint16 log_category)
|
||||||
|
{
|
||||||
|
switch (log_category) {
|
||||||
|
case Logs::Status:
|
||||||
|
case Logs::Normal:
|
||||||
|
return Console::Color::Yellow;
|
||||||
|
case Logs::MySQLError:
|
||||||
|
case Logs::Error:
|
||||||
|
case Logs::QuestErrors:
|
||||||
|
return Console::Color::LightRed;
|
||||||
|
case Logs::MySQLQuery:
|
||||||
|
case Logs::Debug:
|
||||||
|
return Console::Color::LightGreen;
|
||||||
|
case Logs::Quests:
|
||||||
|
return Console::Color::LightCyan;
|
||||||
|
case Logs::Commands:
|
||||||
|
case Logs::Mercenaries:
|
||||||
|
return Console::Color::LightMagenta;
|
||||||
|
case Logs::Crash:
|
||||||
|
return Console::Color::LightRed;
|
||||||
|
default:
|
||||||
|
return Console::Color::Yellow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param log_category
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
std::string EQEmuLogSys::GetLinuxConsoleColorFromCategory(uint16 log_category)
|
||||||
|
{
|
||||||
|
switch (log_category) {
|
||||||
|
case Logs::Status:
|
||||||
|
case Logs::Normal:
|
||||||
|
return LC_YELLOW;
|
||||||
|
case Logs::MySQLError:
|
||||||
|
case Logs::QuestErrors:
|
||||||
|
case Logs::Warning:
|
||||||
|
case Logs::Critical:
|
||||||
|
case Logs::Error:
|
||||||
|
return LC_RED;
|
||||||
|
case Logs::MySQLQuery:
|
||||||
|
case Logs::Debug:
|
||||||
|
return LC_GREEN;
|
||||||
|
case Logs::Quests:
|
||||||
|
return LC_CYAN;
|
||||||
|
case Logs::Commands:
|
||||||
|
case Logs::Mercenaries:
|
||||||
|
return LC_MAGENTA;
|
||||||
|
case Logs::Crash:
|
||||||
|
return LC_RED;
|
||||||
|
default:
|
||||||
|
return LC_YELLOW;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param log_category
|
* @param log_category
|
||||||
* @return
|
* @return
|
||||||
@@ -194,10 +311,12 @@ void EQEmuLogSys::ProcessLogWrite(
|
|||||||
uint16 EQEmuLogSys::GetGMSayColorFromCategory(uint16 log_category)
|
uint16 EQEmuLogSys::GetGMSayColorFromCategory(uint16 log_category)
|
||||||
{
|
{
|
||||||
switch (log_category) {
|
switch (log_category) {
|
||||||
case Logs::Crash:
|
case Logs::Status:
|
||||||
case Logs::Error:
|
case Logs::Normal:
|
||||||
|
return Chat::Yellow;
|
||||||
case Logs::MySQLError:
|
case Logs::MySQLError:
|
||||||
case Logs::QuestErrors:
|
case Logs::QuestErrors:
|
||||||
|
case Logs::Error:
|
||||||
return Chat::Red;
|
return Chat::Red;
|
||||||
case Logs::MySQLQuery:
|
case Logs::MySQLQuery:
|
||||||
case Logs::Debug:
|
case Logs::Debug:
|
||||||
@@ -207,206 +326,35 @@ uint16 EQEmuLogSys::GetGMSayColorFromCategory(uint16 log_category)
|
|||||||
case Logs::Commands:
|
case Logs::Commands:
|
||||||
case Logs::Mercenaries:
|
case Logs::Mercenaries:
|
||||||
return Chat::Magenta;
|
return Chat::Magenta;
|
||||||
|
case Logs::Crash:
|
||||||
|
return Chat::Red;
|
||||||
default:
|
default:
|
||||||
return Chat::Yellow;
|
return Chat::Yellow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param debug_level
|
* @param debug_level
|
||||||
* @param log_category
|
* @param log_category
|
||||||
* @param message
|
* @param message
|
||||||
*/
|
*/
|
||||||
void EQEmuLogSys::ProcessConsoleMessage(
|
void EQEmuLogSys::ProcessConsoleMessage(uint16 log_category, const std::string &message)
|
||||||
uint16 log_category,
|
|
||||||
const std::string &message,
|
|
||||||
const char *file,
|
|
||||||
const char *func,
|
|
||||||
int line
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
bool is_error = (
|
#ifdef _WINDOWS
|
||||||
log_category == Logs::LogCategory::Error ||
|
HANDLE console_handle;
|
||||||
log_category == Logs::LogCategory::MySQLError ||
|
console_handle = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
log_category == Logs::LogCategory::Crash ||
|
CONSOLE_FONT_INFOEX info = { 0 };
|
||||||
log_category == Logs::LogCategory::QuestErrors
|
info.cbSize = sizeof(info);
|
||||||
);
|
info.dwFontSize.Y = 12; // leave X as zero
|
||||||
bool is_warning = (
|
info.FontWeight = FW_NORMAL;
|
||||||
log_category == Logs::LogCategory::Warning
|
wcscpy(info.FaceName, L"Lucida Console");
|
||||||
);
|
SetCurrentConsoleFontEx(console_handle, NULL, &info);
|
||||||
|
SetConsoleTextAttribute(console_handle, EQEmuLogSys::GetWindowsConsoleColorFromCategory(log_category));
|
||||||
(!is_error ? std::cout : std::cerr)
|
std::cout << message << "\n";
|
||||||
<< ""
|
SetConsoleTextAttribute(console_handle, Console::Color::White);
|
||||||
<< rang::fgB::black
|
#else
|
||||||
<< rang::style::bold
|
std::cout << EQEmuLogSys::GetLinuxConsoleColorFromCategory(log_category) << message << LC_RESET << std::endl;
|
||||||
<< fmt::format("{:>6}", GetPlatformName().substr(0, 6))
|
#endif
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< " | "
|
|
||||||
<< ((is_error || is_warning) ? rang::fgB::red : rang::fgB::gray)
|
|
||||||
<< rang::style::bold
|
|
||||||
<< fmt::format("{:^10}", fmt::format("{}", Logs::LogCategoryName[log_category]).substr(0, 10))
|
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< " | "
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< rang::style::bold
|
|
||||||
<< fmt::format("{}", func)
|
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< " ";
|
|
||||||
|
|
||||||
if (RuleB(Logging, PrintFileFunctionAndLine)) {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< ""
|
|
||||||
<< rang::fgB::green
|
|
||||||
<< rang::style::bold
|
|
||||||
<< fmt::format("{:}", fmt::format("{}:{}:{}", std::filesystem::path(file).filename().string(), func, line))
|
|
||||||
<< rang::style::reset
|
|
||||||
<< " | ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (log_category == Logs::LogCategory::MySQLQuery) {
|
|
||||||
auto s = Strings::Split(message, "--");
|
|
||||||
if (s.size() > 1) {
|
|
||||||
std::string query = Strings::Trim(s[0]);
|
|
||||||
std::string meta = Strings::Trim(s[1]);
|
|
||||||
|
|
||||||
std::cout <<
|
|
||||||
rang::fgB::green
|
|
||||||
<<
|
|
||||||
query
|
|
||||||
<<
|
|
||||||
rang::style::reset;
|
|
||||||
|
|
||||||
std::cout <<
|
|
||||||
rang::fgB::black
|
|
||||||
<<
|
|
||||||
" -- "
|
|
||||||
<<
|
|
||||||
meta
|
|
||||||
<<
|
|
||||||
rang::style::reset;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (Strings::Contains(message, "[")) {
|
|
||||||
for (auto &e: Strings::Split(message, " ")) {
|
|
||||||
if (Strings::Contains(e, "[") && Strings::Contains(e, "]")) {
|
|
||||||
e = Strings::Replace(e, "[", "");
|
|
||||||
e = Strings::Replace(e, "]", "");
|
|
||||||
|
|
||||||
bool is_upper = false;
|
|
||||||
|
|
||||||
for (int i = 0; i < strlen(e.c_str()); i++) {
|
|
||||||
if (isupper(e[i])) {
|
|
||||||
is_upper = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// color matching in []
|
|
||||||
// ex: [<red>variable] would produce [variable] with red inside brackets
|
|
||||||
std::map<std::string, rang::fgB> colors = {
|
|
||||||
{"<black>", rang::fgB::black},
|
|
||||||
{"<green>", rang::fgB::green},
|
|
||||||
{"<yellow>", rang::fgB::yellow},
|
|
||||||
{"<blue>", rang::fgB::blue},
|
|
||||||
{"<magenta>", rang::fgB::magenta},
|
|
||||||
{"<cyan>", rang::fgB::cyan},
|
|
||||||
{"<gray>", rang::fgB::gray},
|
|
||||||
{"<red>", rang::fgB::red},
|
|
||||||
};
|
|
||||||
|
|
||||||
bool match_color = false;
|
|
||||||
for (auto &c: colors) {
|
|
||||||
if (Strings::Contains(e, c.first)) {
|
|
||||||
e = Strings::Replace(e, c.first, "");
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "["
|
|
||||||
<< rang::style::bold
|
|
||||||
<< c.second
|
|
||||||
<< e
|
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "] ";
|
|
||||||
match_color = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// string match to colors
|
|
||||||
std::map<std::string, rang::fgB> matches = {
|
|
||||||
{"missing", rang::fgB::red},
|
|
||||||
{"error", rang::fgB::red},
|
|
||||||
{"ok", rang::fgB::green},
|
|
||||||
};
|
|
||||||
|
|
||||||
for (auto &c: matches) {
|
|
||||||
if (Strings::Contains(e, c.first)) {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "["
|
|
||||||
<< rang::style::bold
|
|
||||||
<< c.second
|
|
||||||
<< e
|
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "] ";
|
|
||||||
match_color = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we don't match a color in either the string matching or
|
|
||||||
// the color tag matching, we default to yellow inside brackets
|
|
||||||
// if uppercase, does not get colored
|
|
||||||
if (!match_color) {
|
|
||||||
if (!is_upper) {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "["
|
|
||||||
<< rang::style::bold
|
|
||||||
<< rang::fgB::yellow
|
|
||||||
<< e
|
|
||||||
<< rang::style::reset
|
|
||||||
<< rang::fgB::gray
|
|
||||||
<< "] ";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
(!is_error ? std::cout : std::cerr) << rang::fgB::gray << "[" << e << "] ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< (is_error ? rang::fgB::red : rang::fgB::gray)
|
|
||||||
<< e
|
|
||||||
<< " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<< (is_error ? rang::fgB::red : rang::fgB::gray)
|
|
||||||
<< message
|
|
||||||
<< " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!origination_info.zone_short_name.empty()) {
|
|
||||||
(!is_error ? std::cout : std::cerr)
|
|
||||||
<<
|
|
||||||
rang::fgB::black
|
|
||||||
<<
|
|
||||||
"-- "
|
|
||||||
<<
|
|
||||||
fmt::format(
|
|
||||||
"[{}] ({}) inst_id [{}]",
|
|
||||||
origination_info.zone_short_name,
|
|
||||||
origination_info.zone_long_name,
|
|
||||||
origination_info.instance_id
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
(!is_error ? std::cout : std::cerr) << rang::style::reset << std::endl;
|
|
||||||
|
|
||||||
m_on_log_console_hook(log_category, message);
|
m_on_log_console_hook(log_category, message);
|
||||||
}
|
}
|
||||||
@@ -420,6 +368,33 @@ constexpr const char *str_end(const char *str)
|
|||||||
return *str ? str_end(str + 1) : str;
|
return *str ? str_end(str + 1) : str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
constexpr bool str_slant(const char *str)
|
||||||
|
{
|
||||||
|
return *str == '/' ? true : (*str ? str_slant(str + 1) : false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
constexpr const char *r_slant(const char *str)
|
||||||
|
{
|
||||||
|
return *str == '/' ? (str + 1) : r_slant(str - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param str
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
constexpr const char *base_file_name(const char *str)
|
||||||
|
{
|
||||||
|
return str_slant(str) ? r_slant(str_end(str)) : str;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Core logging function
|
* Core logging function
|
||||||
*
|
*
|
||||||
@@ -447,14 +422,12 @@ void EQEmuLogSys::Out(
|
|||||||
|
|
||||||
std::string prefix;
|
std::string prefix;
|
||||||
if (RuleB(Logging, PrintFileFunctionAndLine)) {
|
if (RuleB(Logging, PrintFileFunctionAndLine)) {
|
||||||
prefix = fmt::format("[{0}::{1}:{2}] ", std::filesystem::path(file).filename().string(), func, line);
|
prefix = fmt::format("[{0}::{1}:{2}] ", base_file_name(file), func, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove this when we remove all legacy logs
|
// remove this when we remove all legacy logs
|
||||||
bool ignore_log_legacy_format = (
|
bool ignore_log_legacy_format = (
|
||||||
log_category == Logs::Netcode ||
|
log_category == Logs::Netcode ||
|
||||||
log_category == Logs::MySQLQuery ||
|
|
||||||
log_category == Logs::MySQLError ||
|
|
||||||
log_category == Logs::PacketServerClient ||
|
log_category == Logs::PacketServerClient ||
|
||||||
log_category == Logs::PacketClientServer ||
|
log_category == Logs::PacketClientServer ||
|
||||||
log_category == Logs::PacketServerToServer
|
log_category == Logs::PacketServerToServer
|
||||||
@@ -472,14 +445,11 @@ void EQEmuLogSys::Out(
|
|||||||
if (l.log_to_console_enabled) {
|
if (l.log_to_console_enabled) {
|
||||||
EQEmuLogSys::ProcessConsoleMessage(
|
EQEmuLogSys::ProcessConsoleMessage(
|
||||||
log_category,
|
log_category,
|
||||||
output_message,
|
fmt::format("[{}] [{}] {}", GetPlatformName(), Logs::LogCategoryName[log_category], prefix + output_message)
|
||||||
file,
|
|
||||||
func,
|
|
||||||
line
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (l.log_to_gmsay_enabled) {
|
if (l.log_to_gmsay_enabled) {
|
||||||
m_on_log_gmsay_hook(log_category, func, output_message);
|
m_on_log_gmsay_hook(log_category, output_message);
|
||||||
}
|
}
|
||||||
if (l.log_to_file_enabled) {
|
if (l.log_to_file_enabled) {
|
||||||
EQEmuLogSys::ProcessLogWrite(
|
EQEmuLogSys::ProcessLogWrite(
|
||||||
@@ -537,11 +507,6 @@ void EQEmuLogSys::StartFileLogs(const std::string &log_name)
|
|||||||
{
|
{
|
||||||
EQEmuLogSys::CloseFileLogs();
|
EQEmuLogSys::CloseFileLogs();
|
||||||
|
|
||||||
if (!File::Exists(path.GetLogPath())) {
|
|
||||||
LogInfo("Logs directory not found, creating [{}]", path.GetLogPath());
|
|
||||||
File::Makedir(path.GetLogPath());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When loading settings, we must have been given a reason in category based logging to output to a file in order to even create or open one...
|
* When loading settings, we must have been given a reason in category based logging to output to a file in order to even create or open one...
|
||||||
*/
|
*/
|
||||||
@@ -594,16 +559,10 @@ void EQEmuLogSys::StartFileLogs(const std::string &log_name)
|
|||||||
*/
|
*/
|
||||||
void EQEmuLogSys::SilenceConsoleLogging()
|
void EQEmuLogSys::SilenceConsoleLogging()
|
||||||
{
|
{
|
||||||
std::copy(std::begin(log_settings), std::end(log_settings), std::begin(pre_silence_settings));
|
|
||||||
|
|
||||||
for (int log_index = Logs::AA; log_index != Logs::MaxCategoryID; log_index++) {
|
for (int log_index = Logs::AA; log_index != Logs::MaxCategoryID; log_index++) {
|
||||||
log_settings[log_index].log_to_console = 0;
|
log_settings[log_index].log_to_console = 0;
|
||||||
log_settings[log_index].is_category_enabled = 0;
|
log_settings[log_index].is_category_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_settings[Logs::MySQLError].log_to_console = static_cast<uint8>(Logs::MySQLError);
|
|
||||||
log_settings[Logs::Error].log_to_console = static_cast<uint8>(Logs::Error);
|
|
||||||
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -611,10 +570,13 @@ void EQEmuLogSys::SilenceConsoleLogging()
|
|||||||
*/
|
*/
|
||||||
void EQEmuLogSys::EnableConsoleLogging()
|
void EQEmuLogSys::EnableConsoleLogging()
|
||||||
{
|
{
|
||||||
std::copy(std::begin(pre_silence_settings), std::end(pre_silence_settings), std::begin(log_settings));
|
for (int log_index = Logs::AA; log_index != Logs::MaxCategoryID; log_index++) {
|
||||||
|
log_settings[log_index].log_to_console = Logs::General;
|
||||||
|
log_settings[log_index].is_category_enabled = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings(bool silent_load)
|
EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
||||||
{
|
{
|
||||||
InjectTablesIfNotExist();
|
InjectTablesIfNotExist();
|
||||||
|
|
||||||
@@ -663,9 +625,6 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings(bool silent_load)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Auto inject categories that don't exist in the database...
|
// Auto inject categories that don't exist in the database...
|
||||||
|
|
||||||
std::vector<LogsysCategoriesRepository::LogsysCategories> db_categories_to_add{};
|
|
||||||
|
|
||||||
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
||||||
|
|
||||||
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
||||||
@@ -680,46 +639,22 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings(bool silent_load)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_missing_in_database && !is_deprecated_category) {
|
if (is_missing_in_database && !is_deprecated_category) {
|
||||||
LogInfo("Automatically adding new log category [{}] ({})", Logs::LogCategoryName[i], i);
|
LogInfo(
|
||||||
|
"Automatically adding new log category [{}] ({})",
|
||||||
|
Logs::LogCategoryName[i],
|
||||||
|
i
|
||||||
|
);
|
||||||
|
|
||||||
auto e = LogsysCategoriesRepository::NewEntity();
|
auto new_category = LogsysCategoriesRepository::NewEntity();
|
||||||
e.log_category_id = i;
|
new_category.log_category_id = i;
|
||||||
e.log_category_description = Strings::Escape(Logs::LogCategoryName[i]);
|
new_category.log_category_description = Strings::Escape(Logs::LogCategoryName[i]);
|
||||||
e.log_to_console = log_settings[i].log_to_console;
|
new_category.log_to_console = log_settings[i].log_to_console;
|
||||||
e.log_to_gmsay = log_settings[i].log_to_gmsay;
|
new_category.log_to_gmsay = log_settings[i].log_to_gmsay;
|
||||||
e.log_to_file = log_settings[i].log_to_file;
|
new_category.log_to_file = log_settings[i].log_to_file;
|
||||||
e.log_to_discord = log_settings[i].log_to_discord;
|
new_category.log_to_discord = log_settings[i].log_to_discord;
|
||||||
db_categories_to_add.emplace_back(e);
|
|
||||||
|
LogsysCategoriesRepository::InsertOne(*m_database, new_category);
|
||||||
}
|
}
|
||||||
|
|
||||||
// look to see if the category name is different in the database
|
|
||||||
auto it = std::find_if(
|
|
||||||
categories.begin(),
|
|
||||||
categories.end(),
|
|
||||||
[i](const auto &c) { return c.log_category_id == i; }
|
|
||||||
);
|
|
||||||
if (it != categories.end()) {
|
|
||||||
if (it->log_category_description != Logs::LogCategoryName[i]) {
|
|
||||||
LogInfo(
|
|
||||||
"Updating log category [{}] ({}) to new name [{}]",
|
|
||||||
it->log_category_description,
|
|
||||||
i,
|
|
||||||
Logs::LogCategoryName[i]
|
|
||||||
);
|
|
||||||
it->log_category_description = Logs::LogCategoryName[i];
|
|
||||||
LogsysCategoriesRepository::ReplaceOne(*m_database, *it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!db_categories_to_add.empty()) {
|
|
||||||
LogsysCategoriesRepository::ReplaceMany(*m_database, db_categories_to_add);
|
|
||||||
LoadLogDatabaseSettings();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (silent_load) {
|
|
||||||
SilenceConsoleLogging();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LogInfo("Loaded [{}] log categories", categories.size());
|
LogInfo("Loaded [{}] log categories", categories.size());
|
||||||
@@ -732,17 +667,6 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings(bool silent_load)
|
|||||||
LogInfo("Loaded [{}] Discord webhooks", webhooks.size());
|
LogInfo("Loaded [{}] Discord webhooks", webhooks.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
// force override this setting
|
|
||||||
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::Crash].log_to_gmsay = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::Crash].log_to_file = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::Info].log_to_file = static_cast<uint8>(Logs::General);
|
|
||||||
log_settings[Logs::Info].log_to_console = static_cast<uint8>(Logs::General);
|
|
||||||
|
|
||||||
if (silent_load) {
|
|
||||||
SilenceConsoleLogging();
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -846,16 +770,3 @@ EQEmuLogSys *EQEmuLogSys::SetLogPath(const std::string &log_path)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EQEmuLogSys::DisableMySQLErrorLogs()
|
|
||||||
{
|
|
||||||
log_settings[Logs::MySQLError].log_to_file = 0;
|
|
||||||
log_settings[Logs::MySQLError].log_to_console = 0;
|
|
||||||
log_settings[Logs::MySQLError].log_to_gmsay = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EQEmuLogSys::EnableMySQLErrorLogs()
|
|
||||||
{
|
|
||||||
log_settings[Logs::MySQLError].log_to_file = 1;
|
|
||||||
log_settings[Logs::MySQLError].log_to_console = 1;
|
|
||||||
log_settings[Logs::MySQLError].log_to_gmsay = 1;
|
|
||||||
}
|
|
||||||
|
|||||||
+61
-100
@@ -39,7 +39,8 @@
|
|||||||
namespace Logs {
|
namespace Logs {
|
||||||
enum DebugLevel {
|
enum DebugLevel {
|
||||||
General = 1, // 1 - Low-Level general debugging, useful info on single line
|
General = 1, // 1 - Low-Level general debugging, useful info on single line
|
||||||
Detail // 2 - Use this for very chatty logging you want to leave in but don't want on by default
|
Moderate, // 2 - Informational based, used in functions, when particular things load
|
||||||
|
Detail // 3 - Use this for extreme detail in logging, usually in extreme debugging in the stack or interprocess communication
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -53,7 +54,7 @@ namespace Logs {
|
|||||||
AI,
|
AI,
|
||||||
Aggro,
|
Aggro,
|
||||||
Attack,
|
Attack,
|
||||||
DeprecatedCS, // deprecated
|
DeprecatedCS,
|
||||||
Combat,
|
Combat,
|
||||||
Commands,
|
Commands,
|
||||||
Crash,
|
Crash,
|
||||||
@@ -64,36 +65,36 @@ namespace Logs {
|
|||||||
Inventory,
|
Inventory,
|
||||||
Launcher,
|
Launcher,
|
||||||
Netcode,
|
Netcode,
|
||||||
Normal, // deprecated
|
Normal,
|
||||||
Object,
|
Object,
|
||||||
Pathing,
|
Pathing,
|
||||||
QSServer, // deprecated
|
QSServer,
|
||||||
Quests,
|
Quests,
|
||||||
Rules,
|
Rules,
|
||||||
Skills,
|
Skills,
|
||||||
Spawns,
|
Spawns,
|
||||||
Spells,
|
Spells,
|
||||||
Status, // deprecated
|
Status,
|
||||||
TCPConnection, // deprecated
|
TCPConnection,
|
||||||
Tasks,
|
Tasks,
|
||||||
Tradeskills,
|
Tradeskills,
|
||||||
Trading,
|
Trading,
|
||||||
Tribute,
|
Tribute,
|
||||||
UCSServer, // deprecated
|
UCSServer,
|
||||||
WebInterfaceServer, // deprecated
|
WebInterfaceServer,
|
||||||
WorldServer, // deprecated
|
WorldServer,
|
||||||
ZoneServer, // deprecated
|
ZoneServer,
|
||||||
MySQLError,
|
MySQLError,
|
||||||
MySQLQuery,
|
MySQLQuery,
|
||||||
Mercenaries,
|
Mercenaries,
|
||||||
QuestDebug,
|
QuestDebug,
|
||||||
DeprecatedSC, // deprecated
|
DeprecatedSC,
|
||||||
DeprecatedCSU, // deprecated
|
DeprecatedCSU,
|
||||||
DeprecatedSCD, // deprecated
|
DeprecatedSCD,
|
||||||
DeprecatedCSD, // deprecated
|
DeprecatedCSD,
|
||||||
Loginserver, // deprecated
|
Loginserver,
|
||||||
ClientLogin,
|
ClientLogin,
|
||||||
HeadlessClient, // deprecated
|
HeadlessClient,
|
||||||
HPUpdate,
|
HPUpdate,
|
||||||
FixZ,
|
FixZ,
|
||||||
Food,
|
Food,
|
||||||
@@ -103,10 +104,10 @@ namespace Logs {
|
|||||||
MobAppearance,
|
MobAppearance,
|
||||||
Info,
|
Info,
|
||||||
Warning,
|
Warning,
|
||||||
Critical, // deprecated
|
Critical,
|
||||||
Emergency, // deprecated
|
Emergency,
|
||||||
Alert, // deprecated
|
Alert,
|
||||||
Notice, // deprecated
|
Notice,
|
||||||
AIScanClose,
|
AIScanClose,
|
||||||
AIYellForHelp,
|
AIYellForHelp,
|
||||||
AICastBeneficialClose,
|
AICastBeneficialClose,
|
||||||
@@ -136,22 +137,6 @@ namespace Logs {
|
|||||||
PacketServerToServer,
|
PacketServerToServer,
|
||||||
Bugs,
|
Bugs,
|
||||||
QuestErrors,
|
QuestErrors,
|
||||||
PlayerEvents,
|
|
||||||
DataBuckets,
|
|
||||||
Zoning,
|
|
||||||
EqTime,
|
|
||||||
Corpses,
|
|
||||||
XTargets,
|
|
||||||
EvolveItem,
|
|
||||||
PositionUpdate,
|
|
||||||
KSM,
|
|
||||||
BotSettings,
|
|
||||||
BotSpellChecks,
|
|
||||||
BotSpellTypeChecks,
|
|
||||||
NpcHandin,
|
|
||||||
ZoneState,
|
|
||||||
NetClient,
|
|
||||||
NetTCP,
|
|
||||||
MaxCategoryID /* Don't Remove this */
|
MaxCategoryID /* Don't Remove this */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -175,36 +160,36 @@ namespace Logs {
|
|||||||
"Inventory",
|
"Inventory",
|
||||||
"Launcher",
|
"Launcher",
|
||||||
"Netcode",
|
"Netcode",
|
||||||
"Normal (Deprecated)",
|
"Normal",
|
||||||
"Object",
|
"Object",
|
||||||
"Pathing",
|
"Pathing",
|
||||||
"QS Server (Deprecated)",
|
"QS Server",
|
||||||
"Quests",
|
"Quests",
|
||||||
"Rules",
|
"Rules",
|
||||||
"Skills",
|
"Skills",
|
||||||
"Spawns",
|
"Spawns",
|
||||||
"Spells",
|
"Spells",
|
||||||
"Status (Deprecated)",
|
"Status",
|
||||||
"TCP Connection (Deprecated)",
|
"TCP Connection",
|
||||||
"Tasks",
|
"Tasks",
|
||||||
"Tradeskills",
|
"Tradeskills",
|
||||||
"Trading",
|
"Trading",
|
||||||
"Tribute",
|
"Tribute",
|
||||||
"UCS Server (Deprecated)",
|
"UCS Server",
|
||||||
"Web Interface (Deprecated)",
|
"WebInterface Server",
|
||||||
"World Server (Deprecated)",
|
"World Server",
|
||||||
"Zone Server (Deprecated)",
|
"Zone Server",
|
||||||
"MySQL Error",
|
"MySQL Error",
|
||||||
"MySQL Query",
|
"MySQL Query",
|
||||||
"Mercenaries",
|
"Mercenaries",
|
||||||
"Quest Debug",
|
"Quest Debug",
|
||||||
"Legacy Packet Logging (Deprecated)",
|
"Deprecated",
|
||||||
"Legacy Packet Logging (Deprecated)",
|
"Deprecated",
|
||||||
"Legacy Packet Logging (Deprecated)",
|
"Deprecated",
|
||||||
"Legacy Packet Logging (Deprecated)",
|
"Deprecated",
|
||||||
"Login Server (Deprecated)",
|
"Login Server",
|
||||||
"Client Login",
|
"Client Login",
|
||||||
"Headless Client (Deprecated)",
|
"Headless Client",
|
||||||
"HP Update",
|
"HP Update",
|
||||||
"FixZ",
|
"FixZ",
|
||||||
"Food",
|
"Food",
|
||||||
@@ -214,13 +199,13 @@ namespace Logs {
|
|||||||
"Mob Appearance",
|
"Mob Appearance",
|
||||||
"Info",
|
"Info",
|
||||||
"Warning",
|
"Warning",
|
||||||
"Critical (Deprecated)",
|
"Critical",
|
||||||
"Emergency (Deprecated)",
|
"Emergency",
|
||||||
"Alert (Deprecated)",
|
"Alert",
|
||||||
"Notice (Deprecated)",
|
"Notice",
|
||||||
"AI Scan Close",
|
"AI Scan Close",
|
||||||
"AI Yell For Help",
|
"AI Yell For Help",
|
||||||
"AI CastBeneficial",
|
"AI Cast Beneficial Close",
|
||||||
"AOE Cast",
|
"AOE Cast",
|
||||||
"Entity Management",
|
"Entity Management",
|
||||||
"Flee",
|
"Flee",
|
||||||
@@ -237,32 +222,16 @@ namespace Logs {
|
|||||||
"DialogueWindow",
|
"DialogueWindow",
|
||||||
"HTTP",
|
"HTTP",
|
||||||
"Saylink",
|
"Saylink",
|
||||||
"Checksum Verification",
|
"ChecksumVerification",
|
||||||
"CombatRecord",
|
"CombatRecord",
|
||||||
"Hate",
|
"Hate",
|
||||||
"Discord",
|
"Discord",
|
||||||
"Faction",
|
"Faction",
|
||||||
"Packet S->C",
|
"Packet-S->C",
|
||||||
"Packet C->S",
|
"Packet-C->S",
|
||||||
"Packet S->S",
|
"Packet-S->S",
|
||||||
"Bugs",
|
"Bugs",
|
||||||
"QuestErrors",
|
"QuestErrors"
|
||||||
"PlayerEvents",
|
|
||||||
"DataBuckets",
|
|
||||||
"Zoning",
|
|
||||||
"EqTime",
|
|
||||||
"Corpses",
|
|
||||||
"XTargets",
|
|
||||||
"EvolveItem",
|
|
||||||
"PositionUpdate",
|
|
||||||
"KSM", // Kernel Samepage Merging
|
|
||||||
"Bot Settings",
|
|
||||||
"Bot Spell Checks",
|
|
||||||
"Bot Spell Type Checks",
|
|
||||||
"NpcHandin",
|
|
||||||
"ZoneState",
|
|
||||||
"Net Server <-> Client",
|
|
||||||
"Net TCP"
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,7 +252,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
void CloseFileLogs();
|
void CloseFileLogs();
|
||||||
EQEmuLogSys *LoadLogSettingsDefaults();
|
EQEmuLogSys *LoadLogSettingsDefaults();
|
||||||
EQEmuLogSys *LoadLogDatabaseSettings(bool silent_load = false);
|
EQEmuLogSys *LoadLogDatabaseSettings();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param directory_name
|
* @param directory_name
|
||||||
@@ -354,9 +323,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
LogSettings log_settings[Logs::LogCategory::MaxCategoryID]{};
|
LogSettings log_settings[Logs::LogCategory::MaxCategoryID]{};
|
||||||
|
|
||||||
// temporary bucket to re-load after silencing
|
|
||||||
LogSettings pre_silence_settings[Logs::LogCategory::MaxCategoryID]{};
|
|
||||||
|
|
||||||
struct LogEnabled {
|
struct LogEnabled {
|
||||||
bool log_to_file_enabled;
|
bool log_to_file_enabled;
|
||||||
bool log_to_console_enabled;
|
bool log_to_console_enabled;
|
||||||
@@ -379,7 +345,7 @@ public:
|
|||||||
// gmsay
|
// gmsay
|
||||||
uint16 GetGMSayColorFromCategory(uint16 log_category);
|
uint16 GetGMSayColorFromCategory(uint16 log_category);
|
||||||
|
|
||||||
EQEmuLogSys *SetGMSayHandler(const std::function<void(uint16 log_type, const char *func, const std::string &)>& f)
|
EQEmuLogSys *SetGMSayHandler(std::function<void(uint16 log_type, const std::string &)> f)
|
||||||
{
|
{
|
||||||
m_on_log_gmsay_hook = f;
|
m_on_log_gmsay_hook = f;
|
||||||
return this;
|
return this;
|
||||||
@@ -407,30 +373,25 @@ public:
|
|||||||
[[nodiscard]] const std::string &GetLogPath() const;
|
[[nodiscard]] const std::string &GetLogPath() const;
|
||||||
EQEmuLogSys * SetLogPath(const std::string &log_path);
|
EQEmuLogSys * SetLogPath(const std::string &log_path);
|
||||||
|
|
||||||
void DisableMySQLErrorLogs();
|
|
||||||
void EnableMySQLErrorLogs();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// reference to database
|
// reference to database
|
||||||
Database *m_database;
|
Database *m_database;
|
||||||
std::function<void(uint16 log_category, const char *func, const std::string &)> m_on_log_gmsay_hook;
|
std::function<void(uint16 log_category, const std::string &)> m_on_log_gmsay_hook;
|
||||||
std::function<void(uint16 log_category, int webhook_id, const std::string &)> m_on_log_discord_hook;
|
std::function<void(uint16 log_category, int webhook_id, const std::string &)> m_on_log_discord_hook;
|
||||||
std::function<void(uint16 log_category, const std::string &)> m_on_log_console_hook;
|
std::function<void(uint16 log_category, const std::string &)> m_on_log_console_hook;
|
||||||
DiscordWebhooks m_discord_webhooks[MAX_DISCORD_WEBHOOK_ID]{};
|
DiscordWebhooks m_discord_webhooks[MAX_DISCORD_WEBHOOK_ID]{};
|
||||||
bool m_file_logs_enabled = false;
|
bool m_file_logs_enabled = false;
|
||||||
int m_log_platform = 0;
|
int m_log_platform = 0;
|
||||||
std::string m_platform_file_name;
|
std::string m_platform_file_name;
|
||||||
std::string m_log_path;
|
std::string m_log_path;
|
||||||
|
|
||||||
void ProcessConsoleMessage(
|
std::string GetLinuxConsoleColorFromCategory(uint16 log_category);
|
||||||
uint16 log_category,
|
uint16 GetWindowsConsoleColorFromCategory(uint16 log_category);
|
||||||
const std::string &message,
|
|
||||||
const char *file,
|
void ProcessConsoleMessage(uint16 log_category, const std::string &message);
|
||||||
const char *func,
|
|
||||||
int line
|
|
||||||
);
|
|
||||||
void ProcessLogWrite(uint16 log_category, const std::string &message);
|
void ProcessLogWrite(uint16 log_category, const std::string &message);
|
||||||
|
bool IsRfc5424LogCategory(uint16 log_category);
|
||||||
void InjectTablesIfNotExist();
|
void InjectTablesIfNotExist();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+571
-160
@@ -21,6 +21,8 @@
|
|||||||
#ifndef EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
#ifndef EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
||||||
#define EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
#define EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
||||||
|
|
||||||
|
#ifdef BUILD_LOGGING
|
||||||
|
|
||||||
#define LogAA(message, ...) do {\
|
#define LogAA(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::AA))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::AA))\
|
||||||
OutF(LogSys, Logs::General, Logs::AA, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::AA, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -36,6 +38,11 @@
|
|||||||
OutF(LogSys, Logs::General, Logs::AI, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::AI, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIModerate(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Moderate, Logs::AI))\
|
||||||
|
OutF(LogSys, Logs::Moderate, Logs::AI, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogAIDetail(message, ...) do {\
|
#define LogAIDetail(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::AI))\
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::AI))\
|
||||||
OutF(LogSys, Logs::Detail, Logs::AI, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::AI, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -76,6 +83,11 @@
|
|||||||
OutF(LogSys, Logs::General, Logs::Combat, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Combat, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombatModerate(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Moderate, Logs::Combat))\
|
||||||
|
OutF(LogSys, Logs::Moderate, Logs::Combat, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogCombatDetail(message, ...) do {\
|
#define LogCombatDetail(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Combat))\
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Combat))\
|
||||||
OutF(LogSys, Logs::Detail, Logs::Combat, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Combat, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -131,16 +143,6 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::Error, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Error, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define LogEvolveItem(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::EvolveItem))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::EvolveItem, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogEvolveItemDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::EvolveItem))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::EvolveItem, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogGuilds(message, ...) do {\
|
#define LogGuilds(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Guilds))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Guilds))\
|
||||||
OutF(LogSys, Logs::General, Logs::Guilds, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Guilds, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -211,6 +213,16 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::Pathing, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Pathing, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQSServer(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::QSServer))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::QSServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQSServerDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::QSServer))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::QSServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogQuests(message, ...) do {\
|
#define LogQuests(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Quests))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Quests))\
|
||||||
OutF(LogSys, Logs::General, Logs::Quests, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Quests, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -256,11 +268,36 @@
|
|||||||
OutF(LogSys, Logs::General, Logs::Spells, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Spells, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpellsModerate(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Moderate, Logs::Spells))\
|
||||||
|
OutF(LogSys, Logs::Moderate, Logs::Spells, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogSpellsDetail(message, ...) do {\
|
#define LogSpellsDetail(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Spells))\
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Spells))\
|
||||||
OutF(LogSys, Logs::Detail, Logs::Spells, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Spells, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogStatus(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Status))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::Status, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogStatusDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Status))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::Status, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTCPConnection(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::TCPConnection))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::TCPConnection, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTCPConnectionDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::TCPConnection))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::TCPConnection, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogTasks(message, ...) do {\
|
#define LogTasks(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Tasks))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Tasks))\
|
||||||
OutF(LogSys, Logs::General, Logs::Tasks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Tasks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -301,6 +338,46 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::Tribute, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Tribute, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogUCSServer(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::UCSServer))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::UCSServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogUCSServerDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::UCSServer))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::UCSServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogWebInterfaceServer(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::WebInterfaceServer))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::WebInterfaceServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogWebInterfaceServerDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::WebInterfaceServer))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::WebInterfaceServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogWorldServer(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::WorldServer))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::WorldServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogWorldServerDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::WorldServer))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::WorldServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZoneServer(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::ZoneServer))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::ZoneServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZoneServerDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::ZoneServer))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::ZoneServer, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogMySQLError(message, ...) do {\
|
#define LogMySQLError(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::MySQLError))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::MySQLError))\
|
||||||
OutF(LogSys, Logs::General, Logs::MySQLError, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::MySQLError, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -372,6 +449,16 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::ClientLogin, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::ClientLogin, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHeadlessClient(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::HeadlessClient))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::HeadlessClient, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHeadlessClientDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::HeadlessClient))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::HeadlessClient, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogHPUpdate(message, ...) do {\
|
#define LogHPUpdate(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::HPUpdate))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::HPUpdate))\
|
||||||
OutF(LogSys, Logs::General, Logs::HPUpdate, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::HPUpdate, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -507,6 +594,11 @@
|
|||||||
OutF(LogSys, Logs::General, Logs::AIScanClose, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::AIScanClose, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIScanCloseModerate(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Moderate, Logs::AIScanClose))\
|
||||||
|
OutF(LogSys, Logs::Moderate, Logs::AIScanClose, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogAIScanCloseDetail(message, ...) do {\
|
#define LogAIScanCloseDetail(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::AIScanClose))\
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::AIScanClose))\
|
||||||
OutF(LogSys, Logs::Detail, Logs::AIScanClose, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::AIScanClose, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -754,6 +846,11 @@
|
|||||||
|
|
||||||
// manually created
|
// manually created
|
||||||
|
|
||||||
|
#define LogExpeditionsModerate(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Moderate, Logs::Expeditions))\
|
||||||
|
OutF(LogSys, Logs::Moderate, Logs::Expeditions, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define LogBugs(message, ...) do {\
|
#define LogBugs(message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Bugs))\
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Bugs))\
|
||||||
OutF(LogSys, Logs::General, Logs::Bugs, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::General, Logs::Bugs, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -774,156 +871,6 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::QuestErrors, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::QuestErrors, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define LogPlayerEvents(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::PlayerEvents))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::PlayerEvents, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogPlayerEventsDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::PlayerEvents))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::PlayerEvents, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogDataBuckets(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::DataBuckets))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogDataBucketsDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::DataBuckets))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::DataBuckets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogZoning(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Zoning))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogZoningDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Zoning))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogEqTime(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::EqTime))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogEqTimeDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::EqTime))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogCorpses(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::Corpses))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogCorpsesDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Corpses))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogXTargets(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::XTargets))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogXTargetsDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::XTargets))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogPositionUpdate(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::PositionUpdate))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::PositionUpdate, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogPositionUpdateDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::PositionUpdate))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::PositionUpdate, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogKSM(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::KSM))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::KSM, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogKSMDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::KSM))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::KSM, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSettings(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::BotSettings))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::BotSettings, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSettingsDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::BotSettings))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::BotSettings, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSpellChecks(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::BotSpellChecks))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::BotSpellChecks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSpellChecksDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::BotSpellChecks))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::BotSpellChecks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSpellTypeChecks(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::BotSpellTypeChecks))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::BotSpellTypeChecks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogBotSpellTypeChecksDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::BotSpellTypeChecks))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::BotSpellTypeChecks, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNpcHandin(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::NpcHandin))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::NpcHandin, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNpcHandinDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::NpcHandin))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::NpcHandin, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogZoneState(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::ZoneState))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::ZoneState, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogZoneStateDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::ZoneState))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::ZoneState, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNetClient(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::NetClient))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::NetClient, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNetClientDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::NetClient))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::NetClient, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNetTCP(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::General, Logs::NetTCP))\
|
|
||||||
OutF(LogSys, Logs::General, Logs::NetTCP, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define LogNetTCPDetail(message, ...) do {\
|
|
||||||
if (LogSys.IsLogEnabled(Logs::Detail, Logs::NetTCP))\
|
|
||||||
OutF(LogSys, Logs::Detail, Logs::NetTCP, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define Log(debug_level, log_category, message, ...) do {\
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
||||||
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
@@ -934,5 +881,469 @@
|
|||||||
OutF(LogSys, debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define LogEmergency(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAlert(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCritical(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogError(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogWarning(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNotice(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogInfo(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDebug(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Category
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LogAA(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAADetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAI(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIModerate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAggro(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAggroDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAttack(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAttackDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogPacketClientServer(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogPacketClientServerDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombat(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombatModerate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombatDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCommands(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCommandsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCrash(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCrashDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDoors(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDoorsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogGroup(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogGroupDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogGuilds(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogGuildsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogInventory(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogInventoryDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLauncher(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLauncherDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNetcode(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNetcodeDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNormal(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNormalDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogObject(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogObjectDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogPathing(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogPathingDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQSServer(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQSServerDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQuests(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQuestsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogRules(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogRulesDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSkills(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSkillsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpawns(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpawnsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpells(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpellsModerate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSpellsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTCPConnection(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTCPConnectionDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTasks(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTasksDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTradeskills(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTradeskillsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTrading(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTradingDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTribute(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTributeDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMySQLError(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMySQLErrorDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMySQLQuery(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMySQLQueryDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMercenaries(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMercenariesDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQuestDebug(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogQuestDebugDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLoginserver(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLoginserverDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogClientLogin(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogClientLoginDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHeadlessClient(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHeadlessClientDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHPUpdate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHPUpdateDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFixZ(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFixZDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFood(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFoodDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTraps(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogTrapsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNPCRoamBox(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNPCRoamBoxDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNPCScaling(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogNPCScalingDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMobAppearance(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMobAppearanceDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogStatus(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogStatusDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIScanClose(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIScanCloseModerate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIScanCloseDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIYellForHelp(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAIYellForHelpDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAICastBeneficialClose(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAICastBeneficialCloseDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAoeCast(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAoeCastDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEntityManagement(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEntityManagementDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFlee(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFleeDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAura(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogAuraDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHotReload(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHotReloadDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMerchants(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogMerchantsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZonePoints(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogZonePointsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogExpeditions(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogExpeditionsModerate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogExpeditionsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDynamicZones(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDynamicZonesDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCheatList(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCheatDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogClientList(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogClientListDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDiaWind(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogDiaWindDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHTTP(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHTTPDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSaylink(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSaylinkDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogScheduler(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogSchedulerDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCheat(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCheatDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLoot(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogLootDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFood(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFoodDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogChecksumVerification(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogChecksumVerificationDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombatRecord(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCombatRecordDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHate(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogHateDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFaction(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogFactionDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogBugs(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogBugsDetail(message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogF(debug_level, log_category, message, ...) do {\
|
||||||
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif //EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
#endif //EQEMU_EQEMU_LOGSYS_LOG_ALIASES_H
|
||||||
|
|||||||
+12
-52
@@ -46,16 +46,20 @@ EQTime::EQTime()
|
|||||||
timezone = 0;
|
timezone = 0;
|
||||||
memset(&eqTime, 0, sizeof(eqTime));
|
memset(&eqTime, 0, sizeof(eqTime));
|
||||||
//Defaults for time
|
//Defaults for time
|
||||||
TimeOfDay_Struct t{};
|
TimeOfDay_Struct start;
|
||||||
t.day = 1;
|
start.day = 1;
|
||||||
t.hour = 9;
|
start.hour = 9;
|
||||||
t.minute = 0;
|
start.minute = 0;
|
||||||
t.month = 1;
|
start.month = 1;
|
||||||
t.year = 3100;
|
start.year = 3100;
|
||||||
//Set default time zone
|
//Set default time zone
|
||||||
timezone = 0;
|
timezone = 0;
|
||||||
//Start EQTimer
|
//Start EQTimer
|
||||||
SetCurrentEQTimeOfDay(t, time(nullptr));
|
SetCurrentEQTimeOfDay(start, time(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
EQTime::~EQTime()
|
||||||
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
||||||
@@ -199,48 +203,4 @@ void EQTime::ToString(TimeOfDay_Struct *t, std::string &str) {
|
|||||||
t->month, t->day, t->year, t->hour, t->minute);
|
t->month, t->day, t->year, t->hour, t->minute);
|
||||||
buf[127] = '\0';
|
buf[127] = '\0';
|
||||||
str = buf;
|
str = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EQTime::IsDayTime() {
|
|
||||||
TimeOfDay_Struct tod{}; //Day time is 5am to 6:59pm (14 hours in-game)
|
|
||||||
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
|
||||||
|
|
||||||
if (tod.hour >= 5 || tod.hour < 19) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQTime::IsNightTime() {
|
|
||||||
TimeOfDay_Struct tod{}; //Night time is 7pm to 4:59am (10 hours in-game)
|
|
||||||
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
|
||||||
|
|
||||||
if (tod.hour >= 19 || tod.hour < 5) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EQTime::IsInbetweenTime(uint8 min_time, uint8 max_time) {
|
|
||||||
TimeOfDay_Struct tod{};
|
|
||||||
GetCurrentEQTimeOfDay(&tod);
|
|
||||||
|
|
||||||
if (min_time == 0 || max_time == 0 || min_time > 24 || max_time > 24) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (max_time < min_time) {
|
|
||||||
if ((tod.hour >= min_time && tod.hour > max_time) || (tod.hour < min_time && tod.hour <= max_time)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (tod.hour >= min_time && tod.hour <= max_time) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
+1
-4
@@ -18,7 +18,7 @@ public:
|
|||||||
//Constructor/destructor
|
//Constructor/destructor
|
||||||
EQTime(TimeOfDay_Struct start_eq, time_t start_real);
|
EQTime(TimeOfDay_Struct start_eq, time_t start_real);
|
||||||
EQTime();
|
EQTime();
|
||||||
~EQTime() = default;
|
~EQTime();
|
||||||
|
|
||||||
//Get functions
|
//Get functions
|
||||||
int GetCurrentEQTimeOfDay( TimeOfDay_Struct *eqTimeOfDay ) { return(GetCurrentEQTimeOfDay(time(nullptr), eqTimeOfDay)); }
|
int GetCurrentEQTimeOfDay( TimeOfDay_Struct *eqTimeOfDay ) { return(GetCurrentEQTimeOfDay(time(nullptr), eqTimeOfDay)); }
|
||||||
@@ -28,9 +28,6 @@ public:
|
|||||||
uint32 getEQTimeZone() { return timezone; }
|
uint32 getEQTimeZone() { return timezone; }
|
||||||
uint32 getEQTimeZoneHr() { return timezone/60; }
|
uint32 getEQTimeZoneHr() { return timezone/60; }
|
||||||
uint32 getEQTimeZoneMin() { return timezone%60; }
|
uint32 getEQTimeZoneMin() { return timezone%60; }
|
||||||
bool IsDayTime();
|
|
||||||
bool IsNightTime();
|
|
||||||
bool IsInbetweenTime(uint8 min_time, uint8 max_time);
|
|
||||||
|
|
||||||
//Set functions
|
//Set functions
|
||||||
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||||
|
MA 02111-1307, USA */
|
||||||
|
|
||||||
|
/* Error messages for mysql clients */
|
||||||
|
/* error messages for the demon is in share/language/errmsg.sys */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
void init_client_errs(void);
|
||||||
|
extern const char *client_errors[]; /* Error messages */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define CR_MIN_ERROR 2000 /* For easier client code */
|
||||||
|
#define CR_MAX_ERROR 2999
|
||||||
|
#if defined(OS2) && defined( MYSQL_SERVER)
|
||||||
|
#define CER(X) client_errors[(X)-CR_MIN_ERROR]
|
||||||
|
#else
|
||||||
|
#define ER(X) client_errors[(X)-CR_MIN_ERROR]
|
||||||
|
#endif
|
||||||
|
#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */
|
||||||
|
|
||||||
|
#define CR_UNKNOWN_ERROR 2000
|
||||||
|
#define CR_SOCKET_CREATE_ERROR 2001
|
||||||
|
#define CR_CONNECTION_ERROR 2002
|
||||||
|
#define CR_CONN_HOST_ERROR 2003
|
||||||
|
#define CR_IPSOCK_ERROR 2004
|
||||||
|
#define CR_UNKNOWN_HOST 2005
|
||||||
|
#define CR_SERVER_GONE_ERROR 2006
|
||||||
|
#define CR_VERSION_ERROR 2007
|
||||||
|
#define CR_OUT_OF_MEMORY 2008
|
||||||
|
#define CR_WRONG_HOST_INFO 2009
|
||||||
|
#define CR_LOCALHOST_CONNECTION 2010
|
||||||
|
#define CR_TCP_CONNECTION 2011
|
||||||
|
#define CR_SERVER_HANDSHAKE_ERR 2012
|
||||||
|
#define CR_SERVER_LOST 2013
|
||||||
|
#define CR_COMMANDS_OUT_OF_SYNC 2014
|
||||||
|
#define CR_NAMEDPIPE_CONNECTION 2015
|
||||||
|
#define CR_NAMEDPIPEWAIT_ERROR 2016
|
||||||
|
#define CR_NAMEDPIPEOPEN_ERROR 2017
|
||||||
|
#define CR_NAMEDPIPESETSTATE_ERROR 2018
|
||||||
|
#define CR_CANT_READ_CHARSET 2019
|
||||||
|
#define CR_NET_PACKET_TOO_LARGE 2020
|
||||||
@@ -38,7 +38,7 @@ namespace EQ
|
|||||||
_running = true;
|
_running = true;
|
||||||
|
|
||||||
for (size_t i = 0; i < threads; ++i) {
|
for (size_t i = 0; i < threads; ++i) {
|
||||||
_threads.emplace_back(std::thread(std::bind(&TaskScheduler::ProcessWork, this)));
|
_threads.push_back(std::thread(std::bind(&TaskScheduler::ProcessWork, this)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,214 +0,0 @@
|
|||||||
#ifndef EQEMU_PLAYER_EVENT_DISCORD_FORMATTER_H
|
|
||||||
#define EQEMU_PLAYER_EVENT_DISCORD_FORMATTER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include "player_events.h"
|
|
||||||
#include "../repositories/base/base_player_event_logs_repository.h"
|
|
||||||
#include <cereal/archives/json.hpp>
|
|
||||||
#include <cereal/types/vector.hpp>
|
|
||||||
|
|
||||||
struct DiscordField {
|
|
||||||
std::string name;
|
|
||||||
std::string value;
|
|
||||||
bool is_inline;
|
|
||||||
|
|
||||||
// cereal
|
|
||||||
template<class Archive>
|
|
||||||
void serialize(Archive &ar)
|
|
||||||
{
|
|
||||||
ar(
|
|
||||||
CEREAL_NVP(name),
|
|
||||||
CEREAL_NVP(value),
|
|
||||||
cereal::make_nvp("inline", is_inline)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DiscordAuthor {
|
|
||||||
std::string name;
|
|
||||||
std::string icon_url;
|
|
||||||
std::string url;
|
|
||||||
|
|
||||||
// cereal
|
|
||||||
template<class Archive>
|
|
||||||
void serialize(Archive &ar)
|
|
||||||
{
|
|
||||||
ar(
|
|
||||||
CEREAL_NVP(name),
|
|
||||||
CEREAL_NVP(icon_url),
|
|
||||||
CEREAL_NVP(url)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DiscordEmbed {
|
|
||||||
std::vector<DiscordField> fields;
|
|
||||||
std::string title;
|
|
||||||
std::string description;
|
|
||||||
std::string timestamp;
|
|
||||||
DiscordAuthor author;
|
|
||||||
|
|
||||||
|
|
||||||
// cereal
|
|
||||||
template<class Archive>
|
|
||||||
void serialize(Archive &ar)
|
|
||||||
{
|
|
||||||
ar(
|
|
||||||
CEREAL_NVP(fields),
|
|
||||||
CEREAL_NVP(title),
|
|
||||||
CEREAL_NVP(description),
|
|
||||||
CEREAL_NVP(timestamp),
|
|
||||||
CEREAL_NVP(author)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DiscordWebhook {
|
|
||||||
std::vector<DiscordEmbed> embeds;
|
|
||||||
std::string content;
|
|
||||||
std::string avatar_url;
|
|
||||||
|
|
||||||
// cereal
|
|
||||||
template<class Archive>
|
|
||||||
void serialize(Archive &ar)
|
|
||||||
{
|
|
||||||
ar(
|
|
||||||
CEREAL_NVP(embeds),
|
|
||||||
CEREAL_NVP(avatar_url),
|
|
||||||
CEREAL_NVP(content)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerEventDiscordFormatter {
|
|
||||||
public:
|
|
||||||
static std::string GetCurrentTimestamp();
|
|
||||||
static std::string FormatEventSay(const PlayerEvent::PlayerEventContainer &c, const PlayerEvent::SayEvent &e);
|
|
||||||
static std::string
|
|
||||||
FormatGMCommand(const PlayerEvent::PlayerEventContainer &c, const PlayerEvent::GMCommandEvent &e);
|
|
||||||
static void BuildDiscordField(
|
|
||||||
std::vector<DiscordField> *f,
|
|
||||||
const std::string &name,
|
|
||||||
const std::string &value,
|
|
||||||
bool is_inline = true
|
|
||||||
);
|
|
||||||
static void BuildBaseEmbed(
|
|
||||||
std::vector<DiscordEmbed> *e,
|
|
||||||
const std::vector<DiscordField> &f,
|
|
||||||
PlayerEvent::PlayerEventContainer c
|
|
||||||
);
|
|
||||||
static std::string FormatWithNodata(const PlayerEvent::PlayerEventContainer &c);
|
|
||||||
|
|
||||||
static std::string FormatAAGainedEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::AAGainedEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatAAPurchasedEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::AAPurchasedEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatDeathEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::DeathEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatFishSuccessEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::FishSuccessEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatForageSuccessEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::ForageSuccessEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatDestroyItemEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::DestroyItemEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatDiscoverItemEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::DiscoverItemEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatDroppedItemEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::DroppedItemEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatLevelGainedEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::LevelGainedEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatLevelLostEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::LevelLostEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatLootItemEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::LootItemEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatGroundSpawnPickupEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::GroundSpawnPickupEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatMerchantPurchaseEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::MerchantPurchaseEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatMerchantSellEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::MerchantSellEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatNPCHandinEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::HandinEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatSkillUpEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::SkillUpEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTaskAcceptEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TaskAcceptEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTaskCompleteEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TaskCompleteEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTaskUpdateEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TaskUpdateEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTradeEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TradeEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTraderPurchaseEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TraderPurchaseEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatTraderSellEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::TraderSellEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatResurrectAcceptEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::ResurrectAcceptEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatSplitMoneyEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::SplitMoneyEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatCombineEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::CombineEvent &e
|
|
||||||
);
|
|
||||||
static std::string FormatZoningEvent(
|
|
||||||
const PlayerEvent::PlayerEventContainer &c,
|
|
||||||
const PlayerEvent::ZoningEvent &e
|
|
||||||
);
|
|
||||||
static DiscordWebhook BuildDiscordWebhook(
|
|
||||||
const PlayerEvent::PlayerEventContainer &p,
|
|
||||||
std::vector<DiscordEmbed> &embeds
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#endif //EQEMU_PLAYER_EVENT_DISCORD_FORMATTER_H
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,132 +0,0 @@
|
|||||||
#ifndef EQEMU_PLAYER_EVENT_LOGS_H
|
|
||||||
#define EQEMU_PLAYER_EVENT_LOGS_H
|
|
||||||
|
|
||||||
#include <cereal/archives/json.hpp>
|
|
||||||
#include <mutex>
|
|
||||||
#include "../json/json_archive_single_line.h"
|
|
||||||
#include "../servertalk.h"
|
|
||||||
#include "../timer.h"
|
|
||||||
#include "../eqemu_config.h"
|
|
||||||
|
|
||||||
#include "../repositories/player_event_log_settings_repository.h"
|
|
||||||
#include "../repositories/player_event_logs_repository.h"
|
|
||||||
#include "../repositories/player_event_loot_items_repository.h"
|
|
||||||
#include "../repositories/player_event_merchant_purchase_repository.h"
|
|
||||||
#include "../repositories/player_event_merchant_sell_repository.h"
|
|
||||||
#include "../repositories/player_event_npc_handin_repository.h"
|
|
||||||
#include "../repositories/player_event_npc_handin_entries_repository.h"
|
|
||||||
#include "../repositories/player_event_trade_repository.h"
|
|
||||||
#include "../repositories/player_event_trade_entries_repository.h"
|
|
||||||
#include "../repositories/player_event_speech_repository.h"
|
|
||||||
#include "../repositories/player_event_killed_npc_repository.h"
|
|
||||||
#include "../repositories/player_event_killed_named_npc_repository.h"
|
|
||||||
#include "../repositories/player_event_killed_raid_npc_repository.h"
|
|
||||||
#include "../repositories/player_event_aa_purchase_repository.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PlayerEventLogs {
|
|
||||||
public:
|
|
||||||
Database player_event_database{};
|
|
||||||
|
|
||||||
void Init();
|
|
||||||
bool LoadDatabaseConnection();
|
|
||||||
void ReloadSettings();
|
|
||||||
void LoadEtlIds();
|
|
||||||
PlayerEventLogs *SetDatabase(Database *db);
|
|
||||||
bool ValidateDatabaseConnection();
|
|
||||||
bool IsEventEnabled(PlayerEvent::EventType event);
|
|
||||||
|
|
||||||
void Process();
|
|
||||||
|
|
||||||
// batch queue
|
|
||||||
void AddToQueue(PlayerEventLogsRepository::PlayerEventLogs &logs);
|
|
||||||
|
|
||||||
// main event record generic function
|
|
||||||
// can ingest any struct event types
|
|
||||||
template<typename T>
|
|
||||||
std::unique_ptr<ServerPacket> RecordEvent(
|
|
||||||
PlayerEvent::EventType t,
|
|
||||||
const PlayerEvent::PlayerEvent &p,
|
|
||||||
T e
|
|
||||||
)
|
|
||||||
{
|
|
||||||
auto n = PlayerEventLogsRepository::NewEntity();
|
|
||||||
FillPlayerEvent(p, n);
|
|
||||||
n.event_type_id = t;
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
{
|
|
||||||
cereal::JSONOutputArchiveSingleLine ar(ss);
|
|
||||||
e.serialize(ar);
|
|
||||||
}
|
|
||||||
|
|
||||||
n.event_type_name = PlayerEvent::EventName[t];
|
|
||||||
n.event_data = Strings::Contains(ss.str(), "noop") ? "{}" : ss.str();
|
|
||||||
n.created_at = std::time(nullptr);
|
|
||||||
|
|
||||||
auto c = PlayerEvent::PlayerEventContainer{
|
|
||||||
.player_event = p,
|
|
||||||
.player_event_log = n
|
|
||||||
};
|
|
||||||
|
|
||||||
return BuildPlayerEventPacket(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] const PlayerEventLogSettingsRepository::PlayerEventLogSettings *GetSettings() const;
|
|
||||||
bool IsEventDiscordEnabled(int32_t event_type_id);
|
|
||||||
std::string GetDiscordWebhookUrlFromEventType(int32_t event_type_id);
|
|
||||||
|
|
||||||
static std::string GetDiscordPayloadFromEvent(const PlayerEvent::PlayerEventContainer &e);
|
|
||||||
|
|
||||||
struct EtlQueues {
|
|
||||||
std::vector<PlayerEventLootItemsRepository::PlayerEventLootItems> loot_items;
|
|
||||||
std::vector<PlayerEventMerchantPurchaseRepository::PlayerEventMerchantPurchase> merchant_purchase;
|
|
||||||
std::vector<PlayerEventMerchantSellRepository::PlayerEventMerchantSell> merchant_sell;
|
|
||||||
std::vector<PlayerEventNpcHandinRepository::PlayerEventNpcHandin> npc_handin;
|
|
||||||
std::vector<PlayerEventNpcHandinEntriesRepository::PlayerEventNpcHandinEntries> npc_handin_entries;
|
|
||||||
std::vector<PlayerEventTradeRepository::PlayerEventTrade> trade;
|
|
||||||
std::vector<PlayerEventTradeEntriesRepository::PlayerEventTradeEntries> trade_entries;
|
|
||||||
std::vector<PlayerEventSpeechRepository::PlayerEventSpeech> speech;
|
|
||||||
std::vector<PlayerEventKilledNpcRepository::PlayerEventKilledNpc> killed_npc;
|
|
||||||
std::vector<PlayerEventKilledNamedNpcRepository::PlayerEventKilledNamedNpc> killed_named_npc;
|
|
||||||
std::vector<PlayerEventKilledRaidNpcRepository::PlayerEventKilledRaidNpc> killed_raid_npc;
|
|
||||||
std::vector<PlayerEventAaPurchaseRepository::PlayerEventAaPurchase> aa_purchase;
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct EtlSettings {
|
|
||||||
bool enabled;
|
|
||||||
std::string table_name;
|
|
||||||
int64 next_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
Database *m_database; // reference to database
|
|
||||||
PlayerEventLogSettingsRepository::PlayerEventLogSettings m_settings[PlayerEvent::EventType::MAX]{};
|
|
||||||
|
|
||||||
// batch queue is used to record events in batch
|
|
||||||
std::vector<PlayerEventLogsRepository::PlayerEventLogs> m_record_batch_queue{};
|
|
||||||
static void FillPlayerEvent(const PlayerEvent::PlayerEvent &p, PlayerEventLogsRepository::PlayerEventLogs &n);
|
|
||||||
static std::unique_ptr<ServerPacket>
|
|
||||||
BuildPlayerEventPacket(const PlayerEvent::PlayerEventContainer &e);
|
|
||||||
|
|
||||||
std::map<PlayerEvent::EventType, EtlSettings> m_etl_settings{};
|
|
||||||
|
|
||||||
// timers
|
|
||||||
Timer m_database_ping_timer; // database ping timer
|
|
||||||
Timer m_process_batch_events_timer; // events processing timer
|
|
||||||
Timer m_process_retention_truncation_timer; // timer for truncating events based on retention settings
|
|
||||||
|
|
||||||
// processing
|
|
||||||
std::mutex m_batch_queue_lock{};
|
|
||||||
void ProcessBatchQueue();
|
|
||||||
void ProcessRetentionTruncation();
|
|
||||||
void SetSettingsDefaults();
|
|
||||||
|
|
||||||
public:
|
|
||||||
std::map<PlayerEvent::EventType, EtlSettings> &GetEtlSettings() { return m_etl_settings;}
|
|
||||||
};
|
|
||||||
|
|
||||||
extern PlayerEventLogs player_event_logs;
|
|
||||||
|
|
||||||
#endif //EQEMU_PLAYER_EVENT_LOGS_H
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,326 +0,0 @@
|
|||||||
#include "evolving_items.h"
|
|
||||||
#include "item_instance.h"
|
|
||||||
#include "events/player_event_logs.h"
|
|
||||||
#include "repositories/character_evolving_items_repository.h"
|
|
||||||
|
|
||||||
EvolvingItemsManager::EvolvingItemsManager()
|
|
||||||
{
|
|
||||||
m_db = nullptr;
|
|
||||||
m_content_db = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvolvingItemsManager::LoadEvolvingItems() const
|
|
||||||
{
|
|
||||||
auto const &results = ItemsEvolvingDetailsRepository::All(*m_content_db);
|
|
||||||
|
|
||||||
if (results.empty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ranges::transform(
|
|
||||||
results.begin(),
|
|
||||||
results.end(),
|
|
||||||
std::inserter(
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache(),
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().end()
|
|
||||||
),
|
|
||||||
[](const ItemsEvolvingDetailsRepository::ItemsEvolvingDetails &x) {
|
|
||||||
return std::make_pair(x.item_id, x);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvolvingItemsManager::SetDatabase(Database *db)
|
|
||||||
{
|
|
||||||
m_db = db;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvolvingItemsManager::SetContentDatabase(Database *db)
|
|
||||||
{
|
|
||||||
m_content_db = db;
|
|
||||||
}
|
|
||||||
|
|
||||||
double EvolvingItemsManager::CalculateProgression(const uint64 current_amount, const uint32 item_id)
|
|
||||||
{
|
|
||||||
if (!evolving_items_manager.GetEvolvingItemsCache().contains(item_id)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return evolving_items_manager.GetEvolvingItemsCache().at(item_id).required_amount > 0
|
|
||||||
? static_cast<double>(current_amount)
|
|
||||||
/ static_cast<double>(evolving_items_manager.GetEvolvingItemsCache().at(item_id).required_amount) * 100
|
|
||||||
: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvolvingItemsManager::DoLootChecks(const uint32 char_id, const uint16 slot_id, const EQ::ItemInstance &inst) const
|
|
||||||
{
|
|
||||||
if (!inst) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
inst.SetEvolveEquipped(false);
|
|
||||||
if (inst.IsEvolving() && slot_id <= EQ::invslot::EQUIPMENT_END && slot_id >= EQ::invslot::EQUIPMENT_BEGIN) {
|
|
||||||
inst.SetEvolveEquipped(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!inst.IsEvolving()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!inst.GetEvolveUniqueID()) {
|
|
||||||
auto e = CharacterEvolvingItemsRepository::NewEntity();
|
|
||||||
|
|
||||||
e.character_id = char_id;
|
|
||||||
e.item_id = inst.GetID();
|
|
||||||
e.equipped = inst.GetEvolveEquipped();
|
|
||||||
e.final_item_id = evolving_items_manager.GetFinalItemID(inst);
|
|
||||||
|
|
||||||
auto r = CharacterEvolvingItemsRepository::InsertOne(*m_db, e);
|
|
||||||
e.id = r.id;
|
|
||||||
|
|
||||||
inst.SetEvolveUniqueID(e.id);
|
|
||||||
inst.SetEvolveCharID(e.character_id);
|
|
||||||
inst.SetEvolveItemID(e.item_id);
|
|
||||||
inst.SetEvolveFinalItemID(e.final_item_id);
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
CharacterEvolvingItemsRepository::SetEquipped(*m_db, inst.GetEvolveUniqueID(), inst.GetEvolveEquipped());
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EvolvingItemsManager::GetFinalItemID(const EQ::ItemInstance &inst) const
|
|
||||||
{
|
|
||||||
if (!inst) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto start_iterator = std::ranges::find_if(
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().cbegin(),
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().cend(),
|
|
||||||
[&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) {
|
|
||||||
return a.second.item_evo_id == inst.GetEvolveLoreID();
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (start_iterator == std::end(evolving_items_manager.GetEvolvingItemsCache())) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto final_id = std::ranges::max_element(
|
|
||||||
start_iterator,
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().cend(),
|
|
||||||
[&](
|
|
||||||
const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a,
|
|
||||||
const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &b
|
|
||||||
) {
|
|
||||||
return a.second.item_evo_id == b.second.item_evo_id &&
|
|
||||||
a.second.item_evolve_level < b.second.item_evolve_level;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return final_id->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EvolvingItemsManager::GetNextEvolveItemID(const EQ::ItemInstance &inst) const
|
|
||||||
{
|
|
||||||
if (!inst) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8 const current_level = inst.GetEvolveLvl();
|
|
||||||
|
|
||||||
const auto iterator = std::ranges::find_if(
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().cbegin(),
|
|
||||||
evolving_items_manager.GetEvolvingItemsCache().cend(),
|
|
||||||
[&](const std::pair<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> &a) {
|
|
||||||
return a.second.item_evo_id == inst.GetEvolveLoreID() &&
|
|
||||||
a.second.item_evolve_level == current_level + 1;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (iterator == std::end(evolving_items_manager.GetEvolvingItemsCache())) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return iterator->first;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemsEvolvingDetailsRepository::ItemsEvolvingDetails EvolvingItemsManager::GetEvolveItemDetails(const uint64 unique_id)
|
|
||||||
{
|
|
||||||
if (GetEvolvingItemsCache().contains(unique_id)) {
|
|
||||||
return GetEvolvingItemsCache().at(unique_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ItemsEvolvingDetailsRepository::NewEntity();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> EvolvingItemsManager::GetEvolveIDItems(
|
|
||||||
const uint32 evolve_id
|
|
||||||
)
|
|
||||||
{
|
|
||||||
std::vector<ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> e{};
|
|
||||||
|
|
||||||
for (auto const &[key, value]: GetEvolvingItemsCache()) {
|
|
||||||
if (value.item_evo_id == evolve_id) {
|
|
||||||
e.push_back(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::ranges::sort(
|
|
||||||
e.begin(),
|
|
||||||
e.end(),
|
|
||||||
[&](
|
|
||||||
ItemsEvolvingDetailsRepository::ItemsEvolvingDetails const &a,
|
|
||||||
ItemsEvolvingDetailsRepository::ItemsEvolvingDetails const &b
|
|
||||||
) {
|
|
||||||
return a.item_evolve_level < b.item_evolve_level;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 EvolvingItemsManager::GetTotalEarnedXP(const EQ::ItemInstance &inst)
|
|
||||||
{
|
|
||||||
if (!inst) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64 xp = inst.GetEvolveCurrentAmount();
|
|
||||||
auto evolve_id_item_cache = GetEvolveIDItems(inst.GetEvolveLoreID());
|
|
||||||
auto current_level = inst.GetEvolveLvl();
|
|
||||||
|
|
||||||
for (auto const &i: evolve_id_item_cache) {
|
|
||||||
if (i.item_evolve_level < current_level) {
|
|
||||||
xp += i.required_amount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return xp;
|
|
||||||
}
|
|
||||||
|
|
||||||
EvolveGetNextItem EvolvingItemsManager::GetNextItemByXP(const EQ::ItemInstance &inst_in, const int64 in_xp)
|
|
||||||
{
|
|
||||||
EvolveGetNextItem ets{};
|
|
||||||
if (!inst_in) {
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto evolve_items = GetEvolveIDItems(inst_in.GetEvolveLoreID());
|
|
||||||
uint32 max_transfer_level = 0;
|
|
||||||
int64 xp = in_xp;
|
|
||||||
|
|
||||||
for (auto const &e: evolve_items) {
|
|
||||||
if (e.item_evolve_level < inst_in.GetEvolveLvl()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64 have = 0;
|
|
||||||
if (e.item_evolve_level == inst_in.GetEvolveLvl()) {
|
|
||||||
have = inst_in.GetEvolveCurrentAmount();
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto required = e.required_amount;
|
|
||||||
const int64 need = required - have;
|
|
||||||
const int64 balance = xp - need;
|
|
||||||
|
|
||||||
if (balance <= 0) {
|
|
||||||
ets.new_current_amount = have + xp;
|
|
||||||
ets.new_item_id = e.item_id;
|
|
||||||
ets.from_current_amount = 0;
|
|
||||||
ets.max_transfer_level = max_transfer_level;
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
xp = balance;
|
|
||||||
max_transfer_level += 1;
|
|
||||||
|
|
||||||
ets.new_current_amount = required;
|
|
||||||
ets.new_item_id = e.item_id;
|
|
||||||
ets.from_current_amount = balance - required;
|
|
||||||
ets.max_transfer_level = max_transfer_level;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
EvolveTransfer EvolvingItemsManager::DetermineTransferResults(
|
|
||||||
const EQ::ItemInstance &inst_from,
|
|
||||||
const EQ::ItemInstance &inst_to
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EvolveTransfer ets{};
|
|
||||||
if (!inst_from || !inst_to) {
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto evolving_details_inst_from = evolving_items_manager.GetEvolveItemDetails(inst_from.GetID());
|
|
||||||
auto evolving_details_inst_to = evolving_items_manager.GetEvolveItemDetails(inst_to.GetID());
|
|
||||||
|
|
||||||
if (!evolving_details_inst_from.id || !evolving_details_inst_to.id) {
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (evolving_details_inst_from.type == evolving_details_inst_to.type) {
|
|
||||||
uint32 compatibility = 0;
|
|
||||||
uint64 xp = 0;
|
|
||||||
if (evolving_details_inst_from.sub_type == evolving_details_inst_to.sub_type) {
|
|
||||||
compatibility = 100;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
compatibility = 30;
|
|
||||||
}
|
|
||||||
|
|
||||||
xp = evolving_items_manager.GetTotalEarnedXP(inst_from) * compatibility / 100;
|
|
||||||
auto results = evolving_items_manager.GetNextItemByXP(inst_to, xp);
|
|
||||||
|
|
||||||
ets.item_from_id = evolving_items_manager.GetFirstItemInLoreGroup(inst_from.GetEvolveLoreID());
|
|
||||||
ets.item_from_current_amount = results.from_current_amount;
|
|
||||||
ets.item_to_id = results.new_item_id;
|
|
||||||
ets.item_to_current_amount = results.new_current_amount;
|
|
||||||
ets.compatibility = compatibility;
|
|
||||||
ets.max_transfer_level = results.max_transfer_level;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ets;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EvolvingItemsManager::GetFirstItemInLoreGroup(const uint32 lore_id)
|
|
||||||
{
|
|
||||||
for (auto const &[key, value]: GetEvolvingItemsCache()) {
|
|
||||||
if (value.item_evo_id == lore_id && value.item_evolve_level == 1) {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 EvolvingItemsManager::GetFirstItemInLoreGroupByItemID(const uint32 item_id)
|
|
||||||
{
|
|
||||||
for (auto const &[key, value]: GetEvolvingItemsCache()) {
|
|
||||||
if (value.item_id == item_id) {
|
|
||||||
for (auto const &[key2, value2]: GetEvolvingItemsCache()) {
|
|
||||||
if (value2.item_evo_id == value.item_evo_id && value2.item_evolve_level == 1) {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void EvolvingItemsManager::LoadPlayerEvent(const EQ::ItemInstance &inst, PlayerEvent::EvolveItem &e)
|
|
||||||
{
|
|
||||||
if (!inst) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
e.item_id = inst.GetID();
|
|
||||||
e.item_name = inst.GetItem() ? inst.GetItem()->Name : std::string();
|
|
||||||
e.level = inst.GetEvolveLvl();
|
|
||||||
e.progression = inst.GetEvolveProgression();
|
|
||||||
e.unique_id = inst.GetEvolveUniqueID();
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
#ifndef EVOLVING_H
|
|
||||||
#define EVOLVING_H
|
|
||||||
|
|
||||||
#include "shareddb.h"
|
|
||||||
#include "events/player_events.h"
|
|
||||||
#include "repositories/items_evolving_details_repository.h"
|
|
||||||
|
|
||||||
namespace EQ {
|
|
||||||
class ItemInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace EvolvingItems {
|
|
||||||
namespace Actions {
|
|
||||||
constexpr int8 UPDATE_ITEMS = 0;
|
|
||||||
constexpr int8 TRANSFER_WINDOW_OPEN = 1;
|
|
||||||
constexpr int8 TRANSFER_WINDOW_DETAILS = 2;
|
|
||||||
constexpr int8 TRANSFER_XP = 3;
|
|
||||||
constexpr int8 FINAL_RESULT = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Types {
|
|
||||||
constexpr int8 AMOUNT_OF_EXP = 1;
|
|
||||||
constexpr int8 NUMBER_OF_KILLS = 2;
|
|
||||||
constexpr int8 SPECIFIC_MOB_RACE = 3;
|
|
||||||
constexpr int8 SPECIFIC_ZONE_ID = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace SubTypes {
|
|
||||||
constexpr int8 ALL_EXP = 0;
|
|
||||||
constexpr int8 SOLO_EXP = 1;
|
|
||||||
constexpr int8 GROUP_EXP = 2;
|
|
||||||
constexpr int8 RAID_EXP = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class EvolvingItemsManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
EvolvingItemsManager();
|
|
||||||
void SetDatabase(Database *db);
|
|
||||||
void SetContentDatabase(Database *db);
|
|
||||||
|
|
||||||
void LoadEvolvingItems() const;
|
|
||||||
void DoLootChecks(uint32 char_id, uint16 slot_id, const EQ::ItemInstance &inst) const;
|
|
||||||
uint32 GetFinalItemID(const EQ::ItemInstance &inst) const;
|
|
||||||
uint32 GetNextEvolveItemID(const EQ::ItemInstance &inst) const;
|
|
||||||
uint32 GetFirstItemInLoreGroup(uint32 lore_id);
|
|
||||||
uint32 GetFirstItemInLoreGroupByItemID(uint32 item_id);
|
|
||||||
uint64 GetTotalEarnedXP(const EQ::ItemInstance &inst);
|
|
||||||
static double CalculateProgression(uint64 current_amount, uint32 item_id);
|
|
||||||
static void LoadPlayerEvent(const EQ::ItemInstance &inst, PlayerEvent::EvolveItem &e);
|
|
||||||
|
|
||||||
ItemsEvolvingDetailsRepository::ItemsEvolvingDetails GetEvolveItemDetails(uint64 id);
|
|
||||||
EvolveTransfer DetermineTransferResults(const EQ::ItemInstance& inst_from, const EQ::ItemInstance& inst_to);
|
|
||||||
EvolveGetNextItem GetNextItemByXP(const EQ::ItemInstance &inst_in, int64 in_xp);
|
|
||||||
std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails>& GetEvolvingItemsCache() { return m_evolving_items_cache; }
|
|
||||||
std::vector<ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> GetEvolveIDItems(uint32 evolve_id);
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::map<uint32, ItemsEvolvingDetailsRepository::ItemsEvolvingDetails> m_evolving_items_cache;
|
|
||||||
Database * m_db;
|
|
||||||
Database * m_content_db;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern EvolvingItemsManager evolving_items_manager;
|
|
||||||
|
|
||||||
#endif //EVOLVING_H
|
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
/**
|
||||||
|
* EQEmulator: Everquest Server Emulator
|
||||||
|
* Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
* are required to give you total support for your newly bought product;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "expedition_lockout_timer.h"
|
||||||
|
#include "../common/strings.h"
|
||||||
|
#include "../common/rulesys.h"
|
||||||
|
#include "../common/util/uuid.h"
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
const char* const DZ_REPLAY_TIMER_NAME = "Replay Timer"; // see December 14, 2016 patch notes
|
||||||
|
|
||||||
|
ExpeditionLockoutTimer::ExpeditionLockoutTimer(
|
||||||
|
std::string expedition_uuid, std::string expedition_name,
|
||||||
|
std::string event_name, uint64_t expire_time, uint32_t duration
|
||||||
|
) :
|
||||||
|
m_expedition_uuid{std::move(expedition_uuid)},
|
||||||
|
m_expedition_name{std::move(expedition_name)},
|
||||||
|
m_event_name{std::move(event_name)},
|
||||||
|
m_expire_time(std::chrono::system_clock::from_time_t(expire_time)),
|
||||||
|
m_duration(duration)
|
||||||
|
{
|
||||||
|
if (m_event_name == DZ_REPLAY_TIMER_NAME)
|
||||||
|
{
|
||||||
|
m_is_replay_timer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpeditionLockoutTimer ExpeditionLockoutTimer::CreateLockout(
|
||||||
|
const std::string& expedition_name, const std::string& event_name, uint32_t seconds, std::string uuid)
|
||||||
|
{
|
||||||
|
seconds = static_cast<uint32_t>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
||||||
|
|
||||||
|
if (uuid.empty())
|
||||||
|
{
|
||||||
|
uuid = EQ::Util::UUID::Generate().ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpeditionLockoutTimer lockout{uuid, expedition_name, event_name, 0, seconds};
|
||||||
|
lockout.Reset(); // sets expire time
|
||||||
|
return lockout;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t ExpeditionLockoutTimer::GetSecondsRemaining() const
|
||||||
|
{
|
||||||
|
auto now = std::chrono::system_clock::now();
|
||||||
|
if (m_expire_time > now)
|
||||||
|
{
|
||||||
|
auto remaining = m_expire_time - now;
|
||||||
|
return static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::seconds>(remaining).count());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpeditionLockoutTimer::DaysHoursMinutes ExpeditionLockoutTimer::GetDaysHoursMinutesRemaining() const
|
||||||
|
{
|
||||||
|
auto seconds = GetSecondsRemaining();
|
||||||
|
return ExpeditionLockoutTimer::DaysHoursMinutes{
|
||||||
|
fmt::format_int(seconds / 86400).str(), // days
|
||||||
|
fmt::format_int((seconds / 3600) % 24).str(), // hours
|
||||||
|
fmt::format_int((seconds / 60) % 60).str() // minutes
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpeditionLockoutTimer::IsSameLockout(const ExpeditionLockoutTimer& compare_lockout) const
|
||||||
|
{
|
||||||
|
return compare_lockout.IsSameLockout(GetExpeditionName(), GetEventName());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ExpeditionLockoutTimer::IsSameLockout(
|
||||||
|
const std::string& expedition_name, const std::string& event_name) const
|
||||||
|
{
|
||||||
|
return GetExpeditionName() == expedition_name && GetEventName() == event_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExpeditionLockoutTimer::AddLockoutTime(int seconds)
|
||||||
|
{
|
||||||
|
seconds = static_cast<uint32_t>(seconds * RuleR(Expedition, LockoutDurationMultiplier));
|
||||||
|
|
||||||
|
auto new_duration = std::max(0, static_cast<int>(m_duration.count()) + seconds);
|
||||||
|
|
||||||
|
auto start_time = m_expire_time - m_duration;
|
||||||
|
m_duration = std::chrono::seconds(new_duration);
|
||||||
|
m_expire_time = start_time + m_duration;
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
/**
|
||||||
|
* EQEmulator: Everquest Server Emulator
|
||||||
|
* Copyright (C) 2001-2020 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
* are required to give you total support for your newly bought product;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef EXPEDITION_LOCKOUT_TIMER_H
|
||||||
|
#define EXPEDITION_LOCKOUT_TIMER_H
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
extern const char* const DZ_REPLAY_TIMER_NAME;
|
||||||
|
|
||||||
|
class ExpeditionLockoutTimer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ExpeditionLockoutTimer() = default;
|
||||||
|
ExpeditionLockoutTimer(
|
||||||
|
std::string expedition_uuid, std::string expedition_name,
|
||||||
|
std::string event_name, uint64_t expire_time, uint32_t duration);
|
||||||
|
|
||||||
|
static ExpeditionLockoutTimer CreateLockout(
|
||||||
|
const std::string& expedition_name, const std::string& event_name,
|
||||||
|
uint32_t seconds, std::string uuid = {});
|
||||||
|
|
||||||
|
struct DaysHoursMinutes
|
||||||
|
{
|
||||||
|
std::string days;
|
||||||
|
std::string hours;
|
||||||
|
std::string mins;
|
||||||
|
};
|
||||||
|
|
||||||
|
void AddLockoutTime(int seconds);
|
||||||
|
uint32_t GetDuration() const { return static_cast<uint32_t>(m_duration.count()); }
|
||||||
|
uint64_t GetExpireTime() const { return std::chrono::system_clock::to_time_t(m_expire_time); }
|
||||||
|
uint64_t GetStartTime() const { return std::chrono::system_clock::to_time_t(m_expire_time - m_duration); }
|
||||||
|
uint32_t GetSecondsRemaining() const;
|
||||||
|
DaysHoursMinutes GetDaysHoursMinutesRemaining() const;
|
||||||
|
const std::string& GetExpeditionName() const { return m_expedition_name; }
|
||||||
|
const std::string& GetExpeditionUUID() const { return m_expedition_uuid; }
|
||||||
|
const std::string& GetEventName() const { return m_event_name; }
|
||||||
|
bool IsExpired() const { return GetSecondsRemaining() == 0; }
|
||||||
|
bool IsFromExpedition(const std::string& uuid) const { return uuid == m_expedition_uuid; }
|
||||||
|
bool IsReplayTimer() const { return m_is_replay_timer; }
|
||||||
|
bool IsSameLockout(const ExpeditionLockoutTimer& compare_lockout) const;
|
||||||
|
bool IsSameLockout(const std::string& expedition_name, const std::string& event_name) const;
|
||||||
|
void Reset() { m_expire_time = std::chrono::system_clock::now() + m_duration; }
|
||||||
|
void SetDuration(uint32_t seconds) { m_duration = std::chrono::seconds(seconds); }
|
||||||
|
void SetExpireTime(uint64_t expire_time) { m_expire_time = std::chrono::system_clock::from_time_t(expire_time); }
|
||||||
|
void SetUUID(const std::string& uuid) { m_expedition_uuid = uuid; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_is_replay_timer = false;
|
||||||
|
std::string m_expedition_uuid; // expedition received in
|
||||||
|
std::string m_expedition_name;
|
||||||
|
std::string m_event_name;
|
||||||
|
std::chrono::seconds m_duration;
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> m_expire_time;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
+2
-2
@@ -96,12 +96,12 @@ bool IsOfEqualRace(int r1, int r2)
|
|||||||
// TODO: add more values
|
// TODO: add more values
|
||||||
switch (r1) {
|
switch (r1) {
|
||||||
case DARK_ELF:
|
case DARK_ELF:
|
||||||
if (r2 == Race::NeriakCitizen) {
|
if (r2 == RACE_NERIAK_CITIZEN_77) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BARBARIAN:
|
case BARBARIAN:
|
||||||
if (r2 == Race::HalasCitizen) {
|
if (r2 == RACE_HALAS_CITIZEN_90) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-8
@@ -24,15 +24,17 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
enum FACTION_VALUE {
|
enum FACTION_VALUE {
|
||||||
FACTION_ALLY = 1,
|
FACTION_ALLY = 1,
|
||||||
FACTION_WARMLY = 2,
|
FACTION_WARMLY = 2,
|
||||||
FACTION_KINDLY = 3,
|
FACTION_KINDLY = 3,
|
||||||
FACTION_AMIABLY = 4,
|
FACTION_AMIABLY = 4,
|
||||||
FACTION_INDIFFERENTLY = 5,
|
|
||||||
|
FACTION_INDIFFERENTLY = 5,
|
||||||
|
|
||||||
FACTION_APPREHENSIVELY = 6,
|
FACTION_APPREHENSIVELY = 6,
|
||||||
FACTION_DUBIOUSLY = 7,
|
FACTION_DUBIOUSLY = 7,
|
||||||
FACTION_THREATENINGLY = 8,
|
FACTION_THREATENINGLY = 8,
|
||||||
FACTION_SCOWLS = 9
|
FACTION_SCOWLS = 9
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NPCFactionList {
|
struct NPCFactionList {
|
||||||
@@ -73,6 +75,23 @@ struct NPCFaction
|
|||||||
uint8 temp;
|
uint8 temp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Faction Associations give a much more live like faction system
|
||||||
|
// Basically the primary faction and magnitude of a faction hit will generate the rest of them
|
||||||
|
|
||||||
|
// Largest faction I could find quickly was Lord Inquisitor Seru with 9 total hits (8 associations) so 8 + 2 for max for now
|
||||||
|
#define MAX_FACTION_ASSOC 10
|
||||||
|
|
||||||
|
// this is the ID of a faction association and it's multiplier
|
||||||
|
struct FactionAssociationHit {
|
||||||
|
int id;
|
||||||
|
float multiplier;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FactionAssociations {
|
||||||
|
// maybe there should be more data here, fine for now
|
||||||
|
FactionAssociationHit hits[MAX_FACTION_ASSOC];
|
||||||
|
};
|
||||||
|
|
||||||
const char *FactionValueToString(FACTION_VALUE faction_value);
|
const char *FactionValueToString(FACTION_VALUE faction_value);
|
||||||
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value);
|
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+44
-4
@@ -35,6 +35,11 @@ Core Zone features
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
//Uncomment this to cause a zone to basically idle
|
||||||
|
//when there are no players in it, mobs stop wandering, etc..
|
||||||
|
#define IDLE_WHEN_EMPTY
|
||||||
|
|
||||||
#ifdef EMBPERL
|
#ifdef EMBPERL
|
||||||
//Enable the new XS based perl parser
|
//Enable the new XS based perl parser
|
||||||
#define EMBPERL_XS
|
#define EMBPERL_XS
|
||||||
@@ -127,7 +132,7 @@ enum { //reuse times
|
|||||||
InstillDoubtReuseTime = 9,
|
InstillDoubtReuseTime = 9,
|
||||||
FishingReuseTime = 11,
|
FishingReuseTime = 11,
|
||||||
ForagingReuseTime = 50,
|
ForagingReuseTime = 50,
|
||||||
MendReuseTime = 360,
|
MendReuseTime = 290,
|
||||||
BashReuseTime = 5,
|
BashReuseTime = 5,
|
||||||
BackstabReuseTime = 9,
|
BackstabReuseTime = 9,
|
||||||
KickReuseTime = 5,
|
KickReuseTime = 5,
|
||||||
@@ -213,14 +218,14 @@ enum { //some random constants
|
|||||||
#define HARD_LEVEL_CAP 127
|
#define HARD_LEVEL_CAP 127
|
||||||
|
|
||||||
//the square of the maximum range at whihc you could possibly use NPC services (shop, tribute, etc)
|
//the square of the maximum range at whihc you could possibly use NPC services (shop, tribute, etc)
|
||||||
#define USE_NPC_RANGE2 40000 //arbitrary right now
|
#define USE_NPC_RANGE2 200*200 //arbitrary right now
|
||||||
|
|
||||||
// Squared range for rampage 75.0 * 75.0 for now
|
// Squared range for rampage 75.0 * 75.0 for now
|
||||||
#define NPC_RAMPAGE_RANGE2 5625.0f
|
#define NPC_RAMPAGE_RANGE2 5625.0f
|
||||||
|
|
||||||
//the formula for experience for killing a mob.
|
//the formula for experience for killing a mob.
|
||||||
//level is the only valid variable to use
|
//level is the only valid variable to use
|
||||||
#define EXP_FORMULA (level * level * 75 * 35 / 10)
|
#define EXP_FORMULA level*level*75*35/10
|
||||||
|
|
||||||
#define HIGHEST_AA_VALUE 35
|
#define HIGHEST_AA_VALUE 35
|
||||||
|
|
||||||
@@ -233,6 +238,41 @@ enum { //some random constants
|
|||||||
// Timer to update aggrometer
|
// Timer to update aggrometer
|
||||||
#define AGGRO_METER_UPDATE_MS 1000
|
#define AGGRO_METER_UPDATE_MS 1000
|
||||||
|
|
||||||
|
//Some hard coded statuses from commands and other places:
|
||||||
|
enum {
|
||||||
|
minStatusToBeGM = 40,
|
||||||
|
minStatusToUseGMCommands = 80,
|
||||||
|
minStatusToKick = 150,
|
||||||
|
minStatusToAvoidFalling = 100,
|
||||||
|
minStatusToHaveInvalidSpells = 80,
|
||||||
|
minStatusToHaveInvalidSkills = 80,
|
||||||
|
minStatusToIgnoreZoneFlags = 80,
|
||||||
|
minStatusToSeeOthersZoneFlags = 80,
|
||||||
|
minStatusToEditOtherGuilds = 80,
|
||||||
|
commandMovecharSelfOnly = 80, //below this == only self move allowed
|
||||||
|
commandMovecharToSpecials = 200, //ability to send people to cshom/load zones
|
||||||
|
commandZoneToSpecials = 80, //zone to cshome, out of load zones
|
||||||
|
commandToggleAI = 250, //can turn NPC AI on and off
|
||||||
|
commandCastSpecials = 100, //can cast special spells
|
||||||
|
commandInstacast = 100, //insta-cast all #casted spells
|
||||||
|
commandLevelAboveCap = 100, //can #level players above level cap
|
||||||
|
commandLevelNPCAboveCap = 100, //can #level NPCs above level cap
|
||||||
|
commandSetSkillsOther = 100, //ability to setskills on others
|
||||||
|
commandRaceOthers = 100, //ability to #race on others
|
||||||
|
commandGenderOthers = 100, //ability to #gender on others
|
||||||
|
commandTextureOthers = 100, //ability to #texture on others
|
||||||
|
commandDoAnimOthers = 100, //can #doanim on others
|
||||||
|
commandLockZones = 101, //can lock or unlock zones
|
||||||
|
commandEditPlayerCorpses = 150, //can Edit Player Corpses
|
||||||
|
commandChangeFlags = 200, //ability to set/refresh flags
|
||||||
|
commandBanPlayers = 100, //can set bans on players
|
||||||
|
commandChangeDatarate = 201, //edit client's data rate
|
||||||
|
commandZoneToCoords = 0, //can #zone with coords
|
||||||
|
commandInterrogateInv = 100, //below this == only log on error state and self-only target dump
|
||||||
|
commandInvSnapshot = 150 //ability to clear/restore snapshots
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
||||||
#define SAYLINK_ITEM_ID 0xFFFFF
|
#define SAYLINK_ITEM_ID 0xFFFFF
|
||||||
|
|
||||||
@@ -255,7 +295,7 @@ Developer configuration
|
|||||||
|
|
||||||
#define COMMON_PROFILE
|
#define COMMON_PROFILE
|
||||||
|
|
||||||
#define PROFILE_DUMP_TIME 180
|
#define PROFILE_DUMP_TIME 3*60
|
||||||
#endif //EQPROFILE
|
#endif //EQPROFILE
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+10
-39
@@ -37,33 +37,25 @@
|
|||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <iostream>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param name
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
bool File::Exists(const std::string &name)
|
bool File::Exists(const std::string &name)
|
||||||
{
|
{
|
||||||
struct stat sb{};
|
return fs::exists(fs::path{name});
|
||||||
if (stat(name.c_str(), &sb) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param directory_name
|
||||||
|
*/
|
||||||
void File::Makedir(const std::string &directory_name)
|
void File::Makedir(const std::string &directory_name)
|
||||||
{
|
{
|
||||||
try {
|
fs::create_directory(directory_name);
|
||||||
fs::create_directory(directory_name);
|
fs::permissions(directory_name, fs::perms::owner_all);
|
||||||
fs::permissions(directory_name, fs::perms::owner_all);
|
|
||||||
}
|
|
||||||
catch (const fs::filesystem_error &ex) {
|
|
||||||
std::cout << "Failed to create directory: " << directory_name << std::endl;
|
|
||||||
std::cout << ex.what() << std::endl;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string File::FindEqemuConfigPath()
|
std::string File::FindEqemuConfigPath()
|
||||||
@@ -88,24 +80,3 @@ std::string File::GetCwd()
|
|||||||
{
|
{
|
||||||
return fs::current_path().string();
|
return fs::current_path().string();
|
||||||
}
|
}
|
||||||
|
|
||||||
FileContentsResult File::GetContents(const std::string &file_name)
|
|
||||||
{
|
|
||||||
std::ifstream f(file_name, std::ios::in | std::ios::binary);
|
|
||||||
if (!f) {
|
|
||||||
return { .error = fmt::format("Couldn't open file [{}]", file_name) };
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr size_t CHUNK_SIZE = 4096; // Read 4KB chunks
|
|
||||||
std::string lines;
|
|
||||||
std::vector<char> buffer(CHUNK_SIZE);
|
|
||||||
|
|
||||||
while (f.read(buffer.data(), CHUNK_SIZE) || f.gcount() > 0) {
|
|
||||||
lines.append(buffer.data(), f.gcount());
|
|
||||||
}
|
|
||||||
|
|
||||||
return FileContentsResult{
|
|
||||||
.contents = lines,
|
|
||||||
.error = {}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -25,16 +25,10 @@
|
|||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
struct FileContentsResult {
|
|
||||||
std::string contents;
|
|
||||||
std::string error;
|
|
||||||
};
|
|
||||||
|
|
||||||
class File {
|
class File {
|
||||||
public:
|
public:
|
||||||
static bool Exists(const std::string &name);
|
static bool Exists(const std::string &name);
|
||||||
static void Makedir(const std::string& directory_name);
|
static void Makedir(const std::string& directory_name);
|
||||||
static FileContentsResult GetContents(const std::string &file_name);
|
|
||||||
static std::string FindEqemuConfigPath();
|
static std::string FindEqemuConfigPath();
|
||||||
static std::string GetCwd();
|
static std::string GetCwd();
|
||||||
};
|
};
|
||||||
|
|||||||
+847
-1018
File diff suppressed because it is too large
Load Diff
+83
-136
@@ -5,42 +5,6 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "timer.h"
|
|
||||||
#include "../common/repositories/guild_members_repository.h"
|
|
||||||
#include "../common/repositories/guilds_repository.h"
|
|
||||||
|
|
||||||
struct DefaultPermissionStruct {
|
|
||||||
GuildAction id;
|
|
||||||
uint32 value;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DefaultRankNamesStruct {
|
|
||||||
uint32 id;
|
|
||||||
std::string name;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct GuildTributeStruct {
|
|
||||||
Timer timer;
|
|
||||||
uint32 id_1;
|
|
||||||
uint32 id_2;
|
|
||||||
uint32 id_1_tier;
|
|
||||||
uint32 id_2_tier;
|
|
||||||
uint32 favor;
|
|
||||||
uint32 time_remaining;
|
|
||||||
uint32 enabled;
|
|
||||||
bool send_timer;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TributeData {
|
|
||||||
public:
|
|
||||||
//this level data stored in regular byte order and must be flipped before sending
|
|
||||||
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
|
||||||
uint8 tier_count;
|
|
||||||
uint32 unknown;
|
|
||||||
std::string name;
|
|
||||||
std::string description;
|
|
||||||
bool is_guild; //is a guild tribute item
|
|
||||||
};
|
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
@@ -48,23 +12,22 @@ class CharGuildInfo
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//fields from `characer_`
|
//fields from `characer_`
|
||||||
uint32 char_id;
|
uint32 char_id;
|
||||||
std::string char_name;
|
std::string char_name;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
uint16 level;
|
uint16 level;
|
||||||
uint32 time_last_on;
|
uint32 time_last_on;
|
||||||
uint32 zone_id;
|
uint32 zone_id;
|
||||||
|
|
||||||
//fields from `guild_members`
|
//fields from `guild_members`
|
||||||
uint32 guild_id;
|
uint32 guild_id;
|
||||||
uint8 rank;
|
uint8 rank;
|
||||||
bool tribute_enable;
|
bool tribute_enable;
|
||||||
uint32 total_tribute;
|
uint32 total_tribute;
|
||||||
uint32 last_tribute; //timestamp
|
uint32 last_tribute; //timestamp
|
||||||
bool banker;
|
bool banker;
|
||||||
bool alt;
|
bool alt;
|
||||||
std::string public_note;
|
std::string public_note;
|
||||||
bool online;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//this object holds guild functionality shared between world and zone.
|
//this object holds guild functionality shared between world and zone.
|
||||||
@@ -75,31 +38,21 @@ class BaseGuildManager
|
|||||||
virtual ~BaseGuildManager();
|
virtual ~BaseGuildManager();
|
||||||
|
|
||||||
//this must be called before doing anything else with this object
|
//this must be called before doing anything else with this object
|
||||||
BaseGuildManager * SetDatabase(Database *db)
|
void SetDatabase(Database *db)
|
||||||
{
|
{
|
||||||
m_db = db;
|
m_db = db;
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
BaseGuildManager * SetContentDatabase(Database *db)
|
|
||||||
{
|
|
||||||
m_content_db = db;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoadGuilds();
|
bool LoadGuilds();
|
||||||
virtual bool RefreshGuild(uint32 guild_id);
|
bool RefreshGuild(uint32 guild_id);
|
||||||
|
|
||||||
//guild edit actions.
|
//guild edit actions.
|
||||||
uint32 CreateGuild(std::string name, uint32 leader_char_id);
|
uint32 CreateGuild(const char* name, uint32 leader_char_id);
|
||||||
bool StoreGuildDB(uint32 guild_id);
|
|
||||||
bool DeleteGuild(uint32 guild_id);
|
bool DeleteGuild(uint32 guild_id);
|
||||||
bool RenameGuild(uint32 guild_id, std::string name);
|
bool RenameGuild(uint32 guild_id, const char* name);
|
||||||
bool SetGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
||||||
bool SetGuildURL(uint32 guild_id, std::string URL);
|
bool SetGuildURL(uint32 GuildID, const char* URL);
|
||||||
bool SetGuildChannel(uint32 guild_id, std::string Channel);
|
bool SetGuildChannel(uint32 GuildID, const char* Channel);
|
||||||
|
|
||||||
//character edit actions
|
//character edit actions
|
||||||
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
@@ -109,16 +62,9 @@ class BaseGuildManager
|
|||||||
bool ForceRankUpdate(uint32 charid);
|
bool ForceRankUpdate(uint32 charid);
|
||||||
bool GetAltFlag(uint32 CharID);
|
bool GetAltFlag(uint32 CharID);
|
||||||
bool SetAltFlag(uint32 charid, bool is_alt);
|
bool SetAltFlag(uint32 charid, bool is_alt);
|
||||||
bool GetBankerFlag(uint32 CharID, bool compat_mode = false);
|
bool GetBankerFlag(uint32 CharID);
|
||||||
bool GetGuildBankerStatus(uint32 guild_id, uint32 guild_rank);
|
|
||||||
bool SetTributeFlag(uint32 charid, bool enabled);
|
bool SetTributeFlag(uint32 charid, bool enabled);
|
||||||
bool SetPublicNote(uint32 charid, std::string public_note);
|
bool SetPublicNote(uint32 charid, const char *note);
|
||||||
uint32 UpdateDbGuildFavor(uint32 guild_id, uint32 enabled);
|
|
||||||
bool UpdateDbGuildTributeEnabled(uint32 guild_id, uint32 enabled);
|
|
||||||
bool UpdateDbMemberTributeEnabled(uint32 guild_id, uint32 char_id, uint32 enabled);
|
|
||||||
bool UpdateDbTributeTimeRemaining(uint32 guild_id, uint32 enabled);
|
|
||||||
uint32 UpdateDbMemberFavor(uint32 guild_id, uint32 char_id, uint32 favor);
|
|
||||||
bool UpdateDbMemberOnline(uint32 char_id, bool status);
|
|
||||||
|
|
||||||
//queries
|
//queries
|
||||||
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
||||||
@@ -128,24 +74,29 @@ class BaseGuildManager
|
|||||||
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
||||||
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
||||||
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
||||||
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
const char *GetRankName(uint32 guild_id, uint8 rank) const;
|
||||||
bool GetGuildNameByID(uint32 guild_id, std::string& into) const;
|
const char *GetGuildName(uint32 guild_id) const;
|
||||||
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
std::string GetGuildNameByID(uint32 guild_id) const;
|
||||||
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
||||||
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
||||||
bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
|
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
|
||||||
GuildsListMessaging_Struct MakeGuildList();
|
uint32 GetGuildIDByName(const char *GuildName);
|
||||||
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
||||||
uint32 GetGuildIDByName(const char *GuildName);
|
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
||||||
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
||||||
uint32 FindGuildByLeader(uint32 leader) const;
|
bool CheckGMStatus(uint32 guild_id, uint8 status) const;
|
||||||
uint32 NumberInGuild(uint32 guild_id);
|
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
|
||||||
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
// uint32 Getguild_id(uint32 eqid);
|
||||||
const char* GetRankName(uint32 guild_id, uint8 rank) const;
|
uint32 FindGuildByLeader(uint32 leader) const;
|
||||||
const char* GetGuildName(uint32 guild_id) const;
|
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
|
||||||
std::string GetGuildNameByID(uint32 guild_id) const;
|
uint32 NumberInGuild(uint32 guild_id);
|
||||||
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
|
||||||
std::vector<GuildMembersRepository::GuildMembers> GetGuildMembers(uint32 guild_id);
|
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
|
||||||
|
|
||||||
|
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
|
||||||
|
|
||||||
|
static const char *const GuildActionNames[_MaxGuildAction];
|
||||||
|
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//the methods which must be defined by base classes.
|
//the methods which must be defined by base classes.
|
||||||
@@ -154,62 +105,58 @@ class BaseGuildManager
|
|||||||
virtual void SendRankUpdate(uint32 CharID) = 0;
|
virtual void SendRankUpdate(uint32 CharID) = 0;
|
||||||
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
||||||
|
|
||||||
uint32 UpdateDbCreateGuild(std::string name, uint32 leader_char_id);
|
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
|
||||||
bool UpdateDbDeleteGuild(uint32 guild_id, bool local_delete = true, bool db_delete = true);
|
bool DBDeleteGuild(uint32 guild_id);
|
||||||
bool UpdateDbRenameGuild(uint32 guild_id, std::string name);
|
bool DBRenameGuild(uint32 guild_id, const char* name);
|
||||||
bool UpdateDbGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
bool UpdateDbGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
||||||
bool UpdateDbGuildURL(uint32 GuildID, std::string URL);
|
bool DBSetGuildURL(uint32 GuildID, const char* URL);
|
||||||
bool UpdateDbGuildChannel(uint32 GuildID, std::string Channel);
|
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
|
||||||
bool UpdateDbGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
||||||
bool UpdateDbGuildRank(uint32 charid, uint8 rank);
|
bool DBSetGuildRank(uint32 charid, uint8 rank);
|
||||||
bool UpdateDbAltFlag(uint32 charid, bool is_alt);
|
bool DBSetBankerFlag(uint32 charid, bool is_banker);
|
||||||
bool UpdateDbTributeFlag(uint32 charid, bool enabled);
|
bool DBSetAltFlag(uint32 charid, bool is_alt);
|
||||||
bool UpdateDbPublicNote(uint32 charid, std::string public_note);
|
bool DBSetTributeFlag(uint32 charid, bool enabled);
|
||||||
|
bool DBSetPublicNote(uint32 charid, const char *note);
|
||||||
bool QueryWithLogging(std::string query, const char *errmsg);
|
bool QueryWithLogging(std::string query, const char *errmsg);
|
||||||
|
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
|
||||||
|
|
||||||
bool LocalDeleteGuild(uint32 guild_id);
|
bool LocalDeleteGuild(uint32 guild_id);
|
||||||
|
|
||||||
struct RankInfo
|
class RankInfo
|
||||||
{
|
{
|
||||||
RankInfo();
|
public:
|
||||||
std::string rank_name;
|
RankInfo();
|
||||||
|
std::string name;
|
||||||
|
bool permissions[_MaxGuildAction];
|
||||||
};
|
};
|
||||||
struct Functions
|
class GuildInfo
|
||||||
{
|
{
|
||||||
uint32 id;
|
public:
|
||||||
uint32 perm_id;
|
GuildInfo();
|
||||||
uint32 guild_id;
|
std::string name;
|
||||||
uint32 perm_value;
|
std::string motd;
|
||||||
};
|
std::string motd_setter;
|
||||||
public:
|
std::string url;
|
||||||
class GuildInfo {
|
std::string channel;
|
||||||
public:
|
|
||||||
GuildInfo();
|
uint32 leader_char_id;
|
||||||
std::string name;
|
uint8 minstatus;
|
||||||
std::string motd;
|
//tribute is not in here on purpose, since it is only valid in world!
|
||||||
std::string motd_setter;
|
RankInfo ranks[GUILD_MAX_RANK + 1];
|
||||||
std::string url;
|
};
|
||||||
std::string channel;
|
|
||||||
uint32 leader;
|
|
||||||
uint8 minstatus;
|
|
||||||
std::string rank_names[GUILD_MAX_RANK + 1];
|
|
||||||
Functions functions[GUILD_MAX_FUNCTIONS + 1];
|
|
||||||
GuildTributeStruct tribute;
|
|
||||||
};
|
|
||||||
virtual BaseGuildManager::GuildInfo* GetGuildByGuildID(uint32 guild_id);
|
|
||||||
uint32 GetGuildTributeTimeRemaining(uint32 guild_id);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
||||||
void ClearGuilds(); //clears internal structure
|
void ClearGuilds(); //clears internal structure
|
||||||
|
|
||||||
Database *m_db;
|
Database *m_db; //we do not own this
|
||||||
Database *m_content_db;
|
|
||||||
|
|
||||||
bool _StoreGuildDB(uint32 guild_id);
|
bool _StoreGuildDB(uint32 guild_id);
|
||||||
GuildInfo* _CreateGuild(uint32 guild_id, std::string guild_name, uint32 leader_char_id, uint8 minstatus, std::string guild_motd, std::string motd_setter, std::string Channel, std::string URL, uint32 favour);
|
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
|
||||||
GuildsRepository::Guilds CreateGuildRepoFromGuildInfo(uint32 guild_id, BaseGuildManager::GuildInfo& in);
|
uint32 _GetFreeGuildID();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*GUILD_BASE_H_*/
|
#endif /*GUILD_BASE_H_*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+16
-56
@@ -16,71 +16,31 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUILDS_H
|
#ifndef GUILD_H
|
||||||
#define GUILDS_H
|
#define GUILD_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
||||||
|
|
||||||
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
||||||
#define GUILD_MAX_FUNCTIONS 30
|
|
||||||
#define GUILD_TRIBUTES_MODIFY 1
|
|
||||||
#define GUILD_TRIBUTES_SAVE 0
|
|
||||||
#define GUILD_TRIBUTES_OFF 0
|
|
||||||
#define GUILD_TRIBUTES_ON 1
|
|
||||||
#define GUILD_INVITE_DECLINE 9
|
|
||||||
|
|
||||||
//defines for standard ranks
|
//defines for standard ranks
|
||||||
#define GUILD_MEMBER_TI 0
|
#define GUILD_MEMBER 0
|
||||||
#define GUILD_OFFICER_TI 1
|
#define GUILD_OFFICER 1
|
||||||
#define GUILD_LEADER_TI 2
|
#define GUILD_LEADER 2
|
||||||
#define GUILD_RANK_NONE_TI (GUILD_MAX_RANK + 1)
|
#define GUILD_RANK_NONE (GUILD_MAX_RANK+1)
|
||||||
|
|
||||||
//defines for standard ranks base on RoF2 definitions
|
|
||||||
#define GUILD_RANK_NONE 0
|
|
||||||
#define GUILD_LEADER 1
|
|
||||||
#define GUILD_SENIOR_OFFICER 2
|
|
||||||
#define GUILD_OFFICER 3
|
|
||||||
#define GUILD_SENIOR_MEMBER 4
|
|
||||||
#define GUILD_MEMBER 5
|
|
||||||
#define GUILD_JUNIOR_MEMBER 6
|
|
||||||
#define GUILD_INITIATE 7
|
|
||||||
#define GUILD_RECRUIT 8
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GUILD_ACTION_BANNER_CHANGE = 1,
|
GUILD_HEAR = 0,
|
||||||
GUILD_ACTION_BANNER_PLANT = 2,
|
GUILD_SPEAK = 1,
|
||||||
GUILD_ACTION_BANNER_REMOVE = 3,
|
GUILD_INVITE = 2,
|
||||||
GUILD_ACTION_DISPLAY_GUILD_NAME = 4,
|
GUILD_REMOVE = 3,
|
||||||
GUILD_ACTION_RANKS_CHANGE_PERMISSIONS = 5,
|
GUILD_PROMOTE = 4,
|
||||||
GUILD_ACTION_RANKS_CHANGE_RANK_NAMES = 6,
|
GUILD_DEMOTE = 5,
|
||||||
GUILD_ACTION_MEMBERS_INVITE = 7,
|
GUILD_MOTD = 6,
|
||||||
GUILD_ACTION_MEMBERS_PROMOTE = 8,
|
GUILD_WARPEACE = 7,
|
||||||
GUILD_ACTION_MEMBERS_DEMOTE = 9,
|
_MaxGuildAction
|
||||||
GUILD_ACTION_MEMBERS_REMOVE = 10,
|
|
||||||
GUILD_ACTION_EDIT_RECRUITING_SETTINGS = 11,
|
|
||||||
GUILD_ACTION_EDIT_PUBLIC_NOTES = 12,
|
|
||||||
GUILD_ACTION_BANK_DEPOSIT_ITEMS = 13,
|
|
||||||
GUILD_ACTION_BANK_WITHDRAW_ITEMS = 14,
|
|
||||||
GUILD_ACTION_BANK_VIEW_ITEMS = 15,
|
|
||||||
GUILD_ACTION_BANK_PROMOTE_ITEMS = 16,
|
|
||||||
GUILD_ACTION_BANK_CHANGE_ITEM_PERMISSIONS = 17,
|
|
||||||
GUILD_ACTION_CHANGE_THE_MOTD = 18,
|
|
||||||
GUILD_ACTION_GUILD_CHAT_SEE = 19,
|
|
||||||
GUILD_ACTION_GUILD_CHAT_SPEAK_IN = 20,
|
|
||||||
GUILD_ACTION_SEND_THE_WHOLE_GUILD_E_MAIL = 21,
|
|
||||||
GUILD_ACTION_TRIBUTE_CHANGE_FOR_OTHERS = 22,
|
|
||||||
GUILD_ACTION_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 23,
|
|
||||||
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_FOR_OTHERS = 24,
|
|
||||||
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 25,
|
|
||||||
GUILD_ACTION_MEMBERS_CHANGE_ALT_FLAG_FOR_OTHER = 26,
|
|
||||||
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_BUY = 27,
|
|
||||||
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_SELL = 28,
|
|
||||||
GUILD_ACTION_REAL_ESTATE_MODIFY_TROPHIES = 29,
|
|
||||||
GUILD_ACTION_MEMBERS_DEMOTE_SELF = 30,
|
|
||||||
} GuildAction;
|
} GuildAction;
|
||||||
|
|
||||||
constexpr int format_as(GuildAction action) { return static_cast<int>(action); }
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -272,8 +272,6 @@ inline const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *asn1) {
|
|||||||
#include <brotli/encode.h>
|
#include <brotli/encode.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../strings.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Declaration
|
* Declaration
|
||||||
*/
|
*/
|
||||||
@@ -3814,12 +3812,12 @@ inline bool brotli_decompressor::decompress(const char *data,
|
|||||||
if (std::regex_match(b, e, cm, re_another_range)) {
|
if (std::regex_match(b, e, cm, re_another_range)) {
|
||||||
ssize_t first = -1;
|
ssize_t first = -1;
|
||||||
if (!cm.str(1).empty()) {
|
if (!cm.str(1).empty()) {
|
||||||
first = static_cast<ssize_t>(Strings::ToBigInt(cm.str(1)));
|
first = static_cast<ssize_t>(std::stoll(cm.str(1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t last = -1;
|
ssize_t last = -1;
|
||||||
if (!cm.str(2).empty()) {
|
if (!cm.str(2).empty()) {
|
||||||
last = static_cast<ssize_t>(Strings::ToBigInt(cm.str(2)));
|
last = static_cast<ssize_t>(std::stoll(cm.str(2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (first != -1 && last != -1 && first > last) {
|
if (first != -1 && last != -1 && first > last) {
|
||||||
@@ -6690,7 +6688,7 @@ static WSInit wsinit_;
|
|||||||
if (params.empty()) { return Get(path, headers); }
|
if (params.empty()) { return Get(path, headers); }
|
||||||
|
|
||||||
std::string path_with_query = append_query_params(path, params);
|
std::string path_with_query = append_query_params(path, params);
|
||||||
return Get(path_with_query, headers, progress);
|
return Get(path_with_query.c_str(), headers, progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result ClientImpl::Get(const std::string &path, const Params ¶ms,
|
inline Result ClientImpl::Get(const std::string &path, const Params ¶ms,
|
||||||
@@ -6710,7 +6708,7 @@ static WSInit wsinit_;
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string path_with_query = append_query_params(path, params);
|
std::string path_with_query = append_query_params(path, params);
|
||||||
return Get(path_with_query, headers, response_handler,
|
return Get(path_with_query.c_str(), headers, response_handler,
|
||||||
content_receiver, progress);
|
content_receiver, progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6807,7 +6805,7 @@ static WSInit wsinit_;
|
|||||||
std::string content_type;
|
std::string content_type;
|
||||||
const auto &body = detail::serialize_multipart_formdata(
|
const auto &body = detail::serialize_multipart_formdata(
|
||||||
items, detail::make_multipart_data_boundary(), content_type);
|
items, detail::make_multipart_data_boundary(), content_type);
|
||||||
return Post(path, headers, body, content_type);
|
return Post(path, headers, body, content_type.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
inline Result ClientImpl::Post(const std::string &path, const Headers &headers,
|
||||||
@@ -6820,7 +6818,7 @@ static WSInit wsinit_;
|
|||||||
std::string content_type;
|
std::string content_type;
|
||||||
const auto &body =
|
const auto &body =
|
||||||
detail::serialize_multipart_formdata(items, boundary, content_type);
|
detail::serialize_multipart_formdata(items, boundary, content_type);
|
||||||
return Post(path, headers, body, content_type);
|
return Post(path, headers, body, content_type.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Result ClientImpl::Put(const std::string &path) {
|
inline Result ClientImpl::Put(const std::string &path) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user