Compare commits

..

2 Commits

Author SHA1 Message Date
regneq caae34ac5e fixed client lua summonitem.
export npc:CanTalk to lua.
added QuestSlot.
Added a condition for questslot in summonitem function.
2024-04-05 18:01:48 -07:00
regneq 56c7db4cbf [MultiQuest] Add functions to Loot. Import to Lua_NPC. 2024-04-05 12:08:01 -07:00
193 changed files with 2084 additions and 6652 deletions
-6
View File
@@ -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
-9
View File
@@ -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
-284
View File
@@ -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
-73
View File
@@ -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/"
}
}
}
-37
View File
@@ -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"
}
}
-49
View File
@@ -1,49 +0,0 @@
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/ubuntu
{
"name": "eqemu",
"build": {
"dockerfile": "Dockerfile.debian.dev"
},
"appPort": [
"5998:5998/udp",
"7000:7000/udp",
"7001:7001/udp",
"7002:7002/udp",
"7003:7003/udp",
"7004:7004/udp",
"7005:7005/udp",
"9000:9000/udp",
"9001:9001/udp"
],
"forwardPorts": [
3306
],
"remoteEnv": {
"LOCALWSF": "${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"
}
+3
View File
@@ -61,6 +61,9 @@ bin/
compile_flags.txt compile_flags.txt
.cache/ .cache/
# vscode generated settings
.vscode/
# Build pipeline # Build pipeline
!utils/scripts/build/ !utils/scripts/build/
!utils/scripts/build/should-release/should-release !utils/scripts/build/should-release/should-release
-23
View File
@@ -1,23 +0,0 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${default}",
"${workspaceFolder}/submodules/fmt/include",
"${workspaceFolder}/submodules/cereal/include",
"${workspaceFolder}/submodules/glm",
"${workspaceFolder}/submodules/libuv/include"
],
"defines": [
"LUA_EQEMU=1"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}
-173
View File
@@ -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
}
]
}
]
}
-136
View File
@@ -1,136 +0,0 @@
{
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"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",
}
}
}
-217
View File
@@ -1,220 +1,3 @@
## [22.50.1] 5/12/2024
### Fixes
* Clear GuildOnlineStatus on world boot ([#4306](https://github.com/EQEmu/Server/pull/4306)) @neckkola 2024-05-12
## [22.50.0] 5/9/2024
### Code
* Fix Message in #find task ([#4270](https://github.com/EQEmu/Server/pull/4270)) @Kinglykrab 2024-04-19
### Combat
* Add rule to set stun duration. Add rule to add stun messages. ([#4284](https://github.com/EQEmu/Server/pull/4284)) @noudess 2024-04-25
### Commands
* Adjust #kill and #list Commands ([#4271](https://github.com/EQEmu/Server/pull/4271)) @Kinglykrab 2024-05-04
### Compiling
* Add profiler flag ([#4293](https://github.com/EQEmu/Server/pull/4293)) @xackery 2024-05-04
### Corpses
* Corpse searches for items did not search augs ([#4289](https://github.com/EQEmu/Server/pull/4289)) @noudess 2024-04-27
### Database
* Add Extra Haste to Bots/Character Tables ([#4286](https://github.com/EQEmu/Server/pull/4286)) @Kinglykrab 2024-05-04
* Break out changes to `npc_types` from parcels ([#4295](https://github.com/EQEmu/Server/pull/4295)) @joligario 2024-05-03
* Move pets query to content database ([#4296](https://github.com/EQEmu/Server/pull/4296)) @joligario 2024-05-04
### Doors
* Replace magic # in code with a field in doors table for when door closes. ([#4288](https://github.com/EQEmu/Server/pull/4288)) @noudess 2024-04-25
### Experience
* Add SetExp/SetAAExp lua mods ([#4292](https://github.com/EQEmu/Server/pull/4292)) @xackery 2024-05-04
### Feature
* Add Augmentation Support for Parcels ([#4285](https://github.com/EQEmu/Server/pull/4285)) @neckkola 2024-04-24
* Add Character Auto Login ([#4216](https://github.com/EQEmu/Server/pull/4216)) @Kinglykrab 2024-04-15
* Add Parcel Feature for RoF2 Clients ([#4198](https://github.com/EQEmu/Server/pull/4198)) @neckkola 2024-04-21
* Add `is_parcel_merchant` to #npcedit ([#4290](https://github.com/EQEmu/Server/pull/4290)) @Kinglykrab 2024-05-04
* Add devcontainer support ([#4294](https://github.com/EQEmu/Server/pull/4294)) @xackery 2024-05-09
* Fix ignore_default on lua mod damage ([#4228](https://github.com/EQEmu/Server/pull/4228)) @xackery 2024-04-15
### Fixes
* "GM flag" vs "GM Flag" @Akkadius 2024-05-04
* All NPC classes could stun with kick/only warriors could be stunned ([#4273](https://github.com/EQEmu/Server/pull/4273)) @noudess 2024-04-24
* Fix Account Flags Loading ([#4243](https://github.com/EQEmu/Server/pull/4243)) @Kinglykrab 2024-04-15
* Fix Corpses "Disappearing" ([#4275](https://github.com/EQEmu/Server/pull/4275)) @joligario 2024-04-21
* Fix Issue With Auto Login ([#4267](https://github.com/EQEmu/Server/pull/4267)) @Kinglykrab 2024-04-21
* Fix crash from #4266 @Akkadius 2024-05-05
* Fixes Issue 4257 - Double Taunt Message ([#4258](https://github.com/EQEmu/Server/pull/4258)) @fryguy503 2024-04-18
* GLAA fix after database.cpp updates ([#4277](https://github.com/EQEmu/Server/pull/4277)) @neckkola 2024-04-21
* GetSkill default return 0 @Akkadius 2024-05-05
* Hero forge armor bug on login and show helm toggle. ([#4246](https://github.com/EQEmu/Server/pull/4246)) @noudess 2024-04-15
* Perl__send_parcel GCC compile error @Akkadius 2024-05-05
* Remove food or water GM message @Akkadius 2024-05-05
* Revert GetSkill from #4234 @Akkadius 2024-05-05
* Fix for world crash with over 1500 guilds ([#4299](https://github.com/EQEmu/Server/pull/4299)) @neckkola 2024-05-09
### Hot Fix
* Update database_update_manifest.cpp ([#4291](https://github.com/EQEmu/Server/pull/4291)) @noudess 2024-04-29
### Loot
* Add content filtering to lootdrop_entries ([#4229](https://github.com/EQEmu/Server/pull/4229)) @Akkadius 2024-04-15
* Consolidate filtering logic ([#4280](https://github.com/EQEmu/Server/pull/4280)) @Akkadius 2024-04-21
### Lua
* Add IsImmuneToSpell Lua Mod ([#4278](https://github.com/EQEmu/Server/pull/4278)) @xackery 2024-04-28
* Add UpdatePersonalFaction Lua Mod ([#4279](https://github.com/EQEmu/Server/pull/4279)) @xackery 2024-05-04
### Messages
* Add GM Status and Invulnerability Messages ([#4266](https://github.com/EQEmu/Server/pull/4266)) @Kinglykrab 2024-05-04
* Fix bug where DoT messages stop coming out when mob dies. ([#4249](https://github.com/EQEmu/Server/pull/4249)) @noudess 2024-04-15
* Fix multiple errors in spell damage at death. ([#4264](https://github.com/EQEmu/Server/pull/4264)) @noudess 2024-04-28
### Performance
* Change skill_cap from vector to map ([#4252](https://github.com/EQEmu/Server/pull/4252)) @xackery 2024-04-15
### Pets
* Fix errors in sync with client of sit/stand ([#4245](https://github.com/EQEmu/Server/pull/4245)) @noudess 2024-04-15
### Quest API
* Add DescribeSpecialAbilities() to Perl/Lua ([#4269](https://github.com/EQEmu/Server/pull/4269)) @Kinglykrab 2024-04-21
* Add GetConsiderColor() to Perl/Lua ([#4253](https://github.com/EQEmu/Server/pull/4253)) @Kinglykrab 2024-04-15
* Add Parcel Sending to Perl/Lua ([#4287](https://github.com/EQEmu/Server/pull/4287)) @Kinglykrab 2024-05-04
* Add Zone Methods to Perl/Lua ([#4268](https://github.com/EQEmu/Server/pull/4268)) @Kinglykrab 2024-04-21
### Quests
* Hot Reload Changes ([#4302](https://github.com/EQEmu/Server/pull/4302)) @Akkadius 2024-05-09
* Reload Quests on Bootup, Init earlier ([#4298](https://github.com/EQEmu/Server/pull/4298)) @Akkadius 2024-05-05
### Spells
* Implemented SPA 122 SE_ReduceSkill ([#4234](https://github.com/EQEmu/Server/pull/4234)) @KayenEQ 2024-05-04
* Normal Group Spells (non-raid) landed twice on caster ([#4240](https://github.com/EQEmu/Server/pull/4240)) @noudess 2024-04-15
* SPA69 TotalHP can be used in Worn Slot, Fixes/Updates to Max HP related variables. ([#4244](https://github.com/EQEmu/Server/pull/4244)) @KayenEQ 2024-04-15
### Zone Instances
* Handle routing to instances when using evac/succor ([#4297](https://github.com/EQEmu/Server/pull/4297)) @joligario 2024-05-04
## [22.49.1] 4/15/2024
### Zoning
* Fix zone routing edge case ([#4255](https://github.com/EQEmu/Server/pull/4255)) @Akkadius 2024-04-15
## [22.49.0] 4/15/2024
### Code
* Avoid unnecessary copies in database functions ([#4220](https://github.com/EQEmu/Server/pull/4220)) @joligario 2024-03-29
* Reference type in `GetRaidLeaderName` ([#4218](https://github.com/EQEmu/Server/pull/4218)) @joligario 2024-03-28
* Remove unnecessary reference types ([#4212](https://github.com/EQEmu/Server/pull/4212)) @joligario 2024-03-28
### Crash
* Check mob pointer before trying to remove it ([#4230](https://github.com/EQEmu/Server/pull/4230)) @Akkadius 2024-04-01
### Feature
* Add Character Auto Login ([#4216](https://github.com/EQEmu/Server/pull/4216)) @Kinglykrab 2024-04-15
* Add LuaMod functions for CommonDamage and HealDamage ([#4227](https://github.com/EQEmu/Server/pull/4227)) @xackery 2024-03-31
* Add RegisterBug LuaMod ([#4209](https://github.com/EQEmu/Server/pull/4209)) @xackery 2024-03-30
* Additive Spell Focus from Worn slot with Limit Checks ([#4208](https://github.com/EQEmu/Server/pull/4208)) @KayenEQ 2024-03-30
* Fix ignore_default on lua mod damage ([#4228](https://github.com/EQEmu/Server/pull/4228)) @xackery 2024-04-15
### Fixes
* Client not updating HP bar when an HP Buff with a Heal is applied. ([#4237](https://github.com/EQEmu/Server/pull/4237)) @KayenEQ 2024-04-02
* Fix Account Flags Loading ([#4243](https://github.com/EQEmu/Server/pull/4243)) @Kinglykrab 2024-04-15
* Fix Auto Login Issue ([#4213](https://github.com/EQEmu/Server/pull/4213)) @Kinglykrab 2024-03-28
* Fix Bot Creation Issue ([#4235](https://github.com/EQEmu/Server/pull/4235)) @Kinglykrab 2024-04-02
* Fix Bot/Character ID Overlap in Groups ([#4093](https://github.com/EQEmu/Server/pull/4093)) @Kinglykrab 2024-03-23
* Fix Group Leadership ([#4214](https://github.com/EQEmu/Server/pull/4214)) @Kinglykrab 2024-03-28
* Fix Issue With Bot Raid Aggro ([#4222](https://github.com/EQEmu/Server/pull/4222)) @Kinglykrab 2024-03-31
* Fix Lua Crash with Spell Blocked Event ([#4236](https://github.com/EQEmu/Server/pull/4236)) @Kinglykrab 2024-04-01
* Fix Luabind Double Class Register ([#4219](https://github.com/EQEmu/Server/pull/4219)) @Kinglykrab 2024-03-29
* Fix crash in SendEnterWorld ([#4204](https://github.com/EQEmu/Server/pull/4204)) @Akkadius 2024-03-24
* Fix event_consider any_cast error ([#4210](https://github.com/EQEmu/Server/pull/4210)) @xackery 2024-03-27
* Fix fishing chances ([#4203](https://github.com/EQEmu/Server/pull/4203)) @joligario 2024-03-24
* Fix manifest for skill caps schema type ([#4231](https://github.com/EQEmu/Server/pull/4231)) @Akkadius 2024-04-02
* Hero forge armor bug on login and show helm toggle. ([#4246](https://github.com/EQEmu/Server/pull/4246)) @noudess 2024-04-15
* Radiant/Ebon Crystals should only extract to 1000 ([#4195](https://github.com/EQEmu/Server/pull/4195)) @fryguy503 2024-03-23
* SPA214 SE_MaxHPChange calculation errors corrected. ([#4238](https://github.com/EQEmu/Server/pull/4238)) @KayenEQ 2024-04-02
* Shared Tasks - charid is now character_id ([#4233](https://github.com/EQEmu/Server/pull/4233)) @fryguy503 2024-04-01
* Using %T in channel messages on fresh corpse yields mob, not corpse name. ([#4168](https://github.com/EQEmu/Server/pull/4168)) @noudess 2024-04-05
### Hot Fix
* Fix Group::AddToGroup ([#4201](https://github.com/EQEmu/Server/pull/4201)) @Kinglykrab 2024-03-23
* Hot Fix for Group::AddToGroup Hot Fix ([#4202](https://github.com/EQEmu/Server/pull/4202)) @Kinglykrab 2024-03-23
### Loot
* Add content filtering to lootdrop_entries ([#4229](https://github.com/EQEmu/Server/pull/4229)) @Akkadius 2024-04-15
### Lua
* Add Zone and Language Constants ([#4211](https://github.com/EQEmu/Server/pull/4211)) @fryguy503 2024-03-28
### Messages
* Fix bug where DoT messages stop coming out when mob dies. ([#4249](https://github.com/EQEmu/Server/pull/4249)) @noudess 2024-04-15
### Performance
* Change skill_cap from vector to map ([#4252](https://github.com/EQEmu/Server/pull/4252)) @xackery 2024-04-15
### Pets
* Fix errors in sync with client of sit/stand ([#4245](https://github.com/EQEmu/Server/pull/4245)) @noudess 2024-04-15
### Quest API
* Add Archetype Methods to Perl/Lua ([#4181](https://github.com/EQEmu/Server/pull/4181)) @Kinglykrab 2024-03-23
* Add Class/Deity/Race Methods to Perl/Lua ([#4215](https://github.com/EQEmu/Server/pull/4215)) @Kinglykrab 2024-03-28
* Add GetConsiderColor() to Perl/Lua ([#4253](https://github.com/EQEmu/Server/pull/4253)) @Kinglykrab 2024-04-15
* Add Spell Blocked Event to Perl/Lua ([#4217](https://github.com/EQEmu/Server/pull/4217)) @Kinglykrab 2024-04-01
### Quests
* Avoid Player and Bot quests in unloaded zone ([#4232](https://github.com/EQEmu/Server/pull/4232)) @hgtw 2024-04-01
### Repositories
* Convert database.cpp to Repositories ([#4054](https://github.com/EQEmu/Server/pull/4054)) @Kinglykrab 2024-03-24
### Skill Caps
* Further improvements ([#4205](https://github.com/EQEmu/Server/pull/4205)) @Akkadius 2024-03-24
* Remove from shared memory and simplify ([#4069](https://github.com/EQEmu/Server/pull/4069)) @Kinglykrab 2024-03-23
### Spells
* Implemented SPA 463 SE_SHIELD_TARGET ([#4224](https://github.com/EQEmu/Server/pull/4224)) @KayenEQ 2024-03-30
* Normal Group Spells (non-raid) landed twice on caster ([#4240](https://github.com/EQEmu/Server/pull/4240)) @noudess 2024-04-15
* SPA148 Stacking Fix ([#4206](https://github.com/EQEmu/Server/pull/4206)) @KayenEQ 2024-03-27
* SPA69 TotalHP can be used in Worn Slot, Fixes/Updates to Max HP related variables. ([#4244](https://github.com/EQEmu/Server/pull/4244)) @KayenEQ 2024-04-15
## [22.48.0] 3/23/2024 ## [22.48.0] 3/23/2024
### Bots ### Bots
-7
View File
@@ -31,13 +31,6 @@ IF (EQEMU_BUILD_STATIC)
ENDIF () ENDIF ()
ENDIF (EQEMU_BUILD_STATIC) 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(MSVC) IF(MSVC)
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS) ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
ADD_DEFINITIONS(-DNOMINMAX) ADD_DEFINITIONS(-DNOMINMAX)
-2
View File
@@ -31,13 +31,11 @@
#include "../../common/path_manager.h" #include "../../common/path_manager.h"
#include "../../common/repositories/skill_caps_repository.h" #include "../../common/repositories/skill_caps_repository.h"
#include "../../common/file.h" #include "../../common/file.h"
#include "../../common/events/player_event_logs.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;
void ExportSpells(SharedDatabase *db); void ExportSpells(SharedDatabase *db);
void ExportSkillCaps(SharedDatabase *db); void ExportSkillCaps(SharedDatabase *db);
-2
View File
@@ -29,13 +29,11 @@
#include "../../common/path_manager.h" #include "../../common/path_manager.h"
#include "../../common/repositories/base_data_repository.h" #include "../../common/repositories/base_data_repository.h"
#include "../../common/file.h" #include "../../common/file.h"
#include "../../common/events/player_event_logs.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;
void ImportSpells(SharedDatabase *db); void ImportSpells(SharedDatabase *db);
void ImportSkillCaps(SharedDatabase *db); void ImportSkillCaps(SharedDatabase *db);
-2
View File
@@ -177,7 +177,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_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
@@ -358,7 +357,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_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
-10
View File
@@ -357,13 +357,3 @@ WorldContentService::FindZoneResult WorldContentService::FindZone(uint32 zone_id
return WorldContentService::FindZoneResult{.zone_id = 0}; return WorldContentService::FindZoneResult{.zone_id = 0};
} }
bool WorldContentService::IsInPublicStaticInstance(uint32 instance_id)
{
for (auto &i: m_zone_instances) {
if (i.id == instance_id) {
return true;
}
}
return false;
}
-2
View File
@@ -178,8 +178,6 @@ public:
}; };
FindZoneResult FindZone(uint32 zone_id, uint32 instance_id); 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;
+6 -72
View File
@@ -35,7 +35,6 @@
#include "../common/repositories/character_data_repository.h" #include "../common/repositories/character_data_repository.h"
#include "../common/repositories/character_languages_repository.h" #include "../common/repositories/character_languages_repository.h"
#include "../common/repositories/character_leadership_abilities_repository.h" #include "../common/repositories/character_leadership_abilities_repository.h"
#include "../common/repositories/character_parcels_repository.h"
#include "../common/repositories/character_skills_repository.h" #include "../common/repositories/character_skills_repository.h"
#include "../common/repositories/data_buckets_repository.h" #include "../common/repositories/data_buckets_repository.h"
#include "../common/repositories/group_id_repository.h" #include "../common/repositories/group_id_repository.h"
@@ -50,7 +49,6 @@
#include "../common/repositories/raid_members_repository.h" #include "../common/repositories/raid_members_repository.h"
#include "../common/repositories/reports_repository.h" #include "../common/repositories/reports_repository.h"
#include "../common/repositories/variables_repository.h" #include "../common/repositories/variables_repository.h"
#include "../common/events/player_event_logs.h"
// Disgrace: for windows compile // Disgrace: for windows compile
#ifdef _WINDOWS #ifdef _WINDOWS
@@ -1127,7 +1125,7 @@ std::string Database::GetGroupLeaderForLogin(const std::string& character_name)
return e.gid ? e.leadername : std::string(); return e.gid ? e.leadername : std::string();
} }
void Database::SetGroupLeaderName(uint32 group_id, const std::string &name) void Database::SetGroupLeaderName(uint32 group_id, const std::string& name)
{ {
auto e = GroupLeadersRepository::FindOne(*this, group_id); auto e = GroupLeadersRepository::FindOne(*this, group_id);
@@ -1147,7 +1145,7 @@ void Database::SetGroupLeaderName(uint32 group_id, const std::string &name)
e.mentoree = std::string(); e.mentoree = std::string();
e.mentor_percent = 0; e.mentor_percent = 0;
GroupLeadersRepository::ReplaceOne(*this, e); GroupLeadersRepository::InsertOne(*this, e);
} }
std::string Database::GetGroupLeaderName(uint32 group_id) std::string Database::GetGroupLeaderName(uint32 group_id)
@@ -1180,7 +1178,7 @@ char* Database::GetGroupLeadershipInfo(
GroupLeadershipAA_Struct* GLAA GroupLeadershipAA_Struct* GLAA
) )
{ {
auto e = GroupLeadersRepository::FindOne(*this, group_id); const auto& e = GroupLeadersRepository::FindOne(*this, group_id);
if (!e.gid) { if (!e.gid) {
if (leaderbuf) { if (leaderbuf) {
@@ -1241,9 +1239,9 @@ char* Database::GetGroupLeadershipInfo(
if (mentor_percent) { if (mentor_percent) {
*mentor_percent = e.mentor_percent; *mentor_percent = e.mentor_percent;
} }
if(GLAA && e.leadershipaa.length() == sizeof(GroupLeadershipAA_Struct)) {
Decode(e.leadershipaa); if (GLAA && e.leadershipaa.length() == sizeof(GroupLeadershipAA_Struct)) {
memcpy(GLAA, e.leadershipaa.data(), sizeof(GroupLeadershipAA_Struct)); memcpy(GLAA, e.leadershipaa.c_str(), sizeof(GroupLeadershipAA_Struct));
} }
return leaderbuf; return leaderbuf;
@@ -2030,67 +2028,3 @@ void Database::SourceSqlFromUrl(const std::string& url)
LogError("URI parser error [{}]", iae.what()); LogError("URI parser error [{}]", iae.what());
} }
} }
void Database::Encode(std::string &in)
{
for(int i = 0; i < in.length(); i++) {
in.at(i) += char('0');
}
};
void Database::Decode(std::string &in)
{
for(int i = 0; i < in.length(); i++) {
in.at(i) -= char('0');
}
};
void Database::PurgeCharacterParcels()
{
auto filter = fmt::format("sent_date < (NOW() - INTERVAL {} DAY)", RuleI(Parcel, ParcelPruneDelay));
auto results = CharacterParcelsRepository::GetWhere(*this, filter);
auto prune = CharacterParcelsRepository::DeleteWhere(*this, filter);
PlayerEvent::ParcelDelete pd{};
PlayerEventLogsRepository::PlayerEventLogs pel{};
pel.event_type_id = PlayerEvent::PARCEL_DELETE;
pel.event_type_name = PlayerEvent::EventName[pel.event_type_id];
std::stringstream ss;
for (auto const &r: results) {
pd.from_name = r.from_name;
pd.item_id = r.item_id;
pd.aug_slot_1 = r.aug_slot_1;
pd.aug_slot_2 = r.aug_slot_2;
pd.aug_slot_3 = r.aug_slot_3;
pd.aug_slot_4 = r.aug_slot_4;
pd.aug_slot_5 = r.aug_slot_5;
pd.aug_slot_6 = r.aug_slot_6;
pd.note = r.note;
pd.quantity = r.quantity;
pd.sent_date = r.sent_date;
pd.char_id = r.char_id;
{
cereal::JSONOutputArchiveSingleLine ar(ss);
pd.serialize(ar);
}
pel.event_data = ss.str();
pel.created_at = std::time(nullptr);
player_event_logs.AddToQueue(pel);
ss.str("");
ss.clear();
}
LogInfo(
"Purged <yellow>[{}] parcels that were over <yellow>[{}] days old.",
results.size(),
RuleI(Parcel, ParcelPruneDelay)
);
}
void Database::ClearGuildOnlineStatus()
{
GuildMembersRepository::ClearOnlineStatus(*this);
}
-4
View File
@@ -243,7 +243,6 @@ public:
void SetRaidGroupLeaderInfo(uint32 group_id, uint32 raid_id); void SetRaidGroupLeaderInfo(uint32 group_id, uint32 raid_id);
void PurgeAllDeletedDataBuckets(); void PurgeAllDeletedDataBuckets();
void ClearGuildOnlineStatus();
/* Database Variables */ /* Database Variables */
@@ -268,9 +267,6 @@ public:
void SourceDatabaseTableFromUrl(const std::string& table_name, const std::string& url); void SourceDatabaseTableFromUrl(const std::string& table_name, const std::string& url);
void SourceSqlFromUrl(const std::string& url); void SourceSqlFromUrl(const std::string& url);
void PurgeCharacterParcels();
void Encode(std::string &in);
void Decode(std::string &in);
private: private:
Mutex Mvarcache; Mutex Mvarcache;
@@ -5469,116 +5469,6 @@ ADD PRIMARY KEY (`id`) USING BTREE,
ADD INDEX `level_skill_cap`(`skill_id`, `class_id`, `level`, `cap`); ADD INDEX `level_skill_cap`(`skill_id`, `class_id`, `level`, `cap`);
)", )",
.content_schema_update = true, .content_schema_update = true,
},
ManifestEntry{
.version = 9269,
.description = "2024_03_27_account_auto_login_charname.sql",
.check = "SHOW COLUMNS FROM `account` LIKE 'auto_login_charname'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `account`
ADD COLUMN `auto_login_charname` varchar(64) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT '' AFTER `charname`;
)"
},
ManifestEntry{
.version = 9270,
.description = "2024_04_31_content_flagging_lootdrop_entries.sql",
.check = "SHOW COLUMNS FROM `lootdrop_entries` LIKE 'content_flags'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `lootdrop_entries` ADD `min_expansion` tinyint(4) NOT NULL DEFAULT -1;
ALTER TABLE `lootdrop_entries` ADD `max_expansion` tinyint(4) NOT NULL DEFAULT -1;
ALTER TABLE `lootdrop_entries` ADD `content_flags` varchar(100) NULL;
ALTER TABLE `lootdrop_entries` ADD `content_flags_disabled` varchar(100) NULL;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9271,
.description = "2024_03_10_parcel_implementation.sql",
.check = "SHOW TABLES LIKE 'character_parcels'",
.condition = "empty",
.match = "",
.sql = R"(CREATE TABLE `character_parcels` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`char_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`item_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`slot_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`quantity` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`from_name` VARCHAR(64) NULL DEFAULT NULL COLLATE 'latin1_swedish_ci',
`note` VARCHAR(1024) NULL DEFAULT NULL COLLATE 'latin1_swedish_ci',
`sent_date` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `data_constraint` (`slot_id`, `char_id`) USING BTREE
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1;
)"
},
ManifestEntry{
.version = 9272,
.description = "2024_04_23_add_parcel_support_for_augmented_items.sql",
.check = "SHOW COLUMNS FROM `character_parcels` LIKE 'aug_slot_1'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `character_parcels`
ADD COLUMN `aug_slot_1` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `item_id`,
ADD COLUMN `aug_slot_2` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `aug_slot_1`,
ADD COLUMN `aug_slot_3` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `aug_slot_2`,
ADD COLUMN `aug_slot_4` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `aug_slot_3`,
ADD COLUMN `aug_slot_5` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `aug_slot_4`,
ADD COLUMN `aug_slot_6` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `aug_slot_5`;
)"
},
ManifestEntry{
.version = 9273,
.description = "2024_04_24_door_close_timer.sql",
.check = "SHOW COLUMNS FROM `doors` LIKE 'close_timer_ms'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `doors`
ADD COLUMN `close_timer_ms` smallint(8) UNSIGNED NOT NULL DEFAULT 5000 AFTER `is_ldon_door`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9274,
.description = "2024_05_02_parcel_npc_content.sql",
.check = "SHOW COLUMNS FROM `npc_types` LIKE 'is_parcel_merchant'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `npc_types`
ADD COLUMN `is_parcel_merchant` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `keeps_sold_items`;
)",
.content_schema_update = true
},
ManifestEntry{
.version = 9275,
.description = "2024_04_28_character_extra_haste.sql",
.check = "SHOW COLUMNS FROM `character_data` LIKE 'extra_haste'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `character_data`
ADD COLUMN `extra_haste` int(11) NOT NULL DEFAULT 0 AFTER `wis`;
)"
},
ManifestEntry{
.version = 9276,
.description = "2024_05_12_fix_guild_bank_dup_issue.sql",
.check = "SHOW COLUMNS FROM `guild_bank` WHERE FIELD = 'qty' AND Type LIKE '%unsigned';",
.condition = "not_empty",
.match = "",
.sql = R"(
ALTER TABLE `guild_bank`
CHANGE COLUMN `qty` `qty` INT(10) NOT NULL DEFAULT '0' AFTER `itemid`;
)"
} }
// -- template; copy/paste this when you need to create a new entry // -- template; copy/paste this when you need to create a new entry
// ManifestEntry{ // ManifestEntry{
@@ -139,17 +139,6 @@ ADD COLUMN `augment_three` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_tw
ADD COLUMN `augment_four` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_three`, ADD COLUMN `augment_four` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_three`,
ADD COLUMN `augment_five` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_four`, ADD COLUMN `augment_five` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_four`,
ADD COLUMN `augment_six` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_five`; ADD COLUMN `augment_six` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_five`;
)"
},
ManifestEntry{
.version = 9044,
.description = "2024_04_23_bot_extra_haste.sql",
.check = "SHOW COLUMNS FROM `bot_data` LIKE 'extra_haste'",
.condition = "empty",
.match = "",
.sql = R"(
ALTER TABLE `bot_data`
ADD COLUMN `extra_haste` mediumint(8) NOT NULL DEFAULT 0 AFTER `wis`;
)" )"
} }
// -- template; copy/paste this when you need to create a new entry // -- template; copy/paste this when you need to create a new entry
-2
View File
@@ -59,7 +59,6 @@ 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_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"},
@@ -129,7 +128,6 @@ namespace DatabaseSchema {
"character_leadership_abilities", "character_leadership_abilities",
"character_material", "character_material",
"character_memmed_spells", "character_memmed_spells",
"character_parcels",
"character_pet_buffs", "character_pet_buffs",
"character_pet_info", "character_pet_info",
"character_pet_inventory", "character_pet_inventory",
-22
View File
@@ -714,25 +714,3 @@ std::string EQ::constants::GetSpecialAbilityName(uint32 ability_id)
return std::string(); return std::string();
} }
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();
}
+2 -14
View File
@@ -89,6 +89,8 @@ 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_QUEST;
using Titanium::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)
@@ -404,9 +406,6 @@ namespace EQ
extern const std::map<uint32, std::string>& GetSpecialAbilityMap(); extern const std::map<uint32, std::string>& GetSpecialAbilityMap();
std::string GetSpecialAbilityName(uint32 ability_id); std::string GetSpecialAbilityName(uint32 ability_id);
extern const std::map<uint32, std::string>& GetConsiderColorMap();
std::string GetConsiderColorName(uint32 consider_color);
const int STANCE_TYPE_FIRST = stancePassive; const int STANCE_TYPE_FIRST = stancePassive;
const int STANCE_TYPE_LAST = stanceBurnAE; const int STANCE_TYPE_LAST = stanceBurnAE;
const int STANCE_TYPE_COUNT = stanceBurnAE; const int STANCE_TYPE_COUNT = stanceBurnAE;
@@ -562,17 +561,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,
-5
View File
@@ -510,11 +510,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),
-18
View File
@@ -1131,22 +1131,4 @@ namespace LeadershipAbilitySlot {
constexpr uint16 HealthOfTargetsTarget = 14; 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
#endif /*COMMON_EQ_CONSTANTS_H*/ #endif /*COMMON_EQ_CONSTANTS_H*/
+7 -117
View File
@@ -27,9 +27,6 @@
#include "../common/version.h" #include "../common/version.h"
#include "emu_constants.h" #include "emu_constants.h"
#include "textures.h" #include "textures.h"
#include "../cereal/include/cereal/archives/binary.hpp"
#include "../cereal/include/cereal/types/string.hpp"
#include "../cereal/include/cereal/types/vector.hpp"
static const uint32 BUFF_COUNT = 42; static const uint32 BUFF_COUNT = 42;
@@ -1536,7 +1533,8 @@ struct ExpUpdate_Struct
** Packet Types: See ItemPacketType enum ** Packet Types: See ItemPacketType enum
** **
*/ */
enum ItemPacketType { enum ItemPacketType
{
ItemPacketViewLink = 0x00, ItemPacketViewLink = 0x00,
ItemPacketMerchant = 0x64, ItemPacketMerchant = 0x64,
ItemPacketTradeView = 0x65, ItemPacketTradeView = 0x65,
@@ -1548,22 +1546,9 @@ enum ItemPacketType {
ItemPacketTributeItem = 0x6C, ItemPacketTributeItem = 0x6C,
ItemPacketGuildTribute = 0x6D, ItemPacketGuildTribute = 0x6D,
ItemPacketCharmUpdate = 0x6E, // noted as incorrect ItemPacketCharmUpdate = 0x6E, // noted as incorrect
ItemPacketRecovery = 0x71,
ItemPacketParcel = 0x73,
ItemPacketInvalid = 0xFF ItemPacketInvalid = 0xFF
}; };
enum MerchantWindowTabDisplay {
None = 0x00,
SellBuy = 0x01,
Recover = 0x02,
SellBuyRecover = 0x03,
Parcel = 0x04,
SellBuyParcel = 0x05,
RecoverParcel = 0x06,
SellBuyRecoverParcel = 0x07
};
//enum ItemPacketType //enum ItemPacketType
//{ //{
// ItemPacketMerchant = /*100*/ 0x64, // Titanium+ // ItemPacketMerchant = /*100*/ 0x64, // Titanium+
@@ -1693,38 +1678,6 @@ struct GuildsList_Struct {
GuildsListEntry_Struct Guilds[MAX_NUMBER_GUILDS]; GuildsListEntry_Struct Guilds[MAX_NUMBER_GUILDS];
}; };
struct GuildsListMessagingEntry_Struct {
/*000*/ uint32 guild_id;
/*004*/ std::string guild_name;
template<class Archive>
void serialize(Archive& archive)
{
archive(
CEREAL_NVP(guild_id),
CEREAL_NVP(guild_name)
);
}
};
struct GuildsListMessaging_Struct {
/*000*/ char header[64];
/*064*/ uint32 no_of_guilds;
/*068*/ uint32 string_length;
/*072*/ std::vector<GuildsListMessagingEntry_Struct> guild_detail;
template<class Archive>
void serialize(Archive& archive)
{
archive(
CEREAL_NVP(header),
CEREAL_NVP(no_of_guilds),
CEREAL_NVP(string_length),
CEREAL_NVP(guild_detail)
);
}
};
struct GuildUpdate_Struct { struct GuildUpdate_Struct {
uint32 guildID; uint32 guildID;
GuildsListEntry_Struct entry; GuildsListEntry_Struct entry;
@@ -2104,75 +2057,12 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct struct Merchant_Click_Struct {
{ /*000*/ uint32 npcid; // Merchant NPC's entity id
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*004*/ uint32 playerid;
/*004*/ uint32 player_id; /*008*/ uint32 command; //1=open, 0=cancel/close
/*008*/ uint32 command; // 1=open, 0=cancel/close /*012*/ float rate; //cost multiplier, dosent work anymore
/*012*/ float rate; // cost multiplier, dosent work anymore
/*016*/ int32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels
/*020*/ int32 unknown020; // Seen 2592000 from Server or -1 from Client
/*024*/
}; };
enum MerchantActions {
Close = 0,
Open = 1
};
struct Parcel_Struct
{
/*000*/ uint32 npc_id;
/*004*/ uint32 item_slot;
/*008*/ uint32 quantity;
/*012*/ uint32 money_flag;
/*016*/ char send_to[64];
/*080*/ char note[128];
/*208*/ uint32 unknown_208;
/*212*/ uint32 unknown_212;
/*216*/ uint32 unknown_216;
};
struct ParcelRetrieve_Struct
{
uint32 merchant_entity_id;
uint32 player_entity_id;
uint32 parcel_slot_id;
uint32 parcel_item_id;
};
struct ParcelMessaging_Struct {
ItemPacketType packet_type;
std::string serialized_item;
uint32 sent_time;
std::string player_name;
std::string note;
uint32 slot_id;
template<class Archive>
void serialize(Archive &archive)
{
archive(
CEREAL_NVP(packet_type),
CEREAL_NVP(serialized_item),
CEREAL_NVP(sent_time),
CEREAL_NVP(player_name),
CEREAL_NVP(note),
CEREAL_NVP(slot_id)
);
}
};
struct ParcelIcon_Struct {
uint32 status; //0 off 1 on 2 overlimit
};
enum ParcelIconActions {
IconOff = 0,
IconOn = 1,
Overlimit = 2
};
/* /*
Unknowns: Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE 0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
-3
View File
@@ -699,9 +699,6 @@ void PlayerEventLogs::SetSettingsDefaults()
m_settings[PlayerEvent::ITEM_CREATION].event_enabled = 1; m_settings[PlayerEvent::ITEM_CREATION].event_enabled = 1;
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_ITEM].event_enabled = 1; m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_ITEM].event_enabled = 1;
m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_PLAT].event_enabled = 1; m_settings[PlayerEvent::GUILD_TRIBUTE_DONATE_PLAT].event_enabled = 1;
m_settings[PlayerEvent::PARCEL_SEND].event_enabled = 1;
m_settings[PlayerEvent::PARCEL_RETRIEVE].event_enabled = 1;
m_settings[PlayerEvent::PARCEL_DELETE].event_enabled = 1;
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) { for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
m_settings[i].retention_days = RETENTION_DAYS_DEFAULT; m_settings[i].retention_days = RETENTION_DAYS_DEFAULT;
+2 -107
View File
@@ -58,9 +58,6 @@ namespace PlayerEvent {
ITEM_CREATION, ITEM_CREATION,
GUILD_TRIBUTE_DONATE_ITEM, GUILD_TRIBUTE_DONATE_ITEM,
GUILD_TRIBUTE_DONATE_PLAT, GUILD_TRIBUTE_DONATE_PLAT,
PARCEL_SEND,
PARCEL_RETRIEVE,
PARCEL_DELETE,
MAX // dont remove MAX // dont remove
}; };
@@ -69,7 +66,7 @@ namespace PlayerEvent {
// If event is unimplemented just tag (Unimplemented) in the name // If event is unimplemented just tag (Unimplemented) in the name
// Events don't get saved to the database if unimplemented or deprecated // Events don't get saved to the database if unimplemented or deprecated
// Events tagged as deprecated will get automatically removed // Events tagged as deprecated will get automatically removed
static const char *EventName[EventType::MAX] = { static const char *EventName[PlayerEvent::MAX] = {
"None", "None",
"GM Command", "GM Command",
"Zoning", "Zoning",
@@ -119,10 +116,7 @@ namespace PlayerEvent {
"Killed Raid NPC", "Killed Raid NPC",
"Item Creation", "Item Creation",
"Guild Tribute Donate Item", "Guild Tribute Donate Item",
"Guild Tribute Donate Platinum", "Guild Tribute Donate Platinum"
"Parcel Item Sent",
"Parcel Item Retrieved",
"Parcel Prune Routine"
}; };
// Generic struct used by all events // Generic struct used by all events
@@ -982,105 +976,6 @@ namespace PlayerEvent {
); );
} }
}; };
struct ParcelRetrieve {
uint32 item_id;
uint32 quantity;
std::string from_player_name;
uint32 sent_date;
uint32 aug_slot_1;
uint32 aug_slot_2;
uint32 aug_slot_3;
uint32 aug_slot_4;
uint32 aug_slot_5;
uint32 aug_slot_6;
// cereal
template<class Archive>
void serialize(Archive &ar)
{
ar(
CEREAL_NVP(item_id),
CEREAL_NVP(quantity),
CEREAL_NVP(from_player_name),
CEREAL_NVP(sent_date),
CEREAL_NVP(aug_slot_1),
CEREAL_NVP(aug_slot_2),
CEREAL_NVP(aug_slot_3),
CEREAL_NVP(aug_slot_4),
CEREAL_NVP(aug_slot_5),
CEREAL_NVP(aug_slot_6)
);
}
};
struct ParcelSend {
uint32 item_id;
uint32 quantity;
std::string from_player_name;
std::string to_player_name;
uint32 sent_date;
uint32 aug_slot_1;
uint32 aug_slot_2;
uint32 aug_slot_3;
uint32 aug_slot_4;
uint32 aug_slot_5;
uint32 aug_slot_6;
// cereal
template<class Archive>
void serialize(Archive &ar)
{
ar(
CEREAL_NVP(item_id),
CEREAL_NVP(quantity),
CEREAL_NVP(from_player_name),
CEREAL_NVP(to_player_name),
CEREAL_NVP(sent_date),
CEREAL_NVP(aug_slot_1),
CEREAL_NVP(aug_slot_2),
CEREAL_NVP(aug_slot_3),
CEREAL_NVP(aug_slot_4),
CEREAL_NVP(aug_slot_5),
CEREAL_NVP(aug_slot_6)
);
}
};
struct ParcelDelete {
uint32 item_id;
uint32 quantity;
uint32 char_id;
std::string from_name;
std::string note;
uint32 sent_date;
uint32 aug_slot_1;
uint32 aug_slot_2;
uint32 aug_slot_3;
uint32 aug_slot_4;
uint32 aug_slot_5;
uint32 aug_slot_6;
// cereal
template<class Archive>
void serialize(Archive &ar)
{
ar(
CEREAL_NVP(item_id),
CEREAL_NVP(quantity),
CEREAL_NVP(char_id),
CEREAL_NVP(from_name),
CEREAL_NVP(note),
CEREAL_NVP(sent_date),
CEREAL_NVP(aug_slot_1),
CEREAL_NVP(aug_slot_2),
CEREAL_NVP(aug_slot_3),
CEREAL_NVP(aug_slot_4),
CEREAL_NVP(aug_slot_5),
CEREAL_NVP(aug_slot_6)
);
}
};
} }
#endif //EQEMU_PLAYER_EVENTS_H #endif //EQEMU_PLAYER_EVENTS_H
+5
View File
@@ -82,6 +82,10 @@ Zone extensions and features
#define QUEST_GLOBAL_DIRECTORY "global" #define QUEST_GLOBAL_DIRECTORY "global"
#endif #endif
// Number of quest items a Quest NPC can hold
#define MAX_NPC_QUEST_INVENTORY 24
//the min ratio at which a mob's speed is reduced //the min ratio at which a mob's speed is reduced
#define FLEE_HP_MINSPEED 22 #define FLEE_HP_MINSPEED 22
//number of tics to try to run straight away before looking again //number of tics to try to run straight away before looking again
@@ -111,6 +115,7 @@ Zone extensions and features
#define SKILL_MAX_LEVEL 75 #define SKILL_MAX_LEVEL 75
/* /*
Zone Numerical configuration Zone Numerical configuration
+31 -37
View File
@@ -92,20 +92,10 @@ BaseGuildManager::~BaseGuildManager()
bool BaseGuildManager::LoadGuilds() bool BaseGuildManager::LoadGuilds()
{ {
ClearGuilds(); ClearGuilds();
auto guilds = GuildsRepository::GetWhere( auto guilds = GuildsRepository::All(*m_db);
*m_db, auto guilds_ranks = GuildRanksRepository::All(*m_db);
fmt::format("`id` < '{}'", RoF2::constants::MAX_GUILD_ID) auto guilds_permissions = GuildPermissionsRepository::All(*m_db);
); auto guilds_tributes = GuildTributesRepository::All(*m_db);
auto guilds_ranks = GuildRanksRepository::LoadAll(*m_db);
auto guilds_permissions = GuildPermissionsRepository::LoadAll(*m_db);
auto guilds_tributes = GuildTributesRepository::GetWhere(
*m_db,
fmt::format(
"`guild_id` < '{}'",
RoF2::constants::MAX_GUILD_ID
)
);
if (guilds.empty()) { if (guilds.empty()) {
LogGuilds("No Guilds found in database."); LogGuilds("No Guilds found in database.");
@@ -118,28 +108,23 @@ bool BaseGuildManager::LoadGuilds()
_CreateGuild(g.id, g.name, g.leader, g.minstatus, g.motd, g.motd_setter, g.channel, g.url, g.favor); _CreateGuild(g.id, g.name, g.leader, g.minstatus, g.motd, g.motd_setter, g.channel, g.url, g.favor);
for (int i = 1; i <= GUILD_MAX_RANK; i++) { for (auto const &r: guilds_ranks) {
auto key = fmt::format("{}-{}", g.id, i); if (r.guild_id == g.id) {
m_guilds[g.id]->rank_names[r.rank_] = r.title;
if (guilds_ranks.contains(key)) {
m_guilds[g.id]->rank_names[i] = guilds_ranks.find(key)->second;
} }
} }
auto count = 0; auto count = 0;
for (int i = 1; i <= GUILD_MAX_FUNCTIONS; i++) { for (auto const &p: guilds_permissions) {
auto key = fmt::format("{}-{}", g.id, i); if (p.guild_id == g.id) {
if (guilds_permissions.contains(key)) {
auto p = guilds_permissions.find(key)->second;
m_guilds[g.id]->functions[p.perm_id].id = p.id; m_guilds[g.id]->functions[p.perm_id].id = p.id;
m_guilds[g.id]->functions[p.perm_id].guild_id = p.guild_id; m_guilds[g.id]->functions[p.perm_id].guild_id = p.guild_id;
m_guilds[g.id]->functions[p.perm_id].perm_id = p.perm_id; m_guilds[g.id]->functions[p.perm_id].perm_id = p.perm_id;
m_guilds[g.id]->functions[p.perm_id].perm_value = p.permission; m_guilds[g.id]->functions[p.perm_id].perm_value = p.permission;
}
count++; count++;
} }
}
if (count < GUILD_MAX_FUNCTIONS) { if (count < GUILD_MAX_FUNCTIONS) {
store_to_db = true; store_to_db = true;
@@ -944,24 +929,33 @@ bool BaseGuildManager::GetCharInfo(uint32 char_id, CharGuildInfo &into)
} }
GuildsListMessaging_Struct BaseGuildManager::MakeGuildList() //returns ownership of the buffer.
uint8 *BaseGuildManager::MakeGuildList(const char *head_name, uint32 &length) const
{ {
GuildsListMessaging_Struct guild_list_messaging{}; //dynamic structs will make this a lot less painful.
uint32 string_length = 0;
for (auto const &g: m_guilds) { length = sizeof(GuildsList_Struct);
GuildsListMessagingEntry_Struct guild_entry{}; auto buffer = new uint8[length];
guild_entry.guild_id = g.first; //a bit little better than memsetting the whole thing...
guild_entry.guild_name = g.second->name; uint32 r, pos;
string_length += g.second->name.length() + 1; for (r = 0, pos = 0; r <= MAX_NUMBER_GUILDS; r++, pos += 64) {
guild_list_messaging.guild_detail.push_back(guild_entry); //strcpy((char *) buffer+pos, "BAD GUILD");
// These 'BAD GUILD' entries were showing in the drop-downs for selecting guilds in the LFP window,
// so just fill unused entries with an empty string instead.
buffer[pos] = '\0';
} }
guild_list_messaging.no_of_guilds = m_guilds.size(); strn0cpy((char *) buffer, head_name, 64);
guild_list_messaging.string_length = string_length;
return guild_list_messaging; std::map<uint32, GuildInfo *>::const_iterator cur, end;
cur = m_guilds.begin();
end = m_guilds.end();
for (; cur != end; ++cur) {
pos = 64 + (64 * cur->first);
strn0cpy((char *) buffer + pos, cur->second->name.c_str(), 64);
}
return (buffer);
} }
const char *BaseGuildManager::GetRankName(uint32 guild_id, uint8 rank) const const char *BaseGuildManager::GetRankName(uint32 guild_id, uint8 rank) const
+1 -1
View File
@@ -134,7 +134,7 @@ class BaseGuildManager
bool CheckGMStatus(uint32 guild_id, uint8 status) const; bool CheckGMStatus(uint32 guild_id, uint8 status) const;
bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const; bool CheckPermission(uint32 guild_id, uint8 rank, GuildAction act) const;
bool UpdateDbBankerFlag(uint32 charid, bool is_banker); bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
GuildsListMessaging_Struct MakeGuildList(); uint8* MakeGuildList(const char* head_name, uint32& length) const; //make a guild list packet, returns ownership of the buffer.
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const; uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
uint32 GetGuildIDByName(const char *GuildName); uint32 GetGuildIDByName(const char *GuildName);
uint32 GetGuildIDByCharacterID(uint32 character_id); uint32 GetGuildIDByCharacterID(uint32 character_id);
+2
View File
@@ -25,6 +25,8 @@ struct LootItem {
uint16 trivial_max_level; uint16 trivial_max_level;
uint16 npc_min_level; uint16 npc_min_level;
uint16 npc_max_level; uint16 npc_max_level;
uint8 quest;
uint8 pet;
}; };
typedef std::list<LootItem*> LootItems; typedef std::list<LootItem*> LootItems;
+28
View File
@@ -3089,6 +3089,21 @@ namespace RoF
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(Merchant_Click_Struct);
SETUP_DIRECT_ENCODE(Merchant_Click_Struct, structs::Merchant_Click_Struct);
OUT(npcid);
OUT(playerid);
OUT(command);
OUT(rate);
eq->unknown01 = 3; // Not sure what these values do yet, but list won't display without them
eq->unknown02 = 2592000;
FINISH_ENCODE();
}
ENCODE(OP_SkillUpdate) ENCODE(OP_SkillUpdate)
{ {
ENCODE_LENGTH_EXACT(SkillUpdate_Struct); ENCODE_LENGTH_EXACT(SkillUpdate_Struct);
@@ -5032,6 +5047,19 @@ namespace RoF
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopRequest)
{
DECODE_LENGTH_EXACT(structs::Merchant_Click_Struct);
SETUP_DIRECT_DECODE(Merchant_Click_Struct, structs::Merchant_Click_Struct);
IN(npcid);
IN(playerid);
IN(command);
IN(rate);
FINISH_DIRECT_DECODE();
}
DECODE(OP_Trader) DECODE(OP_Trader)
{ {
uint32 psize = __packet->size; uint32 psize = __packet->size;
+80 -106
View File
@@ -1403,33 +1403,56 @@ namespace RoF2
EQApplicationPacket *in = *p; EQApplicationPacket *in = *p;
*p = nullptr; *p = nullptr;
GuildsListMessaging_Struct glms{}; uint32 NumberOfGuilds = in->size / 64;
EQ::Util::MemoryStreamReader ss(reinterpret_cast<char *>(in->pBuffer), in->size); uint32 PacketSize = 68; // 64 x 0x00 + a uint32 that I am guessing is the highest guild ID in use.
cereal::BinaryInputArchive ar(ss);
ar(glms);
auto packet_size = 64 + 4 + glms.guild_detail.size() * 4 + glms.string_length; unsigned char *__emu_buffer = in->pBuffer;
auto buffer = new uchar[packet_size];
auto buf_pos = buffer;
memset(buf_pos, 0, 64); char *InBuffer = (char *)__emu_buffer;
buf_pos += 64;
VARSTRUCT_ENCODE_TYPE(uint32, buf_pos, glms.no_of_guilds); uint32 HighestGuildID = 0;
for (auto const &g: glms.guild_detail) { for (unsigned int i = 0; i < NumberOfGuilds; ++i)
if (g.guild_id < RoF2::constants::MAX_GUILD_ID) { {
VARSTRUCT_ENCODE_TYPE(uint32, buf_pos, g.guild_id); if (InBuffer[0])
strn0cpy((char *) buf_pos, g.guild_name.c_str(), g.guild_name.length() + 1); {
buf_pos += g.guild_name.length() + 1; PacketSize += (5 + strlen(InBuffer));
HighestGuildID += 1;
} }
InBuffer += 64;
} }
auto outapp = new EQApplicationPacket(OP_GuildsList); PacketSize++; // Appears to be an extra 0x00 at the very end.
outapp->size = packet_size;
outapp->pBuffer = buffer;
dest->FastQueuePacket(&outapp); in->size = PacketSize;
in->pBuffer = new unsigned char[in->size];
InBuffer = (char *)__emu_buffer;
char *OutBuffer = (char *)in->pBuffer;
// Init the first 64 bytes to zero, as per live.
//
memset(OutBuffer, 0, 64);
OutBuffer += 64;
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, HighestGuildID);
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
{
if (InBuffer[0])
{
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, i - 1);
VARSTRUCT_ENCODE_STRING(OutBuffer, InBuffer);
}
InBuffer += 64;
}
VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0x00);
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
} }
ENCODE(OP_GuildTributeDonateItem) ENCODE(OP_GuildTributeDonateItem)
@@ -1556,75 +1579,30 @@ namespace RoF2
*p = nullptr; *p = nullptr;
//store away the emu struct //store away the emu struct
uchar *__emu_buffer = in->pBuffer; uchar* __emu_buffer = in->pBuffer;
ItemPacket_Struct *old_item_pkt = (ItemPacket_Struct *) __emu_buffer;
switch(old_item_pkt->PacketType) ItemPacket_Struct* old_item_pkt = (ItemPacket_Struct*)__emu_buffer;
{ EQ::InternalSerializedItem_Struct* int_struct = (EQ::InternalSerializedItem_Struct*)(&__emu_buffer[4]);
case ItemPacketParcel: {
ParcelMessaging_Struct pms{};
EQ::Util::MemoryStreamReader ss(reinterpret_cast<char *>(in->pBuffer), in->size);
cereal::BinaryInputArchive ar(ss);
ar(pms);
uint32 player_name_length = pms.player_name.length();
uint32 note_length = pms.note.length();
auto *int_struct = (EQ::InternalSerializedItem_Struct *) pms.serialized_item.data();
EQ::OutBuffer ob;
EQ::OutBuffer::pos_type last_pos = ob.tellp();
ob.write(reinterpret_cast<const char *>(&pms.packet_type), 4);
SerializeItem(ob, (const EQ::ItemInstance *) int_struct->inst, pms.slot_id, 0, ItemPacketParcel);
if (ob.tellp() == last_pos) {
LogNetcode("RoF2::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", pms.slot_id);
safe_delete_array(__emu_buffer);
safe_delete(in);
return;
}
ob.write((const char *) &pms.sent_time, 4);
ob.write((const char *) &player_name_length, 4);
ob.write(pms.player_name.c_str(), pms.player_name.length());
ob.write((const char *) &note_length, 4);
ob.write(pms.note.c_str(), pms.note.length());
in->size = ob.size();
in->pBuffer = ob.detach();
safe_delete_array(__emu_buffer);
dest->FastQueuePacket(&in, ack_req);
break;
}
default: {
EQ::InternalSerializedItem_Struct *int_struct = (EQ::InternalSerializedItem_Struct *)(&__emu_buffer[4]);
EQ::OutBuffer ob; EQ::OutBuffer ob;
EQ::OutBuffer::pos_type last_pos = ob.tellp(); EQ::OutBuffer::pos_type last_pos = ob.tellp();
ob.write((const char *)__emu_buffer, 4); ob.write((const char*)__emu_buffer, 4);
SerializeItem(ob, (const EQ::ItemInstance *)int_struct->inst, int_struct->slot_id, 0, SerializeItem(ob, (const EQ::ItemInstance*)int_struct->inst, int_struct->slot_id, 0, old_item_pkt->PacketType);
old_item_pkt->PacketType);
if (ob.tellp() == last_pos) { if (ob.tellp() == last_pos) {
LogNetcode("RoF2::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", LogNetcode("RoF2::ENCODE(OP_ItemPacket) Serialization failed on item slot [{}]", int_struct->slot_id);
int_struct->slot_id); delete in;
safe_delete_array(__emu_buffer);
safe_delete(in);
return; return;
} }
in->size = ob.size(); in->size = ob.size();
in->pBuffer = ob.detach(); in->pBuffer = ob.detach();
safe_delete_array(__emu_buffer); delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req); dest->FastQueuePacket(&in, ack_req);
} }
}
}
ENCODE(OP_ItemVerifyReply) ENCODE(OP_ItemVerifyReply)
{ {
@@ -3185,6 +3163,21 @@ namespace RoF2
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(Merchant_Click_Struct);
SETUP_DIRECT_ENCODE(Merchant_Click_Struct, structs::Merchant_Click_Struct);
OUT(npcid);
OUT(playerid);
OUT(command);
OUT(rate);
eq->unknown01 = 3; // Not sure what these values do yet, but list won't display without them
eq->unknown02 = 2592000;
FINISH_ENCODE();
}
ENCODE(OP_SkillUpdate) ENCODE(OP_SkillUpdate)
{ {
ENCODE_LENGTH_EXACT(SkillUpdate_Struct); ENCODE_LENGTH_EXACT(SkillUpdate_Struct);
@@ -5314,17 +5307,15 @@ namespace RoF2
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopSendParcel) DECODE(OP_ShopRequest)
{ {
DECODE_LENGTH_EXACT(structs::Parcel_Struct); DECODE_LENGTH_EXACT(structs::Merchant_Click_Struct);
SETUP_DIRECT_DECODE(Parcel_Struct, structs::Parcel_Struct); SETUP_DIRECT_DECODE(Merchant_Click_Struct, structs::Merchant_Click_Struct);
IN(npc_id); IN(npcid);
IN(quantity); IN(playerid);
IN(money_flag); IN(command);
emu->item_slot = RoF2ToServerTypelessSlot(eq->inventory_slot, invtype::typePossessions); IN(rate);
strn0cpy(emu->send_to, eq->send_to, sizeof(emu->send_to));
strn0cpy(emu->note, eq->note, sizeof(emu->note));
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
@@ -5543,24 +5534,11 @@ namespace RoF2
//sprintf(hdr.unknown000, "06e0002Y1W00"); //sprintf(hdr.unknown000, "06e0002Y1W00");
snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID); snprintf(hdr.unknown000, sizeof(hdr.unknown000), "%016d", item->ID);
if (packet_type == ItemPacketParcel) {
strn0cpy(
hdr.unknown000,
fmt::format(
"{:03}PAR{:010}\0",
inst->GetMerchantSlot(),
item->ID
).c_str(),
sizeof(hdr.unknown000)
);
}
hdr.stacksize = hdr.stacksize = (inst->IsStackable() ? ((inst->GetCharges() > 1000) ? 0xFFFFFFFF : inst->GetCharges()) : 1);
item->ID == PARCEL_MONEY_ITEM_ID ? inst->GetPrice() : (inst->IsStackable() ? ((inst->GetCharges() > 1000)
? 0xFFFFFFFF : inst->GetCharges()) : 1);
hdr.unknown004 = 0; hdr.unknown004 = 0;
structs::InventorySlot_Struct slot_id{}; structs::InventorySlot_Struct slot_id;
switch (packet_type) { switch (packet_type) {
case ItemPacketLoot: case ItemPacketLoot:
slot_id = ServerToRoF2CorpseSlot(slot_id_in); slot_id = ServerToRoF2CorpseSlot(slot_id_in);
@@ -5575,14 +5553,12 @@ namespace RoF2
hdr.sub_slot = (inst->GetMerchantSlot() ? 0xffff : slot_id.SubIndex); hdr.sub_slot = (inst->GetMerchantSlot() ? 0xffff : slot_id.SubIndex);
hdr.aug_slot = (inst->GetMerchantSlot() ? 0xffff : slot_id.AugIndex); hdr.aug_slot = (inst->GetMerchantSlot() ? 0xffff : slot_id.AugIndex);
hdr.price = inst->GetPrice(); hdr.price = inst->GetPrice();
hdr.merchant_slot = ((inst->GetMerchantSlot() ? inst->GetMerchantCount() : 1)); hdr.merchant_slot = (inst->GetMerchantSlot() ? inst->GetMerchantCount() : 1);
hdr.scaled_value = (inst->IsScaling() ? (inst->GetExp() / 100) : 0); hdr.scaled_value = (inst->IsScaling() ? (inst->GetExp() / 100) : 0);
hdr.instance_id = (inst->GetMerchantSlot() ? inst->GetMerchantSlot() : inst->GetSerialNumber()); hdr.instance_id = (inst->GetMerchantSlot() ? inst->GetMerchantSlot() : inst->GetSerialNumber());
hdr.parcel_item_id = packet_type == ItemPacketParcel ? inst->GetID() : 0; hdr.unknown028 = 0;
hdr.last_cast_time = inst->GetRecastTimestamp(); hdr.last_cast_time = inst->GetRecastTimestamp();
hdr.charges = (inst->IsStackable() ? (item->MaxCharges ? 1 : 0) : ((inst->GetCharges() > 254) hdr.charges = (inst->IsStackable() ? (item->MaxCharges ? 1 : 0) : ((inst->GetCharges() > 254) ? 0xFFFFFFFF : inst->GetCharges()));
? 0xFFFFFFFF
: inst->GetCharges()));
hdr.inst_nodrop = (inst->IsAttuned() ? 1 : 0); hdr.inst_nodrop = (inst->IsAttuned() ? 1 : 0);
hdr.unknown044 = 0; hdr.unknown044 = 0;
hdr.unknown048 = 0; hdr.unknown048 = 0;
@@ -5645,10 +5621,9 @@ namespace RoF2
ob.write((const char*)&hdrf, sizeof(RoF2::structs::ItemSerializationHeaderFinish)); ob.write((const char*)&hdrf, sizeof(RoF2::structs::ItemSerializationHeaderFinish));
if (strlen(item->Name) > 0) { if (strlen(item->Name) > 0)
ob.write(item->Name, strlen(item->Name)); ob.write(item->Name, strlen(item->Name));
ob.write("\0", 1); ob.write("\0", 1);
}
if (strlen(item->Lore) > 0) if (strlen(item->Lore) > 0)
ob.write(item->Lore, strlen(item->Lore)); ob.write(item->Lore, strlen(item->Lore));
@@ -5810,8 +5785,7 @@ namespace RoF2
itbs.potion_belt_enabled = item->PotionBelt; itbs.potion_belt_enabled = item->PotionBelt;
itbs.potion_belt_slots = item->PotionBeltSlots; itbs.potion_belt_slots = item->PotionBeltSlots;
itbs.stacksize = itbs.stacksize = (inst->IsStackable() ? item->StackSize : 0);
item->ID == PARCEL_MONEY_ITEM_ID ? 0x7FFFFFFF : ((inst->IsStackable() ? item->StackSize : 0));
itbs.no_transfer = item->NoTransfer; itbs.no_transfer = item->NoTransfer;
itbs.expendablearrow = item->ExpendableArrow; itbs.expendablearrow = item->ExpendableArrow;
+2 -1
View File
@@ -165,6 +165,8 @@ namespace RoF2
const int16 SLOT_INVALID = IINVALID; const int16 SLOT_INVALID = IINVALID;
const int16 SLOT_BEGIN = INULL; const int16 SLOT_BEGIN = INULL;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
@@ -271,7 +273,6 @@ namespace RoF2
const size_t CHARACTER_CREATION_LIMIT = 12; const size_t CHARACTER_CREATION_LIMIT = 12;
const size_t SAY_LINK_BODY_SIZE = 56; const size_t SAY_LINK_BODY_SIZE = 56;
const uint32 MAX_GUILD_ID = 50000;
} /*constants*/ } /*constants*/
+2 -1
View File
@@ -116,6 +116,7 @@ E(OP_SendZonepoints)
E(OP_SetGuildRank) E(OP_SetGuildRank)
E(OP_ShopPlayerBuy) E(OP_ShopPlayerBuy)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SkillUpdate) E(OP_SkillUpdate)
E(OP_SomeItemPacketMaybe) E(OP_SomeItemPacketMaybe)
E(OP_SpawnAppearance) E(OP_SpawnAppearance)
@@ -199,7 +200,7 @@ D(OP_Save)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerBuy) D(OP_ShopPlayerBuy)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopSendParcel) D(OP_ShopRequest)
D(OP_Trader) D(OP_Trader)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
+26 -40
View File
@@ -2247,17 +2247,15 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct struct Merchant_Click_Struct {
{ /*000*/ uint32 npcid; // Merchant NPC's entity id
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*004*/ uint32 playerid;
/*004*/ uint32 player_id; /*008*/ uint32 command; // 1=open, 0=cancel/close
/*008*/ uint32 command; // 1=open, 0=cancel/close /*012*/ float rate; // cost multiplier, dosent work anymore
/*012*/ float rate; // cost multiplier, dosent work anymore /*016*/ int32 unknown01; // Seen 3 from Server or -1 from Client
/*016*/ int32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels /*020*/ int32 unknown02; // Seen 2592000 from Server or -1 from Client
/*020*/ int32 unknown02; // Seen 2592000 from Server or -1 from Client /*024*/
/*024*/
}; };
/* /*
Unknowns: Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE 0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
@@ -4574,24 +4572,24 @@ struct RoF2SlotStruct
struct ItemSerializationHeader struct ItemSerializationHeader
{ {
/*000*/ char unknown000[17]; // New for HoT. Looks like a string. /*000*/ char unknown000[17]; // New for HoT. Looks like a string.
/*017*/ uint32 stacksize; /*017*/ uint32 stacksize;
/*021*/ uint32 unknown004; /*021*/ uint32 unknown004;
/*025*/ uint8 slot_type; // 0 = normal, 1 = bank, 2 = shared bank, 9 = merchant, 20 = ? /*025*/ uint8 slot_type; // 0 = normal, 1 = bank, 2 = shared bank, 9 = merchant, 20 = ?
/*026*/ uint16 main_slot; /*026*/ uint16 main_slot;
/*028*/ uint16 sub_slot; /*028*/ uint16 sub_slot;
/*030*/ uint16 aug_slot; // 0xffff /*030*/ uint16 aug_slot; // 0xffff
/*032*/ uint32 price; /*032*/ uint32 price;
/*036*/ uint32 merchant_slot; // 1 if not a merchant item /*036*/ uint32 merchant_slot; //1 if not a merchant item
/*040*/ uint32 scaled_value; // 0 /*040*/ uint32 scaled_value; //0
/*044*/ uint32 instance_id; // unique instance id if not merchant item, else is merchant slot /*044*/ uint32 instance_id; //unique instance id if not merchant item, else is merchant slot
/*048*/ uint32 parcel_item_id; /*048*/ uint32 unknown028; //0
/*052*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0 /*052*/ uint32 last_cast_time; // Unix Time from PP of last cast for this recast type if recast delay > 0
/*056*/ uint32 charges; // Total Charges an item has (-1 for unlimited) /*056*/ uint32 charges; //Total Charges an item has (-1 for unlimited)
/*060*/ uint32 inst_nodrop; // 1 if the item is no drop (attuned items) /*060*/ uint32 inst_nodrop; // 1 if the item is no drop (attuned items)
/*064*/ uint32 unknown044; // 0 /*064*/ uint32 unknown044; // 0
/*068*/ uint32 unknown048; // 0 /*068*/ uint32 unknown048; // 0
/*072*/ uint32 unknown052; // 0 /*072*/ uint32 unknown052; // 0
uint8 isEvolving; uint8 isEvolving;
}; };
@@ -5263,18 +5261,6 @@ struct Checksum_Struct {
uint8_t data[2048]; uint8_t data[2048];
}; };
struct Parcel_Struct
{
/*000*/ uint32 npc_id;
/*004*/ TypelessInventorySlot_Struct inventory_slot;
/*012*/ uint32 quantity;
/*016*/ uint32 money_flag;
/*020*/ char send_to[64];
/*084*/ char note[128];
/*212*/ uint32 unknown_212;
/*216*/ uint32 unknown_216;
/*220*/ uint32 unknown_220;
};
}; /*structs*/ }; /*structs*/
}; /*RoF2*/ }; /*RoF2*/
+2
View File
@@ -162,6 +162,8 @@ namespace RoF
const int16 SLOT_INVALID = IINVALID; const int16 SLOT_INVALID = IINVALID;
const int16 SLOT_BEGIN = INULL; const int16 SLOT_BEGIN = INULL;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
+2
View File
@@ -101,6 +101,7 @@ E(OP_SendZonepoints)
E(OP_SetGuildRank) E(OP_SetGuildRank)
E(OP_ShopPlayerBuy) E(OP_ShopPlayerBuy)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SkillUpdate) E(OP_SkillUpdate)
E(OP_SomeItemPacketMaybe) E(OP_SomeItemPacketMaybe)
E(OP_SpawnAppearance) E(OP_SpawnAppearance)
@@ -182,6 +183,7 @@ D(OP_Save)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerBuy) D(OP_ShopPlayerBuy)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopRequest)
D(OP_Trader) D(OP_Trader)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
+8 -10
View File
@@ -2200,17 +2200,15 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct struct Merchant_Click_Struct {
{ /*000*/ uint32 npcid; // Merchant NPC's entity id
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*004*/ uint32 playerid;
/*004*/ uint32 player_id; /*008*/ uint32 command; // 1=open, 0=cancel/close
/*008*/ uint32 command; // 1=open, 0=cancel/close /*012*/ float rate; // cost multiplier, dosent work anymore
/*012*/ float rate; // cost multiplier, dosent work anymore /*016*/ int32 unknown01; // Seen 3 from Server or -1 from Client
/*016*/ int32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels /*020*/ int32 unknown02; // Seen 2592000 from Server or -1 from Client
/*020*/ int32 unknown020; // Seen 2592000 from Server or -1 from Client /*024*/
/*024*/
}; };
/* /*
Unknowns: Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE 0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
-28
View File
@@ -2026,19 +2026,6 @@ namespace SoD
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(MerchantClick_Struct);
SETUP_DIRECT_ENCODE(MerchantClick_Struct, structs::MerchantClick_Struct);
OUT(npc_id);
OUT(player_id);
OUT(command);
OUT(rate);
FINISH_ENCODE();
}
ENCODE(OP_SomeItemPacketMaybe) ENCODE(OP_SomeItemPacketMaybe)
{ {
// This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow // This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow
@@ -3496,21 +3483,6 @@ namespace SoD
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopRequest)
{
DECODE_LENGTH_EXACT(structs::MerchantClick_Struct);
SETUP_DIRECT_DECODE(MerchantClick_Struct, structs::MerchantClick_Struct);
IN(npc_id);
IN(player_id);
IN(command);
IN(rate);
emu->tab_display = 0;
emu->unknown020 = 0;
FINISH_DIRECT_DECODE();
}
DECODE(OP_TraderBuy) DECODE(OP_TraderBuy)
{ {
DECODE_LENGTH_EXACT(structs::TraderBuy_Struct); DECODE_LENGTH_EXACT(structs::TraderBuy_Struct);
+2
View File
@@ -152,6 +152,8 @@ namespace SoD
const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000; const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
-2
View File
@@ -78,7 +78,6 @@ E(OP_SendCharInfo)
E(OP_SendZonepoints) E(OP_SendZonepoints)
E(OP_ShopPlayerBuy) E(OP_ShopPlayerBuy)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SomeItemPacketMaybe) E(OP_SomeItemPacketMaybe)
E(OP_SpawnDoor) E(OP_SpawnDoor)
E(OP_SpecialMesg) E(OP_SpecialMesg)
@@ -142,7 +141,6 @@ D(OP_Save)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerBuy) D(OP_ShopPlayerBuy)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopRequest)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
D(OP_TributeItem) D(OP_TributeItem)
+5 -9
View File
@@ -1845,16 +1845,12 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct struct Merchant_Click_Struct {
{ /*000*/ uint32 npcid; // Merchant NPC's entity id
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*004*/ uint32 playerid;
/*004*/ uint32 player_id; /*008*/ uint32 command; //1=open, 0=cancel/close
/*008*/ uint32 command; // 1=open, 0=cancel/close /*012*/ float rate; //cost multiplier, dosent work anymore
/*012*/ float rate; // cost multiplier, dosent work anymore
/*016*/ int32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels
/*020*/ int32 unknown020; // Seen 2592000 from Server or -1 from Client
}; };
/* /*
Unknowns: Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE 0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
-28
View File
@@ -1683,19 +1683,6 @@ namespace SoF
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(MerchantClick_Struct);
SETUP_DIRECT_ENCODE(MerchantClick_Struct, structs::MerchantClick_Struct);
OUT(npc_id);
OUT(player_id);
OUT(command);
OUT(rate);
FINISH_ENCODE();
}
ENCODE(OP_SomeItemPacketMaybe) ENCODE(OP_SomeItemPacketMaybe)
{ {
// This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow // This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow
@@ -2887,21 +2874,6 @@ namespace SoF
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopRequest)
{
DECODE_LENGTH_EXACT(structs::MerchantClick_Struct);
SETUP_DIRECT_DECODE(MerchantClick_Struct, structs::MerchantClick_Struct);
IN(npc_id);
IN(player_id);
IN(command);
IN(rate);
emu->tab_display = 0;
emu->unknown020 = 0;
FINISH_DIRECT_DECODE();
}
DECODE(OP_TraderBuy) DECODE(OP_TraderBuy)
{ {
DECODE_LENGTH_EXACT(structs::TraderBuy_Struct); DECODE_LENGTH_EXACT(structs::TraderBuy_Struct);
+2
View File
@@ -152,6 +152,8 @@ namespace SoF
const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000; const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
-2
View File
@@ -72,7 +72,6 @@ E(OP_SendAATable)
E(OP_SendCharInfo) E(OP_SendCharInfo)
E(OP_SendZonepoints) E(OP_SendZonepoints)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SomeItemPacketMaybe) E(OP_SomeItemPacketMaybe)
E(OP_SpawnDoor) E(OP_SpawnDoor)
E(OP_SpecialMesg) E(OP_SpecialMesg)
@@ -129,7 +128,6 @@ D(OP_ReadBook)
D(OP_Save) D(OP_Save)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopRequest)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
D(OP_TributeItem) D(OP_TributeItem)
+5 -9
View File
@@ -1859,16 +1859,12 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct struct Merchant_Click_Struct {
{ /*000*/ uint32 npcid; // Merchant NPC's entity id
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*004*/ uint32 playerid;
/*004*/ uint32 player_id; /*008*/ uint32 command; //1=open, 0=cancel/close
/*008*/ uint32 command; // 1=open, 0=cancel/close /*012*/ float rate; //cost multiplier, dosent work anymore
/*012*/ float rate; // cost multiplier, dosent work anymore
/*016*/ int32 tab_display; // bitmask b000 none, b001 Purchase/Sell, b010 Recover, b100 Parcels
/*020*/ int32 unknown020; // Seen 2592000 from Server or -1 from Client
}; };
/* /*
Unknowns: Unknowns:
0 is e7 from 01 to // MAYBE SLOT IN PURCHASE 0 is e7 from 01 to // MAYBE SLOT IN PURCHASE
-50
View File
@@ -748,28 +748,6 @@ namespace Titanium
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_GuildsList)
{
EQApplicationPacket* in = *p;
*p = nullptr;
GuildsListMessaging_Struct glms{};
EQ::Util::MemoryStreamReader ss(reinterpret_cast<char *>(in->pBuffer), in->size);
cereal::BinaryInputArchive ar(ss);
ar(glms);
auto outapp = new EQApplicationPacket(OP_GuildsList, sizeof(structs::GuildsList_Struct));
auto out = (structs::GuildsList_Struct *) outapp->pBuffer;
for (auto const& g : glms.guild_detail) {
if (g.guild_id < Titanium::constants::MAX_GUILD_ID) {
strn0cpy(out->Guilds[g.guild_id].name, g.guild_name.c_str(), sizeof(out->Guilds[g.guild_id].name));
}
}
dest->FastQueuePacket(&outapp);
}
ENCODE(OP_GuildMemberAdd) ENCODE(OP_GuildMemberAdd)
{ {
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct) ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
@@ -1880,19 +1858,6 @@ namespace Titanium
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(MerchantClick_Struct);
SETUP_DIRECT_ENCODE(MerchantClick_Struct, structs::MerchantClick_Struct);
OUT(npc_id);
OUT(player_id);
OUT(command);
OUT(rate);
FINISH_ENCODE();
}
ENCODE(OP_SpecialMesg) ENCODE(OP_SpecialMesg)
{ {
EQApplicationPacket *in = *p; EQApplicationPacket *in = *p;
@@ -2910,21 +2875,6 @@ namespace Titanium
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopRequest)
{
DECODE_LENGTH_EXACT(structs::MerchantClick_Struct);
SETUP_DIRECT_DECODE(MerchantClick_Struct, structs::MerchantClick_Struct);
IN(npc_id);
IN(player_id);
IN(command);
IN(rate);
emu->tab_display = 0;
emu->unknown020 = 0;
FINISH_DIRECT_DECODE();
}
DECODE(OP_TraderBuy) DECODE(OP_TraderBuy)
{ {
DECODE_LENGTH_EXACT(structs::TraderBuy_Struct); DECODE_LENGTH_EXACT(structs::TraderBuy_Struct);
+2 -1
View File
@@ -151,6 +151,8 @@ namespace Titanium
const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000; const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
@@ -287,7 +289,6 @@ namespace Titanium
const size_t CHARACTER_CREATION_LIMIT = 8; // Hard-coded in client - DO NOT ALTER const size_t CHARACTER_CREATION_LIMIT = 8; // Hard-coded in client - DO NOT ALTER
const size_t SAY_LINK_BODY_SIZE = 45; const size_t SAY_LINK_BODY_SIZE = 45;
const uint32 MAX_GUILD_ID = 1500;
} /*constants*/ } /*constants*/
-3
View File
@@ -45,7 +45,6 @@ E(OP_Emote)
E(OP_FormattedMessage) E(OP_FormattedMessage)
E(OP_GroundSpawn) E(OP_GroundSpawn)
E(OP_SetGuildRank) E(OP_SetGuildRank)
E(OP_GuildsList)
E(OP_GuildMemberLevelUpdate) E(OP_GuildMemberLevelUpdate)
E(OP_GuildMemberList) E(OP_GuildMemberList)
E(OP_GuildMemberAdd) E(OP_GuildMemberAdd)
@@ -75,7 +74,6 @@ E(OP_SendCharInfo)
E(OP_SendAATable) E(OP_SendAATable)
E(OP_SetFace) E(OP_SetFace)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SpawnAppearance) E(OP_SpawnAppearance)
E(OP_SpecialMesg) E(OP_SpecialMesg)
E(OP_TaskDescription) E(OP_TaskDescription)
@@ -122,7 +120,6 @@ D(OP_RaidInvite)
D(OP_ReadBook) D(OP_ReadBook)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopRequest)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
D(OP_TributeItem) D(OP_TributeItem)
+3 -3
View File
@@ -1669,9 +1669,9 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct { struct Merchant_Click_Struct {
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*000*/ uint32 npcid; // Merchant NPC's entity id
/*004*/ uint32 player_id; /*004*/ uint32 playerid;
/*008*/ uint32 command; //1=open, 0=cancel/close /*008*/ uint32 command; //1=open, 0=cancel/close
/*012*/ float rate; //cost multiplier, dosent work anymore /*012*/ float rate; //cost multiplier, dosent work anymore
}; };
+38 -50
View File
@@ -1182,37 +1182,53 @@ namespace UF
ENCODE(OP_GuildsList) ENCODE(OP_GuildsList)
{ {
EQApplicationPacket* in = *p; EQApplicationPacket *in = *p;
*p = nullptr; *p = nullptr;
GuildsListMessaging_Struct glms{}; uint32 NumberOfGuilds = in->size / 64;
EQ::Util::MemoryStreamReader ss(reinterpret_cast<char *>(in->pBuffer), in->size); uint32 PacketSize = 68; // 64 x 0x00 + a uint32 that I am guessing is the highest guild ID in use.
cereal::BinaryInputArchive ar(ss);
ar(glms);
auto packet_size = 64 + 4 + glms.guild_detail.size() * 4 + glms.string_length; unsigned char *__emu_buffer = in->pBuffer;
auto buffer = new uchar[packet_size]; char *InBuffer = (char *)__emu_buffer;
auto buf_pos = buffer; uint32 actual_no_guilds = 0;
memset(buf_pos, 0, 64); for (unsigned int i = 0; i < NumberOfGuilds; ++i)
buf_pos += 64; {
if (InBuffer[0])
VARSTRUCT_ENCODE_TYPE(uint32, buf_pos, glms.no_of_guilds); {
PacketSize += (5 + strlen(InBuffer));
for (auto const& g : glms.guild_detail) { actual_no_guilds++;
if (g.guild_id < UF::constants::MAX_GUILD_ID) {
VARSTRUCT_ENCODE_TYPE(uint32, buf_pos, g.guild_id);
strn0cpy((char *) buf_pos, g.guild_name.c_str(), g.guild_name.length() + 1);
buf_pos += g.guild_name.length() + 1;
} }
InBuffer += 64;
} }
auto outapp = new EQApplicationPacket(OP_GuildsList); PacketSize++; // Appears to be an extra 0x00 at the very end.
in->size = PacketSize;
in->pBuffer = new unsigned char[in->size];
InBuffer = (char *)__emu_buffer;
char *OutBuffer = (char *)in->pBuffer;
outapp->size = packet_size; // Init the first 64 bytes to zero, as per live.
outapp->pBuffer = buffer; //
memset(OutBuffer, 0, 64);
OutBuffer += 64;
dest->FastQueuePacket(&outapp); VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, actual_no_guilds);
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
{
if (InBuffer[0])
{
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, i - 1);
VARSTRUCT_ENCODE_STRING(OutBuffer, InBuffer);
}
InBuffer += 64;
}
VARSTRUCT_ENCODE_TYPE(uint8, OutBuffer, 0x00);
delete[] __emu_buffer;
dest->FastQueuePacket(&in, ack_req);
} }
ENCODE(OP_GuildMemberAdd) ENCODE(OP_GuildMemberAdd)
@@ -2438,19 +2454,6 @@ namespace UF
FINISH_ENCODE(); FINISH_ENCODE();
} }
ENCODE(OP_ShopRequest)
{
ENCODE_LENGTH_EXACT(MerchantClick_Struct);
SETUP_DIRECT_ENCODE(MerchantClick_Struct, structs::MerchantClick_Struct);
OUT(npc_id);
OUT(player_id);
OUT(command);
OUT(rate);
FINISH_ENCODE();
}
ENCODE(OP_SomeItemPacketMaybe) ENCODE(OP_SomeItemPacketMaybe)
{ {
// This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow // This Opcode is not named very well. It is used for the animation of arrows leaving the player's bow
@@ -4044,21 +4047,6 @@ namespace UF
FINISH_DIRECT_DECODE(); FINISH_DIRECT_DECODE();
} }
DECODE(OP_ShopRequest)
{
DECODE_LENGTH_EXACT(structs::MerchantClick_Struct);
SETUP_DIRECT_DECODE(MerchantClick_Struct, structs::MerchantClick_Struct);
IN(npc_id);
IN(player_id);
IN(command);
IN(rate);
emu->tab_display = 0;
emu->unknown020 = 0;
FINISH_DIRECT_DECODE();
}
DECODE(OP_TraderBuy) DECODE(OP_TraderBuy)
{ {
DECODE_LENGTH_EXACT(structs::TraderBuy_Struct); DECODE_LENGTH_EXACT(structs::TraderBuy_Struct);
+2 -1
View File
@@ -152,6 +152,8 @@ namespace UF
const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000; const int16 SLOT_TRADESKILL_EXPERIMENT_COMBINE = 1000;
const int16 SLOT_QUEST = 9999;
const int16 POSSESSIONS_BEGIN = slotCharm; const int16 POSSESSIONS_BEGIN = slotCharm;
const int16 POSSESSIONS_END = slotCursor; const int16 POSSESSIONS_END = slotCursor;
const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1; const int16 POSSESSIONS_COUNT = (POSSESSIONS_END - POSSESSIONS_BEGIN) + 1;
@@ -289,7 +291,6 @@ namespace UF
const size_t CHARACTER_CREATION_LIMIT = 12; const size_t CHARACTER_CREATION_LIMIT = 12;
const size_t SAY_LINK_BODY_SIZE = 50; const size_t SAY_LINK_BODY_SIZE = 50;
const uint32 MAX_GUILD_ID = 50000;
} /*constants*/ } /*constants*/
-2
View File
@@ -89,7 +89,6 @@ E(OP_SendZonepoints)
E(OP_SetGuildRank) E(OP_SetGuildRank)
E(OP_ShopPlayerBuy) E(OP_ShopPlayerBuy)
E(OP_ShopPlayerSell) E(OP_ShopPlayerSell)
E(OP_ShopRequest)
E(OP_SomeItemPacketMaybe) E(OP_SomeItemPacketMaybe)
E(OP_SpawnAppearance) E(OP_SpawnAppearance)
E(OP_SpawnDoor) E(OP_SpawnDoor)
@@ -159,7 +158,6 @@ D(OP_Save)
D(OP_SetServerFilter) D(OP_SetServerFilter)
D(OP_ShopPlayerBuy) D(OP_ShopPlayerBuy)
D(OP_ShopPlayerSell) D(OP_ShopPlayerSell)
D(OP_ShopRequest)
D(OP_TraderBuy) D(OP_TraderBuy)
D(OP_TradeSkillCombine) D(OP_TradeSkillCombine)
D(OP_TributeItem) D(OP_TributeItem)
+3 -3
View File
@@ -1916,9 +1916,9 @@ struct TimeOfDay_Struct {
}; };
// Darvik: shopkeeper structs // Darvik: shopkeeper structs
struct MerchantClick_Struct { struct Merchant_Click_Struct {
/*000*/ uint32 npc_id; // Merchant NPC's entity id /*000*/ uint32 npcid; // Merchant NPC's entity id
/*004*/ uint32 player_id; /*004*/ uint32 playerid;
/*008*/ uint32 command; //1=open, 0=cancel/close /*008*/ uint32 command; //1=open, 0=cancel/close
/*012*/ float rate; //cost multiplier, dosent work anymore /*012*/ float rate; //cost multiplier, dosent work anymore
}; };
-18
View File
@@ -89,24 +89,6 @@ public:
return results.Success(); return results.Success();
} }
static std::string GetAutoLoginCharacterNameByAccountID(Database& db, const uint32 account_id)
{
return AccountRepository::FindOne(db, account_id).auto_login_charname;
}
static bool SetAutoLoginCharacterNameByAccountID(Database& db, const uint32 account_id, const std::string& character_name)
{
auto e = AccountRepository::FindOne(db, account_id);
if (!e.id) {
return false;
}
e.auto_login_charname = character_name;
return AccountRepository::UpdateOne(db, e);
}
}; };
#endif //EQEMU_ACCOUNT_REPOSITORY_H #endif //EQEMU_ACCOUNT_REPOSITORY_H
@@ -22,7 +22,6 @@ public:
int32_t id; int32_t id;
std::string name; std::string name;
std::string charname; std::string charname;
std::string auto_login_charname;
uint32_t sharedplat; uint32_t sharedplat;
std::string password; std::string password;
int32_t status; int32_t status;
@@ -57,7 +56,6 @@ public:
"id", "id",
"name", "name",
"charname", "charname",
"auto_login_charname",
"sharedplat", "sharedplat",
"password", "password",
"status", "status",
@@ -88,7 +86,6 @@ public:
"id", "id",
"name", "name",
"charname", "charname",
"auto_login_charname",
"sharedplat", "sharedplat",
"password", "password",
"status", "status",
@@ -153,7 +150,6 @@ public:
e.id = 0; e.id = 0;
e.name = ""; e.name = "";
e.charname = ""; e.charname = "";
e.auto_login_charname = "";
e.sharedplat = 0; e.sharedplat = 0;
e.password = ""; e.password = "";
e.status = 0; e.status = 0;
@@ -214,28 +210,27 @@ public:
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0; e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : ""; e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : ""; e.charname = row[2] ? row[2] : "";
e.auto_login_charname = row[3] ? row[3] : ""; e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.sharedplat = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0; e.password = row[4] ? row[4] : "";
e.password = row[5] ? row[5] : ""; e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.status = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0; e.ls_id = row[6] ? row[6] : "eqemu";
e.ls_id = row[7] ? row[7] : "eqemu"; e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.lsaccount_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0; e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.gmspeed = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0; e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.invulnerable = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0; e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.flymode = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0; e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.ignore_tells = row[12] ? static_cast<int8_t>(atoi(row[12])) : 0; e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.revoked = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0; e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.karma = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0; e.minilogin_ip = row[14] ? row[14] : "";
e.minilogin_ip = row[15] ? row[15] : ""; e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.hideme = row[16] ? static_cast<int8_t>(atoi(row[16])) : 0; e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.rulesflag = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0; e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.suspendeduntil = strtoll(row[18] ? row[18] : "-1", nullptr, 10); e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.time_creation = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0; e.ban_reason = row[19] ? row[19] : "";
e.ban_reason = row[20] ? row[20] : ""; e.suspend_reason = row[20] ? row[20] : "";
e.suspend_reason = row[21] ? row[21] : ""; e.crc_eqgame = row[21] ? row[21] : "";
e.crc_eqgame = row[22] ? row[22] : ""; e.crc_skillcaps = row[22] ? row[22] : "";
e.crc_skillcaps = row[23] ? row[23] : ""; e.crc_basedata = row[23] ? row[23] : "";
e.crc_basedata = row[24] ? row[24] : "";
return e; return e;
} }
@@ -271,28 +266,27 @@ public:
v.push_back(columns[1] + " = '" + Strings::Escape(e.name) + "'"); v.push_back(columns[1] + " = '" + Strings::Escape(e.name) + "'");
v.push_back(columns[2] + " = '" + Strings::Escape(e.charname) + "'"); v.push_back(columns[2] + " = '" + Strings::Escape(e.charname) + "'");
v.push_back(columns[3] + " = '" + Strings::Escape(e.auto_login_charname) + "'"); v.push_back(columns[3] + " = " + std::to_string(e.sharedplat));
v.push_back(columns[4] + " = " + std::to_string(e.sharedplat)); v.push_back(columns[4] + " = '" + Strings::Escape(e.password) + "'");
v.push_back(columns[5] + " = '" + Strings::Escape(e.password) + "'"); v.push_back(columns[5] + " = " + std::to_string(e.status));
v.push_back(columns[6] + " = " + std::to_string(e.status)); v.push_back(columns[6] + " = '" + Strings::Escape(e.ls_id) + "'");
v.push_back(columns[7] + " = '" + Strings::Escape(e.ls_id) + "'"); v.push_back(columns[7] + " = " + std::to_string(e.lsaccount_id));
v.push_back(columns[8] + " = " + std::to_string(e.lsaccount_id)); v.push_back(columns[8] + " = " + std::to_string(e.gmspeed));
v.push_back(columns[9] + " = " + std::to_string(e.gmspeed)); v.push_back(columns[9] + " = " + std::to_string(e.invulnerable));
v.push_back(columns[10] + " = " + std::to_string(e.invulnerable)); v.push_back(columns[10] + " = " + std::to_string(e.flymode));
v.push_back(columns[11] + " = " + std::to_string(e.flymode)); v.push_back(columns[11] + " = " + std::to_string(e.ignore_tells));
v.push_back(columns[12] + " = " + std::to_string(e.ignore_tells)); v.push_back(columns[12] + " = " + std::to_string(e.revoked));
v.push_back(columns[13] + " = " + std::to_string(e.revoked)); v.push_back(columns[13] + " = " + std::to_string(e.karma));
v.push_back(columns[14] + " = " + std::to_string(e.karma)); v.push_back(columns[14] + " = '" + Strings::Escape(e.minilogin_ip) + "'");
v.push_back(columns[15] + " = '" + Strings::Escape(e.minilogin_ip) + "'"); v.push_back(columns[15] + " = " + std::to_string(e.hideme));
v.push_back(columns[16] + " = " + std::to_string(e.hideme)); v.push_back(columns[16] + " = " + std::to_string(e.rulesflag));
v.push_back(columns[17] + " = " + std::to_string(e.rulesflag)); v.push_back(columns[17] + " = FROM_UNIXTIME(" + (e.suspendeduntil > 0 ? std::to_string(e.suspendeduntil) : "null") + ")");
v.push_back(columns[18] + " = FROM_UNIXTIME(" + (e.suspendeduntil > 0 ? std::to_string(e.suspendeduntil) : "null") + ")"); v.push_back(columns[18] + " = " + std::to_string(e.time_creation));
v.push_back(columns[19] + " = " + std::to_string(e.time_creation)); v.push_back(columns[19] + " = '" + Strings::Escape(e.ban_reason) + "'");
v.push_back(columns[20] + " = '" + Strings::Escape(e.ban_reason) + "'"); v.push_back(columns[20] + " = '" + Strings::Escape(e.suspend_reason) + "'");
v.push_back(columns[21] + " = '" + Strings::Escape(e.suspend_reason) + "'"); v.push_back(columns[21] + " = '" + Strings::Escape(e.crc_eqgame) + "'");
v.push_back(columns[22] + " = '" + Strings::Escape(e.crc_eqgame) + "'"); v.push_back(columns[22] + " = '" + Strings::Escape(e.crc_skillcaps) + "'");
v.push_back(columns[23] + " = '" + Strings::Escape(e.crc_skillcaps) + "'"); v.push_back(columns[23] + " = '" + Strings::Escape(e.crc_basedata) + "'");
v.push_back(columns[24] + " = '" + Strings::Escape(e.crc_basedata) + "'");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -317,7 +311,6 @@ public:
v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'"); v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.charname) + "'"); v.push_back("'" + Strings::Escape(e.charname) + "'");
v.push_back("'" + Strings::Escape(e.auto_login_charname) + "'");
v.push_back(std::to_string(e.sharedplat)); v.push_back(std::to_string(e.sharedplat));
v.push_back("'" + Strings::Escape(e.password) + "'"); v.push_back("'" + Strings::Escape(e.password) + "'");
v.push_back(std::to_string(e.status)); v.push_back(std::to_string(e.status));
@@ -371,7 +364,6 @@ public:
v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'"); v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.charname) + "'"); v.push_back("'" + Strings::Escape(e.charname) + "'");
v.push_back("'" + Strings::Escape(e.auto_login_charname) + "'");
v.push_back(std::to_string(e.sharedplat)); v.push_back(std::to_string(e.sharedplat));
v.push_back("'" + Strings::Escape(e.password) + "'"); v.push_back("'" + Strings::Escape(e.password) + "'");
v.push_back(std::to_string(e.status)); v.push_back(std::to_string(e.status));
@@ -429,28 +421,27 @@ public:
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0; e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : ""; e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : ""; e.charname = row[2] ? row[2] : "";
e.auto_login_charname = row[3] ? row[3] : ""; e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.sharedplat = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0; e.password = row[4] ? row[4] : "";
e.password = row[5] ? row[5] : ""; e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.status = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0; e.ls_id = row[6] ? row[6] : "eqemu";
e.ls_id = row[7] ? row[7] : "eqemu"; e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.lsaccount_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0; e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.gmspeed = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0; e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.invulnerable = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0; e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.flymode = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0; e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.ignore_tells = row[12] ? static_cast<int8_t>(atoi(row[12])) : 0; e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.revoked = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0; e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.karma = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0; e.minilogin_ip = row[14] ? row[14] : "";
e.minilogin_ip = row[15] ? row[15] : ""; e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.hideme = row[16] ? static_cast<int8_t>(atoi(row[16])) : 0; e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.rulesflag = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0; e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.suspendeduntil = strtoll(row[18] ? row[18] : "-1", nullptr, 10); e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.time_creation = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0; e.ban_reason = row[19] ? row[19] : "";
e.ban_reason = row[20] ? row[20] : ""; e.suspend_reason = row[20] ? row[20] : "";
e.suspend_reason = row[21] ? row[21] : ""; e.crc_eqgame = row[21] ? row[21] : "";
e.crc_eqgame = row[22] ? row[22] : ""; e.crc_skillcaps = row[22] ? row[22] : "";
e.crc_skillcaps = row[23] ? row[23] : ""; e.crc_basedata = row[23] ? row[23] : "";
e.crc_basedata = row[24] ? row[24] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -478,28 +469,27 @@ public:
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0; e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
e.name = row[1] ? row[1] : ""; e.name = row[1] ? row[1] : "";
e.charname = row[2] ? row[2] : ""; e.charname = row[2] ? row[2] : "";
e.auto_login_charname = row[3] ? row[3] : ""; e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.sharedplat = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0; e.password = row[4] ? row[4] : "";
e.password = row[5] ? row[5] : ""; e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
e.status = row[6] ? static_cast<int32_t>(atoi(row[6])) : 0; e.ls_id = row[6] ? row[6] : "eqemu";
e.ls_id = row[7] ? row[7] : "eqemu"; e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.lsaccount_id = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0; e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
e.gmspeed = row[9] ? static_cast<uint8_t>(strtoul(row[9], nullptr, 10)) : 0; e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
e.invulnerable = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0; e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
e.flymode = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0; e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
e.ignore_tells = row[12] ? static_cast<int8_t>(atoi(row[12])) : 0; e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
e.revoked = row[13] ? static_cast<uint8_t>(strtoul(row[13], nullptr, 10)) : 0; e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
e.karma = row[14] ? static_cast<uint32_t>(strtoul(row[14], nullptr, 10)) : 0; e.minilogin_ip = row[14] ? row[14] : "";
e.minilogin_ip = row[15] ? row[15] : ""; e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
e.hideme = row[16] ? static_cast<int8_t>(atoi(row[16])) : 0; e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
e.rulesflag = row[17] ? static_cast<uint8_t>(strtoul(row[17], nullptr, 10)) : 0; e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
e.suspendeduntil = strtoll(row[18] ? row[18] : "-1", nullptr, 10); e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
e.time_creation = row[19] ? static_cast<uint32_t>(strtoul(row[19], nullptr, 10)) : 0; e.ban_reason = row[19] ? row[19] : "";
e.ban_reason = row[20] ? row[20] : ""; e.suspend_reason = row[20] ? row[20] : "";
e.suspend_reason = row[21] ? row[21] : ""; e.crc_eqgame = row[21] ? row[21] : "";
e.crc_eqgame = row[22] ? row[22] : ""; e.crc_skillcaps = row[22] ? row[22] : "";
e.crc_skillcaps = row[23] ? row[23] : ""; e.crc_basedata = row[23] ? row[23] : "";
e.crc_basedata = row[24] ? row[24] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -577,7 +567,6 @@ public:
v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'"); v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.charname) + "'"); v.push_back("'" + Strings::Escape(e.charname) + "'");
v.push_back("'" + Strings::Escape(e.auto_login_charname) + "'");
v.push_back(std::to_string(e.sharedplat)); v.push_back(std::to_string(e.sharedplat));
v.push_back("'" + Strings::Escape(e.password) + "'"); v.push_back("'" + Strings::Escape(e.password) + "'");
v.push_back(std::to_string(e.status)); v.push_back(std::to_string(e.status));
@@ -624,7 +613,6 @@ public:
v.push_back(std::to_string(e.id)); v.push_back(std::to_string(e.id));
v.push_back("'" + Strings::Escape(e.name) + "'"); v.push_back("'" + Strings::Escape(e.name) + "'");
v.push_back("'" + Strings::Escape(e.charname) + "'"); v.push_back("'" + Strings::Escape(e.charname) + "'");
v.push_back("'" + Strings::Escape(e.auto_login_charname) + "'");
v.push_back(std::to_string(e.sharedplat)); v.push_back(std::to_string(e.sharedplat));
v.push_back("'" + Strings::Escape(e.password) + "'"); v.push_back("'" + Strings::Escape(e.password) + "'");
v.push_back(std::to_string(e.status)); v.push_back(std::to_string(e.status));
@@ -57,7 +57,6 @@ public:
int32_t int_; int32_t int_;
int32_t agi; int32_t agi;
int32_t wis; int32_t wis;
int32_t extra_haste;
int16_t fire; int16_t fire;
int16_t cold; int16_t cold;
int16_t magic; int16_t magic;
@@ -119,7 +118,6 @@ public:
"`int`", "`int`",
"agi", "agi",
"wis", "wis",
"extra_haste",
"fire", "fire",
"cold", "cold",
"magic", "magic",
@@ -177,7 +175,6 @@ public:
"`int`", "`int`",
"agi", "agi",
"wis", "wis",
"extra_haste",
"fire", "fire",
"cold", "cold",
"magic", "magic",
@@ -269,7 +266,6 @@ public:
e.int_ = 75; e.int_ = 75;
e.agi = 75; e.agi = 75;
e.wis = 75; e.wis = 75;
e.extra_haste = 0;
e.fire = 0; e.fire = 0;
e.cold = 0; e.cold = 0;
e.magic = 0; e.magic = 0;
@@ -357,20 +353,19 @@ public:
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75; e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75; e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75; e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.extra_haste = row[38] ? static_cast<int32_t>(atoi(row[38])) : 0; e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.fire = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0; e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.cold = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0; e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.magic = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0; e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.poison = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0; e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.disease = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0; e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.corruption = row[44] ? static_cast<int16_t>(atoi(row[44])) : 0; e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.show_helm = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 0; e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.follow_distance = row[46] ? static_cast<uint32_t>(strtoul(row[46], nullptr, 10)) : 200; e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.stop_melee_level = row[47] ? static_cast<uint8_t>(strtoul(row[47], nullptr, 10)) : 255; e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.expansion_bitmask = row[48] ? static_cast<int32_t>(atoi(row[48])) : -1; e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.enforce_spell_settings = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0; e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.archery_setting = row[50] ? static_cast<uint8_t>(strtoul(row[50], nullptr, 10)) : 0; e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
e.caster_range = row[51] ? static_cast<uint32_t>(strtoul(row[51], nullptr, 10)) : 300;
return e; return e;
} }
@@ -441,20 +436,19 @@ public:
v.push_back(columns[35] + " = " + std::to_string(e.int_)); v.push_back(columns[35] + " = " + std::to_string(e.int_));
v.push_back(columns[36] + " = " + std::to_string(e.agi)); v.push_back(columns[36] + " = " + std::to_string(e.agi));
v.push_back(columns[37] + " = " + std::to_string(e.wis)); v.push_back(columns[37] + " = " + std::to_string(e.wis));
v.push_back(columns[38] + " = " + std::to_string(e.extra_haste)); v.push_back(columns[38] + " = " + std::to_string(e.fire));
v.push_back(columns[39] + " = " + std::to_string(e.fire)); v.push_back(columns[39] + " = " + std::to_string(e.cold));
v.push_back(columns[40] + " = " + std::to_string(e.cold)); v.push_back(columns[40] + " = " + std::to_string(e.magic));
v.push_back(columns[41] + " = " + std::to_string(e.magic)); v.push_back(columns[41] + " = " + std::to_string(e.poison));
v.push_back(columns[42] + " = " + std::to_string(e.poison)); v.push_back(columns[42] + " = " + std::to_string(e.disease));
v.push_back(columns[43] + " = " + std::to_string(e.disease)); v.push_back(columns[43] + " = " + std::to_string(e.corruption));
v.push_back(columns[44] + " = " + std::to_string(e.corruption)); v.push_back(columns[44] + " = " + std::to_string(e.show_helm));
v.push_back(columns[45] + " = " + std::to_string(e.show_helm)); v.push_back(columns[45] + " = " + std::to_string(e.follow_distance));
v.push_back(columns[46] + " = " + std::to_string(e.follow_distance)); v.push_back(columns[46] + " = " + std::to_string(e.stop_melee_level));
v.push_back(columns[47] + " = " + std::to_string(e.stop_melee_level)); v.push_back(columns[47] + " = " + std::to_string(e.expansion_bitmask));
v.push_back(columns[48] + " = " + std::to_string(e.expansion_bitmask)); v.push_back(columns[48] + " = " + std::to_string(e.enforce_spell_settings));
v.push_back(columns[49] + " = " + std::to_string(e.enforce_spell_settings)); v.push_back(columns[49] + " = " + std::to_string(e.archery_setting));
v.push_back(columns[50] + " = " + std::to_string(e.archery_setting)); v.push_back(columns[50] + " = " + std::to_string(e.caster_range));
v.push_back(columns[51] + " = " + std::to_string(e.caster_range));
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -514,7 +508,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.fire)); v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold)); v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic)); v.push_back(std::to_string(e.magic));
@@ -595,7 +588,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.fire)); v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold)); v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic)); v.push_back(std::to_string(e.magic));
@@ -680,20 +672,19 @@ public:
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75; e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75; e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75; e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.extra_haste = row[38] ? static_cast<int32_t>(atoi(row[38])) : 0; e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.fire = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0; e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.cold = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0; e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.magic = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0; e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.poison = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0; e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.disease = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0; e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.corruption = row[44] ? static_cast<int16_t>(atoi(row[44])) : 0; e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.show_helm = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 0; e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.follow_distance = row[46] ? static_cast<uint32_t>(strtoul(row[46], nullptr, 10)) : 200; e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.stop_melee_level = row[47] ? static_cast<uint8_t>(strtoul(row[47], nullptr, 10)) : 255; e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.expansion_bitmask = row[48] ? static_cast<int32_t>(atoi(row[48])) : -1; e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.enforce_spell_settings = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0; e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.archery_setting = row[50] ? static_cast<uint8_t>(strtoul(row[50], nullptr, 10)) : 0; e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
e.caster_range = row[51] ? static_cast<uint32_t>(strtoul(row[51], nullptr, 10)) : 300;
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -756,20 +747,19 @@ public:
e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75; e.int_ = row[35] ? static_cast<int32_t>(atoi(row[35])) : 75;
e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75; e.agi = row[36] ? static_cast<int32_t>(atoi(row[36])) : 75;
e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75; e.wis = row[37] ? static_cast<int32_t>(atoi(row[37])) : 75;
e.extra_haste = row[38] ? static_cast<int32_t>(atoi(row[38])) : 0; e.fire = row[38] ? static_cast<int16_t>(atoi(row[38])) : 0;
e.fire = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0; e.cold = row[39] ? static_cast<int16_t>(atoi(row[39])) : 0;
e.cold = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0; e.magic = row[40] ? static_cast<int16_t>(atoi(row[40])) : 0;
e.magic = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0; e.poison = row[41] ? static_cast<int16_t>(atoi(row[41])) : 0;
e.poison = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0; e.disease = row[42] ? static_cast<int16_t>(atoi(row[42])) : 0;
e.disease = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0; e.corruption = row[43] ? static_cast<int16_t>(atoi(row[43])) : 0;
e.corruption = row[44] ? static_cast<int16_t>(atoi(row[44])) : 0; e.show_helm = row[44] ? static_cast<uint32_t>(strtoul(row[44], nullptr, 10)) : 0;
e.show_helm = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 0; e.follow_distance = row[45] ? static_cast<uint32_t>(strtoul(row[45], nullptr, 10)) : 200;
e.follow_distance = row[46] ? static_cast<uint32_t>(strtoul(row[46], nullptr, 10)) : 200; e.stop_melee_level = row[46] ? static_cast<uint8_t>(strtoul(row[46], nullptr, 10)) : 255;
e.stop_melee_level = row[47] ? static_cast<uint8_t>(strtoul(row[47], nullptr, 10)) : 255; e.expansion_bitmask = row[47] ? static_cast<int32_t>(atoi(row[47])) : -1;
e.expansion_bitmask = row[48] ? static_cast<int32_t>(atoi(row[48])) : -1; e.enforce_spell_settings = row[48] ? static_cast<uint8_t>(strtoul(row[48], nullptr, 10)) : 0;
e.enforce_spell_settings = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0; e.archery_setting = row[49] ? static_cast<uint8_t>(strtoul(row[49], nullptr, 10)) : 0;
e.archery_setting = row[50] ? static_cast<uint8_t>(strtoul(row[50], nullptr, 10)) : 0; e.caster_range = row[50] ? static_cast<uint32_t>(strtoul(row[50], nullptr, 10)) : 300;
e.caster_range = row[51] ? static_cast<uint32_t>(strtoul(row[51], nullptr, 10)) : 300;
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -882,7 +872,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.fire)); v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold)); v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic)); v.push_back(std::to_string(e.magic));
@@ -956,7 +945,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.fire)); v.push_back(std::to_string(e.fire));
v.push_back(std::to_string(e.cold)); v.push_back(std::to_string(e.cold));
v.push_back(std::to_string(e.magic)); v.push_back(std::to_string(e.magic));
@@ -77,7 +77,6 @@ public:
uint32_t int_; uint32_t int_;
uint32_t agi; uint32_t agi;
uint32_t wis; uint32_t wis;
int32_t extra_haste;
uint32_t zone_change_count; uint32_t zone_change_count;
uint32_t toxicity; uint32_t toxicity;
uint32_t hunger_level; uint32_t hunger_level;
@@ -191,7 +190,6 @@ public:
"`int`", "`int`",
"agi", "agi",
"wis", "wis",
"extra_haste",
"zone_change_count", "zone_change_count",
"toxicity", "toxicity",
"hunger_level", "hunger_level",
@@ -301,7 +299,6 @@ public:
"`int`", "`int`",
"agi", "agi",
"wis", "wis",
"extra_haste",
"zone_change_count", "zone_change_count",
"toxicity", "toxicity",
"hunger_level", "hunger_level",
@@ -445,7 +442,6 @@ public:
e.int_ = 0; e.int_ = 0;
e.agi = 0; e.agi = 0;
e.wis = 0; e.wis = 0;
e.extra_haste = 0;
e.zone_change_count = 0; e.zone_change_count = 0;
e.toxicity = 0; e.toxicity = 0;
e.hunger_level = 0; e.hunger_level = 0;
@@ -585,52 +581,51 @@ public:
e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0; e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0;
e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0; e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0;
e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0; e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0;
e.extra_haste = row[58] ? static_cast<int32_t>(atoi(row[58])) : 0; e.zone_change_count = row[58] ? static_cast<uint32_t>(strtoul(row[58], nullptr, 10)) : 0;
e.zone_change_count = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0; e.toxicity = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0;
e.toxicity = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0; e.hunger_level = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0;
e.hunger_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0; e.thirst_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0;
e.thirst_level = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0; e.ability_up = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0;
e.ability_up = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0; e.ldon_points_guk = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0;
e.ldon_points_guk = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0; e.ldon_points_mir = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0;
e.ldon_points_mir = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0; e.ldon_points_mmc = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0;
e.ldon_points_mmc = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0; e.ldon_points_ruj = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0;
e.ldon_points_ruj = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0; e.ldon_points_tak = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0;
e.ldon_points_tak = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0; e.ldon_points_available = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0;
e.ldon_points_available = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0; e.tribute_time_remaining = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0;
e.tribute_time_remaining = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0; e.career_tribute_points = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0;
e.career_tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0; e.tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0;
e.tribute_points = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0; e.tribute_active = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0;
e.tribute_active = row[73] ? static_cast<uint32_t>(strtoul(row[73], nullptr, 10)) : 0; e.pvp_status = row[73] ? static_cast<uint8_t>(strtoul(row[73], nullptr, 10)) : 0;
e.pvp_status = row[74] ? static_cast<uint8_t>(strtoul(row[74], nullptr, 10)) : 0; e.pvp_kills = row[74] ? static_cast<uint32_t>(strtoul(row[74], nullptr, 10)) : 0;
e.pvp_kills = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0; e.pvp_deaths = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0;
e.pvp_deaths = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0; e.pvp_current_points = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0;
e.pvp_current_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0; e.pvp_career_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0;
e.pvp_career_points = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0; e.pvp_best_kill_streak = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0;
e.pvp_best_kill_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0; e.pvp_worst_death_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0;
e.pvp_worst_death_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0; e.pvp_current_kill_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0;
e.pvp_current_kill_streak = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0; e.pvp2 = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0;
e.pvp2 = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0; e.pvp_type = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0;
e.pvp_type = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0; e.show_helm = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0;
e.show_helm = row[84] ? static_cast<uint32_t>(strtoul(row[84], nullptr, 10)) : 0; e.group_auto_consent = row[84] ? static_cast<uint8_t>(strtoul(row[84], nullptr, 10)) : 0;
e.group_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0; e.raid_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0;
e.raid_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0; e.guild_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0;
e.guild_auto_consent = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0; e.leadership_exp_on = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0;
e.leadership_exp_on = row[88] ? static_cast<uint8_t>(strtoul(row[88], nullptr, 10)) : 0; e.RestTimer = row[88] ? static_cast<uint32_t>(strtoul(row[88], nullptr, 10)) : 0;
e.RestTimer = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0; e.air_remaining = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0;
e.air_remaining = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0; e.autosplit_enabled = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0;
e.autosplit_enabled = row[91] ? static_cast<uint32_t>(strtoul(row[91], nullptr, 10)) : 0; e.lfp = row[91] ? static_cast<uint8_t>(strtoul(row[91], nullptr, 10)) : 0;
e.lfp = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0; e.lfg = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0;
e.lfg = row[93] ? static_cast<uint8_t>(strtoul(row[93], nullptr, 10)) : 0; e.mailkey = row[93] ? row[93] : "";
e.mailkey = row[94] ? row[94] : ""; e.xtargets = row[94] ? static_cast<uint8_t>(strtoul(row[94], nullptr, 10)) : 5;
e.xtargets = row[95] ? static_cast<uint8_t>(strtoul(row[95], nullptr, 10)) : 5; e.firstlogon = row[95] ? static_cast<int8_t>(atoi(row[95])) : 0;
e.firstlogon = row[96] ? static_cast<int8_t>(atoi(row[96])) : 0; e.e_aa_effects = row[96] ? static_cast<uint32_t>(strtoul(row[96], nullptr, 10)) : 0;
e.e_aa_effects = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0; e.e_percent_to_aa = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0;
e.e_percent_to_aa = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0; e.e_expended_aa_spent = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0;
e.e_expended_aa_spent = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0; e.aa_points_spent_old = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0;
e.aa_points_spent_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0; e.aa_points_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0;
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0; e.e_last_invsnapshot = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0; e.deleted_at = strtoll(row[102] ? row[102] : "-1", nullptr, 10);
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
return e; return e;
} }
@@ -721,52 +716,51 @@ public:
v.push_back(columns[55] + " = " + std::to_string(e.int_)); v.push_back(columns[55] + " = " + std::to_string(e.int_));
v.push_back(columns[56] + " = " + std::to_string(e.agi)); v.push_back(columns[56] + " = " + std::to_string(e.agi));
v.push_back(columns[57] + " = " + std::to_string(e.wis)); v.push_back(columns[57] + " = " + std::to_string(e.wis));
v.push_back(columns[58] + " = " + std::to_string(e.extra_haste)); v.push_back(columns[58] + " = " + std::to_string(e.zone_change_count));
v.push_back(columns[59] + " = " + std::to_string(e.zone_change_count)); v.push_back(columns[59] + " = " + std::to_string(e.toxicity));
v.push_back(columns[60] + " = " + std::to_string(e.toxicity)); v.push_back(columns[60] + " = " + std::to_string(e.hunger_level));
v.push_back(columns[61] + " = " + std::to_string(e.hunger_level)); v.push_back(columns[61] + " = " + std::to_string(e.thirst_level));
v.push_back(columns[62] + " = " + std::to_string(e.thirst_level)); v.push_back(columns[62] + " = " + std::to_string(e.ability_up));
v.push_back(columns[63] + " = " + std::to_string(e.ability_up)); v.push_back(columns[63] + " = " + std::to_string(e.ldon_points_guk));
v.push_back(columns[64] + " = " + std::to_string(e.ldon_points_guk)); v.push_back(columns[64] + " = " + std::to_string(e.ldon_points_mir));
v.push_back(columns[65] + " = " + std::to_string(e.ldon_points_mir)); v.push_back(columns[65] + " = " + std::to_string(e.ldon_points_mmc));
v.push_back(columns[66] + " = " + std::to_string(e.ldon_points_mmc)); v.push_back(columns[66] + " = " + std::to_string(e.ldon_points_ruj));
v.push_back(columns[67] + " = " + std::to_string(e.ldon_points_ruj)); v.push_back(columns[67] + " = " + std::to_string(e.ldon_points_tak));
v.push_back(columns[68] + " = " + std::to_string(e.ldon_points_tak)); v.push_back(columns[68] + " = " + std::to_string(e.ldon_points_available));
v.push_back(columns[69] + " = " + std::to_string(e.ldon_points_available)); v.push_back(columns[69] + " = " + std::to_string(e.tribute_time_remaining));
v.push_back(columns[70] + " = " + std::to_string(e.tribute_time_remaining)); v.push_back(columns[70] + " = " + std::to_string(e.career_tribute_points));
v.push_back(columns[71] + " = " + std::to_string(e.career_tribute_points)); v.push_back(columns[71] + " = " + std::to_string(e.tribute_points));
v.push_back(columns[72] + " = " + std::to_string(e.tribute_points)); v.push_back(columns[72] + " = " + std::to_string(e.tribute_active));
v.push_back(columns[73] + " = " + std::to_string(e.tribute_active)); v.push_back(columns[73] + " = " + std::to_string(e.pvp_status));
v.push_back(columns[74] + " = " + std::to_string(e.pvp_status)); v.push_back(columns[74] + " = " + std::to_string(e.pvp_kills));
v.push_back(columns[75] + " = " + std::to_string(e.pvp_kills)); v.push_back(columns[75] + " = " + std::to_string(e.pvp_deaths));
v.push_back(columns[76] + " = " + std::to_string(e.pvp_deaths)); v.push_back(columns[76] + " = " + std::to_string(e.pvp_current_points));
v.push_back(columns[77] + " = " + std::to_string(e.pvp_current_points)); v.push_back(columns[77] + " = " + std::to_string(e.pvp_career_points));
v.push_back(columns[78] + " = " + std::to_string(e.pvp_career_points)); v.push_back(columns[78] + " = " + std::to_string(e.pvp_best_kill_streak));
v.push_back(columns[79] + " = " + std::to_string(e.pvp_best_kill_streak)); v.push_back(columns[79] + " = " + std::to_string(e.pvp_worst_death_streak));
v.push_back(columns[80] + " = " + std::to_string(e.pvp_worst_death_streak)); v.push_back(columns[80] + " = " + std::to_string(e.pvp_current_kill_streak));
v.push_back(columns[81] + " = " + std::to_string(e.pvp_current_kill_streak)); v.push_back(columns[81] + " = " + std::to_string(e.pvp2));
v.push_back(columns[82] + " = " + std::to_string(e.pvp2)); v.push_back(columns[82] + " = " + std::to_string(e.pvp_type));
v.push_back(columns[83] + " = " + std::to_string(e.pvp_type)); v.push_back(columns[83] + " = " + std::to_string(e.show_helm));
v.push_back(columns[84] + " = " + std::to_string(e.show_helm)); v.push_back(columns[84] + " = " + std::to_string(e.group_auto_consent));
v.push_back(columns[85] + " = " + std::to_string(e.group_auto_consent)); v.push_back(columns[85] + " = " + std::to_string(e.raid_auto_consent));
v.push_back(columns[86] + " = " + std::to_string(e.raid_auto_consent)); v.push_back(columns[86] + " = " + std::to_string(e.guild_auto_consent));
v.push_back(columns[87] + " = " + std::to_string(e.guild_auto_consent)); v.push_back(columns[87] + " = " + std::to_string(e.leadership_exp_on));
v.push_back(columns[88] + " = " + std::to_string(e.leadership_exp_on)); v.push_back(columns[88] + " = " + std::to_string(e.RestTimer));
v.push_back(columns[89] + " = " + std::to_string(e.RestTimer)); v.push_back(columns[89] + " = " + std::to_string(e.air_remaining));
v.push_back(columns[90] + " = " + std::to_string(e.air_remaining)); v.push_back(columns[90] + " = " + std::to_string(e.autosplit_enabled));
v.push_back(columns[91] + " = " + std::to_string(e.autosplit_enabled)); v.push_back(columns[91] + " = " + std::to_string(e.lfp));
v.push_back(columns[92] + " = " + std::to_string(e.lfp)); v.push_back(columns[92] + " = " + std::to_string(e.lfg));
v.push_back(columns[93] + " = " + std::to_string(e.lfg)); v.push_back(columns[93] + " = '" + Strings::Escape(e.mailkey) + "'");
v.push_back(columns[94] + " = '" + Strings::Escape(e.mailkey) + "'"); v.push_back(columns[94] + " = " + std::to_string(e.xtargets));
v.push_back(columns[95] + " = " + std::to_string(e.xtargets)); v.push_back(columns[95] + " = " + std::to_string(e.firstlogon));
v.push_back(columns[96] + " = " + std::to_string(e.firstlogon)); v.push_back(columns[96] + " = " + std::to_string(e.e_aa_effects));
v.push_back(columns[97] + " = " + std::to_string(e.e_aa_effects)); v.push_back(columns[97] + " = " + std::to_string(e.e_percent_to_aa));
v.push_back(columns[98] + " = " + std::to_string(e.e_percent_to_aa)); v.push_back(columns[98] + " = " + std::to_string(e.e_expended_aa_spent));
v.push_back(columns[99] + " = " + std::to_string(e.e_expended_aa_spent)); v.push_back(columns[99] + " = " + std::to_string(e.aa_points_spent_old));
v.push_back(columns[100] + " = " + std::to_string(e.aa_points_spent_old)); v.push_back(columns[100] + " = " + std::to_string(e.aa_points_old));
v.push_back(columns[101] + " = " + std::to_string(e.aa_points_old)); v.push_back(columns[101] + " = " + std::to_string(e.e_last_invsnapshot));
v.push_back(columns[102] + " = " + std::to_string(e.e_last_invsnapshot)); v.push_back(columns[102] + " = FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
v.push_back(columns[103] + " = FROM_UNIXTIME(" + (e.deleted_at > 0 ? std::to_string(e.deleted_at) : "null") + ")");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -846,7 +840,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.zone_change_count)); v.push_back(std::to_string(e.zone_change_count));
v.push_back(std::to_string(e.toxicity)); v.push_back(std::to_string(e.toxicity));
v.push_back(std::to_string(e.hunger_level)); v.push_back(std::to_string(e.hunger_level));
@@ -979,7 +972,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.zone_change_count)); v.push_back(std::to_string(e.zone_change_count));
v.push_back(std::to_string(e.toxicity)); v.push_back(std::to_string(e.toxicity));
v.push_back(std::to_string(e.hunger_level)); v.push_back(std::to_string(e.hunger_level));
@@ -1116,52 +1108,51 @@ public:
e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0; e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0;
e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0; e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0;
e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0; e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0;
e.extra_haste = row[58] ? static_cast<int32_t>(atoi(row[58])) : 0; e.zone_change_count = row[58] ? static_cast<uint32_t>(strtoul(row[58], nullptr, 10)) : 0;
e.zone_change_count = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0; e.toxicity = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0;
e.toxicity = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0; e.hunger_level = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0;
e.hunger_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0; e.thirst_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0;
e.thirst_level = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0; e.ability_up = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0;
e.ability_up = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0; e.ldon_points_guk = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0;
e.ldon_points_guk = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0; e.ldon_points_mir = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0;
e.ldon_points_mir = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0; e.ldon_points_mmc = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0;
e.ldon_points_mmc = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0; e.ldon_points_ruj = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0;
e.ldon_points_ruj = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0; e.ldon_points_tak = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0;
e.ldon_points_tak = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0; e.ldon_points_available = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0;
e.ldon_points_available = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0; e.tribute_time_remaining = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0;
e.tribute_time_remaining = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0; e.career_tribute_points = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0;
e.career_tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0; e.tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0;
e.tribute_points = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0; e.tribute_active = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0;
e.tribute_active = row[73] ? static_cast<uint32_t>(strtoul(row[73], nullptr, 10)) : 0; e.pvp_status = row[73] ? static_cast<uint8_t>(strtoul(row[73], nullptr, 10)) : 0;
e.pvp_status = row[74] ? static_cast<uint8_t>(strtoul(row[74], nullptr, 10)) : 0; e.pvp_kills = row[74] ? static_cast<uint32_t>(strtoul(row[74], nullptr, 10)) : 0;
e.pvp_kills = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0; e.pvp_deaths = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0;
e.pvp_deaths = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0; e.pvp_current_points = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0;
e.pvp_current_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0; e.pvp_career_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0;
e.pvp_career_points = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0; e.pvp_best_kill_streak = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0;
e.pvp_best_kill_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0; e.pvp_worst_death_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0;
e.pvp_worst_death_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0; e.pvp_current_kill_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0;
e.pvp_current_kill_streak = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0; e.pvp2 = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0;
e.pvp2 = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0; e.pvp_type = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0;
e.pvp_type = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0; e.show_helm = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0;
e.show_helm = row[84] ? static_cast<uint32_t>(strtoul(row[84], nullptr, 10)) : 0; e.group_auto_consent = row[84] ? static_cast<uint8_t>(strtoul(row[84], nullptr, 10)) : 0;
e.group_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0; e.raid_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0;
e.raid_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0; e.guild_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0;
e.guild_auto_consent = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0; e.leadership_exp_on = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0;
e.leadership_exp_on = row[88] ? static_cast<uint8_t>(strtoul(row[88], nullptr, 10)) : 0; e.RestTimer = row[88] ? static_cast<uint32_t>(strtoul(row[88], nullptr, 10)) : 0;
e.RestTimer = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0; e.air_remaining = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0;
e.air_remaining = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0; e.autosplit_enabled = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0;
e.autosplit_enabled = row[91] ? static_cast<uint32_t>(strtoul(row[91], nullptr, 10)) : 0; e.lfp = row[91] ? static_cast<uint8_t>(strtoul(row[91], nullptr, 10)) : 0;
e.lfp = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0; e.lfg = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0;
e.lfg = row[93] ? static_cast<uint8_t>(strtoul(row[93], nullptr, 10)) : 0; e.mailkey = row[93] ? row[93] : "";
e.mailkey = row[94] ? row[94] : ""; e.xtargets = row[94] ? static_cast<uint8_t>(strtoul(row[94], nullptr, 10)) : 5;
e.xtargets = row[95] ? static_cast<uint8_t>(strtoul(row[95], nullptr, 10)) : 5; e.firstlogon = row[95] ? static_cast<int8_t>(atoi(row[95])) : 0;
e.firstlogon = row[96] ? static_cast<int8_t>(atoi(row[96])) : 0; e.e_aa_effects = row[96] ? static_cast<uint32_t>(strtoul(row[96], nullptr, 10)) : 0;
e.e_aa_effects = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0; e.e_percent_to_aa = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0;
e.e_percent_to_aa = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0; e.e_expended_aa_spent = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0;
e.e_expended_aa_spent = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0; e.aa_points_spent_old = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0;
e.aa_points_spent_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0; e.aa_points_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0;
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0; e.e_last_invsnapshot = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0; e.deleted_at = strtoll(row[102] ? row[102] : "-1", nullptr, 10);
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -1244,52 +1235,51 @@ public:
e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0; e.int_ = row[55] ? static_cast<uint32_t>(strtoul(row[55], nullptr, 10)) : 0;
e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0; e.agi = row[56] ? static_cast<uint32_t>(strtoul(row[56], nullptr, 10)) : 0;
e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0; e.wis = row[57] ? static_cast<uint32_t>(strtoul(row[57], nullptr, 10)) : 0;
e.extra_haste = row[58] ? static_cast<int32_t>(atoi(row[58])) : 0; e.zone_change_count = row[58] ? static_cast<uint32_t>(strtoul(row[58], nullptr, 10)) : 0;
e.zone_change_count = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0; e.toxicity = row[59] ? static_cast<uint32_t>(strtoul(row[59], nullptr, 10)) : 0;
e.toxicity = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0; e.hunger_level = row[60] ? static_cast<uint32_t>(strtoul(row[60], nullptr, 10)) : 0;
e.hunger_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0; e.thirst_level = row[61] ? static_cast<uint32_t>(strtoul(row[61], nullptr, 10)) : 0;
e.thirst_level = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0; e.ability_up = row[62] ? static_cast<uint32_t>(strtoul(row[62], nullptr, 10)) : 0;
e.ability_up = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0; e.ldon_points_guk = row[63] ? static_cast<uint32_t>(strtoul(row[63], nullptr, 10)) : 0;
e.ldon_points_guk = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0; e.ldon_points_mir = row[64] ? static_cast<uint32_t>(strtoul(row[64], nullptr, 10)) : 0;
e.ldon_points_mir = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0; e.ldon_points_mmc = row[65] ? static_cast<uint32_t>(strtoul(row[65], nullptr, 10)) : 0;
e.ldon_points_mmc = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0; e.ldon_points_ruj = row[66] ? static_cast<uint32_t>(strtoul(row[66], nullptr, 10)) : 0;
e.ldon_points_ruj = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0; e.ldon_points_tak = row[67] ? static_cast<uint32_t>(strtoul(row[67], nullptr, 10)) : 0;
e.ldon_points_tak = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0; e.ldon_points_available = row[68] ? static_cast<uint32_t>(strtoul(row[68], nullptr, 10)) : 0;
e.ldon_points_available = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0; e.tribute_time_remaining = row[69] ? static_cast<uint32_t>(strtoul(row[69], nullptr, 10)) : 0;
e.tribute_time_remaining = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0; e.career_tribute_points = row[70] ? static_cast<uint32_t>(strtoul(row[70], nullptr, 10)) : 0;
e.career_tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0; e.tribute_points = row[71] ? static_cast<uint32_t>(strtoul(row[71], nullptr, 10)) : 0;
e.tribute_points = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0; e.tribute_active = row[72] ? static_cast<uint32_t>(strtoul(row[72], nullptr, 10)) : 0;
e.tribute_active = row[73] ? static_cast<uint32_t>(strtoul(row[73], nullptr, 10)) : 0; e.pvp_status = row[73] ? static_cast<uint8_t>(strtoul(row[73], nullptr, 10)) : 0;
e.pvp_status = row[74] ? static_cast<uint8_t>(strtoul(row[74], nullptr, 10)) : 0; e.pvp_kills = row[74] ? static_cast<uint32_t>(strtoul(row[74], nullptr, 10)) : 0;
e.pvp_kills = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0; e.pvp_deaths = row[75] ? static_cast<uint32_t>(strtoul(row[75], nullptr, 10)) : 0;
e.pvp_deaths = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0; e.pvp_current_points = row[76] ? static_cast<uint32_t>(strtoul(row[76], nullptr, 10)) : 0;
e.pvp_current_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0; e.pvp_career_points = row[77] ? static_cast<uint32_t>(strtoul(row[77], nullptr, 10)) : 0;
e.pvp_career_points = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0; e.pvp_best_kill_streak = row[78] ? static_cast<uint32_t>(strtoul(row[78], nullptr, 10)) : 0;
e.pvp_best_kill_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0; e.pvp_worst_death_streak = row[79] ? static_cast<uint32_t>(strtoul(row[79], nullptr, 10)) : 0;
e.pvp_worst_death_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0; e.pvp_current_kill_streak = row[80] ? static_cast<uint32_t>(strtoul(row[80], nullptr, 10)) : 0;
e.pvp_current_kill_streak = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0; e.pvp2 = row[81] ? static_cast<uint32_t>(strtoul(row[81], nullptr, 10)) : 0;
e.pvp2 = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0; e.pvp_type = row[82] ? static_cast<uint32_t>(strtoul(row[82], nullptr, 10)) : 0;
e.pvp_type = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0; e.show_helm = row[83] ? static_cast<uint32_t>(strtoul(row[83], nullptr, 10)) : 0;
e.show_helm = row[84] ? static_cast<uint32_t>(strtoul(row[84], nullptr, 10)) : 0; e.group_auto_consent = row[84] ? static_cast<uint8_t>(strtoul(row[84], nullptr, 10)) : 0;
e.group_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0; e.raid_auto_consent = row[85] ? static_cast<uint8_t>(strtoul(row[85], nullptr, 10)) : 0;
e.raid_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0; e.guild_auto_consent = row[86] ? static_cast<uint8_t>(strtoul(row[86], nullptr, 10)) : 0;
e.guild_auto_consent = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0; e.leadership_exp_on = row[87] ? static_cast<uint8_t>(strtoul(row[87], nullptr, 10)) : 0;
e.leadership_exp_on = row[88] ? static_cast<uint8_t>(strtoul(row[88], nullptr, 10)) : 0; e.RestTimer = row[88] ? static_cast<uint32_t>(strtoul(row[88], nullptr, 10)) : 0;
e.RestTimer = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0; e.air_remaining = row[89] ? static_cast<uint32_t>(strtoul(row[89], nullptr, 10)) : 0;
e.air_remaining = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0; e.autosplit_enabled = row[90] ? static_cast<uint32_t>(strtoul(row[90], nullptr, 10)) : 0;
e.autosplit_enabled = row[91] ? static_cast<uint32_t>(strtoul(row[91], nullptr, 10)) : 0; e.lfp = row[91] ? static_cast<uint8_t>(strtoul(row[91], nullptr, 10)) : 0;
e.lfp = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0; e.lfg = row[92] ? static_cast<uint8_t>(strtoul(row[92], nullptr, 10)) : 0;
e.lfg = row[93] ? static_cast<uint8_t>(strtoul(row[93], nullptr, 10)) : 0; e.mailkey = row[93] ? row[93] : "";
e.mailkey = row[94] ? row[94] : ""; e.xtargets = row[94] ? static_cast<uint8_t>(strtoul(row[94], nullptr, 10)) : 5;
e.xtargets = row[95] ? static_cast<uint8_t>(strtoul(row[95], nullptr, 10)) : 5; e.firstlogon = row[95] ? static_cast<int8_t>(atoi(row[95])) : 0;
e.firstlogon = row[96] ? static_cast<int8_t>(atoi(row[96])) : 0; e.e_aa_effects = row[96] ? static_cast<uint32_t>(strtoul(row[96], nullptr, 10)) : 0;
e.e_aa_effects = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0; e.e_percent_to_aa = row[97] ? static_cast<uint32_t>(strtoul(row[97], nullptr, 10)) : 0;
e.e_percent_to_aa = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0; e.e_expended_aa_spent = row[98] ? static_cast<uint32_t>(strtoul(row[98], nullptr, 10)) : 0;
e.e_expended_aa_spent = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0; e.aa_points_spent_old = row[99] ? static_cast<uint32_t>(strtoul(row[99], nullptr, 10)) : 0;
e.aa_points_spent_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0; e.aa_points_old = row[100] ? static_cast<uint32_t>(strtoul(row[100], nullptr, 10)) : 0;
e.aa_points_old = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0; e.e_last_invsnapshot = row[101] ? static_cast<uint32_t>(strtoul(row[101], nullptr, 10)) : 0;
e.e_last_invsnapshot = row[102] ? static_cast<uint32_t>(strtoul(row[102], nullptr, 10)) : 0; e.deleted_at = strtoll(row[102] ? row[102] : "-1", nullptr, 10);
e.deleted_at = strtoll(row[103] ? row[103] : "-1", nullptr, 10);
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -1422,7 +1412,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.zone_change_count)); v.push_back(std::to_string(e.zone_change_count));
v.push_back(std::to_string(e.toxicity)); v.push_back(std::to_string(e.toxicity));
v.push_back(std::to_string(e.hunger_level)); v.push_back(std::to_string(e.hunger_level));
@@ -1548,7 +1537,6 @@ public:
v.push_back(std::to_string(e.int_)); v.push_back(std::to_string(e.int_));
v.push_back(std::to_string(e.agi)); v.push_back(std::to_string(e.agi));
v.push_back(std::to_string(e.wis)); v.push_back(std::to_string(e.wis));
v.push_back(std::to_string(e.extra_haste));
v.push_back(std::to_string(e.zone_change_count)); v.push_back(std::to_string(e.zone_change_count));
v.push_back(std::to_string(e.toxicity)); v.push_back(std::to_string(e.toxicity));
v.push_back(std::to_string(e.hunger_level)); v.push_back(std::to_string(e.hunger_level));
@@ -1,535 +0,0 @@
/**
* DO NOT MODIFY THIS FILE
*
* This repository was automatically generated and is NOT to be modified directly.
* Any repository modifications are meant to be made to the repository extending the base.
* Any modifications to base repositories are to be made by the generator only
*
* @generator ./utils/scripts/generators/repository-generator.pl
* @docs https://docs.eqemu.io/developer/repositories
*/
#ifndef EQEMU_BASE_CHARACTER_PARCELS_REPOSITORY_H
#define EQEMU_BASE_CHARACTER_PARCELS_REPOSITORY_H
#include "../../database.h"
#include "../../strings.h"
#include <ctime>
class BaseCharacterParcelsRepository {
public:
struct CharacterParcels {
uint32_t id;
uint32_t char_id;
uint32_t item_id;
uint32_t aug_slot_1;
uint32_t aug_slot_2;
uint32_t aug_slot_3;
uint32_t aug_slot_4;
uint32_t aug_slot_5;
uint32_t aug_slot_6;
uint32_t slot_id;
uint32_t quantity;
std::string from_name;
std::string note;
time_t sent_date;
};
static std::string PrimaryKey()
{
return std::string("id");
}
static std::vector<std::string> Columns()
{
return {
"id",
"char_id",
"item_id",
"aug_slot_1",
"aug_slot_2",
"aug_slot_3",
"aug_slot_4",
"aug_slot_5",
"aug_slot_6",
"slot_id",
"quantity",
"from_name",
"note",
"sent_date",
};
}
static std::vector<std::string> SelectColumns()
{
return {
"id",
"char_id",
"item_id",
"aug_slot_1",
"aug_slot_2",
"aug_slot_3",
"aug_slot_4",
"aug_slot_5",
"aug_slot_6",
"slot_id",
"quantity",
"from_name",
"note",
"UNIX_TIMESTAMP(sent_date)",
};
}
static std::string ColumnsRaw()
{
return std::string(Strings::Implode(", ", Columns()));
}
static std::string SelectColumnsRaw()
{
return std::string(Strings::Implode(", ", SelectColumns()));
}
static std::string TableName()
{
return std::string("character_parcels");
}
static std::string BaseSelect()
{
return fmt::format(
"SELECT {} FROM {}",
SelectColumnsRaw(),
TableName()
);
}
static std::string BaseInsert()
{
return fmt::format(
"INSERT INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static CharacterParcels NewEntity()
{
CharacterParcels e{};
e.id = 0;
e.char_id = 0;
e.item_id = 0;
e.aug_slot_1 = 0;
e.aug_slot_2 = 0;
e.aug_slot_3 = 0;
e.aug_slot_4 = 0;
e.aug_slot_5 = 0;
e.aug_slot_6 = 0;
e.slot_id = 0;
e.quantity = 0;
e.from_name = "";
e.note = "";
e.sent_date = 0;
return e;
}
static CharacterParcels GetCharacterParcels(
const std::vector<CharacterParcels> &character_parcelss,
int character_parcels_id
)
{
for (auto &character_parcels : character_parcelss) {
if (character_parcels.id == character_parcels_id) {
return character_parcels;
}
}
return NewEntity();
}
static CharacterParcels FindOne(
Database& db,
int character_parcels_id
)
{
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE {} = {} LIMIT 1",
BaseSelect(),
PrimaryKey(),
character_parcels_id
)
);
auto row = results.begin();
if (results.RowCount() == 1) {
CharacterParcels e{};
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.from_name = row[11] ? row[11] : "";
e.note = row[12] ? row[12] : "";
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
return e;
}
return NewEntity();
}
static int DeleteOne(
Database& db,
int character_parcels_id
)
{
auto results = db.QueryDatabase(
fmt::format(
"DELETE FROM {} WHERE {} = {}",
TableName(),
PrimaryKey(),
character_parcels_id
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int UpdateOne(
Database& db,
const CharacterParcels &e
)
{
std::vector<std::string> v;
auto columns = Columns();
v.push_back(columns[1] + " = " + std::to_string(e.char_id));
v.push_back(columns[2] + " = " + std::to_string(e.item_id));
v.push_back(columns[3] + " = " + std::to_string(e.aug_slot_1));
v.push_back(columns[4] + " = " + std::to_string(e.aug_slot_2));
v.push_back(columns[5] + " = " + std::to_string(e.aug_slot_3));
v.push_back(columns[6] + " = " + std::to_string(e.aug_slot_4));
v.push_back(columns[7] + " = " + std::to_string(e.aug_slot_5));
v.push_back(columns[8] + " = " + std::to_string(e.aug_slot_6));
v.push_back(columns[9] + " = " + std::to_string(e.slot_id));
v.push_back(columns[10] + " = " + std::to_string(e.quantity));
v.push_back(columns[11] + " = '" + Strings::Escape(e.from_name) + "'");
v.push_back(columns[12] + " = '" + Strings::Escape(e.note) + "'");
v.push_back(columns[13] + " = FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
auto results = db.QueryDatabase(
fmt::format(
"UPDATE {} SET {} WHERE {} = {}",
TableName(),
Strings::Implode(", ", v),
PrimaryKey(),
e.id
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static CharacterParcels InsertOne(
Database& db,
CharacterParcels e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.aug_slot_1));
v.push_back(std::to_string(e.aug_slot_2));
v.push_back(std::to_string(e.aug_slot_3));
v.push_back(std::to_string(e.aug_slot_4));
v.push_back(std::to_string(e.aug_slot_5));
v.push_back(std::to_string(e.aug_slot_6));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.quantity));
v.push_back("'" + Strings::Escape(e.from_name) + "'");
v.push_back("'" + Strings::Escape(e.note) + "'");
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseInsert(),
Strings::Implode(",", v)
)
);
if (results.Success()) {
e.id = results.LastInsertedID();
return e;
}
e = NewEntity();
return e;
}
static int InsertMany(
Database& db,
const std::vector<CharacterParcels> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.aug_slot_1));
v.push_back(std::to_string(e.aug_slot_2));
v.push_back(std::to_string(e.aug_slot_3));
v.push_back(std::to_string(e.aug_slot_4));
v.push_back(std::to_string(e.aug_slot_5));
v.push_back(std::to_string(e.aug_slot_6));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.quantity));
v.push_back("'" + Strings::Escape(e.from_name) + "'");
v.push_back("'" + Strings::Escape(e.note) + "'");
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseInsert(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static std::vector<CharacterParcels> All(Database& db)
{
std::vector<CharacterParcels> all_entries;
auto results = db.QueryDatabase(
fmt::format(
"{}",
BaseSelect()
)
);
all_entries.reserve(results.RowCount());
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterParcels e{};
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.from_name = row[11] ? row[11] : "";
e.note = row[12] ? row[12] : "";
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
all_entries.push_back(e);
}
return all_entries;
}
static std::vector<CharacterParcels> GetWhere(Database& db, const std::string &where_filter)
{
std::vector<CharacterParcels> all_entries;
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE {}",
BaseSelect(),
where_filter
)
);
all_entries.reserve(results.RowCount());
for (auto row = results.begin(); row != results.end(); ++row) {
CharacterParcels e{};
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.char_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
e.item_id = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
e.aug_slot_1 = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
e.aug_slot_2 = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
e.aug_slot_3 = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
e.aug_slot_4 = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
e.aug_slot_5 = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
e.aug_slot_6 = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
e.slot_id = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
e.quantity = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
e.from_name = row[11] ? row[11] : "";
e.note = row[12] ? row[12] : "";
e.sent_date = strtoll(row[13] ? row[13] : "-1", nullptr, 10);
all_entries.push_back(e);
}
return all_entries;
}
static int DeleteWhere(Database& db, const std::string &where_filter)
{
auto results = db.QueryDatabase(
fmt::format(
"DELETE FROM {} WHERE {}",
TableName(),
where_filter
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int Truncate(Database& db)
{
auto results = db.QueryDatabase(
fmt::format(
"TRUNCATE TABLE {}",
TableName()
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int64 GetMaxId(Database& db)
{
auto results = db.QueryDatabase(
fmt::format(
"SELECT COALESCE(MAX({}), 0) FROM {}",
PrimaryKey(),
TableName()
)
);
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static int64 Count(Database& db, const std::string &where_filter = "")
{
auto results = db.QueryDatabase(
fmt::format(
"SELECT COUNT(*) FROM {} {}",
TableName(),
(where_filter.empty() ? "" : "WHERE " + where_filter)
)
);
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
}
static std::string BaseReplace()
{
return fmt::format(
"REPLACE INTO {} ({}) ",
TableName(),
ColumnsRaw()
);
}
static int ReplaceOne(
Database& db,
const CharacterParcels &e
)
{
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.aug_slot_1));
v.push_back(std::to_string(e.aug_slot_2));
v.push_back(std::to_string(e.aug_slot_3));
v.push_back(std::to_string(e.aug_slot_4));
v.push_back(std::to_string(e.aug_slot_5));
v.push_back(std::to_string(e.aug_slot_6));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.quantity));
v.push_back("'" + Strings::Escape(e.from_name) + "'");
v.push_back("'" + Strings::Escape(e.note) + "'");
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES ({})",
BaseReplace(),
Strings::Implode(",", v)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
static int ReplaceMany(
Database& db,
const std::vector<CharacterParcels> &entries
)
{
std::vector<std::string> insert_chunks;
for (auto &e: entries) {
std::vector<std::string> v;
v.push_back(std::to_string(e.id));
v.push_back(std::to_string(e.char_id));
v.push_back(std::to_string(e.item_id));
v.push_back(std::to_string(e.aug_slot_1));
v.push_back(std::to_string(e.aug_slot_2));
v.push_back(std::to_string(e.aug_slot_3));
v.push_back(std::to_string(e.aug_slot_4));
v.push_back(std::to_string(e.aug_slot_5));
v.push_back(std::to_string(e.aug_slot_6));
v.push_back(std::to_string(e.slot_id));
v.push_back(std::to_string(e.quantity));
v.push_back("'" + Strings::Escape(e.from_name) + "'");
v.push_back("'" + Strings::Escape(e.note) + "'");
v.push_back("FROM_UNIXTIME(" + (e.sent_date > 0 ? std::to_string(e.sent_date) : "null") + ")");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
}
std::vector<std::string> v;
auto results = db.QueryDatabase(
fmt::format(
"{} VALUES {}",
BaseReplace(),
Strings::Implode(",", insert_chunks)
)
);
return (results.Success() ? results.RowsAffected() : 0);
}
};
#endif //EQEMU_BASE_CHARACTER_PARCELS_REPOSITORY_H
@@ -50,7 +50,6 @@ public:
float buffer; float buffer;
uint32_t client_version_mask; uint32_t client_version_mask;
int16_t is_ldon_door; int16_t is_ldon_door;
int16_t close_timer_ms;
int32_t dz_switch_id; int32_t dz_switch_id;
int8_t min_expansion; int8_t min_expansion;
int8_t max_expansion; int8_t max_expansion;
@@ -97,7 +96,6 @@ public:
"buffer", "buffer",
"client_version_mask", "client_version_mask",
"is_ldon_door", "is_ldon_door",
"close_timer_ms",
"dz_switch_id", "dz_switch_id",
"min_expansion", "min_expansion",
"max_expansion", "max_expansion",
@@ -140,7 +138,6 @@ public:
"buffer", "buffer",
"client_version_mask", "client_version_mask",
"is_ldon_door", "is_ldon_door",
"close_timer_ms",
"dz_switch_id", "dz_switch_id",
"min_expansion", "min_expansion",
"max_expansion", "max_expansion",
@@ -217,7 +214,6 @@ public:
e.buffer = 0; e.buffer = 0;
e.client_version_mask = 4294967295; e.client_version_mask = 4294967295;
e.is_ldon_door = 0; e.is_ldon_door = 0;
e.close_timer_ms = 5000;
e.dz_switch_id = 0; e.dz_switch_id = 0;
e.min_expansion = -1; e.min_expansion = -1;
e.max_expansion = -1; e.max_expansion = -1;
@@ -290,12 +286,11 @@ public:
e.buffer = row[28] ? strtof(row[28], nullptr) : 0; e.buffer = row[28] ? strtof(row[28], nullptr) : 0;
e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295; e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295;
e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0; e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0;
e.close_timer_ms = row[31] ? static_cast<int16_t>(atoi(row[31])) : 5000; e.dz_switch_id = row[31] ? static_cast<int32_t>(atoi(row[31])) : 0;
e.dz_switch_id = row[32] ? static_cast<int32_t>(atoi(row[32])) : 0; e.min_expansion = row[32] ? static_cast<int8_t>(atoi(row[32])) : -1;
e.min_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1; e.max_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1;
e.max_expansion = row[34] ? static_cast<int8_t>(atoi(row[34])) : -1; e.content_flags = row[34] ? row[34] : "";
e.content_flags = row[35] ? row[35] : ""; e.content_flags_disabled = row[35] ? row[35] : "";
e.content_flags_disabled = row[36] ? row[36] : "";
return e; return e;
} }
@@ -359,12 +354,11 @@ public:
v.push_back(columns[28] + " = " + std::to_string(e.buffer)); v.push_back(columns[28] + " = " + std::to_string(e.buffer));
v.push_back(columns[29] + " = " + std::to_string(e.client_version_mask)); v.push_back(columns[29] + " = " + std::to_string(e.client_version_mask));
v.push_back(columns[30] + " = " + std::to_string(e.is_ldon_door)); v.push_back(columns[30] + " = " + std::to_string(e.is_ldon_door));
v.push_back(columns[31] + " = " + std::to_string(e.close_timer_ms)); v.push_back(columns[31] + " = " + std::to_string(e.dz_switch_id));
v.push_back(columns[32] + " = " + std::to_string(e.dz_switch_id)); v.push_back(columns[32] + " = " + std::to_string(e.min_expansion));
v.push_back(columns[33] + " = " + std::to_string(e.min_expansion)); v.push_back(columns[33] + " = " + std::to_string(e.max_expansion));
v.push_back(columns[34] + " = " + std::to_string(e.max_expansion)); v.push_back(columns[34] + " = '" + Strings::Escape(e.content_flags) + "'");
v.push_back(columns[35] + " = '" + Strings::Escape(e.content_flags) + "'"); v.push_back(columns[35] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
v.push_back(columns[36] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -417,7 +411,6 @@ public:
v.push_back(std::to_string(e.buffer)); v.push_back(std::to_string(e.buffer));
v.push_back(std::to_string(e.client_version_mask)); v.push_back(std::to_string(e.client_version_mask));
v.push_back(std::to_string(e.is_ldon_door)); v.push_back(std::to_string(e.is_ldon_door));
v.push_back(std::to_string(e.close_timer_ms));
v.push_back(std::to_string(e.dz_switch_id)); v.push_back(std::to_string(e.dz_switch_id));
v.push_back(std::to_string(e.min_expansion)); v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion)); v.push_back(std::to_string(e.max_expansion));
@@ -483,7 +476,6 @@ public:
v.push_back(std::to_string(e.buffer)); v.push_back(std::to_string(e.buffer));
v.push_back(std::to_string(e.client_version_mask)); v.push_back(std::to_string(e.client_version_mask));
v.push_back(std::to_string(e.is_ldon_door)); v.push_back(std::to_string(e.is_ldon_door));
v.push_back(std::to_string(e.close_timer_ms));
v.push_back(std::to_string(e.dz_switch_id)); v.push_back(std::to_string(e.dz_switch_id));
v.push_back(std::to_string(e.min_expansion)); v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion)); v.push_back(std::to_string(e.max_expansion));
@@ -553,12 +545,11 @@ public:
e.buffer = row[28] ? strtof(row[28], nullptr) : 0; e.buffer = row[28] ? strtof(row[28], nullptr) : 0;
e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295; e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295;
e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0; e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0;
e.close_timer_ms = row[31] ? static_cast<int16_t>(atoi(row[31])) : 5000; e.dz_switch_id = row[31] ? static_cast<int32_t>(atoi(row[31])) : 0;
e.dz_switch_id = row[32] ? static_cast<int32_t>(atoi(row[32])) : 0; e.min_expansion = row[32] ? static_cast<int8_t>(atoi(row[32])) : -1;
e.min_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1; e.max_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1;
e.max_expansion = row[34] ? static_cast<int8_t>(atoi(row[34])) : -1; e.content_flags = row[34] ? row[34] : "";
e.content_flags = row[35] ? row[35] : ""; e.content_flags_disabled = row[35] ? row[35] : "";
e.content_flags_disabled = row[36] ? row[36] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -614,12 +605,11 @@ public:
e.buffer = row[28] ? strtof(row[28], nullptr) : 0; e.buffer = row[28] ? strtof(row[28], nullptr) : 0;
e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295; e.client_version_mask = row[29] ? static_cast<uint32_t>(strtoul(row[29], nullptr, 10)) : 4294967295;
e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0; e.is_ldon_door = row[30] ? static_cast<int16_t>(atoi(row[30])) : 0;
e.close_timer_ms = row[31] ? static_cast<int16_t>(atoi(row[31])) : 5000; e.dz_switch_id = row[31] ? static_cast<int32_t>(atoi(row[31])) : 0;
e.dz_switch_id = row[32] ? static_cast<int32_t>(atoi(row[32])) : 0; e.min_expansion = row[32] ? static_cast<int8_t>(atoi(row[32])) : -1;
e.min_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1; e.max_expansion = row[33] ? static_cast<int8_t>(atoi(row[33])) : -1;
e.max_expansion = row[34] ? static_cast<int8_t>(atoi(row[34])) : -1; e.content_flags = row[34] ? row[34] : "";
e.content_flags = row[35] ? row[35] : ""; e.content_flags_disabled = row[35] ? row[35] : "";
e.content_flags_disabled = row[36] ? row[36] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -725,7 +715,6 @@ public:
v.push_back(std::to_string(e.buffer)); v.push_back(std::to_string(e.buffer));
v.push_back(std::to_string(e.client_version_mask)); v.push_back(std::to_string(e.client_version_mask));
v.push_back(std::to_string(e.is_ldon_door)); v.push_back(std::to_string(e.is_ldon_door));
v.push_back(std::to_string(e.close_timer_ms));
v.push_back(std::to_string(e.dz_switch_id)); v.push_back(std::to_string(e.dz_switch_id));
v.push_back(std::to_string(e.min_expansion)); v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion)); v.push_back(std::to_string(e.max_expansion));
@@ -784,7 +773,6 @@ public:
v.push_back(std::to_string(e.buffer)); v.push_back(std::to_string(e.buffer));
v.push_back(std::to_string(e.client_version_mask)); v.push_back(std::to_string(e.client_version_mask));
v.push_back(std::to_string(e.is_ldon_door)); v.push_back(std::to_string(e.is_ldon_door));
v.push_back(std::to_string(e.close_timer_ms));
v.push_back(std::to_string(e.dz_switch_id)); v.push_back(std::to_string(e.dz_switch_id));
v.push_back(std::to_string(e.min_expansion)); v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion)); v.push_back(std::to_string(e.max_expansion));
@@ -192,7 +192,7 @@ public:
v.push_back(columns[0] + " = " + std::to_string(e.gid)); v.push_back(columns[0] + " = " + std::to_string(e.gid));
v.push_back(columns[1] + " = '" + Strings::Escape(e.leadername) + "'"); v.push_back(columns[1] + " = '" + Strings::Escape(e.leadername) + "'");
v.push_back(columns[2] + " = '" + Strings::Escape(e.marknpc) + "'"); v.push_back(columns[2] + " = '" + Strings::Escape(e.marknpc) + "'");
v.push_back(columns[3] + " = '" + e.leadershipaa + "'"); v.push_back(columns[3] + " = '" + Strings::Escape(e.leadershipaa) + "'");
v.push_back(columns[4] + " = '" + Strings::Escape(e.maintank) + "'"); v.push_back(columns[4] + " = '" + Strings::Escape(e.maintank) + "'");
v.push_back(columns[5] + " = '" + Strings::Escape(e.assist) + "'"); v.push_back(columns[5] + " = '" + Strings::Escape(e.assist) + "'");
v.push_back(columns[6] + " = '" + Strings::Escape(e.puller) + "'"); v.push_back(columns[6] + " = '" + Strings::Escape(e.puller) + "'");
@@ -222,7 +222,7 @@ public:
v.push_back(std::to_string(e.gid)); v.push_back(std::to_string(e.gid));
v.push_back("'" + Strings::Escape(e.leadername) + "'"); v.push_back("'" + Strings::Escape(e.leadername) + "'");
v.push_back("'" + Strings::Escape(e.marknpc) + "'"); v.push_back("'" + Strings::Escape(e.marknpc) + "'");
v.push_back("'" + e.leadershipaa + "'"); v.push_back("'" + Strings::Escape(e.leadershipaa) + "'");
v.push_back("'" + Strings::Escape(e.maintank) + "'"); v.push_back("'" + Strings::Escape(e.maintank) + "'");
v.push_back("'" + Strings::Escape(e.assist) + "'"); v.push_back("'" + Strings::Escape(e.assist) + "'");
v.push_back("'" + Strings::Escape(e.puller) + "'"); v.push_back("'" + Strings::Escape(e.puller) + "'");
@@ -260,7 +260,7 @@ public:
v.push_back(std::to_string(e.gid)); v.push_back(std::to_string(e.gid));
v.push_back("'" + Strings::Escape(e.leadername) + "'"); v.push_back("'" + Strings::Escape(e.leadername) + "'");
v.push_back("'" + Strings::Escape(e.marknpc) + "'"); v.push_back("'" + Strings::Escape(e.marknpc) + "'");
v.push_back("'" + e.leadershipaa + "'"); v.push_back("'" + Strings::Escape(e.leadershipaa) + "'");
v.push_back("'" + Strings::Escape(e.maintank) + "'"); v.push_back("'" + Strings::Escape(e.maintank) + "'");
v.push_back("'" + Strings::Escape(e.assist) + "'"); v.push_back("'" + Strings::Escape(e.assist) + "'");
v.push_back("'" + Strings::Escape(e.puller) + "'"); v.push_back("'" + Strings::Escape(e.puller) + "'");
@@ -418,7 +418,7 @@ public:
v.push_back(std::to_string(e.gid)); v.push_back(std::to_string(e.gid));
v.push_back("'" + Strings::Escape(e.leadername) + "'"); v.push_back("'" + Strings::Escape(e.leadername) + "'");
v.push_back("'" + Strings::Escape(e.marknpc) + "'"); v.push_back("'" + Strings::Escape(e.marknpc) + "'");
v.push_back("'" + e.leadershipaa + "'"); v.push_back("'" + Strings::Escape(e.leadershipaa) + "'");
v.push_back("'" + Strings::Escape(e.maintank) + "'"); v.push_back("'" + Strings::Escape(e.maintank) + "'");
v.push_back("'" + Strings::Escape(e.assist) + "'"); v.push_back("'" + Strings::Escape(e.assist) + "'");
v.push_back("'" + Strings::Escape(e.puller) + "'"); v.push_back("'" + Strings::Escape(e.puller) + "'");
@@ -449,7 +449,7 @@ public:
v.push_back(std::to_string(e.gid)); v.push_back(std::to_string(e.gid));
v.push_back("'" + Strings::Escape(e.leadername) + "'"); v.push_back("'" + Strings::Escape(e.leadername) + "'");
v.push_back("'" + Strings::Escape(e.marknpc) + "'"); v.push_back("'" + Strings::Escape(e.marknpc) + "'");
v.push_back("'" + e.leadershipaa + "'"); v.push_back("'" + Strings::Escape(e.leadershipaa) + "'");
v.push_back("'" + Strings::Escape(e.maintank) + "'"); v.push_back("'" + Strings::Escape(e.maintank) + "'");
v.push_back("'" + Strings::Escape(e.assist) + "'"); v.push_back("'" + Strings::Escape(e.assist) + "'");
v.push_back("'" + Strings::Escape(e.puller) + "'"); v.push_back("'" + Strings::Escape(e.puller) + "'");
@@ -30,10 +30,6 @@ public:
uint8_t multiplier; uint8_t multiplier;
uint16_t npc_min_level; uint16_t npc_min_level;
uint16_t npc_max_level; uint16_t npc_max_level;
int8_t min_expansion;
int8_t max_expansion;
std::string content_flags;
std::string content_flags_disabled;
}; };
static std::string PrimaryKey() static std::string PrimaryKey()
@@ -55,10 +51,6 @@ public:
"multiplier", "multiplier",
"npc_min_level", "npc_min_level",
"npc_max_level", "npc_max_level",
"min_expansion",
"max_expansion",
"content_flags",
"content_flags_disabled",
}; };
} }
@@ -76,10 +68,6 @@ public:
"multiplier", "multiplier",
"npc_min_level", "npc_min_level",
"npc_max_level", "npc_max_level",
"min_expansion",
"max_expansion",
"content_flags",
"content_flags_disabled",
}; };
} }
@@ -131,10 +119,6 @@ public:
e.multiplier = 1; e.multiplier = 1;
e.npc_min_level = 0; e.npc_min_level = 0;
e.npc_max_level = 0; e.npc_max_level = 0;
e.min_expansion = -1;
e.max_expansion = -1;
e.content_flags = "";
e.content_flags_disabled = "";
return e; return e;
} }
@@ -182,10 +166,6 @@ public:
e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1; e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1;
e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0; e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0; e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0;
e.min_expansion = row[11] ? static_cast<int8_t>(atoi(row[11])) : -1;
e.max_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.content_flags = row[13] ? row[13] : "";
e.content_flags_disabled = row[14] ? row[14] : "";
return e; return e;
} }
@@ -230,10 +210,6 @@ public:
v.push_back(columns[8] + " = " + std::to_string(e.multiplier)); v.push_back(columns[8] + " = " + std::to_string(e.multiplier));
v.push_back(columns[9] + " = " + std::to_string(e.npc_min_level)); v.push_back(columns[9] + " = " + std::to_string(e.npc_min_level));
v.push_back(columns[10] + " = " + std::to_string(e.npc_max_level)); v.push_back(columns[10] + " = " + std::to_string(e.npc_max_level));
v.push_back(columns[11] + " = " + std::to_string(e.min_expansion));
v.push_back(columns[12] + " = " + std::to_string(e.max_expansion));
v.push_back(columns[13] + " = '" + Strings::Escape(e.content_flags) + "'");
v.push_back(columns[14] + " = '" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -266,10 +242,6 @@ public:
v.push_back(std::to_string(e.multiplier)); v.push_back(std::to_string(e.multiplier));
v.push_back(std::to_string(e.npc_min_level)); v.push_back(std::to_string(e.npc_min_level));
v.push_back(std::to_string(e.npc_max_level)); v.push_back(std::to_string(e.npc_max_level));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -310,10 +282,6 @@ public:
v.push_back(std::to_string(e.multiplier)); v.push_back(std::to_string(e.multiplier));
v.push_back(std::to_string(e.npc_min_level)); v.push_back(std::to_string(e.npc_min_level));
v.push_back(std::to_string(e.npc_max_level)); v.push_back(std::to_string(e.npc_max_level));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
} }
@@ -358,10 +326,6 @@ public:
e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1; e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1;
e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0; e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0; e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0;
e.min_expansion = row[11] ? static_cast<int8_t>(atoi(row[11])) : -1;
e.max_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.content_flags = row[13] ? row[13] : "";
e.content_flags_disabled = row[14] ? row[14] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -397,10 +361,6 @@ public:
e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1; e.multiplier = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 1;
e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0; e.npc_min_level = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0; e.npc_max_level = row[10] ? static_cast<uint16_t>(strtoul(row[10], nullptr, 10)) : 0;
e.min_expansion = row[11] ? static_cast<int8_t>(atoi(row[11])) : -1;
e.max_expansion = row[12] ? static_cast<int8_t>(atoi(row[12])) : -1;
e.content_flags = row[13] ? row[13] : "";
e.content_flags_disabled = row[14] ? row[14] : "";
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -486,10 +446,6 @@ public:
v.push_back(std::to_string(e.multiplier)); v.push_back(std::to_string(e.multiplier));
v.push_back(std::to_string(e.npc_min_level)); v.push_back(std::to_string(e.npc_min_level));
v.push_back(std::to_string(e.npc_max_level)); v.push_back(std::to_string(e.npc_max_level));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -523,10 +479,6 @@ public:
v.push_back(std::to_string(e.multiplier)); v.push_back(std::to_string(e.multiplier));
v.push_back(std::to_string(e.npc_min_level)); v.push_back(std::to_string(e.npc_min_level));
v.push_back(std::to_string(e.npc_max_level)); v.push_back(std::to_string(e.npc_max_level));
v.push_back(std::to_string(e.min_expansion));
v.push_back(std::to_string(e.max_expansion));
v.push_back("'" + Strings::Escape(e.content_flags) + "'");
v.push_back("'" + Strings::Escape(e.content_flags_disabled) + "'");
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
} }
@@ -146,7 +146,6 @@ public:
int32_t heroic_strikethrough; int32_t heroic_strikethrough;
int32_t faction_amount; int32_t faction_amount;
uint8_t keeps_sold_items; uint8_t keeps_sold_items;
uint8_t is_parcel_merchant;
}; };
static std::string PrimaryKey() static std::string PrimaryKey()
@@ -284,7 +283,6 @@ public:
"heroic_strikethrough", "heroic_strikethrough",
"faction_amount", "faction_amount",
"keeps_sold_items", "keeps_sold_items",
"is_parcel_merchant",
}; };
} }
@@ -418,7 +416,6 @@ public:
"heroic_strikethrough", "heroic_strikethrough",
"faction_amount", "faction_amount",
"keeps_sold_items", "keeps_sold_items",
"is_parcel_merchant",
}; };
} }
@@ -586,7 +583,6 @@ public:
e.heroic_strikethrough = 0; e.heroic_strikethrough = 0;
e.faction_amount = 0; e.faction_amount = 0;
e.keeps_sold_items = 1; e.keeps_sold_items = 1;
e.is_parcel_merchant = 0;
return e; return e;
} }
@@ -750,7 +746,6 @@ public:
e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0; e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0;
e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0; e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0;
e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1; e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1;
e.is_parcel_merchant = row[127] ? static_cast<uint8_t>(strtoul(row[127], nullptr, 10)) : 0;
return e; return e;
} }
@@ -910,7 +905,6 @@ public:
v.push_back(columns[124] + " = " + std::to_string(e.heroic_strikethrough)); v.push_back(columns[124] + " = " + std::to_string(e.heroic_strikethrough));
v.push_back(columns[125] + " = " + std::to_string(e.faction_amount)); v.push_back(columns[125] + " = " + std::to_string(e.faction_amount));
v.push_back(columns[126] + " = " + std::to_string(e.keeps_sold_items)); v.push_back(columns[126] + " = " + std::to_string(e.keeps_sold_items));
v.push_back(columns[127] + " = " + std::to_string(e.is_parcel_merchant));
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -1059,7 +1053,6 @@ public:
v.push_back(std::to_string(e.heroic_strikethrough)); v.push_back(std::to_string(e.heroic_strikethrough));
v.push_back(std::to_string(e.faction_amount)); v.push_back(std::to_string(e.faction_amount));
v.push_back(std::to_string(e.keeps_sold_items)); v.push_back(std::to_string(e.keeps_sold_items));
v.push_back(std::to_string(e.is_parcel_merchant));
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -1216,7 +1209,6 @@ public:
v.push_back(std::to_string(e.heroic_strikethrough)); v.push_back(std::to_string(e.heroic_strikethrough));
v.push_back(std::to_string(e.faction_amount)); v.push_back(std::to_string(e.faction_amount));
v.push_back(std::to_string(e.keeps_sold_items)); v.push_back(std::to_string(e.keeps_sold_items));
v.push_back(std::to_string(e.is_parcel_merchant));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
} }
@@ -1377,7 +1369,6 @@ public:
e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0; e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0;
e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0; e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0;
e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1; e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1;
e.is_parcel_merchant = row[127] ? static_cast<uint8_t>(strtoul(row[127], nullptr, 10)) : 0;
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -1529,7 +1520,6 @@ public:
e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0; e.heroic_strikethrough = row[124] ? static_cast<int32_t>(atoi(row[124])) : 0;
e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0; e.faction_amount = row[125] ? static_cast<int32_t>(atoi(row[125])) : 0;
e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1; e.keeps_sold_items = row[126] ? static_cast<uint8_t>(strtoul(row[126], nullptr, 10)) : 1;
e.is_parcel_merchant = row[127] ? static_cast<uint8_t>(strtoul(row[127], nullptr, 10)) : 0;
all_entries.push_back(e); all_entries.push_back(e);
} }
@@ -1731,7 +1721,6 @@ public:
v.push_back(std::to_string(e.heroic_strikethrough)); v.push_back(std::to_string(e.heroic_strikethrough));
v.push_back(std::to_string(e.faction_amount)); v.push_back(std::to_string(e.faction_amount));
v.push_back(std::to_string(e.keeps_sold_items)); v.push_back(std::to_string(e.keeps_sold_items));
v.push_back(std::to_string(e.is_parcel_merchant));
auto results = db.QueryDatabase( auto results = db.QueryDatabase(
fmt::format( fmt::format(
@@ -1881,7 +1870,6 @@ public:
v.push_back(std::to_string(e.heroic_strikethrough)); v.push_back(std::to_string(e.heroic_strikethrough));
v.push_back(std::to_string(e.faction_amount)); v.push_back(std::to_string(e.faction_amount));
v.push_back(std::to_string(e.keeps_sold_items)); v.push_back(std::to_string(e.keeps_sold_items));
v.push_back(std::to_string(e.is_parcel_merchant));
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")"); insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
} }
@@ -1,114 +0,0 @@
#ifndef EQEMU_CHARACTER_PARCELS_REPOSITORY_H
#define EQEMU_CHARACTER_PARCELS_REPOSITORY_H
#include "../database.h"
#include "../strings.h"
#include "base/base_character_parcels_repository.h"
class CharacterParcelsRepository: public BaseCharacterParcelsRepository {
public:
/**
* This file was auto generated and can be modified and extended upon
*
* Base repository methods are automatically
* generated in the "base" version of this repository. The base repository
* is immutable and to be left untouched, while methods in this class
* are used as extension methods for more specific persistence-layer
* accessors or mutators.
*
* Base Methods (Subject to be expanded upon in time)
*
* Note: Not all tables are designed appropriately to fit functionality with all base methods
*
* InsertOne
* UpdateOne
* DeleteOne
* FindOne
* GetWhere(std::string where_filter)
* DeleteWhere(std::string where_filter)
* InsertMany
* All
*
* Example custom methods in a repository
*
* ParcelsRepository::GetByZoneAndVersion(int zone_id, int zone_version)
* ParcelsRepository::GetWhereNeverExpires()
* ParcelsRepository::GetWhereXAndY()
* ParcelsRepository::DeleteWhereXAndY()
*
* Most of the above could be covered by base methods, but if you as a developer
* find yourself re-using logic for other parts of the code, its best to just make a
* method that can be re-used easily elsewhere especially if it can use a base repository
* method and encapsulate filters there
*/
// Custom extended repository methods here
struct ParcelCountAndCharacterName
{
std::string character_name;
uint32 char_id;
uint32 parcel_count;
};
static std::vector<ParcelCountAndCharacterName> GetParcelCountAndCharacterName(Database &db, const std::string &character_name)
{
std::vector<ParcelCountAndCharacterName> all_entries;
auto results = db.QueryDatabase(
fmt::format(
"SELECT c.name, COUNT(p.id), c.id FROM character_data c "
"LEFT JOIN character_parcels p ON p.char_id = c.id "
"WHERE c.name = '{}' "
"LIMIT 1",
character_name)
);
all_entries.reserve(results.RowCount());
for(auto row = results.begin(); row != results.end(); ++row) {
ParcelCountAndCharacterName e {};
e.character_name = row[0] ? row[0] : "";
e.parcel_count = row[1] ? Strings::ToUnsignedInt(row[1]) : 0;
e.char_id = row[2] ? Strings::ToUnsignedInt(row[2]) : 0;
all_entries.push_back(e);
}
return all_entries;
}
static int GetNextFreeParcelSlot(Database& db, const uint32 character_id, const uint32 max_slots)
{
const auto& l = CharacterParcelsRepository::GetWhere(
db,
fmt::format(
"char_id = '{}' ORDER BY slot_id ASC",
character_id
)
);
if (l.empty()) {
return PARCEL_BEGIN_SLOT;
}
for (uint32 i = PARCEL_BEGIN_SLOT; i <= max_slots; i++) {
auto it = std::find_if(
l.cbegin(),
l.cend(),
[&](const auto &x) {
return x.slot_id == i;
}
);
if (it == l.end()) {
return i;
}
}
return INVALID_INDEX;
}
};
#endif //EQEMU_CHARACTER_PARCELS_REPOSITORY_H
@@ -70,7 +70,6 @@ public:
{.parent_command = "set", .sub_command = "alternate_currency", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setaltcurrency"}, {.parent_command = "set", .sub_command = "alternate_currency", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setaltcurrency"},
{.parent_command = "set", .sub_command = "animation", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanim"}, {.parent_command = "set", .sub_command = "animation", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanim"},
{.parent_command = "set", .sub_command = "anon", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanon"}, {.parent_command = "set", .sub_command = "anon", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setanon"},
{.parent_command = "set", .sub_command = "auto_login", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "setautologin"},
{.parent_command = "set", .sub_command = "bind", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "bind"}, {.parent_command = "set", .sub_command = "bind", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "bind"},
{.parent_command = "set", .sub_command = "checksum", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "updatechecksum"}, {.parent_command = "set", .sub_command = "checksum", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "updatechecksum"},
{.parent_command = "set", .sub_command = "class_permanent", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "permaclass"}, {.parent_command = "set", .sub_command = "class_permanent", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "permaclass"},
@@ -123,7 +122,6 @@ public:
{.parent_command = "set", .sub_command = "zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "zclip|zcolor|zheader|zonelock|zsafecoords|zsky|zunderworld"}, {.parent_command = "set", .sub_command = "zone", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "zclip|zcolor|zheader|zonelock|zsafecoords|zsky|zunderworld"},
{.parent_command = "show", .sub_command = "aas", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaas"}, {.parent_command = "show", .sub_command = "aas", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaas"},
{.parent_command = "show", .sub_command = "aa_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaapoints|showaapts"}, {.parent_command = "show", .sub_command = "aa_points", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showaapoints|showaapts"},
{.parent_command = "show", .sub_command = "auto_login", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showautologin"},
{.parent_command = "show", .sub_command = "aggro", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "aggro"}, {.parent_command = "show", .sub_command = "aggro", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "aggro"},
{.parent_command = "show", .sub_command = "buffs", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showbuffs"}, {.parent_command = "show", .sub_command = "buffs", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "showbuffs"},
{.parent_command = "show", .sub_command = "buried_corpse_count", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "getplayerburiedcorpsecount"}, {.parent_command = "show", .sub_command = "buried_corpse_count", .access_level = AccountStatus::QuestTroupe, .top_level_aliases = "getplayerburiedcorpsecount"},
+1 -14
View File
@@ -7,6 +7,7 @@
class GroupLeadersRepository: public BaseGroupLeadersRepository { class GroupLeadersRepository: public BaseGroupLeadersRepository {
public: public:
/** /**
* This file was auto generated and can be modified and extended upon * This file was auto generated and can be modified and extended upon
* *
@@ -52,20 +53,6 @@ public:
) )
); );
} }
static int UpdateLeadershipAA(Database &db, std::string &aa, uint32 group_id)
{
const auto group_leader = GetWhere(db, fmt::format("gid = '{}' LIMIT 1", group_id));
if(group_leader.empty()) {
return 0;
}
db.Encode(aa);
auto m = group_leader[0];
m.leadershipaa = aa;
return UpdateOne(db, m);
}
}; };
#endif //EQEMU_GROUP_LEADERS_REPOSITORY_H #endif //EQEMU_GROUP_LEADERS_REPOSITORY_H
@@ -190,17 +190,6 @@ public:
return UpdateOne(db, m); return UpdateOne(db, m);
} }
static void ClearOnlineStatus(Database &db)
{
auto results = db.QueryDatabase(
fmt::format(
"UPDATE {} SET `online` = 0 "
"WHERE `online` = 1;",
TableName()
)
);
}
}; };
#endif //EQEMU_GUILD_MEMBERS_REPOSITORY_H #endif //EQEMU_GUILD_MEMBERS_REPOSITORY_H
@@ -45,31 +45,6 @@ public:
// Custom extended repository methods here // Custom extended repository methods here
static std::map<std::string, GuildPermissions> LoadAll(Database &db)
{
std::map<std::string, GuildPermissions> all_entries;
auto results = db.QueryDatabase(
fmt::format(
"{} WHERE `guild_id` < {}",
BaseSelect(),
RoF2::constants::MAX_GUILD_ID
));
for (auto row = results.begin(); row != results.end(); ++row) {
GuildPermissions e{};
e.id = static_cast<int32_t>(atoi(row[0]));
e.perm_id = static_cast<int32_t>(atoi(row[1]));
e.guild_id = static_cast<int32_t>(atoi(row[2]));
e.permission = static_cast<int32_t>(atoi(row[3]));
auto key = fmt::format("{}-{}", e.guild_id, e.perm_id);
all_entries.emplace(key, e);
}
return all_entries;
}
}; };
#endif //EQEMU_GUILD_PERMISSIONS_REPOSITORY_H #endif //EQEMU_GUILD_PERMISSIONS_REPOSITORY_H
@@ -60,30 +60,6 @@ public:
return 1; return 1;
} }
static std::map<std::string, std::string> LoadAll(Database &db)
{
std::map<std::string, std::string> all_entries;
auto results = db.QueryDatabase(fmt::format(
"{} WHERE `guild_id` < {}",
BaseSelect(),
RoF2::constants::MAX_GUILD_ID)
);
for (auto row = results.begin(); row != results.end(); ++row) {
GuildRanks e{};
e.guild_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
e.rank_ = row[1] ? static_cast<uint8_t>(strtoul(row[1], nullptr, 10)) : 0;
e.title = row[2] ? row[2] : "";
auto key = fmt::format("{}-{}", e.guild_id, e.rank_);
all_entries.emplace(key, e.title);
}
return all_entries;
}
}; };
#endif //EQEMU_GUILD_RANKS_REPOSITORY_H #endif //EQEMU_GUILD_RANKS_REPOSITORY_H
-15
View File
@@ -330,7 +330,6 @@ RULE_BOOL(World, UseOldShadowKnightClassExport, true, "Disable to have Shadowkni
RULE_STRING(World, IPExemptionZones, "", "Comma-delimited list of zones to exclude from IP-limit checks. Empty string to disable.") RULE_STRING(World, IPExemptionZones, "", "Comma-delimited list of zones to exclude from IP-limit checks. Empty string to disable.")
RULE_STRING(World, MOTD, "", "Server MOTD sent on login, change from empty to have this be used instead of variables table 'motd' value") RULE_STRING(World, MOTD, "", "Server MOTD sent on login, change from empty to have this be used instead of variables table 'motd' value")
RULE_STRING(World, Rules, "", "Server Rules, change from empty to have this be used instead of variables table 'rules' value, lines are pipe (|) separated, example: A|B|C") RULE_STRING(World, Rules, "", "Server Rules, change from empty to have this be used instead of variables table 'rules' value, lines are pipe (|) separated, example: A|B|C")
RULE_BOOL(World, EnableAutoLogin, false, "Enables or disables auto login of characters, allowing people to log characters in directly from loginserver to ingame")
RULE_CATEGORY_END() RULE_CATEGORY_END()
RULE_CATEGORY(Zone) RULE_CATEGORY(Zone)
@@ -511,8 +510,6 @@ RULE_CATEGORY(Combat)
RULE_REAL(Combat, AERampageMaxDistance, 70, "Max AERampage range (% of max combat distance)") RULE_REAL(Combat, AERampageMaxDistance, 70, "Max AERampage range (% of max combat distance)")
RULE_INT(Combat, PetBaseCritChance, 0, "Pet base crit chance") RULE_INT(Combat, PetBaseCritChance, 0, "Pet base crit chance")
RULE_INT(Combat, NPCBashKickLevel, 6, "The level that NPCcan KICK/BASH") RULE_INT(Combat, NPCBashKickLevel, 6, "The level that NPCcan KICK/BASH")
RULE_INT(Combat, NPCKickStunLevel, 1, "The level that NPC has a chance to stun with kick.")
RULE_INT(Combat, PCKickStunLevel, 56, "The level that PC has a chance to stun with kick.")
RULE_INT(Combat, MeleeCritDifficulty, 8900, "Value against which is rolled to check if a melee crit is triggered. Lower is easier") RULE_INT(Combat, MeleeCritDifficulty, 8900, "Value against which is rolled to check if a melee crit is triggered. Lower is easier")
RULE_INT(Combat, ArcheryCritDifficulty, 3400, "Value against which is rolled to check if an archery crit is triggered. Lower is easier") RULE_INT(Combat, ArcheryCritDifficulty, 3400, "Value against which is rolled to check if an archery crit is triggered. Lower is easier")
RULE_INT(Combat, ThrowingCritDifficulty, 1100, "Value against which is rolled to check if a throwing crit is triggered. Lower is easier") RULE_INT(Combat, ThrowingCritDifficulty, 1100, "Value against which is rolled to check if a throwing crit is triggered. Lower is easier")
@@ -599,8 +596,6 @@ RULE_INT(Combat, ClassicTripleAttackChanceMonk, 100, "Innate Chance for Monk to
RULE_INT(Combat, ClassicTripleAttackChanceBerserker, 100, "Innate Chance for Berserker to Triple Attack after a Double Attack (200 = 20%). DEFAULT: 100") RULE_INT(Combat, ClassicTripleAttackChanceBerserker, 100, "Innate Chance for Berserker to Triple Attack after a Double Attack (200 = 20%). DEFAULT: 100")
RULE_INT(Combat, ClassicTripleAttackChanceRanger, 100, "Innate Chance for Ranger to Triple Attack after a Double Attack (200 = 20%). DEFAULT: 100") RULE_INT(Combat, ClassicTripleAttackChanceRanger, 100, "Innate Chance for Ranger to Triple Attack after a Double Attack (200 = 20%). DEFAULT: 100")
RULE_INT(Combat, StunChance, 12, "Percent chance that client will be stunned when mob is behind player. DEFAULT: 12") RULE_INT(Combat, StunChance, 12, "Percent chance that client will be stunned when mob is behind player. DEFAULT: 12")
RULE_INT(Combat, StunDuration, 2000, "Duration of stuns in ms. DEFAULT: 2000")
RULE_BOOL(Combat, ClientStunMessage, false, "Client stunning NPC produces message. DEFAULT false")
RULE_BOOL(Combat, BashTwoHanderUseShoulderAC, false, "Enable to use shoulder AC for bash calculations when two hander is equipped. Unproven if accurate DEFAULT: false") RULE_BOOL(Combat, BashTwoHanderUseShoulderAC, false, "Enable to use shoulder AC for bash calculations when two hander is equipped. Unproven if accurate DEFAULT: false")
RULE_REAL(Combat, BashACBonusDivisor, 25.0, "this divides the AC value contribution to bash damage, lower to increase damage") RULE_REAL(Combat, BashACBonusDivisor, 25.0, "this divides the AC value contribution to bash damage, lower to increase damage")
RULE_CATEGORY_END() RULE_CATEGORY_END()
@@ -963,16 +958,6 @@ RULE_BOOL(Items, DisablePotionBelt, false, "Enable this to disable Potion Belt I
RULE_BOOL(Items, DisableSpellFocusEffects, false, "Enable this to disable Spell Focus Effects on Items") RULE_BOOL(Items, DisableSpellFocusEffects, false, "Enable this to disable Spell Focus Effects on Items")
RULE_CATEGORY_END() RULE_CATEGORY_END()
RULE_CATEGORY(Parcel)
RULE_BOOL(Parcel, EnableParcelMerchants, true, "Enable or Disable Parcel Merchants. Requires RoF+ Clients.")
RULE_BOOL(Parcel, EnableDirectToInventoryDelivery, false, "Enable or Disable RoF2 bazaar purchases to be delivered directly to the buyer's inventory.")
RULE_BOOL(Parcel, DeleteOnDuplicate, false, "Delete retrieved item if it creates a lore conflict.")
RULE_BOOL(Parcel, EnablePruning, false, "Enable the automatic pruning of sent parcels. Uses rule ParcelPruneDelay for prune delay.")
RULE_INT(Parcel, ParcelDeliveryDelay, 30000, "Sets the time that a player must wait between sending parcels.")
RULE_INT(Parcel, ParcelMaxItems, 50, "The maximum number of parcels a player is allowed to have in their mailbox.")
RULE_INT(Parcel, ParcelPruneDelay, 30, "The number of days after which a parcel is deleted. Items are lost!")
RULE_CATEGORY_END()
#undef RULE_CATEGORY #undef RULE_CATEGORY
#undef RULE_INT #undef RULE_INT
#undef RULE_REAL #undef RULE_REAL
+1 -1
View File
@@ -11,7 +11,7 @@ namespace ServerEvents {
static const std::string EVENT_TYPE_RELOAD_WORLD = "reload_world"; static const std::string EVENT_TYPE_RELOAD_WORLD = "reload_world";
static const std::string EVENT_TYPE_RULE_CHANGE = "rule_change"; static const std::string EVENT_TYPE_RULE_CHANGE = "rule_change";
static const std::string EVENT_TYPE_CONTENT_FLAG_CHANGE = "content_flag_change"; static const std::string EVENT_TYPE_CONTENT_FLAG_CHANGE = "content_flag_change";
} // namespace ServerEvents }
class ServerEventScheduler { class ServerEventScheduler {
public: public:
+1 -4
View File
@@ -43,7 +43,7 @@
#define ServerOP_OnlineGuildMembersResponse 0x0016 #define ServerOP_OnlineGuildMembersResponse 0x0016
#define ServerOP_LFGuildUpdate 0x0017 #define ServerOP_LFGuildUpdate 0x0017
#define ServerOP_FlagUpdate 0x0018 // GM flag updated for character, refresh the memory cache #define ServerOP_FlagUpdate 0x0018 // GM Flag updated for character, refresh the memory cache
#define ServerOP_GMGoto 0x0019 #define ServerOP_GMGoto 0x0019
#define ServerOP_MultiLineMsg 0x001A #define ServerOP_MultiLineMsg 0x001A
#define ServerOP_Lock 0x001B // For #lock/#unlock inside server #define ServerOP_Lock 0x001B // For #lock/#unlock inside server
@@ -113,9 +113,6 @@
#define ServerOP_GuildSendGuildList 0x007E #define ServerOP_GuildSendGuildList 0x007E
#define ServerOP_GuildMembersList 0x007F #define ServerOP_GuildMembersList 0x007F
#define ServerOP_ParcelDelivery 0x0090
#define ServerOP_ParcelPrune 0x0091
#define ServerOP_RaidAdd 0x0100 //in use #define ServerOP_RaidAdd 0x0100 //in use
#define ServerOP_RaidRemove 0x0101 //in use #define ServerOP_RaidRemove 0x0101 //in use
#define ServerOP_RaidDisband 0x0102 //in use #define ServerOP_RaidDisband 0x0102 //in use
+16 -10
View File
@@ -13,11 +13,16 @@ SkillCapsRepository::SkillCaps SkillCaps::GetSkillCap(uint8 class_id, EQ::skills
return SkillCapsRepository::NewEntity(); return SkillCapsRepository::NewEntity();
} }
uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast<uint32>(skill_id); for (const auto &e: m_skill_caps) {
auto pos = m_skill_caps.find(key); if (
if (pos != m_skill_caps.end()) { e.class_id == class_id &&
return pos->second; e.level == level &&
static_cast<EQ::skills::SkillType>(e.skill_id) == skill_id
) {
return e;
} }
}
return SkillCapsRepository::NewEntity(); return SkillCapsRepository::NewEntity();
} }
@@ -41,9 +46,11 @@ uint8 SkillCaps::GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, u
for (const auto &e: m_skill_caps) { for (const auto &e: m_skill_caps) {
for (uint8 current_level = 1; current_level <= max_level; current_level++) { for (uint8 current_level = 1; current_level <= max_level; current_level++) {
uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast<uint32>(skill_id); if (
auto pos = m_skill_caps.find(key); e.class_id == class_id &&
if (pos != m_skill_caps.end()) { static_cast<EQ::skills::SkillType>(e.skill_id) == skill_id &&
e.level == current_level
) {
return current_level; return current_level;
} }
} }
@@ -56,7 +63,7 @@ void SkillCaps::LoadSkillCaps()
{ {
const auto &l = SkillCapsRepository::All(*m_content_database); const auto &l = SkillCapsRepository::All(*m_content_database);
m_skill_caps.clear(); m_skill_caps.reserve(l.size());
for (const auto &e: l) { for (const auto &e: l) {
if ( if (
@@ -67,8 +74,7 @@ void SkillCaps::LoadSkillCaps()
continue; continue;
} }
uint64_t key = (e.class_id * 1000000) + (e.level * 1000) + e.skill_id; m_skill_caps.emplace_back(e);
m_skill_caps[key] = e;
} }
LogInfo( LogInfo(
+1 -1
View File
@@ -17,7 +17,7 @@ public:
SkillCaps *SetContentDatabase(Database *db); SkillCaps *SetContentDatabase(Database *db);
private: private:
Database *m_content_database{}; Database *m_content_database{};
std::map<uint64, SkillCapsRepository::SkillCaps> m_skill_caps = {}; std::vector<SkillCapsRepository::SkillCaps> m_skill_caps = {};
}; };
extern SkillCaps skill_caps; extern SkillCaps skill_caps;
+1 -1
View File
@@ -916,7 +916,7 @@ typedef enum {
#define SE_AttackSpeed3 119 // implemented #define SE_AttackSpeed3 119 // implemented
#define SE_HealRate 120 // implemented - reduces healing by a % #define SE_HealRate 120 // implemented - reduces healing by a %
#define SE_ReverseDS 121 // implemented #define SE_ReverseDS 121 // implemented
#define SE_ReduceSkill 122 // implemented - base: skill id, limit: none, max: none, formula: % skill is reduced (positive) //#define SE_ReduceSkill 122 // not implemented TODO: Now used on live, decreases skills by percent
#define SE_Screech 123 // implemented Spell Blocker(If have buff with value +1 will block any effect with -1) #define SE_Screech 123 // implemented Spell Blocker(If have buff with value +1 will block any effect with -1)
#define SE_ImprovedDamage 124 // implemented #define SE_ImprovedDamage 124 // implemented
#define SE_ImprovedHeal 125 // implemented #define SE_ImprovedHeal 125 // implemented
+3 -3
View File
@@ -25,7 +25,7 @@
// Build variables // Build variables
// these get injected during the build pipeline // these get injected during the build pipeline
#define CURRENT_VERSION "22.50.1-dev" // always append -dev to the current version for custom-builds #define CURRENT_VERSION "22.48.0-dev" // always append -dev to the current version for custom-builds
#define LOGIN_VERSION "0.8.0" #define LOGIN_VERSION "0.8.0"
#define COMPILE_DATE __DATE__ #define COMPILE_DATE __DATE__
#define COMPILE_TIME __TIME__ #define COMPILE_TIME __TIME__
@@ -42,8 +42,8 @@
* Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt * Manifest: https://github.com/EQEmu/Server/blob/master/utils/sql/db_update_manifest.txt
*/ */
#define CURRENT_BINARY_DATABASE_VERSION 9276 #define CURRENT_BINARY_DATABASE_VERSION 9268
#define CURRENT_BINARY_BOTS_DATABASE_VERSION 9044 #define CURRENT_BINARY_BOTS_DATABASE_VERSION 9043
#endif #endif
-26
View File
@@ -162,32 +162,6 @@ std::string ZoneStore::GetZoneLongName(uint32 zone_id)
return {}; return {};
} }
std::string ZoneStore::GetZoneShortNameByLongName(const std::string& zone_long_name)
{
for (const auto& z : m_zones) {
if (z.long_name == zone_long_name) {
return z.short_name;
}
}
LogInfo("Failed to get zone short name by zone_long_name [{}]", zone_long_name);
return {};
}
uint32 ZoneStore::GetZoneIDByLongName(const std::string& zone_long_name)
{
for (const auto& z : m_zones) {
if (z.long_name == zone_long_name) {
return z.zoneidnumber;
}
}
LogInfo("Failed to get zone ID by zone_long_name [{}]", zone_long_name);
return 0;
}
/** /**
* @param zone_id * @param zone_id
* @param version * @param version
-2
View File
@@ -42,8 +42,6 @@ public:
uint32 GetZoneID(std::string zone_name); uint32 GetZoneID(std::string zone_name);
std::string GetZoneName(uint32 zone_id); std::string GetZoneName(uint32 zone_id);
std::string GetZoneLongName(uint32 zone_id); std::string GetZoneLongName(uint32 zone_id);
std::string GetZoneShortNameByLongName(const std::string& zone_long_name);
uint32 GetZoneIDByLongName(const std::string& zone_long_name);
const char *GetZoneName(uint32 zone_id, bool error_unknown = false); const char *GetZoneName(uint32 zone_id, bool error_unknown = false);
const char *GetZoneLongName(uint32 zone_id, bool error_unknown = false); const char *GetZoneLongName(uint32 zone_id, bool error_unknown = false);
ZoneRepository::Zone *GetZoneWithFallback(uint32 zone_id, int version = 0); ZoneRepository::Zone *GetZoneWithFallback(uint32 zone_id, int version = 0);
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "eqemu-server", "name": "eqemu-server",
"version": "22.50.1", "version": "22.48.0",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/EQEmu/Server.git" "url": "https://github.com/EQEmu/Server.git"
-2
View File
@@ -32,13 +32,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/events/player_event_logs.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;
#ifdef _WINDOWS #ifdef _WINDOWS
#include <direct.h> #include <direct.h>
-4
View File
@@ -467,10 +467,6 @@ OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196 OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x0ddd OP_ShopPlayerBuy=0x0ddd
OP_ShopDelItem=0x724f OP_ShopDelItem=0x724f
OP_ShopSendParcel=0x3a5d
OP_ShopDeleteParcel=0x47f1
OP_ShopRetrieveParcel=0x7013
OP_ShopParcelIcon=0x46f0
# tradeskill stuff: # tradeskill stuff:
OP_ClickObject=0x4aa1 OP_ClickObject=0x4aa1
+2 -2
View File
@@ -10,7 +10,7 @@ require (
require ( require (
github.com/golang/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.3.2 // indirect
github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-querystring v1.1.0 // indirect
golang.org/x/crypto v0.21.0 // indirect golang.org/x/crypto v0.17.0 // indirect
golang.org/x/net v0.23.0 // indirect golang.org/x/net v0.17.0 // indirect
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect
) )
+4 -4
View File
@@ -10,12 +10,12 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -260,9 +260,6 @@ foreach my $table_to_generate (@tables) {
elsif ((trim($column_default) eq "" || $column_default eq "NULL") && $column_type =~ /text|varchar/i) { elsif ((trim($column_default) eq "" || $column_default eq "NULL") && $column_type =~ /text|varchar/i) {
$default_value = '""'; $default_value = '""';
} }
elsif ((trim($column_default) eq "" || $column_default eq "NULL") && $column_type =~ /blob/i) {
$default_value = '""';
}
# for datetime values that set default value all zeroed out # for datetime values that set default value all zeroed out
if ($default_value =~ /0000-00-00 00:00:00/i) { if ($default_value =~ /0000-00-00 00:00:00/i) {
@@ -299,9 +296,6 @@ foreach my $table_to_generate (@tables) {
elsif ($data_type =~ /datetime|timestamp/) { elsif ($data_type =~ /datetime|timestamp/) {
$query_value = sprintf('FROM_UNIXTIME(" + (e.%s > 0 ? std::to_string(e.%s) : "null") + ")");', $column_name_formatted, $column_name_formatted); $query_value = sprintf('FROM_UNIXTIME(" + (e.%s > 0 ? std::to_string(e.%s) : "null") + ")");', $column_name_formatted, $column_name_formatted);
} }
elsif ($data_type =~ /blob/) {
$query_value = sprintf('\'" + e.%s + "\'");', $column_name_formatted);
}
$update_one_entries .= sprintf( $update_one_entries .= sprintf(
"\t\t" . 'v.push_back(columns[%s] + " = %s' . "\n", "\t\t" . 'v.push_back(columns[%s] + " = %s' . "\n",
@@ -318,9 +312,6 @@ foreach my $table_to_generate (@tables) {
elsif ($data_type =~ /datetime|timestamp/) { elsif ($data_type =~ /datetime|timestamp/) {
$value = sprintf('"FROM_UNIXTIME(" + (e.%s > 0 ? std::to_string(e.%s) : "null") + ")"', $column_name_formatted, $column_name_formatted); $value = sprintf('"FROM_UNIXTIME(" + (e.%s > 0 ? std::to_string(e.%s) : "null") + ")"', $column_name_formatted, $column_name_formatted);
} }
elsif ($data_type =~ /blob/) {
$value = sprintf("\"'\" + e.%s + \"'\"", $column_name_formatted);
}
$insert_one_entries .= sprintf("\t\tv.push_back(%s);\n", $value); $insert_one_entries .= sprintf("\t\tv.push_back(%s);\n", $value);
$insert_many_entries .= sprintf("\t\t\tv.push_back(%s);\n", $value); $insert_many_entries .= sprintf("\t\t\tv.push_back(%s);\n", $value);
@@ -1,3 +0,0 @@
UPDATE `npc_types` SET `is_parcel_merchant` = 1, `lastname` = 'Parcels and General Supplies'
WHERE id IN (202129, 3036, 394025, 75113, 49073, 41021, 40070, 106115, 55150, 9053, 382156, 1032,
155088, 23017, 61065, 29008, 67058, 54067, 19031, 50140);
+13 -20
View File
@@ -194,20 +194,14 @@ bool Client::CanTradeFVNoDropItem()
void Client::SendEnterWorld(std::string name) void Client::SendEnterWorld(std::string name)
{ {
std::string live_name {}; std::string live_name {};
if (is_player_zoning) { if (is_player_zoning) {
live_name = database.GetLiveChar(GetAccountID()); live_name = database.GetLiveChar(GetAccountID());
if (database.GetAccountIDByChar(live_name) != GetAccountID()) { if(database.GetAccountIDByChar(live_name) != GetAccountID()) {
eqs->Close(); eqs->Close();
return; return;
} else {
LogInfo("Telling client to continue session");
} }
LogInfo("Zoning with live_name [{}] account_id [{}]", live_name, GetAccountID());
}
if (!is_player_zoning && RuleB(World, EnableAutoLogin)) {
live_name = AccountRepository::GetAutoLoginCharacterNameByAccountID(database, GetAccountID());
LogInfo("Attempting to auto login with live_name [{}] account_id [{}]", live_name, GetAccountID());
} }
auto outapp = new EQApplicationPacket(OP_EnterWorld, live_name.length() + 1); auto outapp = new EQApplicationPacket(OP_EnterWorld, live_name.length() + 1);
@@ -1577,20 +1571,19 @@ void Client::QueuePacket(const EQApplicationPacket* app, bool ack_req) {
eqs->QueuePacket(app, ack_req); eqs->QueuePacket(app, ack_req);
} }
void Client::SendGuildList() void Client::SendGuildList() {
{ EQApplicationPacket *outapp;
auto guilds_list = guild_mgr.MakeGuildList(); outapp = new EQApplicationPacket(OP_GuildsList);
std::stringstream ss; //ask the guild manager to build us a nice guild list packet
cereal::BinaryOutputArchive ar(ss); outapp->pBuffer = guild_mgr.MakeGuildList("", outapp->size);
ar(guilds_list); if(outapp->pBuffer == nullptr) {
safe_delete(outapp);
return;
}
uint32 packet_size = ss.str().length();
std::unique_ptr<EQApplicationPacket> out(new EQApplicationPacket(OP_GuildsList, packet_size)); eqs->FastQueuePacket((EQApplicationPacket **)&outapp);
memcpy(out->pBuffer, ss.str().data(), out->size);
QueuePacket(out.get());
} }
// @merth: I have no idea what this struct is for, so it's hardcoded for now // @merth: I have no idea what this struct is for, so it's hardcoded for now
+1 -1
View File
@@ -138,7 +138,7 @@ void ClientListEntry::SetOnline(CLE_Status iOnline)
"Online status [{}] ({}) status [{}] ({})", "Online status [{}] ({}) status [{}] ({})",
AccountName(), AccountName(),
AccountID(), AccountID(),
CLEStatusString[iOnline], CLEStatusString[CLE_Status::Online],
static_cast<int>(iOnline) static_cast<int>(iOnline)
); );
-10
View File
@@ -918,8 +918,6 @@ void ConsoleReloadWorld(
safe_delete(pack); safe_delete(pack);
} }
auto debounce_reload = std::chrono::system_clock::now();
/** /**
* @param connection * @param connection
* @param command * @param command
@@ -936,14 +934,6 @@ void ConsoleReloadZoneQuests(
return; return;
} }
// if now is within 1 second, return
if (std::chrono::system_clock::now() - debounce_reload < std::chrono::seconds(1)) {
debounce_reload = std::chrono::system_clock::now();
return;
}
debounce_reload = std::chrono::system_clock::now();
std::string zone_short_name = args[0]; std::string zone_short_name = args[0];
connection->SendLine(fmt::format("Reloading Zone [{}]...", zone_short_name)); connection->SendLine(fmt::format("Reloading Zone [{}]...", zone_short_name));
-18
View File
@@ -87,7 +87,6 @@
#include "../common/path_manager.h" #include "../common/path_manager.h"
#include "../common/events/player_event_logs.h" #include "../common/events/player_event_logs.h"
#include "../common/skill_caps.h" #include "../common/skill_caps.h"
#include "../common/repositories/character_parcels_repository.h"
SkillCaps skill_caps; SkillCaps skill_caps;
ZoneStore zone_store; ZoneStore zone_store;
@@ -177,9 +176,6 @@ int main(int argc, char **argv)
PurgeInstanceTimer.Start(450000); PurgeInstanceTimer.Start(450000);
Timer EQTimeTimer(600000); Timer EQTimeTimer(600000);
EQTimeTimer.Start(600000); EQTimeTimer.Start(600000);
Timer parcel_prune_timer(86400000);
parcel_prune_timer.Start(86400000);
// global loads // global loads
LogInfo("Loading launcher list"); LogInfo("Loading launcher list");
@@ -424,20 +420,6 @@ int main(int argc, char **argv)
client_list.Process(); client_list.Process();
guild_mgr.Process(); guild_mgr.Process();
if (parcel_prune_timer.Check()) {
if (RuleB(Parcel, EnableParcelMerchants) && RuleB(Parcel, EnablePruning)) {
LogTrading(
"Parcel Prune process running for parcels over <red>[{}] days",
RuleI(Parcel, ParcelPruneDelay)
);
auto out = std::make_unique<ServerPacket>(ServerOP_ParcelPrune);
zoneserver_list.SendPacketToBootedZones(out.get());
database.PurgeCharacterParcels();
}
}
if (player_event_process_timer.Check()) { if (player_event_process_timer.Check()) {
player_event_logs.Process(); player_event_logs.Process();
} }
-4
View File
@@ -1355,10 +1355,6 @@ bool SharedTaskManager::CanRequestSharedTask(uint32_t task_id, const SharedTaskR
return false; return false;
} }
if (is_gm) {
client_list.SendCharacterMessage(requester->CharID(), Chat::White, "Your GM flag allows you to bypass shared task minimum player requirements.");
}
// check if party member count is above the maximum // check if party member count is above the maximum
// todo: live creates the shared task but truncates members if it exceeds max (sorted by leader and raid group numbers) // todo: live creates the shared task but truncates members if it exceeds max (sorted by leader and raid group numbers)
if (task.max_players > 0 && request.members.size() > task.max_players) { if (task.max_players > 0 && request.members.size() > task.max_players) {
-2
View File
@@ -284,8 +284,6 @@ bool WorldBoot::DatabaseLoadRoutines(int argc, char **argv)
database.ClearRaid(); database.ClearRaid();
database.ClearRaidDetails(); database.ClearRaidDetails();
database.ClearRaidLeader(); database.ClearRaidLeader();
LogInfo("Clearing guild online status");
database.ClearGuildOnlineStatus();
LogInfo("Clearing inventory snapshots"); LogInfo("Clearing inventory snapshots");
database.ClearInvSnapshots(); database.ClearInvSnapshots();
LogInfo("Loading items"); LogInfo("Loading items");
+5 -3
View File
@@ -1,7 +1,6 @@
#include "world_event_scheduler.h" #include "world_event_scheduler.h"
#include "../common/servertalk.h" #include "../common/servertalk.h"
#include <ctime> #include <ctime>
#include "../common/rulesys.h"
void WorldEventScheduler::Process(ZSList *zs_list) void WorldEventScheduler::Process(ZSList *zs_list)
{ {
@@ -32,10 +31,13 @@ void WorldEventScheduler::Process(ZSList *zs_list)
); );
for (auto &e: m_events) { for (auto &e: m_events) {
// discard uninteresting events as its less work to calculate time on events we don't care about // discard uninteresting events as its less work to calculate time on events we don't care about
// different processes are interested in different events // different processes are interested in different events
if (e.event_type != ServerEvents::EVENT_TYPE_BROADCAST && if (
e.event_type != ServerEvents::EVENT_TYPE_RELOAD_WORLD) { e.event_type != ServerEvents::EVENT_TYPE_BROADCAST &&
e.event_type != ServerEvents::EVENT_TYPE_RELOAD_WORLD
) {
continue; continue;
} }
-13
View File
@@ -1730,19 +1730,6 @@ void ZoneServer::HandleMessage(uint16 opcode, const EQ::Net::Packet &p) {
} }
break; break;
} }
case ServerOP_ParcelDelivery: {
auto in = (Parcel_Struct *) pack->pBuffer;
if (strlen(in->send_to) == 0) {
LogError(
"ServerOP_ParcelDelivery pack received with invalid character name of [{}]",
in->send_to);
return;
}
zoneserver_list.SendPacketToBootedZones(pack);
break;
}
default: { default: {
LogInfo("Unknown ServerOPcode from zone {:#04x}, size [{}]", pack->opcode, pack->size); LogInfo("Unknown ServerOPcode from zone {:#04x}, size [{}]", pack->opcode, pack->size);
DumpPacket(pack->pBuffer, pack->size); DumpPacket(pack->pBuffer, pack->size);
-1
View File
@@ -101,7 +101,6 @@ SET(zone_sources
npc_scale_manager.cpp npc_scale_manager.cpp
object.cpp object.cpp
oriented_bounding_box.cpp oriented_bounding_box.cpp
parcels.cpp
pathfinder_interface.cpp pathfinder_interface.cpp
pathfinder_nav_mesh.cpp pathfinder_nav_mesh.cpp
pathfinder_null.cpp pathfinder_null.cpp
+5 -5
View File
@@ -221,7 +221,7 @@ void NPC::DescribeAggro(Client *to_who, Mob *mob, bool verbose) {
if (RuleB(Aggro, UseLevelAggro)) { if (RuleB(Aggro, UseLevelAggro)) {
if ( if (
GetLevel() < RuleI(Aggro, MinAggroLevel) && GetLevel() < RuleI(Aggro, MinAggroLevel) &&
mob->GetLevelCon(GetLevel()) == ConsiderColor::Gray && mob->GetLevelCon(GetLevel()) == CON_GRAY &&
GetBodyType() != BT_Undead && GetBodyType() != BT_Undead &&
!AlwaysAggro() !AlwaysAggro()
) { ) {
@@ -237,7 +237,7 @@ void NPC::DescribeAggro(Client *to_who, Mob *mob, bool verbose) {
} else { } else {
if ( if (
GetINT() > RuleI(Aggro, IntAggroThreshold) && GetINT() > RuleI(Aggro, IntAggroThreshold) &&
mob->GetLevelCon(GetLevel()) == ConsiderColor::Gray && mob->GetLevelCon(GetLevel()) == CON_GRAY &&
!AlwaysAggro() !AlwaysAggro()
) { ) {
to_who->Message( to_who->Message(
@@ -502,7 +502,7 @@ bool Mob::CheckWillAggro(Mob *mob) {
mob->IsClient() && mob->IsClient() &&
mob->CastToClient()->IsSitting() mob->CastToClient()->IsSitting()
) || ) ||
mob->GetLevelCon(GetLevel()) != ConsiderColor::Gray mob->GetLevelCon(GetLevel()) != CON_GRAY
) && ) &&
( (
faction_value == FACTION_SCOWLS || faction_value == FACTION_SCOWLS ||
@@ -531,7 +531,7 @@ bool Mob::CheckWillAggro(Mob *mob) {
mob->IsClient() && mob->IsClient() &&
mob->CastToClient()->IsSitting() mob->CastToClient()->IsSitting()
) || ) ||
mob->GetLevelCon(GetLevel()) != ConsiderColor::Gray mob->GetLevelCon(GetLevel()) != CON_GRAY
) && ) &&
( (
faction_value == FACTION_SCOWLS || faction_value == FACTION_SCOWLS ||
@@ -586,7 +586,7 @@ int EntityList::GetHatedCount(Mob *attacker, Mob *exclude, bool inc_gray_con)
continue; continue;
} }
if (!inc_gray_con && attacker->GetLevelCon(mob->GetLevel()) == ConsiderColor::Gray) { if (!inc_gray_con && attacker->GetLevelCon(mob->GetLevel()) == CON_GRAY) {
continue; continue;
} }
+38 -72
View File
@@ -1724,7 +1724,7 @@ void Client::Damage(Mob* other, int64 damage, uint16 spell_id, EQ::skills::Skill
} }
} }
bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillType attack_skill, KilledByTypes killed_by, bool is_buff_tic) bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillType attack_skill, KilledByTypes killed_by)
{ {
if (!ClientFinishedLoading() || dead) { if (!ClientFinishedLoading() || dead) {
return false; return false;
@@ -1786,25 +1786,12 @@ bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::Skil
/* Make Death Packet */ /* Make Death Packet */
EQApplicationPacket app(OP_Death, sizeof(Death_Struct)); EQApplicationPacket app(OP_Death, sizeof(Death_Struct));
Death_Struct* d = (Death_Struct*)app.pBuffer; Death_Struct* d = (Death_Struct*)app.pBuffer;
// Convert last message to color to avoid duplicate damage messages
// that occur in these rare cases when this is the death blow.
if (IsValidSpell(spell) &&
(attack_skill == EQ::skills::SkillTigerClaw ||
(IsDamageSpell(spell) && IsDiscipline(spell)) ||
!is_buff_tic)) {
d->attack_skill = DamageTypeSpell;
d->spell_id = (is_buff_tic) ? UINT32_MAX : spell;
}
else {
d->attack_skill = SkillDamageTypes[attack_skill];
d->spell_id = UINT32_MAX;
}
d->spawn_id = GetID(); d->spawn_id = GetID();
d->killer_id = killer_mob ? killer_mob->GetID() : 0; d->killer_id = killer_mob ? killer_mob->GetID() : 0;
d->corpseid = GetID(); d->corpseid = GetID();
d->bindzoneid = m_pp.binds[0].zone_id; d->bindzoneid = m_pp.binds[0].zone_id;
d->spell_id = IsValidSpell(spell) ? spell : 0xffffffff;
d->attack_skill = IsValidSpell(spell) ? 0xe7 : attack_skill;
d->damage = damage; d->damage = damage;
app.priority = 6; app.priority = 6;
entity_list.QueueClients(this, &app); entity_list.QueueClients(this, &app);
@@ -1959,7 +1946,7 @@ bool Client::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::Skil
} else { } else {
newexp -= exploss; newexp -= exploss;
} }
SetEXP(ExpSource::Death, newexp, GetAAXP()); SetEXP(newexp, GetAAXP());
//m_epp.perAA = 0; //reset to no AA exp on death. //m_epp.perAA = 0; //reset to no AA exp on death.
} }
@@ -2393,7 +2380,7 @@ void NPC::Damage(Mob* other, int64 damage, uint16 spell_id, EQ::skills::SkillTyp
} }
} }
bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillType attack_skill, KilledByTypes killed_by, bool is_buff_tic) bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillType attack_skill, KilledByTypes killed_by)
{ {
LogCombat( LogCombat(
"Fatal blow dealt by [{}] with [{}] damage, spell [{}], skill [{}]", "Fatal blow dealt by [{}] with [{}] damage, spell [{}], skill [{}]",
@@ -2507,27 +2494,14 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
auto d = (Death_Struct*) app->pBuffer; auto d = (Death_Struct*) app->pBuffer;
// Convert last message to color to avoid duplicate damage messages
// that occur in these rare cases when this is the death blow.
if (IsValidSpell(spell) &&
(attack_skill == EQ::skills::SkillTigerClaw ||
(IsDamageSpell(spell) && IsDiscipline(spell)) ||
!is_buff_tic)) {
d->attack_skill = DamageTypeSpell;
d->spell_id = (is_buff_tic) ? UINT32_MAX : spell;
}
else {
d->attack_skill = SkillDamageTypes[attack_skill];
d->spell_id = UINT32_MAX;
}
d->spawn_id = GetID(); d->spawn_id = GetID();
d->killer_id = killer_mob ? killer_mob->GetID() : 0; d->killer_id = killer_mob ? killer_mob->GetID() : 0;
d->bindzoneid = 0; d->bindzoneid = 0;
d->spell_id = UINT32_MAX;
d->attack_skill = SkillDamageTypes[attack_skill];
d->damage = damage; d->damage = damage;
d->corpseid = GetID();
app->priority = 1; app->priority = 6;
entity_list.QueueClients(killer_mob, app, false); entity_list.QueueClients(killer_mob, app, false);
@@ -2617,7 +2591,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
if (killer_raid) { if (killer_raid) {
if (!is_ldon_treasure && MerchantType == 0) { if (!is_ldon_treasure && MerchantType == 0) {
killer_raid->SplitExp(ExpSource::Kill, final_exp, this); killer_raid->SplitExp(final_exp, this);
if ( if (
killer_mob && killer_mob &&
@@ -2683,7 +2657,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
} }
} else if (give_exp_client->IsGrouped() && killer_group) { } else if (give_exp_client->IsGrouped() && killer_group) {
if (!is_ldon_treasure && MerchantType == 0) { if (!is_ldon_treasure && MerchantType == 0) {
killer_group->SplitExp(ExpSource::Kill, final_exp, this); killer_group->SplitExp(final_exp, this);
if ( if (
killer_mob && killer_mob &&
@@ -2745,9 +2719,9 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
if (!is_ldon_treasure && !MerchantType) { if (!is_ldon_treasure && !MerchantType) {
const uint32 con_level = give_exp->GetLevelCon(GetLevel()); const uint32 con_level = give_exp->GetLevelCon(GetLevel());
if (con_level != ConsiderColor::Gray) { if (con_level != CON_GRAY) {
if (!GetOwner() || (GetOwner() && !GetOwner()->IsClient())) { if (!GetOwner() || (GetOwner() && !GetOwner()->IsClient())) {
give_exp_client->AddEXP(ExpSource::Kill, final_exp, con_level); give_exp_client->AddEXP(final_exp, con_level);
if ( if (
killer_mob && killer_mob &&
@@ -2842,6 +2816,9 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
entity_list.RemoveFromAutoXTargets(this); entity_list.RemoveFromAutoXTargets(this);
// Here we create the corpse.
DeleteInvalidQuestLoot();
corpse = new Corpse( corpse = new Corpse(
this, this,
&m_loot_items, &m_loot_items,
@@ -2859,15 +2836,8 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
} }
entity_list.LimitRemoveNPC(this); entity_list.LimitRemoveNPC(this);
entity_list.AddCorpse(corpse, GetID()); entity_list.AddCorpse(corpse, GetID());
// The client sees NPC corpses as name's_corpse. The server uses
// name`s_corpse so that %T works on corpses (client workaround)
// Rename the new corpse on client side.
std::string old_name = Strings::Replace(corpse->GetName(), "`s_corpse", "'s_corpse");
SendRename(killer_mob, old_name.c_str(), corpse->GetName());
entity_list.UnMarkNPC(GetID()); entity_list.UnMarkNPC(GetID());
entity_list.RemoveNPC(GetID()); entity_list.RemoveNPC(GetID());
@@ -4001,9 +3971,13 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
int64 lua_ret = 0; int64 lua_ret = 0;
bool ignore_default = false; bool ignore_default = false;
lua_ret = LuaParser::Instance()->CommonDamage(this, attacker, damage, spell_id, static_cast<int>(skill_used), avoidable, buffslot, iBuffTic, static_cast<int>(special), ignore_default); lua_ret = LuaParser::Instance()->CommonDamage(this, attacker, damage, spell_id, static_cast<int>(skill_used), avoidable, buffslot, iBuffTic, static_cast<int>(special), ignore_default);
if (ignore_default) { if (lua_ret != 0) {
damage = lua_ret; damage = lua_ret;
} }
if (ignore_default) {
//return lua_ret;
}
#endif #endif
// This method is called with skill_used=ABJURE for Damage Shield damage. // This method is called with skill_used=ABJURE for Damage Shield damage.
bool FromDamageShield = (skill_used == EQ::skills::SkillAbjuration); bool FromDamageShield = (skill_used == EQ::skills::SkillAbjuration);
@@ -4079,7 +4053,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
Mob *owner = GetOwner(); Mob *owner = GetOwner();
if (owner && owner->IsClient()) { if (owner && owner->IsClient()) {
if (GetPetOrder() == SPO_Sit) { if (GetPetOrder() == SPO_Sit) {
SetPetOrder(GetPreviousPetOrder()); SetPetOrder(SPO_Follow);
} }
// fix GUI sit button to be unpressed and stop sitting regen // fix GUI sit button to be unpressed and stop sitting regen
owner->CastToClient()->SetPetCommandState(PET_BUTTON_SIT, 0); owner->CastToClient()->SetPetCommandState(PET_BUTTON_SIT, 0);
@@ -4109,11 +4083,11 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
!pet->IsHeld() !pet->IsHeld()
) { ) {
LogAggro("Sending pet [{}] into battle due to attack", pet->GetName()); LogAggro("Sending pet [{}] into battle due to attack", pet->GetName());
if (IsClient() && !pet->IsPetStop()) { if (IsClient()) {
// if pet was sitting his new mode is previous setting of // if pet was sitting his new mode is follow
// follow or guard after the battle (live verified) // following after the battle (live verified)
if (pet->GetPetOrder() == SPO_Sit) { if (pet->GetPetOrder() == SPO_Sit) {
pet->SetPetOrder(pet->GetPreviousPetOrder()); pet->SetPetOrder(SPO_Follow);
} }
// fix GUI sit button to be unpressed and stop sitting regen // fix GUI sit button to be unpressed and stop sitting regen
@@ -4282,8 +4256,8 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
if (!IsSaved && !TrySpellOnDeath()) { if (!IsSaved && !TrySpellOnDeath()) {
SetHP(-500); SetHP(-500);
// killedByType is clarified in Client::Death if we are client.
if (Death(attacker, damage, spell_id, skill_used, KilledByTypes::Killed_NPC, iBuffTic)) { if (Death(attacker, damage, spell_id, skill_used)) {
return; return;
} }
} }
@@ -4327,12 +4301,8 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
} }
} }
else if (skill_used == EQ::skills::SkillKick && else if (skill_used == EQ::skills::SkillKick &&
attacker->GetClass() == Class::Warrior) { (attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == Class::Warrior) {
int stun_level = RuleI(Combat, NPCKickStunLevel); can_stun = true;
if (attacker->IsClient()) {
stun_level = RuleI(Combat, PCKickStunLevel);
}
can_stun = (attacker->GetLevel() >= stun_level);
} }
bool is_immune_to_frontal_stun = false; bool is_immune_to_frontal_stun = false;
@@ -4404,15 +4374,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
if (zone->random.Int(0, 100) >= stun_resist) { if (zone->random.Int(0, 100) >= stun_resist) {
// did stun // did stun
// nothing else to check! // nothing else to check!
Stun(RuleI(Combat, StunDuration)); Stun(2000); // straight 2 seconds every time
if (RuleB(Combat, ClientStunMessage) && attacker->IsClient()) {
if (attacker) {
entity_list.MessageClose(this, true, 500, Chat::Emote, "%s is stunned after being bashed by %s.", GetCleanName(), attacker->GetCleanName());
}
else {
entity_list.MessageClose(this, true, 500, Chat::Emote, "%s is stunned by a bash to the head.", GetCleanName());
}
}
} }
else { else {
// stun resist passed! // stun resist passed!
@@ -4710,9 +4672,9 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
else { else {
//else, it is a buff tic... //else, it is a buff tic...
// So we can see our dot dmg like live shows it. // So we can see our dot dmg like live shows it.
if (IsValidSpell(spell_id) && damage > 0 && attacker && attacker != this) { if (IsValidSpell(spell_id) && damage > 0 && attacker && attacker != this && !attacker->IsCorpse()) {
//might filter on (attack_skill>200 && attack_skill<250), but I dont think we need it //might filter on (attack_skill>200 && attack_skill<250), but I dont think we need it
if (!attacker->IsCorpse() && attacker->IsClient()) { if (attacker->IsClient()) {
attacker->FilteredMessageString(attacker, Chat::DotDamage, attacker->FilteredMessageString(attacker, Chat::DotDamage,
FilterDOT, YOUR_HIT_DOT, GetCleanName(), itoa(damage), FilterDOT, YOUR_HIT_DOT, GetCleanName(), itoa(damage),
spells[spell_id].name); spells[spell_id].name);
@@ -4749,9 +4711,13 @@ void Mob::HealDamage(uint64 amount, Mob* caster, uint16 spell_id)
bool ignore_default = false; bool ignore_default = false;
lua_ret = LuaParser::Instance()->HealDamage(this, caster, amount, spell_id, ignore_default); lua_ret = LuaParser::Instance()->HealDamage(this, caster, amount, spell_id, ignore_default);
if (ignore_default) { if (lua_ret != 0) {
amount = lua_ret; amount = lua_ret;
} }
if (ignore_default) {
//return lua_ret;
}
#endif #endif
int64 maxhp = GetMaxHP(); int64 maxhp = GetMaxHP();
int64 curhp = GetHP(); int64 curhp = GetHP();
@@ -5496,7 +5462,7 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *
// staggers message. // staggers message.
if (defender->GetLevel() <= 55 && !defender->GetSpecialAbility(UNSTUNABLE)) { if (defender->GetLevel() <= 55 && !defender->GetSpecialAbility(UNSTUNABLE)) {
defender->Emote("staggers."); defender->Emote("staggers.");
defender->Stun(RuleI(Combat, StunDuration)); defender->Stun(2000);
} }
return; return;
} }

Some files were not shown because too many files have changed in this diff Show More