mirror of
https://github.com/EQEmu/Server.git
synced 2026-05-31 09:06:46 +00:00
Compare commits
495 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2434bab697 | |||
| 7a5a755033 | |||
| 35fe38cd09 | |||
| eb3664a444 | |||
| a244509d63 | |||
| 873c128f46 | |||
| 8314f2348c | |||
| 29720f95ed | |||
| a478fd2600 | |||
| f57c37e9c5 | |||
| b9fb4babba | |||
| c2e4082045 | |||
| e1dee55ecd | |||
| 1632ff04b0 | |||
| 873209dbc0 | |||
| a00b2eb382 | |||
| 67d8250b1c | |||
| f505c2cfd2 | |||
| a221e50cc2 | |||
| 32c5d4d9f6 | |||
| ce4716e9a5 | |||
| a99ce4fbdb | |||
| dcfc54d408 | |||
| c13ec5a06d | |||
| d182fc3613 | |||
| 5a89fcfb78 | |||
| db3601c25c | |||
| 137a9f835a | |||
| 4ad46b54df | |||
| 3f46210639 | |||
| 6ec63969bb | |||
| 767846f7e5 | |||
| 04bb9bf39c | |||
| e6df5be1ed | |||
| 6bb2f97b74 | |||
| 86f39743fc | |||
| 447fc026a8 | |||
| 7408df933c | |||
| 2f59e70c6b | |||
| eb8514eea8 | |||
| f498bac574 | |||
| 9a0b3a4c36 | |||
| 34ea870717 | |||
| d68c1a7a6c | |||
| c50100fcdb | |||
| 20cdc1e63d | |||
| 43c7523ee1 | |||
| e060d97798 | |||
| 435b6142b8 | |||
| 508b37dc93 | |||
| 0adca46a73 | |||
| e920e35a5c | |||
| 20c01ef343 | |||
| 1567141c19 | |||
| 6bc9bcf15a | |||
| 86a2a86ba8 | |||
| 3e6924d10e | |||
| a27a8adf1e | |||
| 13994fb3e4 | |||
| 78aa527bc7 | |||
| 58287b6539 | |||
| 718a157c06 | |||
| 801025c166 | |||
| 91f5932c6d | |||
| dacebca9dd | |||
| 75539b4f89 | |||
| 804b798068 | |||
| b280f50c99 | |||
| 14d4a2610f | |||
| 26693992b6 | |||
| 772fed5e30 | |||
| 331e04fbf8 | |||
| 9e2afd5571 | |||
| 8edf7a07e3 | |||
| b6b779723e | |||
| c654c1d674 | |||
| fcbf5cae47 | |||
| 0ffea36905 | |||
| 3f9a604c5c | |||
| 297e358c02 | |||
| 029581772d | |||
| 175f2b16f5 | |||
| 71f47dbcef | |||
| 6297c56db2 | |||
| 6efd7c5177 | |||
| 24578f6c1e | |||
| 490ed50c9f | |||
| 7c982df0e3 | |||
| fa783c3c6b | |||
| 5377bb3f49 | |||
| f98c79fdba | |||
| ae79022e06 | |||
| bc59882a65 | |||
| 2e0ed82986 | |||
| 8e3218aaf7 | |||
| 9276966418 | |||
| b89772ca91 | |||
| a1f2a21c99 | |||
| 1cb72642ac | |||
| a38fd8f986 | |||
| 337b6f38e0 | |||
| b4414d3052 | |||
| bfeeb0ce05 | |||
| e640e3cad3 | |||
| c09a3a5bba | |||
| ce907c9519 | |||
| 7a770e0e08 | |||
| 97c3205657 | |||
| ff2e56abc7 | |||
| 9ee16f8bf7 | |||
| 5b43bf4a5e | |||
| 4c769c46b3 | |||
| 8a87e00b66 | |||
| 0ebc7f9bb6 | |||
| 9ac25338bb | |||
| e9285fd2ca | |||
| 5b85f89c21 | |||
| 7fed8fc8c8 | |||
| 26769f40d9 | |||
| f6148b9b8d | |||
| ca1299bf1d | |||
| 3fb24dc0a3 | |||
| dcd7bffa54 | |||
| 5298abe6bc | |||
| fbc2b7c152 | |||
| 86705000b0 | |||
| 748e37dbdf | |||
| 27256215b8 | |||
| 59cbe1a152 | |||
| 3e50427bb7 | |||
| 883b3b5826 | |||
| 135ee6b2b7 | |||
| 906879ce2e | |||
| 8b7aba2769 | |||
| 9303255caa | |||
| 14509fcc4e | |||
| e40267b9b8 | |||
| f3073b463f | |||
| 5ad4129312 | |||
| 4b5b29b165 | |||
| 3b7a138de4 | |||
| 742b437f2c | |||
| d41bd8f963 | |||
| 73a099c5ea | |||
| 77c0eb3998 | |||
| 5d1c59c95f | |||
| 1d7f39c13b | |||
| 1bb8678abe | |||
| 47968774d9 | |||
| d7dc717249 | |||
| 32659426ba | |||
| 238c9fe667 | |||
| b9f997015a | |||
| 11e2a252e5 | |||
| fc627ed52d | |||
| 4c028b85f0 | |||
| f1d5e3eedf | |||
| d59531b16f | |||
| e182d685d3 | |||
| 6968a70310 | |||
| 06e8d258e4 | |||
| 8cb15f9357 | |||
| eb33e5a064 | |||
| 71f78b757e | |||
| 818f833d04 | |||
| 1238a6ca68 | |||
| 4afc1efb38 | |||
| 24eb40d231 | |||
| 2475092ed9 | |||
| 53d6e449c2 | |||
| b61649a2a0 | |||
| ef635cb257 | |||
| 62b5f8a488 | |||
| d0e069f4f8 | |||
| 1b5b22eeca | |||
| 66d9371714 | |||
| 0418dc4aa3 | |||
| f12c87a04a | |||
| 97dbf85a4c | |||
| 46a0cf6b02 | |||
| 8f34bd998f | |||
| 98928aee74 | |||
| e6dc980315 | |||
| ec465616b4 | |||
| 23de0119ff | |||
| f59b4feb94 | |||
| e035660150 | |||
| 472dd71d7f | |||
| 409b6bf424 | |||
| 9da713a830 | |||
| 7d194083aa | |||
| dd41fc5fcd | |||
| 6bf36f3e77 | |||
| dfb06db17b | |||
| 3e958c575b | |||
| e5db19965f | |||
| ce73f6bfe1 | |||
| 700f4645e2 | |||
| 5a7d544c5b | |||
| 0f7f71334a | |||
| c731f3f560 | |||
| b30fbc70a3 | |||
| 195cb80d56 | |||
| b2d5007466 | |||
| 47e2eb0acf | |||
| c36b3f030b | |||
| 2b821e50ff | |||
| 0aa07e9529 | |||
| 7ddafd9ed8 | |||
| 5488e9bf22 | |||
| 6db6d7dca9 | |||
| 066b762e73 | |||
| cd85a8524a | |||
| 4490a53ba0 | |||
| 00eb462d47 | |||
| 2df7d19f97 | |||
| 48c6db3a9c | |||
| cce368d94c | |||
| 84b8bdd2b4 | |||
| fc8ace91cb | |||
| 2d6c9f881a | |||
| 9b72c07a54 | |||
| 9d5d13fbd0 | |||
| bc3e9e8fba | |||
| d9cfc3a858 | |||
| 51dc62dfb1 | |||
| e52e4d5b3f | |||
| 0c3149a6e5 | |||
| 611122833d | |||
| b83373491e | |||
| dfa349492c | |||
| c08200188f | |||
| 41d9a15c74 | |||
| 2ed4effbe3 | |||
| 6ec09f300a | |||
| 079f612730 | |||
| 2c971fb2de | |||
| 20e9a8b2d2 | |||
| 8fa6a0b496 | |||
| d6e1c3f187 | |||
| 70a4b6a2b1 | |||
| 7923d7bc6c | |||
| 6007ba454c | |||
| d4a78f4799 | |||
| 0ada53aa96 | |||
| 7803170d6b | |||
| 20778ad7d9 | |||
| 44d63c47d9 | |||
| b288202c96 | |||
| a724e92638 | |||
| 0ea825e9a4 | |||
| 2ca50b339d | |||
| 164fe31fa8 | |||
| f3de3e8c31 | |||
| 1227f35382 | |||
| c0769a9c29 | |||
| 2dd0e51936 | |||
| fd787af53a | |||
| aa39ac8023 | |||
| 397096996c | |||
| f8de9b9167 | |||
| 9d48cbcd29 | |||
| eb5eb0ca30 | |||
| bc4bebb4a9 | |||
| 05f09b56e6 | |||
| 411fe3d95d | |||
| c1e984dfc1 | |||
| a5d9a8596a | |||
| 7e23d798d5 | |||
| 47ab8910a3 | |||
| 259add68f5 | |||
| d2f5dc43a6 | |||
| 99d2e3a8b1 | |||
| 122fe398b4 | |||
| 43c4b13978 | |||
| a3a707adae | |||
| c4da9766a4 | |||
| a8eb2832ce | |||
| 076aab50e8 | |||
| 1e8889a9fc | |||
| 7c3481daf9 | |||
| b93dec357f | |||
| 2f4af4f0c2 | |||
| a0f2a8a743 | |||
| 4c7016bd7b | |||
| 6c18cd0bee | |||
| 87e63e1e36 | |||
| a771882cff | |||
| b3f6a8c55f | |||
| 605502cd9d | |||
| 4712ca471b | |||
| 836c3d6596 | |||
| 53169ae217 | |||
| fd31915fae | |||
| 52763b6dd2 | |||
| 51cd43b4ea | |||
| 2db84f5a4f | |||
| 79cc2d5351 | |||
| d31cb09214 | |||
| 8bedcd8751 | |||
| 473c5096f6 | |||
| 0b181d5048 | |||
| a7e9af2d27 | |||
| 7a72d5d67e | |||
| 25872203ff | |||
| 6396a6fbef | |||
| 6db0a5c3f0 | |||
| 4fa9e1d66f | |||
| 556af8c5e9 | |||
| f3ef8a0993 | |||
| 267c280db8 | |||
| e06c7d7735 | |||
| 028ebc3a0c | |||
| b3bd44cd76 | |||
| 75a627a3a2 | |||
| 0194aedc92 | |||
| 5cc87cbda7 | |||
| 703862d977 | |||
| 6e325c1ee3 | |||
| 933b83add6 | |||
| b3cd4e63f1 | |||
| 3c894cb533 | |||
| b19ad64800 | |||
| 2cd3d27c67 | |||
| d3b46becd0 | |||
| 286479198f | |||
| 21ec832ca6 | |||
| bdf5f8b4a3 | |||
| 4ca6485398 | |||
| 0c9c2e25c1 | |||
| 7e651877c7 | |||
| 9739c1c8ef | |||
| 8aae59eebe | |||
| c1b07afae9 | |||
| 9c238cd08d | |||
| 33adb9bcc1 | |||
| 2e8bf82861 | |||
| 4d118ab978 | |||
| fcb40daaf1 | |||
| 553bafdbe1 | |||
| d0443db199 | |||
| 9206163190 | |||
| e504482b94 | |||
| 77b88e3dec | |||
| aeeb350068 | |||
| df83113cea | |||
| 940abfaf7a | |||
| a46443b95e | |||
| 871f320311 | |||
| a222128599 | |||
| 45b249e33d | |||
| c24834de5d | |||
| 841d7f2700 | |||
| 56c29154f0 | |||
| 6466c2ff21 | |||
| 16dc210cd8 | |||
| 77045f558e | |||
| e1fa2d5bc5 | |||
| b03f52de18 | |||
| 226cc3d6cb | |||
| 7f54e26dec | |||
| 11a81d8e8a | |||
| e719aa43cf | |||
| 22994e3264 | |||
| cfbdecad19 | |||
| 2427f7e034 | |||
| 9a6403b196 | |||
| d8953c5156 | |||
| 33b40e83b7 | |||
| e75c31d524 | |||
| cf1f8d5460 | |||
| 690cacdaab | |||
| f9f45eedcd | |||
| 93ddffa57f | |||
| c9993fb698 | |||
| aa0fbb8b45 | |||
| 62532c6bdd | |||
| f8c3c03185 | |||
| 692a90f3f0 | |||
| 3a49d851ca | |||
| fdc5c27061 | |||
| 56be69ddb1 | |||
| 9477ff72ac | |||
| 6d8e80b1e5 | |||
| ebeaef598b | |||
| 60b65da7f2 | |||
| 100e6698ea | |||
| 2bd94ab7a2 | |||
| 4c8d68c24b | |||
| 1755678b1f | |||
| 39e2763968 | |||
| f7780b0247 | |||
| c0fe0f11f7 | |||
| a1f1f11940 | |||
| 4c5013e09e | |||
| 838ffbd8c7 | |||
| 42b41d973c | |||
| e7761133a9 | |||
| 93f2bea96e | |||
| ded82ac6d6 | |||
| 6ef182edfd | |||
| e466ca1c6d | |||
| fa5a3155fe | |||
| a20d333f9d | |||
| 853739b538 | |||
| 6094ec9c7b | |||
| 9da1d6b397 | |||
| 8ea7299a57 | |||
| 0811a899d1 | |||
| fad9599642 | |||
| 62711b13d8 | |||
| 2702485206 | |||
| 0aadb891a1 | |||
| d812310c5b | |||
| 1420983700 | |||
| d25cc35f1b | |||
| ed7f395612 | |||
| 8dceb20dd8 | |||
| 6929d180ca | |||
| 011a66a75e | |||
| 07120563a2 | |||
| cc985cbcd5 | |||
| 97caa79472 | |||
| cfa575c756 | |||
| 85063249b4 | |||
| 04d6f8feea | |||
| dfc1bf0381 | |||
| 2237c3a056 | |||
| 4af191c593 | |||
| 0a3972deb9 | |||
| 9d2f258390 | |||
| 0b452f4ec1 | |||
| fef629e1df | |||
| a5a51fbe44 | |||
| 47db92cdb6 | |||
| 690301e80d | |||
| 1887e48b76 | |||
| af2691eb12 | |||
| 2df4289588 | |||
| 49d4d0acc3 | |||
| 5a663910a5 | |||
| b027edd21e | |||
| 0bbfcf7adc | |||
| 7962a0bd38 | |||
| 4d9b51df0a | |||
| 508ecec6ea | |||
| f0c6fa2a26 | |||
| ad6dbb7beb | |||
| 6ddbb41617 | |||
| 8a558f6a29 | |||
| 0585be0360 | |||
| 6927baef7f | |||
| 52d64781b5 | |||
| 0667fe435f | |||
| 9959070f24 | |||
| 2a91f08845 | |||
| adc64005f1 | |||
| 605480f1c4 | |||
| 3b95601c62 | |||
| a4f2ed28f1 | |||
| e19b969541 | |||
| 4241556f75 | |||
| 961332b40c | |||
| a1a861e0c4 | |||
| 4bbb1aa92f | |||
| 1212ccefef | |||
| c203fec9b4 | |||
| 16ab1839e8 | |||
| f5e4c6a127 | |||
| 166c87c931 | |||
| 345dd442dd | |||
| 565baec675 | |||
| 9884c442e9 | |||
| ad0b5d6a1c | |||
| b82b32e1d2 | |||
| 2fb72e5729 | |||
| 3791bc788f | |||
| 833fa55fdf | |||
| 4fc3c27715 | |||
| cea3ad6a42 | |||
| d8926cd5f3 | |||
| efb03164c7 | |||
| 455eb2e6d9 | |||
| b5b0e53da2 | |||
| 68cb94b39c | |||
| 3d95b6c184 | |||
| 7db7631308 | |||
| f053cd3b56 | |||
| cf27f2bc88 | |||
| 79918ebaba | |||
| 2a648507f2 | |||
| f395ee0508 | |||
| 7166fcc650 | |||
| ae8e58ddc5 | |||
| 26e72c6857 |
+1
-1
@@ -15,7 +15,7 @@ volumes:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Build Linux X64
|
- name: Build Linux X64
|
||||||
image: akkadius/eqemu-server:v11
|
image: akkadius/eqemu-server:v14
|
||||||
environment:
|
environment:
|
||||||
GITHUB_TOKEN:
|
GITHUB_TOKEN:
|
||||||
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
from_secret: GH_RELEASE_GITHUB_API_TOKEN
|
||||||
|
|||||||
+1198
File diff suppressed because it is too large
Load Diff
+17
-1
@@ -17,13 +17,19 @@ SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|||||||
SET(CMAKE_CXX_EXTENSIONS OFF)
|
SET(CMAKE_CXX_EXTENSIONS OFF)
|
||||||
|
|
||||||
OPTION(EQEMU_BUILD_STATIC "Build with static linking" OFF)
|
OPTION(EQEMU_BUILD_STATIC "Build with static linking" OFF)
|
||||||
|
OPTION(EQEMU_BUILD_PCH "Build with precompiled headers (Windows)" ON)
|
||||||
|
|
||||||
IF (EQEMU_BUILD_STATIC)
|
IF (EQEMU_BUILD_STATIC)
|
||||||
SET(BUILD_SHARED_LIBS OFF)
|
SET(BUILD_SHARED_LIBS OFF)
|
||||||
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a")
|
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".a")
|
||||||
MESSAGE(STATUS "Building with static linking")
|
MESSAGE(STATUS "Building with static linking")
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
SET(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
|
||||||
ENDIF(EQEMU_BUILD_STATIC)
|
IF (UNIX)
|
||||||
|
SET(PERL_LIBRARY "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/libperl.so")
|
||||||
|
SET(PERL_INCLUDE_PATH "/opt/eqemu-perl/lib/5.32.1/x86_64-linux-thread-multi/CORE/")
|
||||||
|
SET(PERL_EXECUTABLE "/opt/eqemu-perl/bin/perl")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF (EQEMU_BUILD_STATIC)
|
||||||
|
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
|
||||||
@@ -133,6 +139,13 @@ ELSE()
|
|||||||
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
MESSAGE(STATUS "* mbedTLS: MISSING *")
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_PATH: ${PERL_INCLUDE_PATH}")
|
||||||
|
MESSAGE(STATUS "PERL_LIBRARY: ${PERL_LIBRARY}")
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_DIR: ${PERL_INCLUDE_DIR}")
|
||||||
|
MESSAGE(STATUS "PERL_INCLUDE_DIRS: ${PERL_INCLUDE_DIRS}")
|
||||||
|
MESSAGE(STATUS "PERL_LIBRARIES: ${PERL_LIBRARIES}")
|
||||||
|
MESSAGE(STATUS "PERL_VERSION: ${PERL_VERSION}")
|
||||||
|
|
||||||
MESSAGE(STATUS "**************************************************")
|
MESSAGE(STATUS "**************************************************")
|
||||||
|
|
||||||
#options
|
#options
|
||||||
@@ -389,6 +402,9 @@ IF(PERL_LIBRARY_ENABLED)
|
|||||||
ADD_DEFINITIONS(-DEMBPERL)
|
ADD_DEFINITIONS(-DEMBPERL)
|
||||||
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
ADD_DEFINITIONS(-DEMBPERL_PLUGIN)
|
||||||
ADD_DEFINITIONS(-DPERLBIND_NO_STRICT_SCALAR_TYPES)
|
ADD_DEFINITIONS(-DPERLBIND_NO_STRICT_SCALAR_TYPES)
|
||||||
|
IF (UNIX AND EQEMU_BUILD_STATIC)
|
||||||
|
SET(SERVER_LIBS ${SERVER_LIBS} libcrypt.a)
|
||||||
|
ENDIF ()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
|
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
|
||||||
|
|
||||||
add_subdirectory(import)
|
add_subdirectory(import)
|
||||||
add_subdirectory(export)
|
add_subdirectory(export)
|
||||||
|
|||||||
@@ -27,6 +27,8 @@
|
|||||||
#include "../../common/content/world_content_service.h"
|
#include "../../common/content/world_content_service.h"
|
||||||
#include "../../common/zone_store.h"
|
#include "../../common/zone_store.h"
|
||||||
#include "../../common/path_manager.h"
|
#include "../../common/path_manager.h"
|
||||||
|
#include "../../common/repositories/base_data_repository.h"
|
||||||
|
#include "../../common/file.h"
|
||||||
|
|
||||||
EQEmuLogSys LogSys;
|
EQEmuLogSys LogSys;
|
||||||
WorldContentService content_service;
|
WorldContentService content_service;
|
||||||
@@ -255,50 +257,45 @@ void ImportSkillCaps(SharedDatabase *db) {
|
|||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportBaseData(SharedDatabase *db) {
|
void ImportBaseData(SharedDatabase *db)
|
||||||
|
{
|
||||||
LogInfo("Importing Base Data");
|
LogInfo("Importing Base Data");
|
||||||
|
|
||||||
std::string file = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
|
const std::string& file_name = fmt::format("{}/import/BaseData.txt", path.GetServerPath());
|
||||||
FILE *f = fopen(file.c_str(), "r");
|
|
||||||
if(!f) {
|
const auto& file_contents = File::GetContents(file_name);
|
||||||
LogError("Unable to open {} to read, skipping.", file);
|
if (!file_contents.error.empty()) {
|
||||||
return;
|
LogError("{}", file_contents.error);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string delete_sql = "DELETE FROM base_data";
|
db->QueryDatabase("DELETE FROM base_data");
|
||||||
db->QueryDatabase(delete_sql);
|
|
||||||
|
|
||||||
char buffer[2048];
|
std::vector<BaseDataRepository::BaseData> v;
|
||||||
while(fgets(buffer, 2048, f)) {
|
|
||||||
auto split = Strings::Split(buffer, '^');
|
|
||||||
|
|
||||||
if(split.size() < 10) {
|
auto e = BaseDataRepository::NewEntity();
|
||||||
|
|
||||||
|
for (const auto& line: Strings::Split(file_contents.contents, "\n")) {
|
||||||
|
const auto& line_data = Strings::Split(line, '^');
|
||||||
|
|
||||||
|
if (line_data.size() < 10) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sql;
|
e.level = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[0]));
|
||||||
int level, class_id;
|
e.class_ = static_cast<uint8_t>(Strings::ToUnsignedInt(line_data[1]));
|
||||||
double hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac;
|
e.hp = Strings::ToFloat(line_data[2]);
|
||||||
|
e.mana = Strings::ToFloat(line_data[3]);
|
||||||
|
e.end = Strings::ToFloat(line_data[4]);
|
||||||
|
e.hp_regen = Strings::ToFloat(line_data[5]);
|
||||||
|
e.end_regen = Strings::ToFloat(line_data[6]);
|
||||||
|
e.hp_fac = Strings::ToFloat(line_data[7]);
|
||||||
|
e.mana_fac = Strings::ToFloat(line_data[8]);
|
||||||
|
e.end_fac = Strings::ToFloat(line_data[9]);
|
||||||
|
|
||||||
level = Strings::ToInt(split[0].c_str());
|
v.emplace_back(e);
|
||||||
class_id = Strings::ToInt(split[1].c_str());
|
|
||||||
hp = Strings::ToFloat(split[2].c_str());
|
|
||||||
mana = Strings::ToFloat(split[3].c_str());
|
|
||||||
end = Strings::ToFloat(split[4].c_str());
|
|
||||||
unk1 = Strings::ToFloat(split[5].c_str());
|
|
||||||
unk2 = Strings::ToFloat(split[6].c_str());
|
|
||||||
hp_fac = Strings::ToFloat(split[7].c_str());
|
|
||||||
mana_fac = Strings::ToFloat(split[8].c_str());
|
|
||||||
end_fac = Strings::ToFloat(split[9].c_str());
|
|
||||||
|
|
||||||
sql = StringFormat("INSERT INTO base_data(level, class, hp, mana, end, unk1, unk2, hp_fac, "
|
|
||||||
"mana_fac, end_fac) VALUES(%d, %d, %f, %f, %f, %f, %f, %f, %f, %f)",
|
|
||||||
level, class_id, hp, mana, end, unk1, unk2, hp_fac, mana_fac, end_fac);
|
|
||||||
|
|
||||||
db->QueryDatabase(sql);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
BaseDataRepository::InsertMany(*db, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportDBStrings(SharedDatabase *db) {
|
void ImportDBStrings(SharedDatabase *db) {
|
||||||
|
|||||||
+14
-7
@@ -13,7 +13,6 @@ SET(common_sources
|
|||||||
crc32.cpp
|
crc32.cpp
|
||||||
database/database_dump_service.cpp
|
database/database_dump_service.cpp
|
||||||
database.cpp
|
database.cpp
|
||||||
database_conversions.cpp
|
|
||||||
database_instances.cpp
|
database_instances.cpp
|
||||||
database/database_update_manifest.cpp
|
database/database_update_manifest.cpp
|
||||||
database/database_update_manifest_bots.cpp
|
database/database_update_manifest_bots.cpp
|
||||||
@@ -70,6 +69,7 @@ SET(common_sources
|
|||||||
perl_eqdb.cpp
|
perl_eqdb.cpp
|
||||||
perl_eqdb_res.cpp
|
perl_eqdb_res.cpp
|
||||||
process/process.cpp
|
process/process.cpp
|
||||||
|
process.cpp
|
||||||
proc_launcher.cpp
|
proc_launcher.cpp
|
||||||
profanity_manager.cpp
|
profanity_manager.cpp
|
||||||
ptimer.cpp
|
ptimer.cpp
|
||||||
@@ -90,6 +90,7 @@ SET(common_sources
|
|||||||
timer.cpp
|
timer.cpp
|
||||||
unix.cpp
|
unix.cpp
|
||||||
platform.cpp
|
platform.cpp
|
||||||
|
json/json.hpp
|
||||||
json/jsoncpp.cpp
|
json/jsoncpp.cpp
|
||||||
zone_store.cpp
|
zone_store.cpp
|
||||||
net/console_server.cpp
|
net/console_server.cpp
|
||||||
@@ -221,6 +222,9 @@ SET(repositories
|
|||||||
repositories/base/base_group_leaders_repository.h
|
repositories/base/base_group_leaders_repository.h
|
||||||
repositories/base/base_guilds_repository.h
|
repositories/base/base_guilds_repository.h
|
||||||
repositories/base/base_guild_ranks_repository.h
|
repositories/base/base_guild_ranks_repository.h
|
||||||
|
repositories/base/base_guild_permissions_repository.h
|
||||||
|
repositories/base/base_guild_members_repository.h
|
||||||
|
repositories/base/base_guild_bank_repository.h
|
||||||
repositories/base/base_guild_relations_repository.h
|
repositories/base/base_guild_relations_repository.h
|
||||||
repositories/base/base_horses_repository.h
|
repositories/base/base_horses_repository.h
|
||||||
repositories/base/base_instance_list_repository.h
|
repositories/base/base_instance_list_repository.h
|
||||||
@@ -229,7 +233,6 @@ SET(repositories
|
|||||||
repositories/base/base_inventory_snapshots_repository.h
|
repositories/base/base_inventory_snapshots_repository.h
|
||||||
repositories/base/base_ip_exemptions_repository.h
|
repositories/base/base_ip_exemptions_repository.h
|
||||||
repositories/base/base_items_repository.h
|
repositories/base/base_items_repository.h
|
||||||
repositories/base/base_item_tick_repository.h
|
|
||||||
repositories/base/base_ldon_trap_entries_repository.h
|
repositories/base/base_ldon_trap_entries_repository.h
|
||||||
repositories/base/base_ldon_trap_templates_repository.h
|
repositories/base/base_ldon_trap_templates_repository.h
|
||||||
repositories/base/base_level_exp_mods_repository.h
|
repositories/base/base_level_exp_mods_repository.h
|
||||||
@@ -399,6 +402,9 @@ SET(repositories
|
|||||||
repositories/group_leaders_repository.h
|
repositories/group_leaders_repository.h
|
||||||
repositories/guilds_repository.h
|
repositories/guilds_repository.h
|
||||||
repositories/guild_ranks_repository.h
|
repositories/guild_ranks_repository.h
|
||||||
|
repositories/guild_permissions_repository.h
|
||||||
|
repositories/guild_members_repository.h
|
||||||
|
repositories/guild_bank_repository.h
|
||||||
repositories/guild_relations_repository.h
|
repositories/guild_relations_repository.h
|
||||||
repositories/horses_repository.h
|
repositories/horses_repository.h
|
||||||
repositories/instance_list_repository.h
|
repositories/instance_list_repository.h
|
||||||
@@ -407,7 +413,6 @@ SET(repositories
|
|||||||
repositories/inventory_snapshots_repository.h
|
repositories/inventory_snapshots_repository.h
|
||||||
repositories/ip_exemptions_repository.h
|
repositories/ip_exemptions_repository.h
|
||||||
repositories/items_repository.h
|
repositories/items_repository.h
|
||||||
repositories/item_tick_repository.h
|
|
||||||
repositories/ldon_trap_entries_repository.h
|
repositories/ldon_trap_entries_repository.h
|
||||||
repositories/ldon_trap_templates_repository.h
|
repositories/ldon_trap_templates_repository.h
|
||||||
repositories/level_exp_mods_repository.h
|
repositories/level_exp_mods_repository.h
|
||||||
@@ -492,7 +497,6 @@ SET(repositories
|
|||||||
SET(common_headers
|
SET(common_headers
|
||||||
additive_lagged_fibonacci_engine.h
|
additive_lagged_fibonacci_engine.h
|
||||||
base_packet.h
|
base_packet.h
|
||||||
base_data.h
|
|
||||||
bodytypes.h
|
bodytypes.h
|
||||||
classes.h
|
classes.h
|
||||||
compression.h
|
compression.h
|
||||||
@@ -539,7 +543,6 @@ SET(common_headers
|
|||||||
events/player_event_logs.h
|
events/player_event_logs.h
|
||||||
events/player_event_discord_formatter.h
|
events/player_event_discord_formatter.h
|
||||||
events/player_events.h
|
events/player_events.h
|
||||||
errmsg.h
|
|
||||||
event_sub.h
|
event_sub.h
|
||||||
expedition_lockout_timer.h
|
expedition_lockout_timer.h
|
||||||
extprofile.h
|
extprofile.h
|
||||||
@@ -561,10 +564,9 @@ SET(common_headers
|
|||||||
item_fieldlist.h
|
item_fieldlist.h
|
||||||
item_instance.h
|
item_instance.h
|
||||||
json_config.h
|
json_config.h
|
||||||
languages.h
|
|
||||||
light_source.h
|
light_source.h
|
||||||
linked_list.h
|
linked_list.h
|
||||||
loottable.h
|
loot.h
|
||||||
mail_oplist.h
|
mail_oplist.h
|
||||||
md5.h
|
md5.h
|
||||||
memory_buffer.h
|
memory_buffer.h
|
||||||
@@ -583,12 +585,14 @@ SET(common_headers
|
|||||||
path_manager.cpp
|
path_manager.cpp
|
||||||
platform.h
|
platform.h
|
||||||
process/process.h
|
process/process.h
|
||||||
|
process.h
|
||||||
proc_launcher.h
|
proc_launcher.h
|
||||||
profanity_manager.h
|
profanity_manager.h
|
||||||
profiler.h
|
profiler.h
|
||||||
ptimer.h
|
ptimer.h
|
||||||
queue.h
|
queue.h
|
||||||
races.h
|
races.h
|
||||||
|
raid.h
|
||||||
random.h
|
random.h
|
||||||
rdtsc.h
|
rdtsc.h
|
||||||
rulesys.h
|
rulesys.h
|
||||||
@@ -788,5 +792,8 @@ IF (UNIX)
|
|||||||
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
SET_SOURCE_FILES_PROPERTIES("patches/sod.cpp" "patches/sof.cpp" "patches/rof.cpp" "patches/rof2.cpp" "patches/uf.cpp" PROPERTIES COMPILE_FLAGS -O0)
|
||||||
ENDIF (UNIX)
|
ENDIF (UNIX)
|
||||||
|
|
||||||
|
IF (WIN32 AND EQEMU_BUILD_PCH)
|
||||||
|
TARGET_PRECOMPILE_HEADERS(common PRIVATE pch/pch.h)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemulator.net)
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
are required to give you total support for your newly bought product;
|
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __EQEMU_COMMON_BASE_DATA_H
|
|
||||||
#define __EQEMU_COMMON_BASE_DATA_H
|
|
||||||
|
|
||||||
struct BaseDataStruct
|
|
||||||
{
|
|
||||||
double base_hp;
|
|
||||||
double base_mana;
|
|
||||||
double base_end;
|
|
||||||
double hp_regen;
|
|
||||||
double end_regen;
|
|
||||||
double hp_factor;
|
|
||||||
double mana_factor;
|
|
||||||
double endurance_factor;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -64,4 +64,6 @@ typedef enum {
|
|||||||
} bodyType;
|
} bodyType;
|
||||||
/* bodytypes above 64 make the mob not show up */
|
/* bodytypes above 64 make the mob not show up */
|
||||||
|
|
||||||
|
constexpr int format_as(bodyType type) { return static_cast<int>(type); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+289
-466
File diff suppressed because it is too large
Load Diff
+96
-93
@@ -19,99 +19,106 @@
|
|||||||
#define CLASSES_CH
|
#define CLASSES_CH
|
||||||
|
|
||||||
#include "../common/types.h"
|
#include "../common/types.h"
|
||||||
|
#include "../common/rulesys.h"
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
#define NO_CLASS 0
|
namespace Class {
|
||||||
#define WARRIOR 1
|
constexpr uint8 None = 0;
|
||||||
#define CLERIC 2
|
constexpr uint8 Warrior = 1;
|
||||||
#define PALADIN 3
|
constexpr uint8 Cleric = 2;
|
||||||
#define RANGER 4
|
constexpr uint8 Paladin = 3;
|
||||||
#define SHADOWKNIGHT 5
|
constexpr uint8 Ranger = 4;
|
||||||
#define DRUID 6
|
constexpr uint8 ShadowKnight = 5;
|
||||||
#define MONK 7
|
constexpr uint8 Druid = 6;
|
||||||
#define BARD 8
|
constexpr uint8 Monk = 7;
|
||||||
#define ROGUE 9
|
constexpr uint8 Bard = 8;
|
||||||
#define SHAMAN 10
|
constexpr uint8 Rogue = 9;
|
||||||
#define NECROMANCER 11
|
constexpr uint8 Shaman = 10;
|
||||||
#define WIZARD 12
|
constexpr uint8 Necromancer = 11;
|
||||||
#define MAGICIAN 13
|
constexpr uint8 Wizard = 12;
|
||||||
#define ENCHANTER 14
|
constexpr uint8 Magician = 13;
|
||||||
#define BEASTLORD 15
|
constexpr uint8 Enchanter = 14;
|
||||||
#define BERSERKER 16
|
constexpr uint8 Beastlord = 15;
|
||||||
#define WARRIORGM 20
|
constexpr uint8 Berserker = 16;
|
||||||
#define CLERICGM 21
|
constexpr uint8 WarriorGM = 20;
|
||||||
#define PALADINGM 22
|
constexpr uint8 ClericGM = 21;
|
||||||
#define RANGERGM 23
|
constexpr uint8 PaladinGM = 22;
|
||||||
#define SHADOWKNIGHTGM 24
|
constexpr uint8 RangerGM = 23;
|
||||||
#define DRUIDGM 25
|
constexpr uint8 ShadowKnightGM = 24;
|
||||||
#define MONKGM 26
|
constexpr uint8 DruidGM = 25;
|
||||||
#define BARDGM 27
|
constexpr uint8 MonkGM = 26;
|
||||||
#define ROGUEGM 28
|
constexpr uint8 BardGM = 27;
|
||||||
#define SHAMANGM 29
|
constexpr uint8 RogueGM = 28;
|
||||||
#define NECROMANCERGM 30
|
constexpr uint8 ShamanGM = 29;
|
||||||
#define WIZARDGM 31
|
constexpr uint8 NecromancerGM = 30;
|
||||||
#define MAGICIANGM 32
|
constexpr uint8 WizardGM = 31;
|
||||||
#define ENCHANTERGM 33
|
constexpr uint8 MagicianGM = 32;
|
||||||
#define BEASTLORDGM 34
|
constexpr uint8 EnchanterGM = 33;
|
||||||
#define BERSERKERGM 35
|
constexpr uint8 BeastlordGM = 34;
|
||||||
#define BANKER 40
|
constexpr uint8 BerserkerGM = 35;
|
||||||
#define MERCHANT 41
|
constexpr uint8 Banker = 40;
|
||||||
#define DISCORD_MERCHANT 59
|
constexpr uint8 Merchant = 41;
|
||||||
#define ADVENTURE_RECRUITER 60
|
constexpr uint8 DiscordMerchant = 59;
|
||||||
#define ADVENTURE_MERCHANT 61
|
constexpr uint8 AdventureRecruiter = 60;
|
||||||
#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs, seen on Danvi's Corpse in Akheva
|
constexpr uint8 AdventureMerchant = 61;
|
||||||
#define TRIBUTE_MASTER 63
|
constexpr uint8 LDoNTreasure = 62;
|
||||||
#define GUILD_TRIBUTE_MASTER 64 // not sure
|
constexpr uint8 TributeMaster = 63;
|
||||||
#define GUILD_BANKER 66
|
constexpr uint8 GuildTributeMaster = 64;
|
||||||
#define NORRATHS_KEEPERS_MERCHANT 67
|
constexpr uint8 GuildBanker = 66;
|
||||||
#define DARK_REIGN_MERCHANT 68
|
constexpr uint8 NorrathsKeepersMerchant = 67;
|
||||||
#define FELLOWSHIP_MASTER 69
|
constexpr uint8 DarkReignMerchant = 68;
|
||||||
#define ALT_CURRENCY_MERCHANT 70
|
constexpr uint8 FellowshipMaster = 69;
|
||||||
#define MERCENARY_MASTER 71
|
constexpr uint8 AlternateCurrencyMerchant = 70;
|
||||||
|
constexpr uint8 MercenaryLiaison = 71;
|
||||||
|
|
||||||
|
constexpr uint8 PLAYER_CLASS_COUNT = 16;
|
||||||
|
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
|
||||||
|
};
|
||||||
|
|
||||||
// player class values
|
static std::map<uint8, uint16> player_class_bitmasks = {
|
||||||
#define PLAYER_CLASS_UNKNOWN 0
|
{Class::Warrior, 1},
|
||||||
#define PLAYER_CLASS_WARRIOR 1
|
{Class::Cleric, 2},
|
||||||
#define PLAYER_CLASS_CLERIC 2
|
{Class::Paladin, 4},
|
||||||
#define PLAYER_CLASS_PALADIN 3
|
{Class::Ranger, 8},
|
||||||
#define PLAYER_CLASS_RANGER 4
|
{Class::ShadowKnight, 16},
|
||||||
#define PLAYER_CLASS_SHADOWKNIGHT 5
|
{Class::Druid, 32},
|
||||||
#define PLAYER_CLASS_DRUID 6
|
{Class::Monk, 64},
|
||||||
#define PLAYER_CLASS_MONK 7
|
{Class::Bard, 128},
|
||||||
#define PLAYER_CLASS_BARD 8
|
{Class::Rogue, 256},
|
||||||
#define PLAYER_CLASS_ROGUE 9
|
{Class::Shaman, 512},
|
||||||
#define PLAYER_CLASS_SHAMAN 10
|
{Class::Necromancer, 1024},
|
||||||
#define PLAYER_CLASS_NECROMANCER 11
|
{Class::Wizard, 2048},
|
||||||
#define PLAYER_CLASS_WIZARD 12
|
{Class::Magician, 4096},
|
||||||
#define PLAYER_CLASS_MAGICIAN 13
|
{Class::Enchanter, 8192},
|
||||||
#define PLAYER_CLASS_ENCHANTER 14
|
{Class::Beastlord, 16384},
|
||||||
#define PLAYER_CLASS_BEASTLORD 15
|
{Class::Berserker, 32768},
|
||||||
#define PLAYER_CLASS_BERSERKER 16
|
};
|
||||||
|
|
||||||
#define PLAYER_CLASS_COUNT 16
|
static std::string shadow_knight_class_name = (
|
||||||
|
RuleB(World, UseOldShadowKnightClassExport) ?
|
||||||
|
"Shadowknight" :
|
||||||
|
"Shadow Knight"
|
||||||
|
);
|
||||||
|
|
||||||
|
static std::map<uint8, std::string> class_names = {
|
||||||
// player class bits
|
{Class::Warrior, "Warrior"},
|
||||||
#define PLAYER_CLASS_UNKNOWN_BIT 0
|
{Class::Cleric, "Cleric"},
|
||||||
#define PLAYER_CLASS_WARRIOR_BIT 1
|
{Class::Paladin, "Paladin"},
|
||||||
#define PLAYER_CLASS_CLERIC_BIT 2
|
{Class::Ranger, "Ranger"},
|
||||||
#define PLAYER_CLASS_PALADIN_BIT 4
|
{Class::ShadowKnight, shadow_knight_class_name},
|
||||||
#define PLAYER_CLASS_RANGER_BIT 8
|
{Class::Druid, "Druid"},
|
||||||
#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16
|
{Class::Monk, "Monk"},
|
||||||
#define PLAYER_CLASS_DRUID_BIT 32
|
{Class::Bard, "Bard"},
|
||||||
#define PLAYER_CLASS_MONK_BIT 64
|
{Class::Rogue, "Rogue"},
|
||||||
#define PLAYER_CLASS_BARD_BIT 128
|
{Class::Shaman, "Shaman"},
|
||||||
#define PLAYER_CLASS_ROGUE_BIT 256
|
{Class::Necromancer, "Necromancer"},
|
||||||
#define PLAYER_CLASS_SHAMAN_BIT 512
|
{Class::Wizard, "Wizard"},
|
||||||
#define PLAYER_CLASS_NECROMANCER_BIT 1024
|
{Class::Magician, "Magician"},
|
||||||
#define PLAYER_CLASS_WIZARD_BIT 2048
|
{Class::Enchanter, "Enchanter"},
|
||||||
#define PLAYER_CLASS_MAGICIAN_BIT 4096
|
{Class::Beastlord, "Beastlord"},
|
||||||
#define PLAYER_CLASS_ENCHANTER_BIT 8192
|
{Class::Berserker, "Berserker"},
|
||||||
#define PLAYER_CLASS_BEASTLORD_BIT 16384
|
};
|
||||||
#define PLAYER_CLASS_BERSERKER_BIT 32768
|
|
||||||
|
|
||||||
#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
|
|
||||||
|
|
||||||
|
|
||||||
#define ARMOR_TYPE_UNKNOWN 0
|
#define ARMOR_TYPE_UNKNOWN 0
|
||||||
@@ -126,16 +133,12 @@
|
|||||||
|
|
||||||
|
|
||||||
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
||||||
const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
|
|
||||||
|
|
||||||
bool IsPlayerClass(uint8 class_id);
|
bool IsPlayerClass(uint8 class_id);
|
||||||
const std::string GetPlayerClassAbbreviation(uint8 class_id);
|
const std::string GetPlayerClassAbbreviation(uint8 class_id);
|
||||||
|
|
||||||
uint32 GetPlayerClassValue(uint8 class_id);
|
uint8 GetPlayerClassValue(uint8 class_id);
|
||||||
uint32 GetPlayerClassBit(uint8 class_id);
|
uint16 GetPlayerClassBit(uint8 class_id);
|
||||||
|
|
||||||
uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
|
|
||||||
uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
|
|
||||||
|
|
||||||
bool IsFighterClass(uint8 class_id);
|
bool IsFighterClass(uint8 class_id);
|
||||||
bool IsSpellFighterClass(uint8 class_id);
|
bool IsSpellFighterClass(uint8 class_id);
|
||||||
|
|||||||
@@ -39,15 +39,15 @@ namespace EQEmuCommand {
|
|||||||
{
|
{
|
||||||
if (cmd[{"-d", "--debug"}]) {
|
if (cmd[{"-d", "--debug"}]) {
|
||||||
std::cout << "Positional args:\n";
|
std::cout << "Positional args:\n";
|
||||||
for (auto &pos_arg : cmd.pos_args())
|
for (auto &pos_arg: cmd.pos_args())
|
||||||
std::cout << '\t' << pos_arg << std::endl;
|
std::cout << '\t' << pos_arg << std::endl;
|
||||||
|
|
||||||
std::cout << "\nFlags:\n";
|
std::cout << "\nFlags:\n";
|
||||||
for (auto &flag : cmd.flags())
|
for (auto &flag: cmd.flags())
|
||||||
std::cout << '\t' << flag << std::endl;
|
std::cout << '\t' << flag << std::endl;
|
||||||
|
|
||||||
std::cout << "\nParameters:\n";
|
std::cout << "\nParameters:\n";
|
||||||
for (auto ¶m : cmd.params())
|
for (auto ¶m: cmd.params())
|
||||||
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
std::cout << '\t' << param.first << " : " << param.second << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -70,7 +70,7 @@ namespace EQEmuCommand {
|
|||||||
bool arguments_filled = true;
|
bool arguments_filled = true;
|
||||||
|
|
||||||
int index = 2;
|
int index = 2;
|
||||||
for (auto &arg : arguments) {
|
for (auto &arg: arguments) {
|
||||||
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
if (cmd(arg).str().empty() && cmd(index).str().empty()) {
|
||||||
arguments_filled = false;
|
arguments_filled = false;
|
||||||
}
|
}
|
||||||
@@ -79,12 +79,12 @@ namespace EQEmuCommand {
|
|||||||
|
|
||||||
if (!arguments_filled || (argc == 2 && !cmd[{"-h", "--help"}]) || (argc == 3 && cmd[{"-h", "--help"}])) {
|
if (!arguments_filled || (argc == 2 && !cmd[{"-h", "--help"}]) || (argc == 3 && cmd[{"-h", "--help"}])) {
|
||||||
std::string arguments_string;
|
std::string arguments_string;
|
||||||
for (auto &arg : arguments) {
|
for (auto &arg: arguments) {
|
||||||
arguments_string += " " + arg;
|
arguments_string += " " + arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string options_string;
|
std::string options_string;
|
||||||
for (auto &opt : options) {
|
for (auto &opt: options) {
|
||||||
options_string += " " + opt + "\n";
|
options_string += " " + opt + "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,14 +124,6 @@ namespace EQEmuCommand {
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
std::string description;
|
std::string description;
|
||||||
bool ran_command = false;
|
|
||||||
for (auto &it: in_function_map) {
|
|
||||||
if (it.first == argv[1]) {
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
|
||||||
ran_command = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd[{"-h", "--help"}]) {
|
if (cmd[{"-h", "--help"}]) {
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
std::cout <<
|
std::cout <<
|
||||||
@@ -142,9 +134,7 @@ namespace EQEmuCommand {
|
|||||||
<< std::endl
|
<< std::endl
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
/**
|
// Get max command length for padding length
|
||||||
* Get max command length for padding length
|
|
||||||
*/
|
|
||||||
int max_command_length = 0;
|
int max_command_length = 0;
|
||||||
|
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
@@ -155,18 +145,14 @@ namespace EQEmuCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Display command menu
|
||||||
* Display command menu
|
|
||||||
*/
|
|
||||||
std::string command_section;
|
std::string command_section;
|
||||||
for (auto &it: in_function_map) {
|
for (auto &it: in_function_map) {
|
||||||
description.clear();
|
description.clear();
|
||||||
|
|
||||||
(it.second)(argc, argv, cmd, description);
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
|
||||||
/**
|
// Print section header
|
||||||
* Print section header
|
|
||||||
*/
|
|
||||||
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
std::string command_prefix = it.first.substr(0, it.first.find(":"));
|
||||||
|
|
||||||
if (command_prefix.find("test") != std::string::npos) {
|
if (command_prefix.find("test") != std::string::npos) {
|
||||||
@@ -178,9 +164,7 @@ namespace EQEmuCommand {
|
|||||||
std::cout << termcolor::reset << command_prefix << std::endl;
|
std::cout << termcolor::reset << command_prefix << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Print commands
|
||||||
* Print commands
|
|
||||||
*/
|
|
||||||
std::stringstream command;
|
std::stringstream command;
|
||||||
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
command << termcolor::colorize << termcolor::yellow << it.first << termcolor::reset;
|
||||||
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
printf(" %-*s %s\n", max_command_length, command.str().c_str(), description.c_str());
|
||||||
@@ -191,6 +175,15 @@ namespace EQEmuCommand {
|
|||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ran_command = false;
|
||||||
|
|
||||||
|
for (auto &it: in_function_map) {
|
||||||
|
if (it.first == argv[1]) {
|
||||||
|
(it.second)(argc, argv, cmd, description);
|
||||||
|
ran_command = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (ran_command) {
|
if (ran_command) {
|
||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +1,11 @@
|
|||||||
/**
|
|
||||||
* EQEmulator: Everquest Server Emulator
|
|
||||||
* Copyright (C) 2001-2019 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
* are required to give you total support for your newly bought product;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "world_content_service.h"
|
#include "world_content_service.h"
|
||||||
|
|
||||||
|
#include <utility>
|
||||||
|
#include <glm/vec3.hpp>
|
||||||
#include "../database.h"
|
#include "../database.h"
|
||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../eqemu_logsys.h"
|
#include "../eqemu_logsys.h"
|
||||||
#include "../loottable.h"
|
#include "../repositories/instance_list_repository.h"
|
||||||
#include "../repositories/content_flags_repository.h"
|
|
||||||
|
|
||||||
|
|
||||||
WorldContentService::WorldContentService()
|
WorldContentService::WorldContentService()
|
||||||
@@ -120,7 +102,7 @@ std::vector<std::string> WorldContentService::GetContentFlagsDisabled()
|
|||||||
/**
|
/**
|
||||||
* @param content_flags
|
* @param content_flags
|
||||||
*/
|
*/
|
||||||
void WorldContentService::SetContentFlags(const std::vector<ContentFlagsRepository::ContentFlags>& content_flags)
|
void WorldContentService::SetContentFlags(const std::vector<ContentFlagsRepository::ContentFlags> &content_flags)
|
||||||
{
|
{
|
||||||
WorldContentService::content_flags = content_flags;
|
WorldContentService::content_flags = content_flags;
|
||||||
}
|
}
|
||||||
@@ -168,14 +150,14 @@ bool WorldContentService::DoesPassContentFiltering(const ContentFlags &f)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if we don't have any enabled flag in enabled flags, we fail
|
// if we don't have any enabled flag in enabled flags, we fail
|
||||||
for (const auto& flag: Strings::Split(f.content_flags)) {
|
for (const auto &flag: Strings::Split(f.content_flags)) {
|
||||||
if (!Strings::Contains(GetContentFlagsEnabled(), flag)) {
|
if (!Strings::Contains(GetContentFlagsEnabled(), flag)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we don't have any disabled flag in disabled flags, we fail
|
// if we don't have any disabled flag in disabled flags, we fail
|
||||||
for (const auto& flag: Strings::Split(f.content_flags_disabled)) {
|
for (const auto &flag: Strings::Split(f.content_flags_disabled)) {
|
||||||
if (!Strings::Contains(GetContentFlagsDisabled(), flag)) {
|
if (!Strings::Contains(GetContentFlagsDisabled(), flag)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -201,6 +183,7 @@ void WorldContentService::ReloadContentFlags()
|
|||||||
}
|
}
|
||||||
|
|
||||||
SetContentFlags(set_content_flags);
|
SetContentFlags(set_content_flags);
|
||||||
|
SetContentZones(ZoneRepository::All(*m_content_database));
|
||||||
}
|
}
|
||||||
|
|
||||||
Database *WorldContentService::GetDatabase() const
|
Database *WorldContentService::GetDatabase() const
|
||||||
@@ -215,6 +198,18 @@ WorldContentService *WorldContentService::SetDatabase(Database *database)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Database *WorldContentService::GetContentDatabase() const
|
||||||
|
{
|
||||||
|
return m_content_database;
|
||||||
|
}
|
||||||
|
|
||||||
|
WorldContentService *WorldContentService::SetContentDatabase(Database *database)
|
||||||
|
{
|
||||||
|
WorldContentService::m_content_database = database;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
void WorldContentService::SetContentFlag(const std::string &content_flag_name, bool enabled)
|
void WorldContentService::SetContentFlag(const std::string &content_flag_name, bool enabled)
|
||||||
{
|
{
|
||||||
auto flags = ContentFlagsRepository::GetWhere(
|
auto flags = ContentFlagsRepository::GetWhere(
|
||||||
@@ -239,3 +234,85 @@ void WorldContentService::SetContentFlag(const std::string &content_flag_name, b
|
|||||||
|
|
||||||
ReloadContentFlags();
|
ReloadContentFlags();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetZones sets the zones for the world content service
|
||||||
|
// this is used for zone routing middleware
|
||||||
|
// we pull the zone list from the zone repository and feed from the zone store for now
|
||||||
|
// we're holding a copy in the content service - but we're talking 250kb of data in memory to handle routing of zoning
|
||||||
|
WorldContentService *WorldContentService::SetContentZones(const std::vector<BaseZoneRepository::Zone>& zones)
|
||||||
|
{
|
||||||
|
m_zones = zones;
|
||||||
|
|
||||||
|
LogInfo("Loaded [{}] zones", m_zones.size());
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// HandleZoneRoutingMiddleware is meant to handle content and context aware zone routing
|
||||||
|
//
|
||||||
|
// example # 1
|
||||||
|
// lavastorm (pre-don) version 0 (classic)
|
||||||
|
// lavastorm (don) version 1
|
||||||
|
// we want to route players to the correct version of lavastorm based on the current server side expansion
|
||||||
|
// in order to do that the simplest and cleanest way we intercept the zoning process and route players to an "instance" of the zone
|
||||||
|
// the reason why we're doing this is because all of the zoning logic already is handled by two keys "zone_id" and "instance_id"
|
||||||
|
// we can leverage static, never expires instances to handle this but to the client they don't see it any other way than a public normal zone
|
||||||
|
// scripts handle all the same way, you don't have to think about instances, the middleware will handle the magic
|
||||||
|
// the versions of zones are represented by two zone entries that have potentially different min/max expansion and/or different content flags
|
||||||
|
// we decide to route the client to the correct version of the zone based on the current server side expansion
|
||||||
|
// example # 2
|
||||||
|
void WorldContentService::HandleZoneRoutingMiddleware(ZoneChange_Struct *zc)
|
||||||
|
{
|
||||||
|
// if we're already in an instance, we don't want to route the player to another instance
|
||||||
|
if (zc->instanceID > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &z: m_zones) {
|
||||||
|
if (z.zoneidnumber == zc->zoneID) {
|
||||||
|
auto f = ContentFlags{
|
||||||
|
.min_expansion = z.min_expansion,
|
||||||
|
.max_expansion = z.max_expansion,
|
||||||
|
.content_flags = z.content_flags,
|
||||||
|
.content_flags_disabled = z.content_flags_disabled
|
||||||
|
};
|
||||||
|
|
||||||
|
if (DoesPassContentFiltering(f)) {
|
||||||
|
LogInfo(
|
||||||
|
"Attempting to route player to zone [{}] ({}) version [{}] long_name [{}]",
|
||||||
|
z.short_name,
|
||||||
|
z.zoneidnumber,
|
||||||
|
z.version,
|
||||||
|
z.long_name
|
||||||
|
);
|
||||||
|
|
||||||
|
auto instances = InstanceListRepository::GetWhere(
|
||||||
|
*GetDatabase(),
|
||||||
|
fmt::format(
|
||||||
|
"zone = {} AND version = {} AND never_expires = 1 AND is_global = 1",
|
||||||
|
z.zoneidnumber,
|
||||||
|
z.version
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!instances.empty()) {
|
||||||
|
auto instance = instances.front();
|
||||||
|
zc->instanceID = instance.id;
|
||||||
|
|
||||||
|
LogInfo(
|
||||||
|
"Routed player to instance [{}] of zone [{}] ({}) version [{}] long_name [{}] notes [{}]",
|
||||||
|
instance.id,
|
||||||
|
z.short_name,
|
||||||
|
z.zoneidnumber,
|
||||||
|
z.version,
|
||||||
|
z.long_name,
|
||||||
|
instance.notes
|
||||||
|
);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,33 +1,20 @@
|
|||||||
/**
|
|
||||||
* EQEmulator: Everquest Server Emulator
|
|
||||||
* Copyright (C) 2001-2019 EQEmulator Development Team (https://github.com/EQEmu/Server)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; version 2 of the License.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
* are required to give you total support for your newly bought product;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EQEMU_WORLD_CONTENT_SERVICE_H
|
#ifndef EQEMU_WORLD_CONTENT_SERVICE_H
|
||||||
#define EQEMU_WORLD_CONTENT_SERVICE_H
|
#define EQEMU_WORLD_CONTENT_SERVICE_H
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include "../loottable.h"
|
|
||||||
#include "../repositories/content_flags_repository.h"
|
#include "../repositories/content_flags_repository.h"
|
||||||
|
#include "../repositories/zone_repository.h"
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
|
struct ContentFlags {
|
||||||
|
int16 min_expansion;
|
||||||
|
int16 max_expansion;
|
||||||
|
std::string content_flags;
|
||||||
|
std::string content_flags_disabled;
|
||||||
|
};
|
||||||
|
|
||||||
namespace Expansion {
|
namespace Expansion {
|
||||||
static const int EXPANSION_ALL = -1;
|
static const int EXPANSION_ALL = -1;
|
||||||
static const int EXPANSION_FILTER_MAX = 99;
|
static const int EXPANSION_FILTER_MAX = 99;
|
||||||
@@ -176,14 +163,23 @@ public:
|
|||||||
WorldContentService * SetDatabase(Database *database);
|
WorldContentService * SetDatabase(Database *database);
|
||||||
Database *GetDatabase() const;
|
Database *GetDatabase() const;
|
||||||
|
|
||||||
|
WorldContentService * SetContentDatabase(Database *database);
|
||||||
|
Database *GetContentDatabase() const;
|
||||||
|
|
||||||
void SetContentFlag(const std::string &content_flag_name, bool enabled);
|
void SetContentFlag(const std::string &content_flag_name, bool enabled);
|
||||||
|
|
||||||
|
void HandleZoneRoutingMiddleware(ZoneChange_Struct *zc);
|
||||||
|
WorldContentService * SetContentZones(const std::vector<ZoneRepository::Zone>& zones);
|
||||||
private:
|
private:
|
||||||
int current_expansion{};
|
int current_expansion{};
|
||||||
std::vector<ContentFlagsRepository::ContentFlags> content_flags;
|
std::vector<ContentFlagsRepository::ContentFlags> content_flags;
|
||||||
|
|
||||||
// reference to database
|
// reference to database
|
||||||
Database *m_database;
|
Database *m_database;
|
||||||
|
Database *m_content_database;
|
||||||
|
|
||||||
|
// holds a record of the zone table from the database
|
||||||
|
std::vector<ZoneRepository::Zone> m_zones = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
extern WorldContentService content_service;
|
extern WorldContentService content_service;
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ void SendCrashReport(const std::string &crash_report)
|
|||||||
{
|
{
|
||||||
// can configure multiple endpoints if need be
|
// can configure multiple endpoints if need be
|
||||||
std::vector<std::string> endpoints = {
|
std::vector<std::string> endpoints = {
|
||||||
"http://spire.akkadius.com/api/v1/analytics/server-crash-report",
|
"https://spire.akkadius.com/api/v1/analytics/server-crash-report",
|
||||||
// "http://localhost:3010/api/v1/analytics/server-crash-report", // development
|
// "http://localhost:3010/api/v1/analytics/server-crash-report", // development
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+214
-372
@@ -29,6 +29,13 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "../common/repositories/account_repository.h"
|
||||||
|
#include "../common/repositories/character_bind_repository.h"
|
||||||
|
#include "../common/repositories/character_data_repository.h"
|
||||||
|
#include "../common/repositories/character_languages_repository.h"
|
||||||
|
#include "../common/repositories/character_leadership_abilities_repository.h"
|
||||||
|
#include "../common/repositories/character_skills_repository.h"
|
||||||
|
|
||||||
// Disgrace: for windows compile
|
// Disgrace: for windows compile
|
||||||
#ifdef _WINDOWS
|
#ifdef _WINDOWS
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
@@ -52,6 +59,7 @@
|
|||||||
|
|
||||||
#include "repositories/zone_repository.h"
|
#include "repositories/zone_repository.h"
|
||||||
#include "zone_store.h"
|
#include "zone_store.h"
|
||||||
|
#include "repositories/merchantlist_temp_repository.h"
|
||||||
|
|
||||||
extern Client client;
|
extern Client client;
|
||||||
|
|
||||||
@@ -451,363 +459,185 @@ bool Database::DeleteCharacter(char *character_name)
|
|||||||
|
|
||||||
bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct *pp)
|
bool Database::SaveCharacterCreate(uint32 character_id, uint32 account_id, PlayerProfile_Struct *pp)
|
||||||
{
|
{
|
||||||
std::string query = StringFormat(
|
auto c = CharacterDataRepository::NewEntity();
|
||||||
"REPLACE INTO `character_data` ("
|
|
||||||
"id,"
|
|
||||||
"account_id,"
|
|
||||||
"`name`,"
|
|
||||||
"last_name,"
|
|
||||||
"gender,"
|
|
||||||
"race,"
|
|
||||||
"class,"
|
|
||||||
"`level`,"
|
|
||||||
"deity,"
|
|
||||||
"birthday,"
|
|
||||||
"last_login,"
|
|
||||||
"time_played,"
|
|
||||||
"pvp_status,"
|
|
||||||
"level2,"
|
|
||||||
"anon,"
|
|
||||||
"gm,"
|
|
||||||
"intoxication,"
|
|
||||||
"hair_color,"
|
|
||||||
"beard_color,"
|
|
||||||
"eye_color_1,"
|
|
||||||
"eye_color_2,"
|
|
||||||
"hair_style,"
|
|
||||||
"beard,"
|
|
||||||
"ability_time_seconds,"
|
|
||||||
"ability_number,"
|
|
||||||
"ability_time_minutes,"
|
|
||||||
"ability_time_hours,"
|
|
||||||
"title,"
|
|
||||||
"suffix,"
|
|
||||||
"exp,"
|
|
||||||
"points,"
|
|
||||||
"mana,"
|
|
||||||
"cur_hp,"
|
|
||||||
"str,"
|
|
||||||
"sta,"
|
|
||||||
"cha,"
|
|
||||||
"dex,"
|
|
||||||
"`int`,"
|
|
||||||
"agi,"
|
|
||||||
"wis,"
|
|
||||||
"face,"
|
|
||||||
"y,"
|
|
||||||
"x,"
|
|
||||||
"z,"
|
|
||||||
"heading,"
|
|
||||||
"pvp2,"
|
|
||||||
"pvp_type,"
|
|
||||||
"autosplit_enabled,"
|
|
||||||
"zone_change_count,"
|
|
||||||
"drakkin_heritage,"
|
|
||||||
"drakkin_tattoo,"
|
|
||||||
"drakkin_details,"
|
|
||||||
"toxicity,"
|
|
||||||
"hunger_level,"
|
|
||||||
"thirst_level,"
|
|
||||||
"ability_up,"
|
|
||||||
"zone_id,"
|
|
||||||
"zone_instance,"
|
|
||||||
"leadership_exp_on,"
|
|
||||||
"ldon_points_guk,"
|
|
||||||
"ldon_points_mir,"
|
|
||||||
"ldon_points_mmc,"
|
|
||||||
"ldon_points_ruj,"
|
|
||||||
"ldon_points_tak,"
|
|
||||||
"ldon_points_available,"
|
|
||||||
"tribute_time_remaining,"
|
|
||||||
"show_helm,"
|
|
||||||
"career_tribute_points,"
|
|
||||||
"tribute_points,"
|
|
||||||
"tribute_active,"
|
|
||||||
"endurance,"
|
|
||||||
"group_leadership_exp,"
|
|
||||||
"raid_leadership_exp,"
|
|
||||||
"group_leadership_points,"
|
|
||||||
"raid_leadership_points,"
|
|
||||||
"air_remaining,"
|
|
||||||
"pvp_kills,"
|
|
||||||
"pvp_deaths,"
|
|
||||||
"pvp_current_points,"
|
|
||||||
"pvp_career_points,"
|
|
||||||
"pvp_best_kill_streak,"
|
|
||||||
"pvp_worst_death_streak,"
|
|
||||||
"pvp_current_kill_streak,"
|
|
||||||
"aa_points_spent,"
|
|
||||||
"aa_exp,"
|
|
||||||
"aa_points,"
|
|
||||||
"group_auto_consent,"
|
|
||||||
"raid_auto_consent,"
|
|
||||||
"guild_auto_consent,"
|
|
||||||
"RestTimer) "
|
|
||||||
"VALUES ("
|
|
||||||
"%u," // id
|
|
||||||
"%u," // account_id
|
|
||||||
"'%s'," // `name`
|
|
||||||
"'%s'," // last_name
|
|
||||||
"%u," // gender
|
|
||||||
"%u," // race
|
|
||||||
"%u," // class
|
|
||||||
"%u," // `level`
|
|
||||||
"%u," // deity
|
|
||||||
"%u," // birthday
|
|
||||||
"%u," // last_login
|
|
||||||
"%u," // time_played
|
|
||||||
"%u," // pvp_status
|
|
||||||
"%u," // level2
|
|
||||||
"%u," // anon
|
|
||||||
"%u," // gm
|
|
||||||
"%u," // intoxication
|
|
||||||
"%u," // hair_color
|
|
||||||
"%u," // beard_color
|
|
||||||
"%u," // eye_color_1
|
|
||||||
"%u," // eye_color_2
|
|
||||||
"%u," // hair_style
|
|
||||||
"%u," // beard
|
|
||||||
"%u," // ability_time_seconds
|
|
||||||
"%u," // ability_number
|
|
||||||
"%u," // ability_time_minutes
|
|
||||||
"%u," // ability_time_hours
|
|
||||||
"'%s'," // title
|
|
||||||
"'%s'," // suffix
|
|
||||||
"%u," // exp
|
|
||||||
"%u," // points
|
|
||||||
"%u," // mana
|
|
||||||
"%u," // cur_hp
|
|
||||||
"%u," // str
|
|
||||||
"%u," // sta
|
|
||||||
"%u," // cha
|
|
||||||
"%u," // dex
|
|
||||||
"%u," // `int`
|
|
||||||
"%u," // agi
|
|
||||||
"%u," // wis
|
|
||||||
"%u," // face
|
|
||||||
"%f," // y
|
|
||||||
"%f," // x
|
|
||||||
"%f," // z
|
|
||||||
"%f," // heading
|
|
||||||
"%u," // pvp2
|
|
||||||
"%u," // pvp_type
|
|
||||||
"%u," // autosplit_enabled
|
|
||||||
"%u," // zone_change_count
|
|
||||||
"%u," // drakkin_heritage
|
|
||||||
"%u," // drakkin_tattoo
|
|
||||||
"%u," // drakkin_details
|
|
||||||
"%i," // toxicity
|
|
||||||
"%i," // hunger_level
|
|
||||||
"%i," // thirst_level
|
|
||||||
"%u," // ability_up
|
|
||||||
"%u," // zone_id
|
|
||||||
"%u," // zone_instance
|
|
||||||
"%u," // leadership_exp_on
|
|
||||||
"%u," // ldon_points_guk
|
|
||||||
"%u," // ldon_points_mir
|
|
||||||
"%u," // ldon_points_mmc
|
|
||||||
"%u," // ldon_points_ruj
|
|
||||||
"%u," // ldon_points_tak
|
|
||||||
"%u," // ldon_points_available
|
|
||||||
"%u," // tribute_time_remaining
|
|
||||||
"%u," // show_helm
|
|
||||||
"%u," // career_tribute_points
|
|
||||||
"%u," // tribute_points
|
|
||||||
"%u," // tribute_active
|
|
||||||
"%u," // endurance
|
|
||||||
"%u," // group_leadership_exp
|
|
||||||
"%u," // raid_leadership_exp
|
|
||||||
"%u," // group_leadership_point
|
|
||||||
"%u," // raid_leadership_points
|
|
||||||
"%u," // air_remaining
|
|
||||||
"%u," // pvp_kills
|
|
||||||
"%u," // pvp_deaths
|
|
||||||
"%u," // pvp_current_points
|
|
||||||
"%u," // pvp_career_points
|
|
||||||
"%u," // pvp_best_kill_streak
|
|
||||||
"%u," // pvp_worst_death_streak
|
|
||||||
"%u," // pvp_current_kill_strea
|
|
||||||
"%u," // aa_points_spent
|
|
||||||
"%u," // aa_exp
|
|
||||||
"%u," // aa_points
|
|
||||||
"%u," // group_auto_consent
|
|
||||||
"%u," // raid_auto_consent
|
|
||||||
"%u," // guild_auto_consent
|
|
||||||
"%u" // RestTimer
|
|
||||||
")",
|
|
||||||
character_id, // " id, "
|
|
||||||
account_id, // " account_id, "
|
|
||||||
Strings::Escape(pp->name).c_str(), // " `name`, "
|
|
||||||
Strings::Escape(pp->last_name).c_str(), // " last_name, "
|
|
||||||
pp->gender, // " gender, "
|
|
||||||
pp->race, // " race, "
|
|
||||||
pp->class_, // " class, "
|
|
||||||
pp->level, // " `level`, "
|
|
||||||
pp->deity, // " deity, "
|
|
||||||
pp->birthday, // " birthday, "
|
|
||||||
pp->lastlogin, // " last_login, "
|
|
||||||
pp->timePlayedMin, // " time_played, "
|
|
||||||
pp->pvp, // " pvp_status, "
|
|
||||||
pp->level2, // " level2, "
|
|
||||||
pp->anon, // " anon, "
|
|
||||||
pp->gm, // " gm, "
|
|
||||||
pp->intoxication, // " intoxication, "
|
|
||||||
pp->haircolor, // " hair_color, "
|
|
||||||
pp->beardcolor, // " beard_color, "
|
|
||||||
pp->eyecolor1, // " eye_color_1, "
|
|
||||||
pp->eyecolor2, // " eye_color_2, "
|
|
||||||
pp->hairstyle, // " hair_style, "
|
|
||||||
pp->beard, // " beard, "
|
|
||||||
pp->ability_time_seconds, // " ability_time_seconds, "
|
|
||||||
pp->ability_number, // " ability_number, "
|
|
||||||
pp->ability_time_minutes, // " ability_time_minutes, "
|
|
||||||
pp->ability_time_hours, // " ability_time_hours, "
|
|
||||||
Strings::Escape(pp->title).c_str(), // " title, "
|
|
||||||
Strings::Escape(pp->suffix).c_str(), // " suffix, "
|
|
||||||
pp->exp, // " exp, "
|
|
||||||
pp->points, // " points, "
|
|
||||||
pp->mana, // " mana, "
|
|
||||||
pp->cur_hp, // " cur_hp, "
|
|
||||||
pp->STR, // " str, "
|
|
||||||
pp->STA, // " sta, "
|
|
||||||
pp->CHA, // " cha, "
|
|
||||||
pp->DEX, // " dex, "
|
|
||||||
pp->INT, // " `int`, "
|
|
||||||
pp->AGI, // " agi, "
|
|
||||||
pp->WIS, // " wis, "
|
|
||||||
pp->face, // " face, "
|
|
||||||
pp->y, // " y, "
|
|
||||||
pp->x, // " x, "
|
|
||||||
pp->z, // " z, "
|
|
||||||
pp->heading, // " heading, "
|
|
||||||
pp->pvp2, // " pvp2, "
|
|
||||||
pp->pvptype, // " pvp_type, "
|
|
||||||
pp->autosplit, // " autosplit_enabled, "
|
|
||||||
pp->zone_change_count, // " zone_change_count, "
|
|
||||||
pp->drakkin_heritage, // " drakkin_heritage, "
|
|
||||||
pp->drakkin_tattoo, // " drakkin_tattoo, "
|
|
||||||
pp->drakkin_details, // " drakkin_details, "
|
|
||||||
pp->toxicity, // " toxicity, "
|
|
||||||
pp->hunger_level, // " hunger_level, "
|
|
||||||
pp->thirst_level, // " thirst_level, "
|
|
||||||
pp->ability_up, // " ability_up, "
|
|
||||||
pp->zone_id, // " zone_id, "
|
|
||||||
pp->zoneInstance, // " zone_instance, "
|
|
||||||
pp->leadAAActive, // " leadership_exp_on, "
|
|
||||||
pp->ldon_points_guk, // " ldon_points_guk, "
|
|
||||||
pp->ldon_points_mir, // " ldon_points_mir, "
|
|
||||||
pp->ldon_points_mmc, // " ldon_points_mmc, "
|
|
||||||
pp->ldon_points_ruj, // " ldon_points_ruj, "
|
|
||||||
pp->ldon_points_tak, // " ldon_points_tak, "
|
|
||||||
pp->ldon_points_available, // " ldon_points_available, "
|
|
||||||
pp->tribute_time_remaining, // " tribute_time_remaining, "
|
|
||||||
pp->showhelm, // " show_helm, "
|
|
||||||
pp->career_tribute_points, // " career_tribute_points, "
|
|
||||||
pp->tribute_points, // " tribute_points, "
|
|
||||||
pp->tribute_active, // " tribute_active, "
|
|
||||||
pp->endurance, // " endurance, "
|
|
||||||
pp->group_leadership_exp, // " group_leadership_exp, "
|
|
||||||
pp->raid_leadership_exp, // " raid_leadership_exp, "
|
|
||||||
pp->group_leadership_points, // " group_leadership_points, "
|
|
||||||
pp->raid_leadership_points, // " raid_leadership_points, "
|
|
||||||
pp->air_remaining, // " air_remaining, "
|
|
||||||
pp->PVPKills, // " pvp_kills, "
|
|
||||||
pp->PVPDeaths, // " pvp_deaths, "
|
|
||||||
pp->PVPCurrentPoints, // " pvp_current_points, "
|
|
||||||
pp->PVPCareerPoints, // " pvp_career_points, "
|
|
||||||
pp->PVPBestKillStreak, // " pvp_best_kill_streak, "
|
|
||||||
pp->PVPWorstDeathStreak, // " pvp_worst_death_streak, "
|
|
||||||
pp->PVPCurrentKillStreak, // " pvp_current_kill_streak, "
|
|
||||||
pp->aapoints_spent, // " aa_points_spent, "
|
|
||||||
pp->expAA, // " aa_exp, "
|
|
||||||
pp->aapoints, // " aa_points, "
|
|
||||||
pp->groupAutoconsent, // " group_auto_consent, "
|
|
||||||
pp->raidAutoconsent, // " raid_auto_consent, "
|
|
||||||
pp->guildAutoconsent, // " guild_auto_consent, "
|
|
||||||
pp->RestTimer // " RestTimer) "
|
|
||||||
);
|
|
||||||
QueryDatabase(query);
|
|
||||||
|
|
||||||
/* Save Bind Points */
|
c.id = character_id;
|
||||||
query = StringFormat(
|
c.account_id = account_id;
|
||||||
"REPLACE INTO `character_bind` (id, zone_id, instance_id, x, y, z, heading, slot)"
|
c.name = pp->name;
|
||||||
" VALUES (%u, %u, %u, %f, %f, %f, %f, %i), "
|
c.last_name = pp->last_name;
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
c.gender = pp->gender;
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
c.race = pp->race;
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i), "
|
c.class_ = pp->class_;
|
||||||
"(%u, %u, %u, %f, %f, %f, %f, %i)",
|
c.level = pp->level;
|
||||||
character_id, pp->binds[0].zone_id, 0, pp->binds[0].x, pp->binds[0].y, pp->binds[0].z, pp->binds[0].heading, 0,
|
c.deity = pp->deity;
|
||||||
character_id, pp->binds[1].zone_id, 0, pp->binds[1].x, pp->binds[1].y, pp->binds[1].z, pp->binds[1].heading, 1,
|
c.birthday = pp->birthday;
|
||||||
character_id, pp->binds[2].zone_id, 0, pp->binds[2].x, pp->binds[2].y, pp->binds[2].z, pp->binds[2].heading, 2,
|
c.last_login = pp->lastlogin;
|
||||||
character_id, pp->binds[3].zone_id, 0, pp->binds[3].x, pp->binds[3].y, pp->binds[3].z, pp->binds[3].heading, 3,
|
c.time_played = pp->timePlayedMin;
|
||||||
character_id, pp->binds[4].zone_id, 0, pp->binds[4].x, pp->binds[4].y, pp->binds[4].z, pp->binds[4].heading, 4
|
c.pvp_status = pp->pvp;
|
||||||
);
|
c.level2 = pp->level2;
|
||||||
QueryDatabase(query);
|
c.anon = pp->anon;
|
||||||
|
c.gm = pp->gm;
|
||||||
|
c.intoxication = pp->intoxication;
|
||||||
|
c.hair_color = pp->haircolor;
|
||||||
|
c.beard_color = pp->beardcolor;
|
||||||
|
c.eye_color_1 = pp->eyecolor1;
|
||||||
|
c.eye_color_2 = pp->eyecolor2;
|
||||||
|
c.hair_style = pp->hairstyle;
|
||||||
|
c.beard = pp->beard;
|
||||||
|
c.ability_time_seconds = pp->ability_time_seconds;
|
||||||
|
c.ability_number = pp->ability_number;
|
||||||
|
c.ability_time_minutes = pp->ability_time_minutes;
|
||||||
|
c.ability_time_hours = pp->ability_time_hours;
|
||||||
|
c.title = pp->title;
|
||||||
|
c.suffix = pp->suffix;
|
||||||
|
c.exp = pp->exp;
|
||||||
|
c.points = pp->points;
|
||||||
|
c.mana = pp->mana;
|
||||||
|
c.cur_hp = pp->cur_hp;
|
||||||
|
c.str = pp->STR;
|
||||||
|
c.sta = pp->STA;
|
||||||
|
c.cha = pp->CHA;
|
||||||
|
c.dex = pp->DEX;
|
||||||
|
c.int_ = pp->INT;
|
||||||
|
c.agi = pp->AGI;
|
||||||
|
c.wis = pp->WIS;
|
||||||
|
c.face = pp->face;
|
||||||
|
c.y = pp->y;
|
||||||
|
c.x = pp->x;
|
||||||
|
c.z = pp->z;
|
||||||
|
c.heading = pp->heading;
|
||||||
|
c.pvp2 = pp->pvp2;
|
||||||
|
c.pvp_type = pp->pvptype;
|
||||||
|
c.autosplit_enabled = pp->autosplit;
|
||||||
|
c.zone_change_count = pp->zone_change_count;
|
||||||
|
c.drakkin_heritage = pp->drakkin_heritage;
|
||||||
|
c.drakkin_tattoo = pp->drakkin_tattoo;
|
||||||
|
c.drakkin_details = pp->drakkin_details;
|
||||||
|
c.toxicity = pp->toxicity;
|
||||||
|
c.hunger_level = pp->hunger_level;
|
||||||
|
c.thirst_level = pp->thirst_level;
|
||||||
|
c.ability_up = pp->ability_up;
|
||||||
|
c.zone_id = pp->zone_id;
|
||||||
|
c.zone_instance = pp->zoneInstance;
|
||||||
|
c.leadership_exp_on = pp->leadAAActive;
|
||||||
|
c.ldon_points_guk = pp->ldon_points_guk;
|
||||||
|
c.ldon_points_mir = pp->ldon_points_mir;
|
||||||
|
c.ldon_points_mmc = pp->ldon_points_mmc;
|
||||||
|
c.ldon_points_ruj = pp->ldon_points_ruj;
|
||||||
|
c.ldon_points_tak = pp->ldon_points_tak;
|
||||||
|
c.ldon_points_available = pp->ldon_points_available;
|
||||||
|
c.tribute_time_remaining = pp->tribute_time_remaining;
|
||||||
|
c.show_helm = pp->showhelm;
|
||||||
|
c.career_tribute_points = pp->career_tribute_points;
|
||||||
|
c.tribute_points = pp->tribute_points;
|
||||||
|
c.tribute_active = pp->tribute_active;
|
||||||
|
c.endurance = pp->endurance;
|
||||||
|
c.group_leadership_exp = pp->group_leadership_exp;
|
||||||
|
c.raid_leadership_exp = pp->raid_leadership_exp;
|
||||||
|
c.group_leadership_points = pp->group_leadership_points;
|
||||||
|
c.raid_leadership_points = pp->raid_leadership_points;
|
||||||
|
c.air_remaining = pp->air_remaining;
|
||||||
|
c.pvp_kills = pp->PVPKills;
|
||||||
|
c.pvp_deaths = pp->PVPDeaths;
|
||||||
|
c.pvp_current_points = pp->PVPCurrentPoints;
|
||||||
|
c.pvp_career_points = pp->PVPCareerPoints;
|
||||||
|
c.pvp_best_kill_streak = pp->PVPBestKillStreak;
|
||||||
|
c.pvp_worst_death_streak = pp->PVPWorstDeathStreak;
|
||||||
|
c.pvp_current_kill_streak = pp->PVPCurrentKillStreak;
|
||||||
|
c.aa_points_spent = pp->aapoints_spent;
|
||||||
|
c.aa_exp = pp->expAA;
|
||||||
|
c.aa_points = pp->aapoints;
|
||||||
|
c.group_auto_consent = pp->groupAutoconsent;
|
||||||
|
c.raid_auto_consent = pp->raidAutoconsent;
|
||||||
|
c.guild_auto_consent = pp->guildAutoconsent;
|
||||||
|
c.RestTimer = pp->RestTimer;
|
||||||
|
|
||||||
|
CharacterDataRepository::ReplaceOne(*this, c);
|
||||||
|
|
||||||
|
std::vector<CharacterBindRepository::CharacterBind> character_binds;
|
||||||
|
|
||||||
|
character_binds.reserve(5);
|
||||||
|
|
||||||
|
auto b = CharacterBindRepository::NewEntity();
|
||||||
|
|
||||||
|
b.id = character_id;
|
||||||
|
|
||||||
|
for (uint8 slot_id = 0; slot_id < 5; slot_id++) {
|
||||||
|
b.zone_id = pp->binds[slot_id].zone_id;
|
||||||
|
b.x = pp->binds[slot_id].x;
|
||||||
|
b.y = pp->binds[slot_id].y;
|
||||||
|
b.z = pp->binds[slot_id].z;
|
||||||
|
b.heading = pp->binds[slot_id].heading;
|
||||||
|
b.slot = slot_id;
|
||||||
|
|
||||||
|
character_binds.emplace_back(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
CharacterBindRepository::ReplaceMany(*this, character_binds);
|
||||||
|
|
||||||
/* HoTT Ability */
|
|
||||||
if (RuleB(Character, GrantHoTTOnCreate)) {
|
if (RuleB(Character, GrantHoTTOnCreate)) {
|
||||||
query = StringFormat(
|
CharacterLeadershipAbilitiesRepository::InsertOne(
|
||||||
"INSERT INTO `character_leadership_abilities` (id, slot, `rank`) VALUES (%u, %i, %i)",
|
*this,
|
||||||
character_id,
|
CharacterLeadershipAbilitiesRepository::CharacterLeadershipAbilities{
|
||||||
14,
|
.id = character_id,
|
||||||
1
|
.slot = LeadershipAbilitySlot::HealthOfTargetsTarget,
|
||||||
|
.rank_ = 1
|
||||||
|
}
|
||||||
);
|
);
|
||||||
QueryDatabase(query);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save Skills */
|
std::vector<CharacterSkillsRepository::CharacterSkills> character_skills;
|
||||||
int firstquery = 0;
|
|
||||||
for (int i = 0; i < MAX_PP_SKILL; i++) {
|
|
||||||
if (pp->skills[i] > 0) {
|
|
||||||
if (firstquery != 1) {
|
|
||||||
firstquery = 1;
|
|
||||||
query = StringFormat(
|
|
||||||
"REPLACE INTO `character_skills` (id, skill_id, value) VALUES (%u, %u, %u)",
|
|
||||||
character_id,
|
|
||||||
i,
|
|
||||||
pp->skills[i]
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
query = query + StringFormat(", (%u, %u, %u)", character_id, i, pp->skills[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QueryDatabase(query);
|
|
||||||
|
|
||||||
/* Save Language */
|
character_skills.reserve(MAX_PP_SKILL);
|
||||||
firstquery = 0;
|
|
||||||
for (int i = 0; i < MAX_PP_LANGUAGE; i++) {
|
for (uint16 slot_id = 0; slot_id < MAX_PP_SKILL; slot_id++) {
|
||||||
if (pp->languages[i] > 0) {
|
character_skills.emplace_back(
|
||||||
if (firstquery != 1) {
|
CharacterSkillsRepository::CharacterSkills{
|
||||||
firstquery = 1;
|
.id = character_id,
|
||||||
query = StringFormat(
|
.skill_id = slot_id,
|
||||||
"REPLACE INTO `character_languages` (id, lang_id, value) VALUES (%u, %u, %u)",
|
.value = static_cast<uint16_t>(pp->skills[slot_id])
|
||||||
character_id,
|
}
|
||||||
i,
|
|
||||||
pp->languages[i]
|
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
query = query + StringFormat(", (%u, %u, %u)", character_id, i, pp->languages[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CharacterSkillsRepository::ReplaceMany(*this, character_skills);
|
||||||
|
|
||||||
|
std::vector<CharacterLanguagesRepository::CharacterLanguages> character_languages;
|
||||||
|
|
||||||
|
character_languages.reserve(MAX_PP_LANGUAGE);
|
||||||
|
|
||||||
|
for (uint16 slot_id = 0; slot_id < MAX_PP_LANGUAGE; slot_id++) {
|
||||||
|
character_languages.emplace_back(
|
||||||
|
CharacterLanguagesRepository::CharacterLanguages{
|
||||||
|
.id = character_id,
|
||||||
|
.lang_id = slot_id,
|
||||||
|
.value = static_cast<uint16_t>(pp->languages[slot_id])
|
||||||
}
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
QueryDatabase(query);
|
|
||||||
|
CharacterLanguagesRepository::ReplaceMany(*this, character_languages);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 Database::GetCharacterID(const char *name) {
|
uint32 Database::GetCharacterID(const std::string& name)
|
||||||
const auto query = fmt::format(
|
{
|
||||||
"SELECT `id` FROM `character_data` WHERE `name` = '{}'",
|
const auto& l = CharacterDataRepository::GetWhere(
|
||||||
|
*this,
|
||||||
|
fmt::format(
|
||||||
|
"`name` = '{}'",
|
||||||
Strings::Escape(name)
|
Strings::Escape(name)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
auto results = QueryDatabase(query);
|
|
||||||
if (!results.Success() || !results.RowCount()) {
|
if (l.empty()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto row = results.begin();
|
auto e = l.front();
|
||||||
return Strings::ToUnsignedInt(row[0]);
|
|
||||||
|
return e.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1219,8 +1049,9 @@ void Database::GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus) {
|
|||||||
*oStatus = Strings::ToInt(row[1]);
|
*oStatus = Strings::ToInt(row[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::ClearMerchantTemp(){
|
void Database::ClearMerchantTemp()
|
||||||
QueryDatabase("DELETE FROM merchantlist_temp");
|
{
|
||||||
|
MerchantlistTempRepository::ClearTemporaryMerchantLists(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::UpdateName(const char* oldname, const char* newname) {
|
bool Database::UpdateName(const char* oldname, const char* newname) {
|
||||||
@@ -1643,25 +1474,20 @@ void Database::ClearGroupLeader(uint32 gid) {
|
|||||||
std::cout << "Unable to clear group leader: " << results.ErrorMessage() << std::endl;
|
std::cout << "Unable to clear group leader: " << results.ErrorMessage() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 Database::GetAgreementFlag(uint32 acctid) {
|
uint8 Database::GetAgreementFlag(uint32 account_id)
|
||||||
|
{
|
||||||
std::string query = StringFormat("SELECT rulesflag FROM account WHERE id=%i",acctid);
|
const auto& e = AccountRepository::FindOne(*this, account_id);
|
||||||
auto results = QueryDatabase(query);
|
if (!e.id) {
|
||||||
|
|
||||||
if (!results.Success())
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (results.RowCount() != 1)
|
return e.rulesflag;
|
||||||
return 0;
|
|
||||||
|
|
||||||
auto row = results.begin();
|
|
||||||
|
|
||||||
return Strings::ToUnsignedInt(row[0]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::SetAgreementFlag(uint32 acctid) {
|
void Database::SetAgreementFlag(uint32 account_id) {
|
||||||
std::string query = StringFormat("UPDATE account SET rulesflag=1 where id=%i", acctid);
|
auto e = AccountRepository::FindOne(*this, account_id);
|
||||||
QueryDatabase(query);
|
e.rulesflag = 1;
|
||||||
|
AccountRepository::UpdateOne(*this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::ClearRaid(uint32 rid) {
|
void Database::ClearRaid(uint32 rid) {
|
||||||
@@ -2097,37 +1923,45 @@ void Database::ClearInvSnapshots(bool from_now) {
|
|||||||
|
|
||||||
struct TimeOfDay_Struct Database::LoadTime(time_t &realtime)
|
struct TimeOfDay_Struct Database::LoadTime(time_t &realtime)
|
||||||
{
|
{
|
||||||
|
TimeOfDay_Struct t{};
|
||||||
TimeOfDay_Struct eqTime;
|
|
||||||
std::string query = StringFormat("SELECT minute,hour,day,month,year,realtime FROM eqtime limit 1");
|
std::string query = StringFormat("SELECT minute,hour,day,month,year,realtime FROM eqtime limit 1");
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
if (!results.Success() || results.RowCount() == 0){
|
if (!results.Success() || results.RowCount() == 0) {
|
||||||
LogInfo("Loading EQ time of day failed. Using defaults");
|
LogInfo("Loading EQ time of day failed. Using defaults");
|
||||||
eqTime.minute = 0;
|
t.minute = 0;
|
||||||
eqTime.hour = 9;
|
t.hour = 9;
|
||||||
eqTime.day = 1;
|
t.day = 1;
|
||||||
eqTime.month = 1;
|
t.month = 1;
|
||||||
eqTime.year = 3100;
|
t.year = 3100;
|
||||||
realtime = time(nullptr);
|
realtime = time(nullptr);
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
auto row = results.begin();
|
auto row = results.begin();
|
||||||
|
|
||||||
eqTime.minute = Strings::ToUnsignedInt(row[0]);
|
uint8 hour = Strings::ToUnsignedInt(row[1]);
|
||||||
eqTime.hour = Strings::ToUnsignedInt(row[1]);
|
time_t realtime_ = Strings::ToBigInt(row[5]);
|
||||||
eqTime.day = Strings::ToUnsignedInt(row[2]);
|
if (RuleI(World, BootHour) > 0 && RuleI(World, BootHour) <= 24) {
|
||||||
eqTime.month = Strings::ToUnsignedInt(row[3]);
|
hour = RuleI(World, BootHour);
|
||||||
eqTime.year = Strings::ToUnsignedInt(row[4]);
|
realtime_ = time(nullptr);
|
||||||
realtime = Strings::ToBigInt(row[5]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return eqTime;
|
t.minute = Strings::ToUnsignedInt(row[0]);
|
||||||
|
t.hour = hour;
|
||||||
|
t.day = Strings::ToUnsignedInt(row[2]);
|
||||||
|
t.month = Strings::ToUnsignedInt(row[3]);
|
||||||
|
t.year = Strings::ToUnsignedInt(row[4]);
|
||||||
|
realtime = realtime_;
|
||||||
|
|
||||||
|
LogEqTime("Setting hour to [{}]", hour);
|
||||||
|
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Database::SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year)
|
bool Database::SaveTime(int8 minute, int8 hour, int8 day, int8 month, int16 year)
|
||||||
{
|
{
|
||||||
std::string query = StringFormat("UPDATE eqtime set minute = %d, hour = %d, day = %d, month = %d, year = %d, realtime = %d limit 1", minute, hour, day, month, year, time(0));
|
std::string query = StringFormat("UPDATE eqtime set minute = %d, hour = %d, day = %d, month = %d, year = %d, realtime = %d limit 1", minute, hour, day, month, year, time(nullptr));
|
||||||
auto results = QueryDatabase(query);
|
auto results = QueryDatabase(query);
|
||||||
|
|
||||||
return results.Success();
|
return results.Success();
|
||||||
@@ -2241,6 +2075,11 @@ bool Database::CopyCharacter(
|
|||||||
row = results.begin();
|
row = results.begin();
|
||||||
std::string new_character_id = row[0];
|
std::string new_character_id = row[0];
|
||||||
|
|
||||||
|
std::vector<std::string> tables_to_zero_id = {
|
||||||
|
"keyring",
|
||||||
|
"data_buckets",
|
||||||
|
};
|
||||||
|
|
||||||
TransactionBegin();
|
TransactionBegin();
|
||||||
for (const auto &iter : DatabaseSchema::GetCharacterTables()) {
|
for (const auto &iter : DatabaseSchema::GetCharacterTables()) {
|
||||||
std::string table_name = iter.first;
|
std::string table_name = iter.first;
|
||||||
@@ -2274,6 +2113,10 @@ bool Database::CopyCharacter(
|
|||||||
std::string column = columns[column_index];
|
std::string column = columns[column_index];
|
||||||
std::string value = row[column_index] ? row[column_index] : "null";
|
std::string value = row[column_index] ? row[column_index] : "null";
|
||||||
|
|
||||||
|
if (column == "id" && Strings::Contains(tables_to_zero_id, table_name)) {
|
||||||
|
value = "0";
|
||||||
|
}
|
||||||
|
|
||||||
if (column == character_id_column_name) {
|
if (column == character_id_column_name) {
|
||||||
value = new_character_id;
|
value = new_character_id;
|
||||||
}
|
}
|
||||||
@@ -2321,7 +2164,6 @@ bool Database::CopyCharacter(
|
|||||||
if (!insert.ErrorMessage().empty()) {
|
if (!insert.ErrorMessage().empty()) {
|
||||||
TransactionRollback();
|
TransactionRollback();
|
||||||
return false;
|
return false;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-8
@@ -125,7 +125,7 @@ public:
|
|||||||
uint32 GetAccountIDByChar(const char* charname, uint32* oCharID = 0);
|
uint32 GetAccountIDByChar(const char* charname, uint32* oCharID = 0);
|
||||||
uint32 GetAccountIDByChar(uint32 char_id);
|
uint32 GetAccountIDByChar(uint32 char_id);
|
||||||
uint32 GetAccountIDByName(std::string account_name, std::string loginserver, int16* status = 0, uint32* lsid = 0);
|
uint32 GetAccountIDByName(std::string account_name, std::string loginserver, int16* status = 0, uint32* lsid = 0);
|
||||||
uint32 GetCharacterID(const char *name);
|
uint32 GetCharacterID(const std::string& name);
|
||||||
uint32 GetCharacterInfo(std::string character_name, uint32 *account_id, uint32 *zone_id, uint32 *instance_id);
|
uint32 GetCharacterInfo(std::string character_name, uint32 *account_id, uint32 *zone_id, uint32 *instance_id);
|
||||||
uint32 GetGuildIDByCharID(uint32 char_id);
|
uint32 GetGuildIDByCharID(uint32 char_id);
|
||||||
uint32 GetGroupIDByCharID(uint32 char_id);
|
uint32 GetGroupIDByCharID(uint32 char_id);
|
||||||
@@ -166,6 +166,7 @@ public:
|
|||||||
void GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids);
|
void GetCharactersInInstance(uint16 instance_id, std::list<uint32> &character_ids);
|
||||||
void PurgeExpiredInstances();
|
void PurgeExpiredInstances();
|
||||||
void SetInstanceDuration(uint16 instance_id, uint32 new_duration);
|
void SetInstanceDuration(uint16 instance_id, uint32 new_duration);
|
||||||
|
void CleanupInstanceCorpses();
|
||||||
|
|
||||||
/* Adventure related. */
|
/* Adventure related. */
|
||||||
|
|
||||||
@@ -188,10 +189,10 @@ public:
|
|||||||
uint32 CheckLogin(const char* name, const char* password, const char *loginserver, int16* oStatus = 0);
|
uint32 CheckLogin(const char* name, const char* password, const char *loginserver, int16* oStatus = 0);
|
||||||
uint32 CreateAccount(const char* name, const char* password, int16 status, const char* loginserver, uint32 lsaccount_id);
|
uint32 CreateAccount(const char* name, const char* password, int16 status, const char* loginserver, uint32 lsaccount_id);
|
||||||
uint32 GetAccountIDFromLSID(const std::string& in_loginserver_id, uint32 in_loginserver_account_id, char* in_account_name = 0, int16* in_status = 0);
|
uint32 GetAccountIDFromLSID(const std::string& in_loginserver_id, uint32 in_loginserver_account_id, char* in_account_name = 0, int16* in_status = 0);
|
||||||
uint8 GetAgreementFlag(uint32 acctid);
|
uint8 GetAgreementFlag(uint32 account_id);
|
||||||
|
|
||||||
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
void GetAccountFromID(uint32 id, char* oAccountName, int16* oStatus);
|
||||||
void SetAgreementFlag(uint32 acctid);
|
void SetAgreementFlag(uint32 account_id);
|
||||||
|
|
||||||
int GetIPExemption(std::string account_ip);
|
int GetIPExemption(std::string account_ip);
|
||||||
void SetIPExemption(std::string account_ip, int exemption_amount);
|
void SetIPExemption(std::string account_ip, int exemption_amount);
|
||||||
@@ -226,11 +227,6 @@ public:
|
|||||||
|
|
||||||
void PurgeAllDeletedDataBuckets();
|
void PurgeAllDeletedDataBuckets();
|
||||||
|
|
||||||
/* Database Conversions 'database_conversions.cpp' */
|
|
||||||
|
|
||||||
bool CheckDatabaseConversions();
|
|
||||||
bool CheckDatabaseConvertCorpseDeblob();
|
|
||||||
bool CheckDatabaseConvertPPDeblob();
|
|
||||||
|
|
||||||
/* Database Variables */
|
/* Database Variables */
|
||||||
|
|
||||||
|
|||||||
@@ -322,6 +322,10 @@ void DatabaseDumpService::DatabaseDump()
|
|||||||
pipe_file
|
pipe_file
|
||||||
);
|
);
|
||||||
|
|
||||||
|
LogInfo("Backing up database [{}]", execute_command);
|
||||||
|
LogInfo("This can take a few minutes depending on the size of your database");
|
||||||
|
LogInfo("LOADING... PLEASE WAIT...");
|
||||||
|
|
||||||
BuildCredentialsFile();
|
BuildCredentialsFile();
|
||||||
std::string execution_result = Process::execute(execute_command);
|
std::string execution_result = Process::execute(execute_command);
|
||||||
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
if (!execution_result.empty() && IsDumpOutputToConsole()) {
|
||||||
|
|||||||
@@ -76,9 +76,9 @@ void DatabaseUpdate::CheckDbUpdates()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DatabaseUpdate::GetQueryResult(std::string query)
|
std::string DatabaseUpdate::GetQueryResult(const ManifestEntry& e)
|
||||||
{
|
{
|
||||||
auto results = m_database->QueryDatabase(query);
|
auto results = (e.content_schema_update ? m_content_database : m_database)->QueryDatabase(e.check);
|
||||||
|
|
||||||
std::vector<std::string> result_lines = {};
|
std::vector<std::string> result_lines = {};
|
||||||
|
|
||||||
@@ -121,6 +121,16 @@ bool DatabaseUpdate::ShouldRunMigration(ManifestEntry &e, std::string query_resu
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if we are running in a terminal
|
||||||
|
bool is_atty()
|
||||||
|
{
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
return ::_isatty(_fileno(stdin));
|
||||||
|
#else
|
||||||
|
return isatty(fileno(stdin));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// return true if we ran updates
|
// return true if we ran updates
|
||||||
bool DatabaseUpdate::UpdateManifest(
|
bool DatabaseUpdate::UpdateManifest(
|
||||||
std::vector<ManifestEntry> entries,
|
std::vector<ManifestEntry> entries,
|
||||||
@@ -136,7 +146,7 @@ bool DatabaseUpdate::UpdateManifest(
|
|||||||
for (auto &e: entries) {
|
for (auto &e: entries) {
|
||||||
if (e.version == version) {
|
if (e.version == version) {
|
||||||
bool has_migration = true;
|
bool has_migration = true;
|
||||||
std::string r = GetQueryResult(e.check);
|
std::string r = GetQueryResult(e);
|
||||||
if (ShouldRunMigration(e, r)) {
|
if (ShouldRunMigration(e, r)) {
|
||||||
has_migration = false;
|
has_migration = false;
|
||||||
missing_migrations.emplace_back(e.version);
|
missing_migrations.emplace_back(e.version);
|
||||||
@@ -179,7 +189,7 @@ bool DatabaseUpdate::UpdateManifest(
|
|||||||
if (e.version == m) {
|
if (e.version == m) {
|
||||||
bool errored_migration = false;
|
bool errored_migration = false;
|
||||||
|
|
||||||
auto r = m_database->QueryDatabaseMulti(e.sql);
|
auto r = (e.content_schema_update ? m_content_database : m_database)->QueryDatabaseMulti(e.sql);
|
||||||
|
|
||||||
// ignore empty query result "errors"
|
// ignore empty query result "errors"
|
||||||
if (r.ErrorNumber() != 1065 && !r.ErrorMessage().empty()) {
|
if (r.ErrorNumber() != 1065 && !r.ErrorMessage().empty()) {
|
||||||
@@ -187,6 +197,9 @@ bool DatabaseUpdate::UpdateManifest(
|
|||||||
errored_migration = true;
|
errored_migration = true;
|
||||||
|
|
||||||
LogInfo("Required database update failed. This could be a problem");
|
LogInfo("Required database update failed. This could be a problem");
|
||||||
|
|
||||||
|
// if terminal attached then prompt for skip
|
||||||
|
if (is_atty()) {
|
||||||
LogInfo("Would you like to skip this update? [y/n] (Timeout 60s)");
|
LogInfo("Would you like to skip this update? [y/n] (Timeout 60s)");
|
||||||
|
|
||||||
// user input
|
// user input
|
||||||
@@ -214,6 +227,10 @@ bool DatabaseUpdate::UpdateManifest(
|
|||||||
errored_migration = false;
|
errored_migration = false;
|
||||||
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
errored_migration = true;
|
||||||
|
LogInfo("Skipping update [{}] [{}]", e.version, e.description);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LogInfo(
|
LogInfo(
|
||||||
@@ -247,6 +264,13 @@ DatabaseUpdate *DatabaseUpdate::SetDatabase(Database *db)
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DatabaseUpdate *DatabaseUpdate::SetContentDatabase(Database *db)
|
||||||
|
{
|
||||||
|
m_content_database = db;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
bool DatabaseUpdate::CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b)
|
bool DatabaseUpdate::CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b)
|
||||||
{
|
{
|
||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
@@ -274,9 +298,9 @@ bool DatabaseUpdate::CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b)
|
|||||||
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
LogInfo("{}", Strings::Repeat("-", BREAK_LENGTH));
|
||||||
|
|
||||||
// server database version is required
|
// server database version is required
|
||||||
bool server_up_to_date = v.server_database_version == b.server_database_version;
|
bool server_up_to_date = v.server_database_version >= b.server_database_version;
|
||||||
// bots database version is optional, if not enabled then it is always up-to-date
|
// bots database version is optional, if not enabled then it is always up-to-date
|
||||||
bool bots_up_to_date = RuleB(Bots, Enabled) ? v.bots_database_version == b.bots_database_version : true;
|
bool bots_up_to_date = RuleB(Bots, Enabled) ? v.bots_database_version >= b.bots_database_version : true;
|
||||||
|
|
||||||
return server_up_to_date && bots_up_to_date;
|
return server_up_to_date && bots_up_to_date;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ struct ManifestEntry {
|
|||||||
std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
std::string condition{}; // condition or "match_type" - Possible values [contains|match|missing|empty|not_empty]
|
||||||
std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
std::string match{}; // match field that is not always used, but works in conjunction with "condition" values [missing|match|contains]
|
||||||
std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
std::string sql{}; // the SQL DDL that gets ran when the condition is true
|
||||||
|
bool content_schema_update{}; // if true, this migration is a content schema update and should be ran against the content database
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DatabaseVersion {
|
struct DatabaseVersion {
|
||||||
@@ -22,14 +23,16 @@ public:
|
|||||||
DatabaseVersion GetDatabaseVersions();
|
DatabaseVersion GetDatabaseVersions();
|
||||||
DatabaseVersion GetBinaryDatabaseVersions();
|
DatabaseVersion GetBinaryDatabaseVersions();
|
||||||
void CheckDbUpdates();
|
void CheckDbUpdates();
|
||||||
std::string GetQueryResult(std::string query);
|
std::string GetQueryResult(const ManifestEntry& e);
|
||||||
static bool ShouldRunMigration(ManifestEntry &e, std::string query_result);
|
static bool ShouldRunMigration(ManifestEntry &e, std::string query_result);
|
||||||
bool UpdateManifest(std::vector<ManifestEntry> entries, int version_low, int version_high);
|
bool UpdateManifest(std::vector<ManifestEntry> entries, int version_low, int version_high);
|
||||||
|
|
||||||
DatabaseUpdate *SetDatabase(Database *db);
|
DatabaseUpdate *SetDatabase(Database *db);
|
||||||
|
DatabaseUpdate *SetContentDatabase(Database *db);
|
||||||
bool HasPendingUpdates();
|
bool HasPendingUpdates();
|
||||||
private:
|
private:
|
||||||
Database *m_database;
|
Database *m_database;
|
||||||
|
Database *m_content_database;
|
||||||
static bool CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b);
|
static bool CheckVersionsUpToDate(DatabaseVersion v, DatabaseVersion b);
|
||||||
void InjectBotsVersionColumn();
|
void InjectBotsVersionColumn();
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4943,7 +4943,474 @@ ALTER TABLE `aa_ability` ADD COLUMN `auto_grant_enabled` TINYINT(4) NOT NULL DEF
|
|||||||
UPDATE `aa_ability` SET `auto_grant_enabled` = 1 WHERE `grant_only` = 0 AND `charges` = 0 AND `category` = -1;
|
UPDATE `aa_ability` SET `auto_grant_enabled` = 1 WHERE `grant_only` = 0 AND `charges` = 0 AND `category` = -1;
|
||||||
)"
|
)"
|
||||||
},
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9237,
|
||||||
|
.description = "2023_10_15_import_13th_floor.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `items` LIKE 'bardeffect';",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "mediumint",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `items`
|
||||||
|
MODIFY COLUMN `scriptfileid` MEDIUMINT(6) NOT NULL DEFAULT 0,
|
||||||
|
MODIFY COLUMN `powersourcecapacity` MEDIUMINT(7) NOT NULL DEFAULT 0,
|
||||||
|
MODIFY COLUMN `augdistiller` INT(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
MODIFY COLUMN `scrollunk1` INT(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
MODIFY COLUMN `bardeffect` MEDIUMINT(6) NOT NULL DEFAULT 0;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9238,
|
||||||
|
.description = "2023_10_18_tradeskill_add_learned_by_item_id.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `tradeskill_recipe` LIKE 'learned_by_item_id'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `tradeskill_recipe`
|
||||||
|
ADD COLUMN `learned_by_item_id` int(11) NOT NULL DEFAULT 0 AFTER `must_learn`;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9239,
|
||||||
|
.description = "2023_10_18_blocked_spells_expansions_content_flags.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `blocked_spells` LIKE 'min_expansion'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `blocked_spells`
|
||||||
|
ADD COLUMN `min_expansion` tinyint(4) NOT NULL DEFAULT -1 AFTER `description`,
|
||||||
|
ADD COLUMN `max_expansion` tinyint(4) NOT NULL DEFAULT -1 AFTER `min_expansion`,
|
||||||
|
ADD COLUMN `content_flags` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `max_expansion`,
|
||||||
|
ADD COLUMN `content_flags_disabled` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `content_flags`;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9240,
|
||||||
|
.description = "2023_10_29_variables_id.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `variables` LIKE 'id'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `variables`
|
||||||
|
ADD COLUMN `id` int(11) NOT NULL AUTO_INCREMENT FIRST,
|
||||||
|
DROP PRIMARY KEY,
|
||||||
|
ADD PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
ADD UNIQUE INDEX(`varname`);
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9241,
|
||||||
|
.description = "2023_10_29_split_spawn2_enabled.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'spawn2_disabled'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
CREATE TABLE `spawn2_backup_2023_10_29` LIKE `spawn2`;
|
||||||
|
INSERT INTO `spawn2_backup_2023_10_29` SELECT * FROM `spawn2`;
|
||||||
|
CREATE TABLE `spawn2_disabled` (
|
||||||
|
`id` bigint(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`spawn2_id` int(11) DEFAULT NULL,
|
||||||
|
`instance_id` int(11) DEFAULT 0,
|
||||||
|
`disabled` smallint(11) DEFAULT 0,
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
UNIQUE KEY `spawn2_id` (`spawn2_id`,`instance_id`) USING BTREE
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
|
||||||
|
INSERT INTO spawn2_disabled (spawn2_id, disabled) SELECT id, 1 FROM spawn2 WHERE enabled = 0;
|
||||||
|
ALTER TABLE `spawn2` DROP COLUMN `enabled`;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9242,
|
||||||
|
.description = "2023_11_7_mintime_maxtime_spawnentry.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `spawnentry` LIKE 'min_time'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `spawnentry`
|
||||||
|
ADD COLUMN `min_time` smallint(4) NOT NULL DEFAULT 0 AFTER `condition_value_filter`,
|
||||||
|
ADD COLUMN `max_time` smallint(4) NOT NULL DEFAULT 0 AFTER `min_time`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9243,
|
||||||
|
.description = "2023_11_27_starting_items_revamp.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `starting_items` LIKE 'race_list'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
CREATE TABLE `starting_items_backup_9243` LIKE `starting_items`;
|
||||||
|
INSERT INTO `starting_items_backup_9243` SELECT * FROM `starting_items`;
|
||||||
|
|
||||||
|
CREATE TABLE `starting_items_new` (
|
||||||
|
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`race_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`class_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`deity_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`zone_id_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`item_id` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`item_charges` tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
`gm` mediumint(3) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`slot` mediumint(9) NOT NULL DEFAULT -1,
|
||||||
|
`min_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`max_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`content_flags` varchar(100) NULL,
|
||||||
|
`content_flags_disabled` varchar(100) NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
);
|
||||||
|
|
||||||
|
INSERT INTO
|
||||||
|
`starting_items_new`
|
||||||
|
(
|
||||||
|
SELECT
|
||||||
|
0 AS `id`,
|
||||||
|
GROUP_CONCAT(DISTINCT `class` ORDER BY class ASC SEPARATOR '|') AS `class_list`,
|
||||||
|
GROUP_CONCAT(DISTINCT `race` ORDER BY race ASC SEPARATOR '|') AS `race_list`,
|
||||||
|
GROUP_CONCAT(DISTINCT `deityid` ORDER BY deityid ASC SEPARATOR '|') AS `deity_list`,
|
||||||
|
GROUP_CONCAT(DISTINCT `zoneid` ORDER BY zoneid ASC SEPARATOR '|') AS `zone_list`,
|
||||||
|
`itemid`,
|
||||||
|
`item_charges`,
|
||||||
|
`gm`,
|
||||||
|
`slot`,
|
||||||
|
`min_expansion`,
|
||||||
|
`max_expansion`,
|
||||||
|
`content_flags`,
|
||||||
|
`content_flags_disabled`
|
||||||
|
FROM
|
||||||
|
`starting_items`
|
||||||
|
GROUP BY
|
||||||
|
`itemid`
|
||||||
|
);
|
||||||
|
|
||||||
|
DROP TABLE `starting_items`;
|
||||||
|
RENAME TABLE `starting_items_new` TO `starting_items`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9244,
|
||||||
|
.description = "2023_11_30_items_table_schema.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `items` LIKE 'updated'",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "0000-00-00 00:00:00",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `items` MODIFY COLUMN `updated` datetime NULL DEFAULT NULL;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9245,
|
||||||
|
.description = "2023_12_03_object_incline.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `object` LIKE 'incline'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `object` CHANGE COLUMN `unknown08` `size_percentage` float NOT NULL DEFAULT 0 AFTER `icon`;
|
||||||
|
ALTER TABLE `object` CHANGE COLUMN `unknown10` `solid_type` mediumint(5) NOT NULL DEFAULT 0 AFTER `size`;
|
||||||
|
ALTER TABLE `object` CHANGE COLUMN `unknown20` `incline` int(11) NOT NULL DEFAULT 0 AFTER `solid_type`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9246,
|
||||||
|
.description = "2023_12_07_keyring_id.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `keyring` LIKE 'id'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `keyring`
|
||||||
|
ADD COLUMN `id` int UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
|
||||||
|
ADD PRIMARY KEY (`id`);
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9247,
|
||||||
|
.description = "2023_12_14_starting_items_fix.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `starting_items` LIKE 'inventory_slot'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `starting_items`
|
||||||
|
CHANGE COLUMN `race_list` `temporary` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `id`,
|
||||||
|
CHANGE COLUMN `class_list` `race_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `temporary`,
|
||||||
|
CHANGE COLUMN `gm` `status` mediumint(3) NOT NULL DEFAULT 0 AFTER `item_charges`,
|
||||||
|
CHANGE COLUMN `slot` `inventory_slot` mediumint(9) NOT NULL DEFAULT -1 AFTER `status`;
|
||||||
|
|
||||||
|
ALTER TABLE `starting_items`
|
||||||
|
CHANGE COLUMN `temporary` `class_list` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `id`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9248,
|
||||||
|
.description = "2023_12_22_drop_npc_emotes_index.sql",
|
||||||
|
.check = "show index from npc_emotes where key_name = 'emoteid'",
|
||||||
|
.condition = "not_empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `npc_emotes` DROP INDEX `emoteid`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9249,
|
||||||
|
.description = "2023_12_26_add_tasks_enabled_column.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `tasks` LIKE 'enabled'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `tasks`
|
||||||
|
ADD COLUMN `enabled` smallint NULL DEFAULT 1 AFTER `faction_amount`
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9250,
|
||||||
|
.description = "2023_01_06_task_activities_list_group.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `task_activities` LIKE 'list_group'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `task_activities`
|
||||||
|
ADD COLUMN `list_group` TINYINT UNSIGNED NOT NULL DEFAULT '0' AFTER `optional`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9251,
|
||||||
|
.description = "2023_01_12_instance_list_notes.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `instance_list` LIKE 'notes'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `instance_list`
|
||||||
|
ADD COLUMN `notes` varchar(50) NOT NULL DEFAULT '' AFTER `never_expires`;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9252,
|
||||||
|
.description = "2024_01_07_zone_idle_when_empty.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `zone` LIKE 'idle_when_empty'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `zone`
|
||||||
|
ADD COLUMN `idle_when_empty` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `min_lava_damage`,
|
||||||
|
ADD COLUMN `seconds_before_idle` int(11) UNSIGNED NOT NULL DEFAULT 60 AFTER `idle_when_empty`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9253,
|
||||||
|
.description = "2024_01_13_merchantlist_slot.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `merchantlist` LIKE 'slot'",
|
||||||
|
.condition = "missing",
|
||||||
|
.match = "unsigned",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `merchantlist`
|
||||||
|
MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9254,
|
||||||
|
.description = "2024_01_13_merchantlist_temp_slot.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `merchantlist_temp` LIKE 'slot'",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "tinyint",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `merchantlist_temp`
|
||||||
|
MODIFY COLUMN `slot` int(11) UNSIGNED NOT NULL DEFAULT 0
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9255,
|
||||||
|
.description = "2024_01_13_drop_item_tick_deprecated.sql",
|
||||||
|
.check = "show tables like 'item_tick'",
|
||||||
|
.condition = "not_empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
DROP TABLE IF EXISTS item_tick
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9256,
|
||||||
|
.description = "2024_01_16_increase_spawngroup_size.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `spawngroup` LIKE 'name'",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "varchar(50)",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `spawngroup`
|
||||||
|
MODIFY COLUMN `name` varchar(200) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT '' AFTER `id`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9257,
|
||||||
|
.description = "2024_01_16_ground_spawns_fix_z.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `ground_spawns` LIKE 'fix_z'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `ground_spawns`
|
||||||
|
ADD COLUMN `fix_z` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 AFTER `respawn_timer`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9258,
|
||||||
|
.description = "2024_02_04_base_data.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `base_data` LIKE 'hp_regen'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `base_data`
|
||||||
|
CHANGE COLUMN `unk1` `hp_regen` double NOT NULL AFTER `end`,
|
||||||
|
CHANGE COLUMN `unk2` `end_regen` double NOT NULL AFTER `hp_regen`,
|
||||||
|
MODIFY COLUMN `level` tinyint(3) UNSIGNED NOT NULL FIRST,
|
||||||
|
MODIFY COLUMN `class` tinyint(2) UNSIGNED NOT NULL AFTER `level`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9259,
|
||||||
|
.description = "2024_01_13_corpse_rez_overhaul.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `character_corpses` LIKE 'rez_time'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `character_corpses`
|
||||||
|
ADD COLUMN `rez_time` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `wc_9`,
|
||||||
|
ADD COLUMN `gm_exp` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `rez_time`,
|
||||||
|
ADD COLUMN `killed_by` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `gm_exp`,
|
||||||
|
ADD COLUMN `rezzable` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 AFTER `killed_by`;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9260,
|
||||||
|
.description = "2023_11_11_guild_features.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'guild_permissions'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
CREATE TABLE `guild_permissions` (
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`perm_id` INT(11) NOT NULL DEFAULT '0',
|
||||||
|
`guild_id` INT(11) NOT NULL DEFAULT '0',
|
||||||
|
`permission` INT(11) NOT NULL DEFAULT '0',
|
||||||
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
|
UNIQUE INDEX `perm_id_guild_id` (`perm_id`, `guild_id`) USING BTREE
|
||||||
|
)
|
||||||
|
ENGINE=InnoDB
|
||||||
|
AUTO_INCREMENT=1;
|
||||||
|
|
||||||
|
UPDATE guild_ranks SET title = 'Leader' WHERE `rank` = '1';
|
||||||
|
UPDATE guild_ranks SET title = 'Senior Officer' WHERE `rank` = '2';
|
||||||
|
UPDATE guild_ranks SET title = 'Officer' WHERE `rank` = '3';
|
||||||
|
UPDATE guild_ranks SET title = 'Senior Member' WHERE `rank` = '4';
|
||||||
|
UPDATE guild_ranks SET title = 'Member' WHERE `rank` = '5';
|
||||||
|
UPDATE guild_ranks SET title = 'Junior Member' WHERE `rank` = '6';
|
||||||
|
UPDATE guild_ranks SET title = 'Initiate' WHERE `rank` = '7';
|
||||||
|
UPDATE guild_ranks SET title = 'Recruit' WHERE `rank` = '8';
|
||||||
|
|
||||||
|
DELETE FROM guild_ranks WHERE `rank` = 0;
|
||||||
|
|
||||||
|
ALTER TABLE `guild_ranks`
|
||||||
|
DROP COLUMN `can_hear`,
|
||||||
|
DROP COLUMN `can_speak`,
|
||||||
|
DROP COLUMN `can_invite`,
|
||||||
|
DROP COLUMN `can_remove`,
|
||||||
|
DROP COLUMN `can_promote`,
|
||||||
|
DROP COLUMN `can_demote`,
|
||||||
|
DROP COLUMN `can_motd`,
|
||||||
|
DROP COLUMN `can_warpeace`;
|
||||||
|
|
||||||
|
UPDATE guild_members SET `rank` = '5' WHERE `rank` = '0';
|
||||||
|
UPDATE guild_members SET `rank` = '3' WHERE `rank` = '1';
|
||||||
|
UPDATE guild_members SET `rank` = '1' WHERE `rank` = '2';
|
||||||
|
|
||||||
|
ALTER TABLE `guild_members`
|
||||||
|
ADD COLUMN `online` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `alt`;
|
||||||
|
|
||||||
|
ALTER TABLE `guilds`
|
||||||
|
ADD COLUMN `favor` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `url`;
|
||||||
|
|
||||||
|
CREATE TABLE guild_tributes (
|
||||||
|
guild_id int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
tribute_id_1 int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
tribute_id_1_tier int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
tribute_id_2 int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
tribute_id_2_tier int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
time_remaining int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
enabled int(11) unsigned NOT NULL DEFAULT 0,
|
||||||
|
PRIMARY KEY (guild_id) USING BTREE
|
||||||
|
) ENGINE=InnoDB;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9261,
|
||||||
|
.description = "2024_02_11_character_corpses.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `character_corpses` LIKE 'time_of_death'",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "0000-00-00 00:00:00",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `character_corpses` MODIFY COLUMN `time_of_death` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9262,
|
||||||
|
.description = "2024_02_11_object_contents.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `object_contents` LIKE 'droptime'",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "0000-00-00 00:00:00",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `object_contents` MODIFY COLUMN `droptime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9263,
|
||||||
|
.description = "2024_02_16_rearrange_zone_columns.sql",
|
||||||
|
.check = "show columns from zone like 'note'",
|
||||||
|
.condition = "missing",
|
||||||
|
.match = "varchar(200)",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `zone`
|
||||||
|
MODIFY COLUMN `id` int(10) NOT NULL AUTO_INCREMENT FIRST,
|
||||||
|
MODIFY COLUMN `zoneidnumber` int(4) NOT NULL DEFAULT 0 AFTER `id`,
|
||||||
|
MODIFY COLUMN `version` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 AFTER `zoneidnumber`,
|
||||||
|
MODIFY COLUMN `short_name` varchar(32) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `version`,
|
||||||
|
MODIFY COLUMN `long_name` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL AFTER `short_name`,
|
||||||
|
MODIFY COLUMN `min_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0 AFTER `long_name`,
|
||||||
|
MODIFY COLUMN `note` varchar(200) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `map_file_name`,
|
||||||
|
MODIFY COLUMN `min_expansion` tinyint(4) NOT NULL DEFAULT -1 AFTER `note`,
|
||||||
|
MODIFY COLUMN `max_expansion` tinyint(4) NOT NULL DEFAULT -1 AFTER `min_expansion`,
|
||||||
|
MODIFY COLUMN `content_flags` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `max_expansion`,
|
||||||
|
MODIFY COLUMN `content_flags_disabled` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `content_flags`,
|
||||||
|
MODIFY COLUMN `expansion` tinyint(3) NOT NULL DEFAULT 0 AFTER `content_flags_disabled`,
|
||||||
|
MODIFY COLUMN `file_name` varchar(16) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL AFTER `expansion`,
|
||||||
|
MODIFY COLUMN `safe_x` float NOT NULL DEFAULT 0 AFTER `file_name`,
|
||||||
|
MODIFY COLUMN `safe_y` float NOT NULL DEFAULT 0 AFTER `safe_x`,
|
||||||
|
MODIFY COLUMN `safe_z` float NOT NULL DEFAULT 0 AFTER `safe_y`,
|
||||||
|
MODIFY COLUMN `safe_heading` float NOT NULL DEFAULT 0 AFTER `safe_z`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9264,
|
||||||
|
.description = "2024_02_18_starting_items_augments.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `starting_items` LIKE 'augment_one'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `starting_items`
|
||||||
|
ADD COLUMN `augment_one` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `item_charges`,
|
||||||
|
ADD COLUMN `augment_two` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_one`,
|
||||||
|
ADD COLUMN `augment_three` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_two`,
|
||||||
|
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_six` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_five`;
|
||||||
|
)",
|
||||||
|
.content_schema_update = true
|
||||||
|
}
|
||||||
// -- 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{
|
||||||
// .version = 9228,
|
// .version = 9228,
|
||||||
|
|||||||
@@ -61,6 +61,86 @@ DROP TABLE IF EXISTS `bot_group_members`;
|
|||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
)",
|
)",
|
||||||
},
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9040,
|
||||||
|
.description = "2023_11_16_bot_starting_items.sql",
|
||||||
|
.check = "SHOW TABLES LIKE 'bot_starting_items'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
CREATE TABLE `bot_starting_items` (
|
||||||
|
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||||
|
`races` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`classes` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`item_id` int(11) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`item_charges` tinyint(3) UNSIGNED NOT NULL DEFAULT 1,
|
||||||
|
`min_status` tinyint(3) UNSIGNED NOT NULL DEFAULT 0,
|
||||||
|
`slot_id` mediumint(9) NOT NULL DEFAULT -1,
|
||||||
|
`min_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`max_expansion` tinyint(4) NOT NULL DEFAULT -1,
|
||||||
|
`content_flags` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
`content_flags_disabled` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci;
|
||||||
|
)",
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9041,
|
||||||
|
.description = "2023_12_04_bot_timers.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `bot_timers` LIKE 'recast_time'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
ADD COLUMN `recast_time` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `timer_value`,
|
||||||
|
ADD COLUMN `is_spell` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `recast_time`,
|
||||||
|
ADD COLUMN `is_disc` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `is_spell`,
|
||||||
|
ADD COLUMN `spell_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `is_disc`,
|
||||||
|
ADD COLUMN `is_item` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 AFTER `spell_id`,
|
||||||
|
ADD COLUMN `item_id` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `is_item`;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
DROP FOREIGN KEY `FK_bot_timers_1`;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
DROP PRIMARY KEY;
|
||||||
|
ALTER TABLE `bot_timers`
|
||||||
|
ADD PRIMARY KEY (`bot_id`, `timer_id`, `spell_id`, `item_id`);
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9042,
|
||||||
|
.description = "2024_01_27_delete_bot_foreign_keys.sql",
|
||||||
|
.check = "SHOW CREATE TABLE `bot_stances`",
|
||||||
|
.condition = "contains",
|
||||||
|
.match = "FOREIGN",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_buffs` DROP FOREIGN KEY `FK_bot_buffs_1`;
|
||||||
|
ALTER TABLE `bot_heal_rotations` DROP FOREIGN KEY `FK_bot_heal_rotations`;
|
||||||
|
ALTER TABLE `bot_heal_rotation_members` DROP FOREIGN KEY `FK_bot_heal_rotation_members_1`;
|
||||||
|
ALTER TABLE `bot_heal_rotation_members` DROP FOREIGN KEY `FK_bot_heal_rotation_members_2`;
|
||||||
|
ALTER TABLE `bot_heal_rotation_targets` DROP FOREIGN KEY `FK_bot_heal_rotation_targets`;
|
||||||
|
ALTER TABLE `bot_inventories` DROP FOREIGN KEY `FK_bot_inventories_1`;
|
||||||
|
ALTER TABLE `bot_pets` DROP FOREIGN KEY `FK_bot_pets_1`;
|
||||||
|
ALTER TABLE `bot_pet_buffs` DROP FOREIGN KEY `FK_bot_pet_buffs_1`;
|
||||||
|
ALTER TABLE `bot_pet_inventories` DROP FOREIGN KEY `FK_bot_pet_inventories_1`;
|
||||||
|
ALTER TABLE `bot_stances` DROP FOREIGN KEY `FK_bot_stances_1`;
|
||||||
|
)"
|
||||||
|
},
|
||||||
|
ManifestEntry{
|
||||||
|
.version = 9043,
|
||||||
|
.description = "2024_02_18_bot_starting_items_augments.sql",
|
||||||
|
.check = "SHOW COLUMNS FROM `bot_starting_items` LIKE 'augment_one'",
|
||||||
|
.condition = "empty",
|
||||||
|
.match = "",
|
||||||
|
.sql = R"(
|
||||||
|
ALTER TABLE `bot_starting_items`
|
||||||
|
ADD COLUMN `augment_one` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `item_charges`,
|
||||||
|
ADD COLUMN `augment_two` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_one`,
|
||||||
|
ADD COLUMN `augment_three` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_two`,
|
||||||
|
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_six` int(11) UNSIGNED NOT NULL DEFAULT 0 AFTER `augment_five`;
|
||||||
|
)"
|
||||||
|
}
|
||||||
// -- 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{
|
||||||
// .version = 9228,
|
// .version = 9228,
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
#include "../common/global_define.h"
|
|
||||||
#include "../common/rulesys.h"
|
|
||||||
#include "../common/strings.h"
|
|
||||||
|
|
||||||
#include "database.h"
|
|
||||||
#include "database/database_update.h"
|
|
||||||
|
|
||||||
|
|
||||||
// Disgrace: for windows compile
|
|
||||||
#ifdef _WINDOWS
|
|
||||||
#include <windows.h>
|
|
||||||
#define snprintf _snprintf
|
|
||||||
#define strncasecmp _strnicmp
|
|
||||||
#define strcasecmp _stricmp
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include "unix.h"
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#pragma pack(1)
|
|
||||||
|
|
||||||
DatabaseUpdate database_update;
|
|
||||||
|
|
||||||
bool Database::CheckDatabaseConversions()
|
|
||||||
{
|
|
||||||
auto *r = RuleManager::Instance();
|
|
||||||
r->LoadRules(this, "default", false);
|
|
||||||
if (!RuleB(Bots, Enabled) && DoesTableExist("bot_data")) {
|
|
||||||
LogInfo("Bot tables found but rule not enabled, enabling");
|
|
||||||
r->SetRule("Bots:Enabled", "true", this, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
database_update.SetDatabase(this)->CheckDbUpdates();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include "../common/repositories/raid_members_repository.h"
|
#include "../common/repositories/raid_members_repository.h"
|
||||||
#include "../common/repositories/respawn_times_repository.h"
|
#include "../common/repositories/respawn_times_repository.h"
|
||||||
#include "../common/repositories/spawn_condition_values_repository.h"
|
#include "../common/repositories/spawn_condition_values_repository.h"
|
||||||
|
#include "repositories/spawn2_disabled_repository.h"
|
||||||
|
|
||||||
|
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
@@ -49,6 +50,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
bool Database::AddClientToInstance(uint16 instance_id, uint32 character_id)
|
||||||
{
|
{
|
||||||
auto e = InstanceListPlayerRepository::NewEntity();
|
auto e = InstanceListPlayerRepository::NewEntity();
|
||||||
@@ -553,6 +555,7 @@ void Database::PurgeExpiredInstances()
|
|||||||
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
||||||
DynamicZoneMembersRepository::DeleteByManyInstances(*this, imploded_instance_ids);
|
DynamicZoneMembersRepository::DeleteByManyInstances(*this, imploded_instance_ids);
|
||||||
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
DynamicZonesRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
|
Spawn2DisabledRepository::DeleteWhere(*this, fmt::format("instance_id IN ({})", imploded_instance_ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
||||||
@@ -567,3 +570,23 @@ void Database::SetInstanceDuration(uint16 instance_id, uint32 new_duration)
|
|||||||
|
|
||||||
InstanceListRepository::UpdateOne(*this, i);
|
InstanceListRepository::UpdateOne(*this, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Database::CleanupInstanceCorpses() {
|
||||||
|
auto l = InstanceListRepository::GetWhere(
|
||||||
|
*this,
|
||||||
|
"never_expires = 0"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (l.empty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> instance_ids;
|
||||||
|
for (const auto& e : l) {
|
||||||
|
instance_ids.emplace_back(std::to_string(e.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto imploded_instance_ids = Strings::Implode(",", instance_ids);
|
||||||
|
|
||||||
|
CharacterCorpsesRepository::BuryInstances(*this, imploded_instance_ids);
|
||||||
|
}
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ namespace DatabaseSchema {
|
|||||||
{"character_tasks", "charid"},
|
{"character_tasks", "charid"},
|
||||||
{"character_tribute", "character_id"},
|
{"character_tribute", "character_id"},
|
||||||
{"completed_tasks", "charid"},
|
{"completed_tasks", "charid"},
|
||||||
{"data_buckets", "id"},
|
{"data_buckets", "character_id"},
|
||||||
{"faction_values", "char_id"},
|
{"faction_values", "char_id"},
|
||||||
{"friends", "charid"},
|
{"friends", "charid"},
|
||||||
{"guild_members", "char_id"},
|
{"guild_members", "char_id"},
|
||||||
@@ -146,8 +146,10 @@ namespace DatabaseSchema {
|
|||||||
"friends",
|
"friends",
|
||||||
"guild_bank",
|
"guild_bank",
|
||||||
"guild_members",
|
"guild_members",
|
||||||
|
"guild_permissions",
|
||||||
"guild_ranks",
|
"guild_ranks",
|
||||||
"guild_relations",
|
"guild_relations",
|
||||||
|
"guild_tributes",
|
||||||
"guilds",
|
"guilds",
|
||||||
"instance_list_player",
|
"instance_list_player",
|
||||||
"inventory",
|
"inventory",
|
||||||
@@ -332,7 +334,6 @@ namespace DatabaseSchema {
|
|||||||
"group_leaders",
|
"group_leaders",
|
||||||
"instance_list",
|
"instance_list",
|
||||||
"ip_exemptions",
|
"ip_exemptions",
|
||||||
"item_tick",
|
|
||||||
"lfguild",
|
"lfguild",
|
||||||
"merc_buffs",
|
"merc_buffs",
|
||||||
"merchantlist_temp",
|
"merchantlist_temp",
|
||||||
@@ -345,6 +346,7 @@ namespace DatabaseSchema {
|
|||||||
"respawn_times",
|
"respawn_times",
|
||||||
"saylink",
|
"saylink",
|
||||||
"server_scheduled_events",
|
"server_scheduled_events",
|
||||||
|
"spawn2_disabled",
|
||||||
"player_event_log_settings",
|
"player_event_log_settings",
|
||||||
"player_event_logs",
|
"player_event_logs",
|
||||||
"shared_task_activity_state",
|
"shared_task_activity_state",
|
||||||
|
|||||||
+1
-2
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include "dbcore.h"
|
#include "dbcore.h"
|
||||||
|
|
||||||
#include <errmsg.h>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <mysqld_error.h>
|
#include <mysqld_error.h>
|
||||||
@@ -138,7 +137,7 @@ MySQLRequestResult DBcore::QueryDatabase(const char *query, uint32 querylen, boo
|
|||||||
* Error logging
|
* Error logging
|
||||||
*/
|
*/
|
||||||
if (mysql_errno(mysql) > 0 && query[0] != '\0') {
|
if (mysql_errno(mysql) > 0 && query[0] != '\0') {
|
||||||
LogMySQLError("[{}] [{}]\n[{}]", mysql_errno(mysql), mysql_error(mysql), query);
|
LogMySQLError("MySQL Error ({}) [{}] Query [{}]", mysql_errno(mysql), mysql_error(mysql), query);
|
||||||
}
|
}
|
||||||
|
|
||||||
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(mysql), errorBuffer);
|
return MySQLRequestResult(nullptr, 0, 0, 0, 0, mysql_errno(mysql), errorBuffer);
|
||||||
|
|||||||
@@ -14,6 +14,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
|
#define CR_SERVER_GONE_ERROR 2006
|
||||||
|
#define CR_SERVER_LOST 2013
|
||||||
|
|
||||||
class DBcore {
|
class DBcore {
|
||||||
public:
|
public:
|
||||||
enum eStatus {
|
enum eStatus {
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ namespace EQ
|
|||||||
bit_DeityAll = UINT32_MAX
|
bit_DeityAll = UINT32_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr int format_as(DeityType type) { return static_cast<int>(type); }
|
||||||
|
|
||||||
extern DeityTypeBit GetDeityBitmask(DeityType deity_type);
|
extern DeityTypeBit GetDeityBitmask(DeityType deity_type);
|
||||||
extern std::string GetDeityName(DeityType deity_type);
|
extern std::string GetDeityName(DeityType deity_type);
|
||||||
extern const std::map<DeityType, std::string>& GetDeityMap();
|
extern const std::map<DeityType, std::string>& GetDeityMap();
|
||||||
|
|||||||
+167
-35
@@ -22,7 +22,6 @@
|
|||||||
#include "data_verification.h"
|
#include "data_verification.h"
|
||||||
#include "eqemu_logsys.h"
|
#include "eqemu_logsys.h"
|
||||||
#include "eqemu_logsys_log_aliases.h"
|
#include "eqemu_logsys_log_aliases.h"
|
||||||
#include "languages.h"
|
|
||||||
#include "rulesys.h"
|
#include "rulesys.h"
|
||||||
|
|
||||||
int16 EQ::invtype::GetInvTypeSize(int16 inv_type) {
|
int16 EQ::invtype::GetInvTypeSize(int16 inv_type) {
|
||||||
@@ -159,45 +158,45 @@ int EQ::constants::ConvertStanceTypeToIndex(StanceType stance_type) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::map<int, std::string>& EQ::constants::GetLanguageMap()
|
const std::map<uint8, std::string>& EQ::constants::GetLanguageMap()
|
||||||
{
|
{
|
||||||
static const std::map<int, std::string> language_map = {
|
static const std::map<uint8, std::string> language_map = {
|
||||||
{ LANG_COMMON_TONGUE, "Common Tongue" },
|
{ Language::CommonTongue, "Common Tongue" },
|
||||||
{ LANG_BARBARIAN, "Barbarian" },
|
{ Language::Barbarian, "Barbarian" },
|
||||||
{ LANG_ERUDIAN, "Erudian" },
|
{ Language::Erudian, "Erudian" },
|
||||||
{ LANG_ELVISH, "Elvish" },
|
{ Language::Elvish, "Elvish" },
|
||||||
{ LANG_DARK_ELVISH, "Dark Elvish" },
|
{ Language::DarkElvish, "Dark Elvish" },
|
||||||
{ LANG_DWARVISH, "Dwarvish" },
|
{ Language::Dwarvish, "Dwarvish" },
|
||||||
{ LANG_TROLL, "Troll" },
|
{ Language::Troll, "Troll" },
|
||||||
{ LANG_OGRE, "Ogre" },
|
{ Language::Ogre, "Ogre" },
|
||||||
{ LANG_GNOMISH, "Gnomish" },
|
{ Language::Gnomish, "Gnomish" },
|
||||||
{ LANG_HALFLING, "Halfling" },
|
{ Language::Halfling, "Halfling" },
|
||||||
{ LANG_THIEVES_CANT, "Thieves Cant" },
|
{ Language::ThievesCant, "Thieves Cant" },
|
||||||
{ LANG_OLD_ERUDIAN, "Old Erudian" },
|
{ Language::OldErudian, "Old Erudian" },
|
||||||
{ LANG_ELDER_ELVISH, "Elder Elvish" },
|
{ Language::ElderElvish, "Elder Elvish" },
|
||||||
{ LANG_FROGLOK, "Froglok" },
|
{ Language::Froglok, "Froglok" },
|
||||||
{ LANG_GOBLIN, "Goblin" },
|
{ Language::Goblin, "Goblin" },
|
||||||
{ LANG_GNOLL, "Gnoll" },
|
{ Language::Gnoll, "Gnoll" },
|
||||||
{ LANG_COMBINE_TONGUE, "Combine Tongue" },
|
{ Language::CombineTongue, "Combine Tongue" },
|
||||||
{ LANG_ELDER_TEIRDAL, "Elder Teirdal" },
|
{ Language::ElderTeirDal, "Elder Teir'Dal" },
|
||||||
{ LANG_LIZARDMAN, "Lizardman" },
|
{ Language::Lizardman, "Lizardman" },
|
||||||
{ LANG_ORCISH, "Orcish" },
|
{ Language::Orcish, "Orcish" },
|
||||||
{ LANG_FAERIE, "Faerie" },
|
{ Language::Faerie, "Faerie" },
|
||||||
{ LANG_DRAGON, "Dragon" },
|
{ Language::Dragon, "Dragon" },
|
||||||
{ LANG_ELDER_DRAGON, "Elder Dragon" },
|
{ Language::ElderDragon, "Elder Dragon" },
|
||||||
{ LANG_DARK_SPEECH, "Dark Speech" },
|
{ Language::DarkSpeech, "Dark Speech" },
|
||||||
{ LANG_VAH_SHIR, "Vah Shir" },
|
{ Language::VahShir, "Vah Shir" },
|
||||||
{ LANG_ALARAN, "Alaran" },
|
{ Language::Alaran, "Alaran" },
|
||||||
{ LANG_HADAL, "Hadal" },
|
{ Language::Hadal, "Hadal" },
|
||||||
{ LANG_UNKNOWN, "Unknown" }
|
{ Language::Unknown27, "Unknown" }
|
||||||
};
|
};
|
||||||
|
|
||||||
return language_map;
|
return language_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string EQ::constants::GetLanguageName(int language_id)
|
std::string EQ::constants::GetLanguageName(uint8 language_id)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(language_id, LANG_COMMON_TONGUE, LANG_UNKNOWN)) {
|
if (!EQ::ValueWithin(language_id, Language::CommonTongue, Language::Unknown27)) {
|
||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -509,7 +508,6 @@ std::string EQ::constants::GetObjectTypeName(int object_type)
|
|||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(object_type, ObjectTypes::SmallBag, ObjectTypes::NoDeposit)) {
|
if (!EQ::ValueWithin(object_type, ObjectTypes::SmallBag, ObjectTypes::NoDeposit)) {
|
||||||
return std::string();
|
return std::string();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetObjectTypeMap().find(object_type)->second;
|
return EQ::constants::GetObjectTypeMap().find(object_type)->second;
|
||||||
@@ -564,6 +562,7 @@ std::string EQ::constants::GetEmoteEventTypeName(uint8 emote_event_type)
|
|||||||
const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
||||||
{
|
{
|
||||||
static const std::map<uint8, std::string> emote_type_map = {
|
static const std::map<uint8, std::string> emote_type_map = {
|
||||||
|
{ EmoteTypes::Say, "Say" },
|
||||||
{ EmoteTypes::Emote, "Emote" },
|
{ EmoteTypes::Emote, "Emote" },
|
||||||
{ EmoteTypes::Shout, "Shout" },
|
{ EmoteTypes::Shout, "Shout" },
|
||||||
{ EmoteTypes::Proximity, "Proximity" }
|
{ EmoteTypes::Proximity, "Proximity" }
|
||||||
@@ -574,9 +573,142 @@ const std::map<uint8, std::string> &EQ::constants::GetEmoteTypeMap()
|
|||||||
|
|
||||||
std::string EQ::constants::GetEmoteTypeName(uint8 emote_type)
|
std::string EQ::constants::GetEmoteTypeName(uint8 emote_type)
|
||||||
{
|
{
|
||||||
if (!EQ::ValueWithin(emote_type, EmoteTypes::Emote, EmoteTypes::Proximity)) {
|
if (!EQ::ValueWithin(emote_type, EmoteTypes::Say, EmoteTypes::Proximity)) {
|
||||||
return std::string();
|
return std::string();
|
||||||
}
|
}
|
||||||
|
|
||||||
return EQ::constants::GetEmoteTypeMap().find(emote_type)->second;
|
return EQ::constants::GetEmoteTypeMap().find(emote_type)->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::map<uint32, std::string>& EQ::constants::GetAppearanceTypeMap()
|
||||||
|
{
|
||||||
|
static const std::map<uint32, std::string> appearance_type_map = {
|
||||||
|
{ AppearanceType::Die, "Die" },
|
||||||
|
{ AppearanceType::WhoLevel, "Who Level" },
|
||||||
|
{ AppearanceType::MaxHealth, "Max Health" },
|
||||||
|
{ AppearanceType::Invisibility, "Invisibility" },
|
||||||
|
{ AppearanceType::PVP, "PVP" },
|
||||||
|
{ AppearanceType::Light, "Light" },
|
||||||
|
{ AppearanceType::Animation, "Animation" },
|
||||||
|
{ AppearanceType::Sneak, "Sneak" },
|
||||||
|
{ AppearanceType::SpawnID, "Spawn ID" },
|
||||||
|
{ AppearanceType::Health, "Health" },
|
||||||
|
{ AppearanceType::Linkdead, "Linkdead" },
|
||||||
|
{ AppearanceType::FlyMode, "Fly Mode" },
|
||||||
|
{ AppearanceType::GM, "GM" },
|
||||||
|
{ AppearanceType::Anonymous, "Anonymous" },
|
||||||
|
{ AppearanceType::GuildID, "Guild ID" },
|
||||||
|
{ AppearanceType::GuildRank, "Guild Rank" },
|
||||||
|
{ AppearanceType::AFK, "AFK" },
|
||||||
|
{ AppearanceType::Pet, "Pet" },
|
||||||
|
{ AppearanceType::Summoned, "Summoned" },
|
||||||
|
{ AppearanceType::Split, "Split" },
|
||||||
|
{ AppearanceType::Size, "Size" },
|
||||||
|
{ AppearanceType::SetType, "Set Type" },
|
||||||
|
{ AppearanceType::NPCName, "NPCName" },
|
||||||
|
{ AppearanceType::AARank, "AARank" },
|
||||||
|
{ AppearanceType::CancelSneakHide, "Cancel Sneak Hide" },
|
||||||
|
{ AppearanceType::AreaHealthRegen, "Area Health Regeneration" },
|
||||||
|
{ AppearanceType::AreaManaRegen, "Area Mana Regeneration" },
|
||||||
|
{ AppearanceType::AreaEnduranceRegen, "Area Endurance Regeneration" },
|
||||||
|
{ AppearanceType::FreezeBeneficialBuffs, "Freeze Beneficial Buffs" },
|
||||||
|
{ AppearanceType::NPCTintIndex, "NPC Tint Index" },
|
||||||
|
{ AppearanceType::GroupAutoConsent, "Group Auto Consent" },
|
||||||
|
{ AppearanceType::RaidAutoConsent, "Raid Auto Consent" },
|
||||||
|
{ AppearanceType::GuildAutoConsent, "Guild Auto Consent" },
|
||||||
|
{ AppearanceType::ShowHelm, "Show Helm" },
|
||||||
|
{ AppearanceType::DamageState, "Damage State" },
|
||||||
|
{ AppearanceType::EQPlayers, "EQ Players" },
|
||||||
|
{ AppearanceType::FindBits, "Find Bits" },
|
||||||
|
{ AppearanceType::TextureType, "Texture Type" },
|
||||||
|
{ AppearanceType::FacePick, "Face Pick" },
|
||||||
|
{ AppearanceType::AntiCheat, "Anti Cheat" },
|
||||||
|
{ AppearanceType::GuildShow, "Guild Show" },
|
||||||
|
{ AppearanceType::OfflineMode, "Offline Mode" }
|
||||||
|
};
|
||||||
|
|
||||||
|
return appearance_type_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetAppearanceTypeName(uint32 appearance_type)
|
||||||
|
{
|
||||||
|
const auto& a = EQ::constants::GetAppearanceTypeMap().find(appearance_type);
|
||||||
|
if (a != EQ::constants::GetAppearanceTypeMap().end()) {
|
||||||
|
return a->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::map<uint32, std::string>& EQ::constants::GetSpecialAbilityMap()
|
||||||
|
{
|
||||||
|
static const std::map<uint32, std::string> special_ability_map = {
|
||||||
|
{ SPECATK_SUMMON, "Summon" },
|
||||||
|
{ SPECATK_ENRAGE, "Enrage" },
|
||||||
|
{ SPECATK_RAMPAGE, "Rampage" },
|
||||||
|
{ SPECATK_AREA_RAMPAGE, "Area Rampage" },
|
||||||
|
{ SPECATK_FLURRY, "Flurry" },
|
||||||
|
{ SPECATK_TRIPLE, "Triple Attack" },
|
||||||
|
{ SPECATK_QUAD, "Quadruple Attack" },
|
||||||
|
{ SPECATK_INNATE_DW, "Dual Wield" },
|
||||||
|
{ SPECATK_BANE, "Bane Attack" },
|
||||||
|
{ SPECATK_MAGICAL, "Magical Attack" },
|
||||||
|
{ SPECATK_RANGED_ATK, "Ranged Attack" },
|
||||||
|
{ UNSLOWABLE, "Immune to Slow" },
|
||||||
|
{ UNMEZABLE, "Immune to Mesmerize" },
|
||||||
|
{ UNCHARMABLE, "Immune to Charm" },
|
||||||
|
{ UNSTUNABLE, "Immune to Stun" },
|
||||||
|
{ UNSNAREABLE, "Immune to Snare" },
|
||||||
|
{ UNFEARABLE, "Immune to Fear" },
|
||||||
|
{ UNDISPELLABLE, "Immune to Dispell" },
|
||||||
|
{ IMMUNE_MELEE, "Immune to Melee" },
|
||||||
|
{ IMMUNE_MAGIC, "Immune to Magic" },
|
||||||
|
{ IMMUNE_FLEEING, "Immune to Fleeing" },
|
||||||
|
{ IMMUNE_MELEE_EXCEPT_BANE, "Immune to Melee except Bane" },
|
||||||
|
{ IMMUNE_MELEE_NONMAGICAL, "Immune to Non-Magical Melee" },
|
||||||
|
{ IMMUNE_AGGRO, "Immune to Aggro" },
|
||||||
|
{ IMMUNE_AGGRO_ON, "Immune to Being Aggro" },
|
||||||
|
{ IMMUNE_CASTING_FROM_RANGE, "Immune to Ranged Spells" },
|
||||||
|
{ IMMUNE_FEIGN_DEATH, "Immune to Feign Death" },
|
||||||
|
{ IMMUNE_TAUNT, "Immune to Taunt" },
|
||||||
|
{ NPC_TUNNELVISION, "Tunnel Vision" },
|
||||||
|
{ NPC_NO_BUFFHEAL_FRIENDS, "Does Not Heal of Buff Allies" },
|
||||||
|
{ IMMUNE_PACIFY, "Immune to Pacify" },
|
||||||
|
{ LEASH, "Leashed" },
|
||||||
|
{ TETHER, "Tethered" },
|
||||||
|
{ DESTRUCTIBLE_OBJECT, "Destructible Object" },
|
||||||
|
{ NO_HARM_FROM_CLIENT, "Immune to Harm from Client" },
|
||||||
|
{ ALWAYS_FLEE, "Always Flees" },
|
||||||
|
{ FLEE_PERCENT, "Flee Percentage" },
|
||||||
|
{ ALLOW_BENEFICIAL, "Allows Beneficial Spells" },
|
||||||
|
{ DISABLE_MELEE, "Melee is Disabled" },
|
||||||
|
{ NPC_CHASE_DISTANCE, "Chase Distance" },
|
||||||
|
{ ALLOW_TO_TANK, "Allowed to Tank" },
|
||||||
|
{ IGNORE_ROOT_AGGRO_RULES, "Ignores Root Aggro" },
|
||||||
|
{ CASTING_RESIST_DIFF, "Casting Resist Difficulty" },
|
||||||
|
{ COUNTER_AVOID_DAMAGE, "Counter Damage Avoidance" },
|
||||||
|
{ PROX_AGGRO, "Proximity Aggro" },
|
||||||
|
{ IMMUNE_RANGED_ATTACKS, "Immune to Ranged Attacks" },
|
||||||
|
{ IMMUNE_DAMAGE_CLIENT, "Immune to Client Damage" },
|
||||||
|
{ IMMUNE_DAMAGE_NPC, "Immune to NPC Damage" },
|
||||||
|
{ IMMUNE_AGGRO_CLIENT, "Immune to Client Aggro" },
|
||||||
|
{ IMMUNE_AGGRO_NPC, "Immune to NPC Aggro" },
|
||||||
|
{ MODIFY_AVOID_DAMAGE, "Modify Damage Avoidance" },
|
||||||
|
{ IMMUNE_FADING_MEMORIES, "Immune to Memory Fades" },
|
||||||
|
{ IMMUNE_OPEN, "Immune to Open" },
|
||||||
|
{ IMMUNE_ASSASSINATE, "Immune to Assassinate" },
|
||||||
|
{ IMMUNE_HEADSHOT, "Immune to Headshot" },
|
||||||
|
};
|
||||||
|
|
||||||
|
return special_ability_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string EQ::constants::GetSpecialAbilityName(uint32 ability_id)
|
||||||
|
{
|
||||||
|
const auto& a = EQ::constants::GetSpecialAbilityMap().find(ability_id);
|
||||||
|
if (a != EQ::constants::GetSpecialAbilityMap().end()) {
|
||||||
|
return a->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|||||||
+68
-2
@@ -350,6 +350,7 @@ namespace EQ
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum EmoteTypes : uint8 {
|
enum EmoteTypes : uint8 {
|
||||||
|
Say,
|
||||||
Emote,
|
Emote,
|
||||||
Shout,
|
Shout,
|
||||||
Proximity
|
Proximity
|
||||||
@@ -358,8 +359,8 @@ namespace EQ
|
|||||||
const char *GetStanceName(StanceType stance_type);
|
const char *GetStanceName(StanceType stance_type);
|
||||||
int ConvertStanceTypeToIndex(StanceType stance_type);
|
int ConvertStanceTypeToIndex(StanceType stance_type);
|
||||||
|
|
||||||
extern const std::map<int, std::string>& GetLanguageMap();
|
extern const std::map<uint8, std::string>& GetLanguageMap();
|
||||||
std::string GetLanguageName(int language_id);
|
std::string GetLanguageName(uint8 language_id);
|
||||||
|
|
||||||
extern const std::map<uint32, std::string>& GetLDoNThemeMap();
|
extern const std::map<uint32, std::string>& GetLDoNThemeMap();
|
||||||
std::string GetLDoNThemeName(uint32 theme_id);
|
std::string GetLDoNThemeName(uint32 theme_id);
|
||||||
@@ -397,6 +398,12 @@ namespace EQ
|
|||||||
extern const std::map<uint8, std::string>& GetEmoteTypeMap();
|
extern const std::map<uint8, std::string>& GetEmoteTypeMap();
|
||||||
std::string GetEmoteTypeName(uint8 emote_type);
|
std::string GetEmoteTypeName(uint8 emote_type);
|
||||||
|
|
||||||
|
extern const std::map<uint32, std::string>& GetAppearanceTypeMap();
|
||||||
|
std::string GetAppearanceTypeName(uint32 animation_type);
|
||||||
|
|
||||||
|
extern const std::map<uint32, std::string>& GetSpecialAbilityMap();
|
||||||
|
std::string GetSpecialAbilityName(uint32 ability_id);
|
||||||
|
|
||||||
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;
|
||||||
@@ -593,6 +600,65 @@ enum class ApplySpellType {
|
|||||||
Raid
|
Raid
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SPECATK_SUMMON = 1,
|
||||||
|
SPECATK_ENRAGE = 2,
|
||||||
|
SPECATK_RAMPAGE = 3,
|
||||||
|
SPECATK_AREA_RAMPAGE = 4,
|
||||||
|
SPECATK_FLURRY = 5,
|
||||||
|
SPECATK_TRIPLE = 6,
|
||||||
|
SPECATK_QUAD = 7,
|
||||||
|
SPECATK_INNATE_DW = 8,
|
||||||
|
SPECATK_BANE = 9,
|
||||||
|
SPECATK_MAGICAL = 10,
|
||||||
|
SPECATK_RANGED_ATK = 11,
|
||||||
|
UNSLOWABLE = 12,
|
||||||
|
UNMEZABLE = 13,
|
||||||
|
UNCHARMABLE = 14,
|
||||||
|
UNSTUNABLE = 15,
|
||||||
|
UNSNAREABLE = 16,
|
||||||
|
UNFEARABLE = 17,
|
||||||
|
UNDISPELLABLE = 18,
|
||||||
|
IMMUNE_MELEE = 19,
|
||||||
|
IMMUNE_MAGIC = 20,
|
||||||
|
IMMUNE_FLEEING = 21,
|
||||||
|
IMMUNE_MELEE_EXCEPT_BANE = 22,
|
||||||
|
IMMUNE_MELEE_NONMAGICAL = 23,
|
||||||
|
IMMUNE_AGGRO = 24,
|
||||||
|
IMMUNE_AGGRO_ON = 25,
|
||||||
|
IMMUNE_CASTING_FROM_RANGE = 26,
|
||||||
|
IMMUNE_FEIGN_DEATH = 27,
|
||||||
|
IMMUNE_TAUNT = 28,
|
||||||
|
NPC_TUNNELVISION = 29,
|
||||||
|
NPC_NO_BUFFHEAL_FRIENDS = 30,
|
||||||
|
IMMUNE_PACIFY = 31,
|
||||||
|
LEASH = 32,
|
||||||
|
TETHER = 33,
|
||||||
|
DESTRUCTIBLE_OBJECT = 34,
|
||||||
|
NO_HARM_FROM_CLIENT = 35,
|
||||||
|
ALWAYS_FLEE = 36,
|
||||||
|
FLEE_PERCENT = 37,
|
||||||
|
ALLOW_BENEFICIAL = 38,
|
||||||
|
DISABLE_MELEE = 39,
|
||||||
|
NPC_CHASE_DISTANCE = 40,
|
||||||
|
ALLOW_TO_TANK = 41,
|
||||||
|
IGNORE_ROOT_AGGRO_RULES = 42,
|
||||||
|
CASTING_RESIST_DIFF = 43,
|
||||||
|
COUNTER_AVOID_DAMAGE = 44, // Modify by percent NPC's opponents chance to riposte, block, parry or dodge individually, or for all skills
|
||||||
|
PROX_AGGRO = 45,
|
||||||
|
IMMUNE_RANGED_ATTACKS = 46,
|
||||||
|
IMMUNE_DAMAGE_CLIENT = 47,
|
||||||
|
IMMUNE_DAMAGE_NPC = 48,
|
||||||
|
IMMUNE_AGGRO_CLIENT = 49,
|
||||||
|
IMMUNE_AGGRO_NPC = 50,
|
||||||
|
MODIFY_AVOID_DAMAGE = 51, // Modify by percent the NPCs chance to riposte, block, parry or dodge individually, or for all skills
|
||||||
|
IMMUNE_FADING_MEMORIES = 52,
|
||||||
|
IMMUNE_OPEN = 53,
|
||||||
|
IMMUNE_ASSASSINATE = 54,
|
||||||
|
IMMUNE_HEADSHOT = 55,
|
||||||
|
MAX_SPECIAL_ATTACK = 56
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
namespace HeroicBonusBucket
|
namespace HeroicBonusBucket
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ typedef enum { //EQEmu internal opcodes list
|
|||||||
_maxEmuOpcode
|
_maxEmuOpcode
|
||||||
} EmuOpcode;
|
} EmuOpcode;
|
||||||
|
|
||||||
|
constexpr int format_as(EmuOpcode opcode) { return static_cast<int>(opcode); }
|
||||||
extern const char *OpcodeNames[_maxEmuOpcode+1];
|
extern const char *OpcodeNames[_maxEmuOpcode+1];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+21
-1
@@ -228,6 +228,7 @@ N(OP_GuildBank),
|
|||||||
N(OP_GuildBankItemList),
|
N(OP_GuildBankItemList),
|
||||||
N(OP_GuildCreate),
|
N(OP_GuildCreate),
|
||||||
N(OP_GuildDelete),
|
N(OP_GuildDelete),
|
||||||
|
N(OP_GuildDeleteGuild),
|
||||||
N(OP_GuildDemote),
|
N(OP_GuildDemote),
|
||||||
N(OP_GuildInvite),
|
N(OP_GuildInvite),
|
||||||
N(OP_GuildInviteAccept),
|
N(OP_GuildInviteAccept),
|
||||||
@@ -239,15 +240,33 @@ N(OP_GuildManageStatus),
|
|||||||
N(OP_GuildMemberLevelUpdate),
|
N(OP_GuildMemberLevelUpdate),
|
||||||
N(OP_GuildMemberList),
|
N(OP_GuildMemberList),
|
||||||
N(OP_GuildMemberUpdate),
|
N(OP_GuildMemberUpdate),
|
||||||
|
N(OP_GuildMemberLevel),
|
||||||
|
N(OP_GuildMemberRankAltBanker),
|
||||||
|
N(OP_GuildMemberPublicNote),
|
||||||
|
N(OP_GuildMemberAdd),
|
||||||
|
N(OP_GuildMemberRename),
|
||||||
|
N(OP_GuildMemberDelete),
|
||||||
|
N(OP_GuildMemberDetails),
|
||||||
|
N(OP_GuildRenameGuild),
|
||||||
N(OP_GuildMOTD),
|
N(OP_GuildMOTD),
|
||||||
N(OP_GuildPeace),
|
N(OP_GuildPeace),
|
||||||
N(OP_GuildPromote),
|
N(OP_GuildPromote),
|
||||||
N(OP_GuildPublicNote),
|
N(OP_GuildPublicNote),
|
||||||
N(OP_GuildRemove),
|
N(OP_GuildRemove),
|
||||||
|
N(OP_GuildSelectTribute),
|
||||||
|
N(OP_GuildModifyBenefits),
|
||||||
|
N(OP_GuildTributeToggleReq),
|
||||||
|
N(OP_GuildTributeToggleReply),
|
||||||
|
N(OP_GuildOptInOut),
|
||||||
|
N(OP_GuildSaveActiveTributes),
|
||||||
|
N(OP_GuildSendActiveTributes),
|
||||||
|
N(OP_GuildTributeFavorAndTimer),
|
||||||
N(OP_GuildsList),
|
N(OP_GuildsList),
|
||||||
N(OP_GuildStatus),
|
N(OP_GuildStatus),
|
||||||
N(OP_GuildTributeInfo),
|
N(OP_GuildTributeInfo),
|
||||||
N(OP_GuildUpdateURLAndChannel),
|
N(OP_GuildUpdate),
|
||||||
|
N(OP_GuildTributeDonateItem),
|
||||||
|
N(OP_GuildTributeDonatePlat),
|
||||||
N(OP_GuildWar),
|
N(OP_GuildWar),
|
||||||
N(OP_Heartbeat),
|
N(OP_Heartbeat),
|
||||||
N(OP_Hide),
|
N(OP_Hide),
|
||||||
@@ -425,6 +444,7 @@ N(OP_ReqClientSpawn),
|
|||||||
N(OP_ReqNewZone),
|
N(OP_ReqNewZone),
|
||||||
N(OP_RequestClientZoneChange),
|
N(OP_RequestClientZoneChange),
|
||||||
N(OP_RequestDuel),
|
N(OP_RequestDuel),
|
||||||
|
N(OP_RequestGuildTributes),
|
||||||
N(OP_RequestKnowledgeBase),
|
N(OP_RequestKnowledgeBase),
|
||||||
N(OP_RequestTitles),
|
N(OP_RequestTitles),
|
||||||
N(OP_RespawnWindow),
|
N(OP_RespawnWindow),
|
||||||
|
|||||||
+133
-54
@@ -23,61 +23,59 @@
|
|||||||
#include "skills.h"
|
#include "skills.h"
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
namespace AppearanceType {
|
||||||
|
constexpr uint32 Die = 0; // Causes the client to keel over and zone to bind point (default action)
|
||||||
|
constexpr uint32 WhoLevel = 1; // Level that shows up on /who
|
||||||
|
constexpr uint32 MaxHealth = 2;
|
||||||
|
constexpr uint32 Invisibility = 3; // 0 = Visible, 1 = Invisible
|
||||||
|
constexpr uint32 PVP = 4; // 0 = Non-PVP, 1 = PVP
|
||||||
|
constexpr uint32 Light = 5; // Light type emitted by player (lightstone, shiny shield)
|
||||||
|
constexpr uint32 Animation = 14; // 100 = Standing, 102 = Freeze, 105 = Looting, 110 = Sitting, 111 = Crouching, 115 = Lying
|
||||||
|
constexpr uint32 Sneak = 15; // 0 = Normal, 1 = Sneaking
|
||||||
|
constexpr uint32 SpawnID = 16; // Server -> Client, sets player spawn ID
|
||||||
|
constexpr uint32 Health = 17; // Client->Server, my HP has changed (like regen tic)
|
||||||
|
constexpr uint32 Linkdead = 18; // 0 = Normal, 1 = Linkdead
|
||||||
|
constexpr uint32 FlyMode = 19; // 0 = Off, 1 = Flying, 2 = Levitating, 3 = Water, 4 = Floating, 5 = Levitating while Running
|
||||||
|
constexpr uint32 GM = 20; // 0 = Non-GM, 1 = GM
|
||||||
|
constexpr uint32 Anonymous = 21; // 0 = Non-Anonymous, 1 = Anonymous, 2 = Roleplaying
|
||||||
|
constexpr uint32 GuildID = 22;
|
||||||
|
constexpr uint32 GuildRank = 23;
|
||||||
|
constexpr uint32 AFK = 24; // 0 = Non-AFK, 1 = AFK
|
||||||
|
constexpr uint32 Pet = 25; // Parameter is Entity ID of owner, or 0 for when charm breaks
|
||||||
|
constexpr uint32 Summoned = 27;
|
||||||
|
constexpr uint32 Split = 28; // 0 = No Split, 1 = Auto Split
|
||||||
|
constexpr uint32 Size = 29; // Spawn's Size
|
||||||
|
constexpr uint32 SetType = 30; // 0 = PC, 1 = NPC, 2 = Corpse
|
||||||
|
constexpr uint32 NPCName = 31; // Change PC name color to NPC name color
|
||||||
|
constexpr uint32 AARank = 32; // AA Rank Title ID, title in /who?
|
||||||
|
constexpr uint32 CancelSneakHide = 33; // Turns off Hide and Sneak
|
||||||
|
constexpr uint32 AreaHealthRegen = 35; // Guild Hall Regeneration Pool sets to value * 0.001
|
||||||
|
constexpr uint32 AreaManaRegen = 36; // Guild Hall Regeneration Pool sets to value * 0.001
|
||||||
|
constexpr uint32 AreaEnduranceRegen = 37; // Guild Hall Regeneration Pool sets to value * 0.001
|
||||||
|
constexpr uint32 FreezeBeneficialBuffs = 38; // Freezes beneficial buff timers for PCs
|
||||||
|
constexpr uint32 NPCTintIndex = 39;
|
||||||
|
constexpr uint32 GroupAutoConsent = 40; // Auto Consent Group
|
||||||
|
constexpr uint32 RaidAutoConsent = 41; // Auto Consent Raid
|
||||||
|
constexpr uint32 GuildAutoConsent = 42; // Auto Consent Guild
|
||||||
|
constexpr uint32 ShowHelm = 43; // 0 = Hide, 1 = Show
|
||||||
|
constexpr uint32 DamageState = 44; // The damage state of a destructible object (0 through 10) plays sound IDs, most only have 2 or 4 states though
|
||||||
|
constexpr uint32 EQPlayers = 45; // EQ Players Update
|
||||||
|
constexpr uint32 FindBits = 46; // Set Find Bits?
|
||||||
|
constexpr uint32 TextureType = 48; // Texture Type?
|
||||||
|
constexpr uint32 FacePick = 49; // Turns off face pick window?
|
||||||
|
constexpr uint32 AntiCheat = 51; // Sent by the client randomly telling the server how long since last action has occurred
|
||||||
|
constexpr uint32 GuildShow = 52;
|
||||||
|
constexpr uint32 OfflineMode = 53; // Offline Mode
|
||||||
|
}
|
||||||
|
|
||||||
//SpawnAppearance types: (compared two clients for server-originating types: SoF & RoF2)
|
namespace Animation {
|
||||||
#define AT_Die 0 // this causes the client to keel over and zone to bind point (default action)
|
constexpr uint32 Standing = 100;
|
||||||
#define AT_WhoLevel 1 // the level that shows up on /who
|
constexpr uint32 Freeze = 102;
|
||||||
#define AT_HPMax 2 // idk
|
constexpr uint32 Looting = 105;
|
||||||
#define AT_Invis 3 // 0 = visible, 1 = invisible
|
constexpr uint32 Sitting = 110;
|
||||||
#define AT_PVP 4 // 0 = blue, 1 = pvp (red)
|
constexpr uint32 Crouching = 111;
|
||||||
#define AT_Light 5 // light type emitted by player (lightstone, shiny shield)
|
constexpr uint32 Lying = 115;
|
||||||
#define AT_Anim 14 // 100=standing, 110=sitting, 111=ducking, 115=feigned, 105=looting
|
}
|
||||||
#define AT_Sneak 15 // 0 = normal, 1 = sneaking
|
|
||||||
#define AT_SpawnID 16 // server to client, sets player spawn id
|
|
||||||
#define AT_HP 17 // Client->Server, my HP has changed (like regen tic)
|
|
||||||
#define AT_Linkdead 18 // 0 = normal, 1 = linkdead
|
|
||||||
#define AT_Levitate 19 // 0=off, 1=flymode, 2=levitate max 5, see GravityBehavior enum
|
|
||||||
#define AT_GM 20 // 0 = normal, 1 = GM - all odd numbers seem to make it GM
|
|
||||||
#define AT_Anon 21 // 0 = normal, 1 = anon, 2 = roleplay
|
|
||||||
#define AT_GuildID 22
|
|
||||||
#define AT_GuildRank 23 // 0=member, 1=officer, 2=leader
|
|
||||||
#define AT_AFK 24 // 0 = normal, 1 = afk
|
|
||||||
#define AT_Pet 25 // Param is EntityID of owner, or 0 for when charm breaks
|
|
||||||
#define AT_Summoned 27 // Unsure
|
|
||||||
#define AT_Split 28 // 0 = normal, 1 = autosplit on (not showing in SoF+) (client-to-server only)
|
|
||||||
#define AT_Size 29 // spawn's size (present: SoF, absent: RoF2)
|
|
||||||
#define AT_SetType 30 // 0 = PC, 1 = NPC, 2 <= = corpse
|
|
||||||
#define AT_NPCName 31 // change PC's name's color to NPC color 0 = normal, 1 = npc name, Trader on RoF2?
|
|
||||||
#define AT_AARank 32 // AA Rank Title ID thingy, does is this the title in /who?
|
|
||||||
#define AT_CancelSneakHide 33 // Turns off Hide and Sneak
|
|
||||||
//#define AT_34 34 // unknown (present: SoF, absent: RoF2)
|
|
||||||
#define AT_AreaHPRegen 35 // guild hall regen pool sets to value * 0.001
|
|
||||||
#define AT_AreaManaRegen 36 // guild hall regen pool sets to value * 0.001
|
|
||||||
#define AT_AreaEndRegen 37 // guild hall regen pool sets to value * 0.001
|
|
||||||
#define AT_FreezeBuffs 38 // Freezes beneficial buff timers
|
|
||||||
#define AT_NpcTintIndex 39 // not 100% sure
|
|
||||||
#define AT_GroupConsent 40 // auto consent group
|
|
||||||
#define AT_RaidConsent 41 // auto consent raid
|
|
||||||
#define AT_GuildConsent 42 // auto consent guild
|
|
||||||
#define AT_ShowHelm 43 // 0 = hide graphic, 1 = show graphic
|
|
||||||
#define AT_DamageState 44 // The damage state of a destructible object (0 through 10) plays soundids most only have 2 or 4 states though
|
|
||||||
#define AT_EQPlayers 45 // /eqplayersupdate
|
|
||||||
#define AT_FindBits 46 // set FindBits, whatever those are!
|
|
||||||
#define AT_TextureType 48 // TextureType
|
|
||||||
#define AT_FacePick 49 // Turns off face pick window? maybe ...
|
|
||||||
#define AT_AntiCheat 51 // sent by the client randomly telling the server how long since last action has occured
|
|
||||||
#define AT_GuildShow 52 // this is what MQ2 call sit, not sure
|
|
||||||
#define AT_Offline 53 // Offline mode
|
|
||||||
|
|
||||||
//#define AT_Trader 300 // Bazaar Trader Mode (not present in SoF or RoF2)
|
|
||||||
|
|
||||||
// animations for AT_Anim
|
|
||||||
#define ANIM_FREEZE 102
|
|
||||||
#define ANIM_STAND 0x64
|
|
||||||
#define ANIM_SIT 0x6e
|
|
||||||
#define ANIM_CROUCH 0x6f
|
|
||||||
#define ANIM_DEATH 0x73
|
|
||||||
#define ANIM_LOOT 0x69
|
|
||||||
|
|
||||||
constexpr int16 RECAST_TYPE_UNLINKED_ITEM = -1;
|
constexpr int16 RECAST_TYPE_UNLINKED_ITEM = -1;
|
||||||
|
|
||||||
@@ -686,6 +684,53 @@ namespace Zones {
|
|||||||
constexpr uint16 APPRENTICE = 999; // Designer Apprentice
|
constexpr uint16 APPRENTICE = 999; // Designer Apprentice
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace Language {
|
||||||
|
constexpr uint8 CommonTongue = 0;
|
||||||
|
constexpr uint8 Barbarian = 1;
|
||||||
|
constexpr uint8 Erudian = 2;
|
||||||
|
constexpr uint8 Elvish = 3;
|
||||||
|
constexpr uint8 DarkElvish = 4;
|
||||||
|
constexpr uint8 Dwarvish = 5;
|
||||||
|
constexpr uint8 Troll = 6;
|
||||||
|
constexpr uint8 Ogre = 7;
|
||||||
|
constexpr uint8 Gnomish = 8;
|
||||||
|
constexpr uint8 Halfling = 9;
|
||||||
|
constexpr uint8 ThievesCant = 10;
|
||||||
|
constexpr uint8 OldErudian = 11;
|
||||||
|
constexpr uint8 ElderElvish = 12;
|
||||||
|
constexpr uint8 Froglok = 13;
|
||||||
|
constexpr uint8 Goblin = 14;
|
||||||
|
constexpr uint8 Gnoll = 15;
|
||||||
|
constexpr uint8 CombineTongue = 16;
|
||||||
|
constexpr uint8 ElderTeirDal = 17;
|
||||||
|
constexpr uint8 Lizardman = 18;
|
||||||
|
constexpr uint8 Orcish = 19;
|
||||||
|
constexpr uint8 Faerie = 20;
|
||||||
|
constexpr uint8 Dragon = 21;
|
||||||
|
constexpr uint8 ElderDragon = 22;
|
||||||
|
constexpr uint8 DarkSpeech = 23;
|
||||||
|
constexpr uint8 VahShir = 24;
|
||||||
|
constexpr uint8 Alaran = 25;
|
||||||
|
constexpr uint8 Hadal = 26;
|
||||||
|
constexpr uint8 Unknown27 = 27;
|
||||||
|
|
||||||
|
constexpr uint8 MaxValue = 100;
|
||||||
|
}
|
||||||
|
namespace PetInfoType {
|
||||||
|
constexpr int Current = 0;
|
||||||
|
constexpr int Suspended = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace BuffEffectType {
|
||||||
|
constexpr uint8 None = 0;
|
||||||
|
constexpr uint8 Buff = 2;
|
||||||
|
constexpr uint8 InverseBuff = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace AlternateCurrencyMode {
|
||||||
|
constexpr uint32 Update = 7;
|
||||||
|
constexpr uint32 Populate = 8;
|
||||||
|
}
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FilterNone = 0,
|
FilterNone = 0,
|
||||||
@@ -1052,4 +1097,38 @@ enum ScribeSpellActions
|
|||||||
Unmemorize
|
Unmemorize
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum SpellTimeRestrictions
|
||||||
|
{
|
||||||
|
NoRestriction,
|
||||||
|
Day,
|
||||||
|
Night
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MoneyTypes
|
||||||
|
{
|
||||||
|
Copper,
|
||||||
|
Silver,
|
||||||
|
Gold,
|
||||||
|
Platinum
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MoneySubtypes
|
||||||
|
{
|
||||||
|
Personal,
|
||||||
|
Bank,
|
||||||
|
Cursor,
|
||||||
|
SharedBank // Platinum Only
|
||||||
|
};
|
||||||
|
|
||||||
|
namespace RaidLootType {
|
||||||
|
constexpr uint32 LeaderOnly = 1;
|
||||||
|
constexpr uint32 LeaderAndGroupLeadersOnly = 2;
|
||||||
|
constexpr uint32 LeaderSelected = 3;
|
||||||
|
constexpr uint32 EntireRaid = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace LeadershipAbilitySlot {
|
||||||
|
constexpr uint16 HealthOfTargetsTarget = 14;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /*COMMON_EQ_CONSTANTS_H*/
|
#endif /*COMMON_EQ_CONSTANTS_H*/
|
||||||
|
|||||||
+289
-62
@@ -124,6 +124,12 @@ struct LDoNTrapTemplate
|
|||||||
uint8 locked;
|
uint8 locked;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CrystalReclaimTypes
|
||||||
|
{
|
||||||
|
Ebon = 5,
|
||||||
|
Radiant = 4,
|
||||||
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
@@ -308,6 +314,7 @@ union
|
|||||||
uint32 DestructibleUnk9;
|
uint32 DestructibleUnk9;
|
||||||
bool targetable_with_hotkey;
|
bool targetable_with_hotkey;
|
||||||
bool show_name;
|
bool show_name;
|
||||||
|
bool guild_show;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PlayerState_Struct {
|
struct PlayerState_Struct {
|
||||||
@@ -386,7 +393,7 @@ struct NewZone_Struct {
|
|||||||
/*0724*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, if this value is 0, it prevents you from running off edges that would end up underworld
|
/*0724*/ uint32 underworld_teleport_index; // > 0 teleports w/ zone point index, invalid succors, if this value is 0, it prevents you from running off edges that would end up underworld
|
||||||
/*0728*/ uint32 lava_damage; // Seen 50
|
/*0728*/ uint32 lava_damage; // Seen 50
|
||||||
/*0732*/ uint32 min_lava_damage; // Seen 10
|
/*0732*/ uint32 min_lava_damage; // Seen 10
|
||||||
/*0736*/
|
/*0736*/ float safe_heading;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -625,6 +632,12 @@ struct ConsentResponse_Struct {
|
|||||||
char zonename[32];
|
char zonename[32];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct NameApproval_Struct {
|
||||||
|
char name[64];
|
||||||
|
uint32 race_id;
|
||||||
|
uint32 class_id;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Name Generator Struct
|
** Name Generator Struct
|
||||||
** Length: 72 bytes
|
** Length: 72 bytes
|
||||||
@@ -1665,6 +1678,68 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
GuildsListEntry_Struct entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildMemberAdd_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 unknown04;
|
||||||
|
/*008*/ uint32 unknown08;
|
||||||
|
/*012*/ uint32 unknown12;
|
||||||
|
/*016*/ uint32 level;
|
||||||
|
/*020*/ uint32 class_;
|
||||||
|
/*024*/ uint32 rank_;
|
||||||
|
/*028*/ uint32 guild_show;
|
||||||
|
/*032*/ uint32 zone_id;
|
||||||
|
/*036*/ uint32 last_on;
|
||||||
|
/*040*/ char player_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberLevel_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
/*068*/ uint32 level;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberRank_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 rank_;
|
||||||
|
/*008*/ char player_name[64];
|
||||||
|
/*072*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||||
|
/*076*/ uint32 offline;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberPublicNote_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
/*068*/ char public_note[256]; //RoF2 256
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildDelete_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildRenameGuild_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char new_guild_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildRenameMember_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
/*068*/ char new_player_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberDetails_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
/*068*/ uint32 zone_id;
|
||||||
|
/*072*/ uint32 last_on;
|
||||||
|
/*076*/ uint32 offline_mode; //1 Offline
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberDelete_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Money Loot
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@@ -1714,9 +1789,9 @@ struct GuildJoin_Struct{
|
|||||||
};
|
};
|
||||||
struct GuildInviteAccept_Struct {
|
struct GuildInviteAccept_Struct {
|
||||||
char inviter[64];
|
char inviter[64];
|
||||||
char newmember[64];
|
char new_member[64];
|
||||||
uint32 response;
|
uint32 response;
|
||||||
uint32 guildeqid;
|
uint32 guild_id;
|
||||||
};
|
};
|
||||||
struct GuildManageRemove_Struct {
|
struct GuildManageRemove_Struct {
|
||||||
uint32 guildeqid;
|
uint32 guildeqid;
|
||||||
@@ -1748,6 +1823,14 @@ struct PopupResponse_Struct {
|
|||||||
/*0004*/ uint32 popupid;
|
/*0004*/ uint32 popupid;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum GuildInformationActions
|
||||||
|
{
|
||||||
|
GuildUpdateURL = 0,
|
||||||
|
GuildUpdateChannel = 1,
|
||||||
|
GuildUpdateRanks = 4,
|
||||||
|
GuildUpdatePermissions = 5
|
||||||
|
};
|
||||||
|
|
||||||
struct GuildManageBanker_Struct {
|
struct GuildManageBanker_Struct {
|
||||||
uint32 unknown0;
|
uint32 unknown0;
|
||||||
char myname[64];
|
char myname[64];
|
||||||
@@ -1761,9 +1844,9 @@ struct GuildSetRank_Struct
|
|||||||
{
|
{
|
||||||
/*00*/ uint32 Unknown00;
|
/*00*/ uint32 Unknown00;
|
||||||
/*04*/ uint32 Unknown04;
|
/*04*/ uint32 Unknown04;
|
||||||
/*08*/ uint32 Rank;
|
/*08*/ uint32 rank;
|
||||||
/*12*/ char MemberName[64];
|
/*12*/ char member_name[64];
|
||||||
/*76*/ uint32 Banker;
|
/*76*/ uint32 banker;
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2594,11 +2677,11 @@ struct BookButton_Struct
|
|||||||
struct Object_Struct {
|
struct Object_Struct {
|
||||||
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
/*00*/ uint32 linked_list_addr[2];// They are, get this, prev and next, ala linked list
|
||||||
/*08*/ float size; //
|
/*08*/ float size; //
|
||||||
/*10*/ uint16 solidtype; //
|
/*10*/ uint16 solid_type; //
|
||||||
/*12*/ uint32 drop_id; // Unique object id for zone
|
/*12*/ uint32 drop_id; // Unique object id for zone
|
||||||
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
/*16*/ uint16 zone_id; // Redudant, but: Zone the object appears in
|
||||||
/*18*/ uint16 zone_instance; //
|
/*18*/ uint16 zone_instance; //
|
||||||
/*20*/ uint32 unknown020; //
|
/*20*/ uint32 incline; //
|
||||||
/*24*/ uint32 unknown024; //
|
/*24*/ uint32 unknown024; //
|
||||||
/*28*/ float tilt_x;
|
/*28*/ float tilt_x;
|
||||||
/*32*/ float tilt_y;
|
/*32*/ float tilt_y;
|
||||||
@@ -3321,6 +3404,7 @@ struct Internal_GuildMemberEntry_Struct {
|
|||||||
// char public_note[1]; //variable length.
|
// char public_note[1]; //variable length.
|
||||||
uint16 zoneinstance; //network byte order
|
uint16 zoneinstance; //network byte order
|
||||||
uint16 zone_id; //network byte order
|
uint16 zone_id; //network byte order
|
||||||
|
uint32 online;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Internal_GuildMembers_Struct { //just for display purposes, this is not actually used in the message encoding.
|
struct Internal_GuildMembers_Struct { //just for display purposes, this is not actually used in the message encoding.
|
||||||
@@ -3347,7 +3431,42 @@ struct GuildUpdate_PublicNote{
|
|||||||
uint32 unknown0;
|
uint32 unknown0;
|
||||||
char name[64];
|
char name[64];
|
||||||
char target[64];
|
char target[64];
|
||||||
char note[1]; //variable length.
|
char note[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildUpdateURLAndChannelStruct {
|
||||||
|
char text[512];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildUpdatePermissionsStruct {
|
||||||
|
uint32 rank; // the rank that is being changed
|
||||||
|
uint32 function_id; // the id of the guild function
|
||||||
|
uint32 value; // 1 is on, 0 is off
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildUpdateRankNamesStruct {
|
||||||
|
uint32 rank; // the rank that is being updated
|
||||||
|
char rank_name[76]; // the rank name
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildUpdateUCPStruct {
|
||||||
|
uint32 action; // 0 and 1 use url and channel payload. 5 uses permissions payload
|
||||||
|
char unknown[76];
|
||||||
|
union {
|
||||||
|
GuildUpdateURLAndChannelStruct url_channel;
|
||||||
|
GuildUpdatePermissionsStruct permissions;
|
||||||
|
GuildUpdateRankNamesStruct rank_name;
|
||||||
|
}payload;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildPermission_Struct
|
||||||
|
{
|
||||||
|
uint32 Action; // 5 = Update function permission
|
||||||
|
char Unknown0004[76]; // not used
|
||||||
|
uint32 rank; // the rank that is being changed
|
||||||
|
uint32 function_id; // the id of the guild function
|
||||||
|
uint32 value; // 1 is on, 0 is off
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildUpdateURLAndChannel_Struct
|
struct GuildUpdateURLAndChannel_Struct
|
||||||
@@ -3366,7 +3485,7 @@ struct GuildUpdateURLAndChannel_Struct
|
|||||||
//The client sends this struct on changing a guild rank. The server sends each rank in 32 or less packets upon zonein if you are in a guild.
|
//The client sends this struct on changing a guild rank. The server sends each rank in 32 or less packets upon zonein if you are in a guild.
|
||||||
struct GuildUpdateRanks_Struct
|
struct GuildUpdateRanks_Struct
|
||||||
{
|
{
|
||||||
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 5 = RoF Ranks
|
/*0000*/ uint32 Action; // 0 = Update URL, 1 = Update Channel, 4 = Ranks 5 = Permissions
|
||||||
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
|
/*0004*/ uint32 Unknown0004; //Seen 00 00 00 00
|
||||||
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
|
/*0008*/ uint32 Unknown0008; //Seen 96 29 00 00
|
||||||
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
|
/*0008*/ char Unknown0012[64]; //Seen "CharacterName"
|
||||||
@@ -3388,6 +3507,7 @@ struct GuildStatus_Struct
|
|||||||
struct GuildDemoteStruct{
|
struct GuildDemoteStruct{
|
||||||
char name[64];
|
char name[64];
|
||||||
char target[64];
|
char target[64];
|
||||||
|
uint32 rank;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildRemoveStruct{
|
struct GuildRemoveStruct{
|
||||||
@@ -3397,9 +3517,9 @@ struct GuildRemoveStruct{
|
|||||||
uint32 leaderstatus; //?
|
uint32 leaderstatus; //?
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildMakeLeader{
|
struct GuildMakeLeader_Struct{
|
||||||
char name[64];
|
char requestor[64];
|
||||||
char target[64];
|
char new_leader[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct BugReport_Struct {
|
struct BugReport_Struct {
|
||||||
@@ -3439,20 +3559,23 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
|
||||||
float max_x;
|
struct GroundSpawn {
|
||||||
float max_y;
|
float max_x = 0.0f;
|
||||||
float min_x;
|
float max_y = 0.0f;
|
||||||
float min_y;
|
float min_x = 0.0f;
|
||||||
float max_z;
|
float min_y = 0.0f;
|
||||||
float heading;
|
float max_z = 0.0f;
|
||||||
char name[20];
|
float heading = 0.0f;
|
||||||
uint32 item;
|
std::string name = std::string();
|
||||||
uint32 max_allowed;
|
uint32 item_id = 0;
|
||||||
uint32 respawntimer;
|
uint32 max_allowed = 1;
|
||||||
|
uint32 respawn_timer = 1;
|
||||||
|
bool fix_z = true;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawns {
|
||||||
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -3508,21 +3631,148 @@ struct TributeAbility_Struct {
|
|||||||
char name[0];
|
char name[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GuildTributeAbility_Struct {
|
|
||||||
uint32 guild_id;
|
|
||||||
TributeAbility_Struct ability;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SelectTributeReq_Struct {
|
struct SelectTributeReq_Struct {
|
||||||
uint32 client_id; //? maybe action ID?
|
uint32 client_id; //? maybe action ID?
|
||||||
uint32 tribute_id;
|
uint32 tribute_id;
|
||||||
uint32 unknown8; //seen E3 00 00 00
|
uint32 unknown8; //seen E3 00 00 00
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildTributeAbilityDetail_Struct {
|
||||||
|
uint32 tribute_id; //backwards byte order!
|
||||||
|
uint32 tier_count; //backwards byte order!
|
||||||
|
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||||
|
uint32 unknown132;
|
||||||
|
char name[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeAbility_Struct {
|
||||||
|
uint32 guild_id;
|
||||||
|
GuildTributeAbilityDetail_Struct ability;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeSelectReq_Struct {
|
||||||
|
uint32 tribute_id;
|
||||||
|
uint32 tier;
|
||||||
|
uint32 tribute_id2;
|
||||||
|
uint32 unknown12; //seen A7 01 00 00
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeSelectReply_Struct {
|
||||||
|
uint32 tribute_id;
|
||||||
|
uint32 tier;
|
||||||
|
uint32 tribute_id2;
|
||||||
|
char description;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeModifyBenefits_Struct {
|
||||||
|
/*000*/uint32 command;
|
||||||
|
/*004*/uint32 data;
|
||||||
|
/*008*/char unknown8[12];
|
||||||
|
/*020*/uint32 tribute_master_id;
|
||||||
|
/*024*/uint32 tribute_id_1;
|
||||||
|
/*028*/uint32 tribute_id_2;
|
||||||
|
/*032*/uint32 tribute_id_1_tier;
|
||||||
|
/*036*/uint32 tribute_id_2_tier;
|
||||||
|
/*040*/char unknown[40];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeOptInOutReq_Struct {
|
||||||
|
/*000*/uint32 guild_id;
|
||||||
|
/*004*/uint32 tribute_toggle;
|
||||||
|
/*008*/char player[64];
|
||||||
|
/*072*/uint32 command;
|
||||||
|
/*076*/uint32 tribute_master_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeOptInOutReply_Struct {
|
||||||
|
/*000*/uint32 guild_id;
|
||||||
|
/*004*/char player_name[64];
|
||||||
|
/*068*/uint32 tribute_toggle;// 0 off 1 on
|
||||||
|
/*072*/uint32 tribute_trophy_toggle;// 0 off 1 on not yet implemented
|
||||||
|
/*076*/uint32 no_donations;
|
||||||
|
/*080*/uint32 time;
|
||||||
|
/*084*/uint32 command;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeSaveActive_Struct {
|
||||||
|
/*000*/ uint32 command;
|
||||||
|
/*004*/ char unknown04[16];
|
||||||
|
/*020*/ uint32 master_tribute_id;
|
||||||
|
/*024*/ uint32 tribute_id_1;
|
||||||
|
/*028*/ uint32 tribute_id_2;
|
||||||
|
/*032*/ uint32 tribute_1_tier;
|
||||||
|
/*036*/ uint32 tribute_2_tier;
|
||||||
|
/*040*/ char unknown40[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeFavorTimer_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 guild_favor;
|
||||||
|
/*008*/ uint32 tribute_timer;
|
||||||
|
/*012*/ uint32 trophy_timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeSendActive_Struct {
|
||||||
|
/*000*/ uint32 not_used;
|
||||||
|
/*004*/ uint32 guild_favor;
|
||||||
|
/*008*/ uint32 tribute_timer;
|
||||||
|
/*012*/ uint32 tribute_enabled;
|
||||||
|
/*016*/ char unknown16[8];
|
||||||
|
/*024*/ uint32 tribute_id_1;
|
||||||
|
/*028*/ uint32 tribute_id_2;
|
||||||
|
/*032*/ uint32 tribute_id_1_tier;
|
||||||
|
/*036*/ uint32 tribute_id_2_tier;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeToggleReq_Struct {
|
||||||
|
/*000*/ uint32 command;
|
||||||
|
/*004*/ uint32 unknown4;
|
||||||
|
/*008*/ uint32 unknown8;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemRequest_Struct {
|
||||||
|
/*000*/ uint32 type;
|
||||||
|
/*004*/ uint16 slot;
|
||||||
|
/*006*/ uint16 sub_index;
|
||||||
|
/*008*/ uint16 aug_index;
|
||||||
|
/*010*/ uint16 unknown10;
|
||||||
|
/*012*/ uint32 quantity;
|
||||||
|
/*016*/ uint32 tribute_master_id;
|
||||||
|
/*020*/ uint32 unknown20;
|
||||||
|
/*024*/ uint32 guild_id;
|
||||||
|
/*028*/ uint32 unknown28;
|
||||||
|
/*032*/ uint32 unknown32;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemReply_Struct {
|
||||||
|
/*000*/ uint32 type;
|
||||||
|
/*004*/ uint16 slot;
|
||||||
|
/*006*/ uint16 sub_index;
|
||||||
|
/*008*/ uint16 aug_index;
|
||||||
|
/*010*/ uint16 unknown10;
|
||||||
|
/*012*/ uint32 quantity;
|
||||||
|
/*016*/ uint32 unknown20;
|
||||||
|
/*020*/ uint32 favor;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonatePlatRequest_Struct {
|
||||||
|
/*000*/ uint32 quantity;
|
||||||
|
/*004*/ uint32 tribute_master_id;
|
||||||
|
/*008*/ uint32 unknown08;
|
||||||
|
/*012*/ uint32 guild_id;
|
||||||
|
/*016*/ uint32 unknown16;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonatePlatReply_Struct {
|
||||||
|
/*000*/ uint32 quantity;
|
||||||
|
/*004*/ uint32 unknown4;
|
||||||
|
/*008*/ uint32 favor;
|
||||||
|
};
|
||||||
|
|
||||||
struct SelectTributeReply_Struct {
|
struct SelectTributeReply_Struct {
|
||||||
uint32 client_id; //echoed from request.
|
uint32 client_id; //echoed from request.
|
||||||
uint32 tribute_id;
|
uint32 tribute_id;
|
||||||
char desc[0];
|
char description[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TributeInfo_Struct {
|
struct TributeInfo_Struct {
|
||||||
@@ -4164,7 +4414,6 @@ struct RaidGeneral_Struct {
|
|||||||
/*68*/ uint32 unknown1;
|
/*68*/ uint32 unknown1;
|
||||||
/*72*/ char leader_name[64];
|
/*72*/ char leader_name[64];
|
||||||
/*136*/ uint32 parameter;
|
/*136*/ uint32 parameter;
|
||||||
/*200*/ char note[64];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidAddMember_Struct {
|
struct RaidAddMember_Struct {
|
||||||
@@ -4175,9 +4424,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*136*/ char motd[0]; // max size is 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
@@ -5124,8 +5378,6 @@ struct GroupMakeLeader_Struct
|
|||||||
//ex for a blank crowns window you would send:
|
//ex for a blank crowns window you would send:
|
||||||
//999999|1|999999|0
|
//999999|1|999999|0
|
||||||
//any items come after in much the same way adventure merchant items do except there is no theme included
|
//any items come after in much the same way adventure merchant items do except there is no theme included
|
||||||
#define ALT_CURRENCY_OP_POPULATE 8
|
|
||||||
#define ALT_CURRENCY_OP_UPDATE 7
|
|
||||||
|
|
||||||
//Server -> Client
|
//Server -> Client
|
||||||
//Populates the initial Alternate Currency Window
|
//Populates the initial Alternate Currency Window
|
||||||
@@ -5536,28 +5788,6 @@ struct MercenaryMerchantResponse_Struct {
|
|||||||
/*0004*/
|
/*0004*/
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ServerLootItem_Struct {
|
|
||||||
uint32 item_id; // uint32 item_id;
|
|
||||||
int16 equip_slot; // int16 equip_slot;
|
|
||||||
uint16 charges; // uint8 charges;
|
|
||||||
uint16 lootslot; // uint16 lootslot;
|
|
||||||
uint32 aug_1; // uint32 aug_1;
|
|
||||||
uint32 aug_2; // uint32 aug_2;
|
|
||||||
uint32 aug_3; // uint32 aug_3;
|
|
||||||
uint32 aug_4; // uint32 aug_4;
|
|
||||||
uint32 aug_5; // uint32 aug_5;
|
|
||||||
uint32 aug_6; // uint32 aug_5;
|
|
||||||
bool attuned;
|
|
||||||
std::string custom_data;
|
|
||||||
uint32 ornamenticon {};
|
|
||||||
uint32 ornamentidfile {};
|
|
||||||
uint32 ornament_hero_model {};
|
|
||||||
uint16 trivial_min_level;
|
|
||||||
uint16 trivial_max_level;
|
|
||||||
uint16 npc_min_level;
|
|
||||||
uint16 npc_max_level;
|
|
||||||
};
|
|
||||||
|
|
||||||
//Found in client near a ref to the string:
|
//Found in client near a ref to the string:
|
||||||
//"Got a broadcast message for ... %s ...\n"
|
//"Got a broadcast message for ... %s ...\n"
|
||||||
struct ClientMarqueeMessage_Struct {
|
struct ClientMarqueeMessage_Struct {
|
||||||
@@ -5576,9 +5806,6 @@ struct ClientMarqueeMessage_Struct {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::list<ServerLootItem_Struct*> ItemList;
|
|
||||||
|
|
||||||
|
|
||||||
struct fling_struct {
|
struct fling_struct {
|
||||||
/* 00 */ uint32 collision; // 0 collision is off, anything else it's on
|
/* 00 */ uint32 collision; // 0 collision is off, anything else it's on
|
||||||
/* 04 */ int32 travel_time; // ms -- UF we need to calc this, RoF+ -1 auto calcs
|
/* 04 */ int32 travel_time; // ms -- UF we need to calc this, RoF+ -1 auto calcs
|
||||||
|
|||||||
+110
-15
@@ -20,9 +20,12 @@
|
|||||||
#include "eqemu_config.h"
|
#include "eqemu_config.h"
|
||||||
#include "misc_functions.h"
|
#include "misc_functions.h"
|
||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
|
#include "eqemu_logsys.h"
|
||||||
|
#include "json/json.hpp"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <filesystem>
|
||||||
|
|
||||||
std::string EQEmuConfig::ConfigFile = "eqemu_config.json";
|
std::string EQEmuConfig::ConfigFile = "eqemu_config.json";
|
||||||
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
EQEmuConfig *EQEmuConfig::_config = nullptr;
|
||||||
@@ -111,13 +114,12 @@ void EQEmuConfig::parse_config()
|
|||||||
DisableConfigChecks = true;
|
DisableConfigChecks = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* UCS
|
|
||||||
*/
|
CheckUcsConfigConversion();
|
||||||
ChatHost = _root["server"]["chatserver"].get("host", "eqchat.eqemulator.net").asString();
|
|
||||||
ChatPort = Strings::ToUnsignedInt(_root["server"]["chatserver"].get("port", "7778").asString());
|
m_ucs_host = _root["server"]["ucs"].get("host", "eqchat.eqemulator.net").asString();
|
||||||
MailHost = _root["server"]["mailserver"].get("host", "eqmail.eqemulator.net").asString();
|
m_ucs_port = Strings::ToUnsignedInt(_root["server"]["ucs"].get("port", "7778").asString());
|
||||||
MailPort = Strings::ToUnsignedInt(_root["server"]["mailserver"].get("port", "7778").asString());
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Database
|
* Database
|
||||||
@@ -246,16 +248,16 @@ std::string EQEmuConfig::GetByName(const std::string &var_name) const
|
|||||||
return (WorldHTTPEnabled ? "true" : "false");
|
return (WorldHTTPEnabled ? "true" : "false");
|
||||||
}
|
}
|
||||||
if (var_name == "ChatHost") {
|
if (var_name == "ChatHost") {
|
||||||
return (ChatHost);
|
return (m_ucs_host);
|
||||||
}
|
}
|
||||||
if (var_name == "ChatPort") {
|
if (var_name == "ChatPort") {
|
||||||
return (itoa(ChatPort));
|
return (itoa(m_ucs_port));
|
||||||
}
|
}
|
||||||
if (var_name == "MailHost") {
|
if (var_name == "MailHost") {
|
||||||
return (MailHost);
|
return (m_ucs_host);
|
||||||
}
|
}
|
||||||
if (var_name == "MailPort") {
|
if (var_name == "MailPort") {
|
||||||
return (itoa(MailPort));
|
return (itoa(m_ucs_port));
|
||||||
}
|
}
|
||||||
if (var_name == "DatabaseHost") {
|
if (var_name == "DatabaseHost") {
|
||||||
return (DatabaseHost);
|
return (DatabaseHost);
|
||||||
@@ -362,10 +364,8 @@ void EQEmuConfig::Dump() const
|
|||||||
std::cout << "WorldHTTPPort = " << WorldHTTPPort << std::endl;
|
std::cout << "WorldHTTPPort = " << WorldHTTPPort << std::endl;
|
||||||
std::cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << std::endl;
|
std::cout << "WorldHTTPMimeFile = " << WorldHTTPMimeFile << std::endl;
|
||||||
std::cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << std::endl;
|
std::cout << "WorldHTTPEnabled = " << WorldHTTPEnabled << std::endl;
|
||||||
std::cout << "ChatHost = " << ChatHost << std::endl;
|
std::cout << "UCSHost = " << m_ucs_host << std::endl;
|
||||||
std::cout << "ChatPort = " << ChatPort << std::endl;
|
std::cout << "UCSPort = " << m_ucs_port << std::endl;
|
||||||
std::cout << "MailHost = " << MailHost << std::endl;
|
|
||||||
std::cout << "MailPort = " << MailPort << std::endl;
|
|
||||||
std::cout << "DatabaseHost = " << DatabaseHost << std::endl;
|
std::cout << "DatabaseHost = " << DatabaseHost << std::endl;
|
||||||
std::cout << "DatabaseUsername = " << DatabaseUsername << std::endl;
|
std::cout << "DatabaseUsername = " << DatabaseUsername << std::endl;
|
||||||
std::cout << "DatabasePassword = " << DatabasePassword << std::endl;
|
std::cout << "DatabasePassword = " << DatabasePassword << std::endl;
|
||||||
@@ -392,3 +392,98 @@ void EQEmuConfig::Dump() const
|
|||||||
std::cout << "DefaultStatus = " << (int) DefaultStatus << std::endl;
|
std::cout << "DefaultStatus = " << (int) DefaultStatus << std::endl;
|
||||||
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
// std::cout << "DynamicCount = " << DynamicCount << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const std::string &EQEmuConfig::GetUCSHost() const
|
||||||
|
{
|
||||||
|
return m_ucs_host;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16 EQEmuConfig::GetUCSPort() const
|
||||||
|
{
|
||||||
|
return m_ucs_port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EQEmuConfig::CheckUcsConfigConversion()
|
||||||
|
{
|
||||||
|
std::string chat_host = _root["server"]["chatserver"].get("host", "").asString();
|
||||||
|
uint32 chat_port = Strings::ToUnsignedInt(_root["server"]["chatserver"].get("port", "0").asString());
|
||||||
|
std::string mail_host = _root["server"]["mailserver"].get("host", "").asString();
|
||||||
|
uint32 mail_port = Strings::ToUnsignedInt(_root["server"]["mailserver"].get("port", "0").asString());
|
||||||
|
std::string ucs_host = _root["server"]["ucs"].get("host", "").asString();
|
||||||
|
|
||||||
|
// automatic ucs legacy configuration migration
|
||||||
|
// if old configuration values are set, let's backup the existing configuration
|
||||||
|
// and migrate to to use the new fields and write the new config
|
||||||
|
if ((!chat_host.empty() || !mail_host.empty()) && ucs_host.empty()) {
|
||||||
|
LogInfo("Migrating old [eqemu_config] UCS configuration to new configuration");
|
||||||
|
|
||||||
|
std::string config_file_path = std::filesystem::path{
|
||||||
|
path.GetServerPath() + "/eqemu_config.json"
|
||||||
|
}.string();
|
||||||
|
|
||||||
|
std::string config_file_bak_path = std::filesystem::path{
|
||||||
|
path.GetServerPath() + "/eqemu_config.ucs-migrate-json.bak"
|
||||||
|
}.string();
|
||||||
|
|
||||||
|
// copy eqemu_config.json to eqemu_config.json.bak
|
||||||
|
std::ifstream src(config_file_path, std::ios::binary);
|
||||||
|
std::ofstream dst(config_file_bak_path, std::ios::binary);
|
||||||
|
dst << src.rdbuf();
|
||||||
|
src.close();
|
||||||
|
|
||||||
|
LogInfo("Old configuration backed up to [{}]", config_file_bak_path);
|
||||||
|
|
||||||
|
// read eqemu_config.json, transplant new fields and write to eqemu_config.json
|
||||||
|
Json::Value root;
|
||||||
|
Json::Reader reader;
|
||||||
|
std::ifstream file(config_file_path);
|
||||||
|
if (!reader.parse(file, root)) {
|
||||||
|
LogError("Failed to parse configuration file");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
// get old fields
|
||||||
|
std::string host = !chat_host.empty() ? chat_host : mail_host;
|
||||||
|
if (host.empty()) {
|
||||||
|
host = "eqchat.eqemulator.net";
|
||||||
|
}
|
||||||
|
std::string port = chat_port > 0 ? std::to_string(chat_port) : std::to_string(mail_port);
|
||||||
|
if (port.empty()) {
|
||||||
|
port = "7778";
|
||||||
|
}
|
||||||
|
|
||||||
|
// set new fields
|
||||||
|
root["server"]["ucs"]["host"] = host;
|
||||||
|
root["server"]["ucs"]["port"] = port;
|
||||||
|
|
||||||
|
// unset old fields
|
||||||
|
root["server"].removeMember("chatserver");
|
||||||
|
root["server"].removeMember("mailserver");
|
||||||
|
|
||||||
|
// get Json::Value raw string
|
||||||
|
std::string config = root.toStyledString();
|
||||||
|
|
||||||
|
// format using more modern json library
|
||||||
|
nlohmann::json data = nlohmann::json::parse(config);
|
||||||
|
|
||||||
|
// write to file
|
||||||
|
std::ofstream o(config_file_path);
|
||||||
|
o << std::setw(1) << data << std::endl;
|
||||||
|
o.close();
|
||||||
|
|
||||||
|
// write new config
|
||||||
|
LogInfo("New configuration written to [{}]", config_file_path);
|
||||||
|
LogInfo("Migration complete, please review the new configuration file");
|
||||||
|
|
||||||
|
// reload config internally
|
||||||
|
try {
|
||||||
|
std::ifstream fconfig(config_file_path, std::ifstream::binary);
|
||||||
|
fconfig >> _config->_root;
|
||||||
|
_config->parse_config();
|
||||||
|
}
|
||||||
|
catch (std::exception &) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -62,14 +62,6 @@ class EQEmuConfig
|
|||||||
std::string SharedKey;
|
std::string SharedKey;
|
||||||
bool DisableConfigChecks;
|
bool DisableConfigChecks;
|
||||||
|
|
||||||
// From <chatserver/>
|
|
||||||
std::string ChatHost;
|
|
||||||
uint16 ChatPort;
|
|
||||||
|
|
||||||
// From <mailserver/>
|
|
||||||
std::string MailHost;
|
|
||||||
uint16 MailPort;
|
|
||||||
|
|
||||||
// From <database/>
|
// From <database/>
|
||||||
std::string DatabaseHost;
|
std::string DatabaseHost;
|
||||||
std::string DatabaseUsername;
|
std::string DatabaseUsername;
|
||||||
@@ -122,12 +114,18 @@ class EQEmuConfig
|
|||||||
|
|
||||||
bool auto_database_updates;
|
bool auto_database_updates;
|
||||||
|
|
||||||
|
const std::string &GetUCSHost() const;
|
||||||
|
uint16 GetUCSPort() const;
|
||||||
|
|
||||||
// uint16 DynamicCount;
|
// uint16 DynamicCount;
|
||||||
|
|
||||||
// map<string,uint16> StaticZones;
|
// map<string,uint16> StaticZones;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
std::string m_ucs_host;
|
||||||
|
uint16 m_ucs_port;
|
||||||
|
|
||||||
static EQEmuConfig *_config;
|
static EQEmuConfig *_config;
|
||||||
Json::Value _root;
|
Json::Value _root;
|
||||||
static std::string ConfigFile;
|
static std::string ConfigFile;
|
||||||
@@ -186,6 +184,7 @@ class EQEmuConfig
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Dump() const;
|
void Dump() const;
|
||||||
|
void CheckUcsConfigConversion();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+15
-7
@@ -100,6 +100,8 @@ EQEmuLogSys *EQEmuLogSys::LoadLogSettingsDefaults()
|
|||||||
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Discord].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::QuestErrors].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::EqTime].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::EqTime].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* RFC 5424
|
* RFC 5424
|
||||||
@@ -649,6 +651,9 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Auto inject categories that don't exist in the database...
|
// Auto inject categories that don't exist in the database...
|
||||||
|
|
||||||
|
std::vector<LogsysCategoriesRepository::LogsysCategories> db_categories_to_add{};
|
||||||
|
|
||||||
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
for (int i = Logs::AA; i != Logs::MaxCategoryID; i++) {
|
||||||
|
|
||||||
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
bool is_missing_in_database = std::find(db_categories.begin(), db_categories.end(), i) == db_categories.end();
|
||||||
@@ -663,11 +668,7 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (is_missing_in_database && !is_deprecated_category) {
|
if (is_missing_in_database && !is_deprecated_category) {
|
||||||
LogInfo(
|
LogInfo("Automatically adding new log category [{}] ({})", Logs::LogCategoryName[i], i);
|
||||||
"Automatically adding new log category [{}] ({})",
|
|
||||||
Logs::LogCategoryName[i],
|
|
||||||
i
|
|
||||||
);
|
|
||||||
|
|
||||||
auto new_category = LogsysCategoriesRepository::NewEntity();
|
auto new_category = LogsysCategoriesRepository::NewEntity();
|
||||||
new_category.log_category_id = i;
|
new_category.log_category_id = i;
|
||||||
@@ -676,11 +677,16 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
new_category.log_to_gmsay = log_settings[i].log_to_gmsay;
|
new_category.log_to_gmsay = log_settings[i].log_to_gmsay;
|
||||||
new_category.log_to_file = log_settings[i].log_to_file;
|
new_category.log_to_file = log_settings[i].log_to_file;
|
||||||
new_category.log_to_discord = log_settings[i].log_to_discord;
|
new_category.log_to_discord = log_settings[i].log_to_discord;
|
||||||
|
db_categories_to_add.emplace_back(new_category);
|
||||||
LogsysCategoriesRepository::InsertOne(*m_database, new_category);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!db_categories_to_add.empty()) {
|
||||||
|
LogsysCategoriesRepository::ReplaceMany(*m_database, db_categories_to_add);
|
||||||
|
LoadLogDatabaseSettings();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
LogInfo("Loaded [{}] log categories", categories.size());
|
LogInfo("Loaded [{}] log categories", categories.size());
|
||||||
|
|
||||||
auto webhooks = DiscordWebhooksRepository::GetWhere(*m_database, fmt::format("id < {}", MAX_DISCORD_WEBHOOK_ID));
|
auto webhooks = DiscordWebhooksRepository::GetWhere(*m_database, fmt::format("id < {}", MAX_DISCORD_WEBHOOK_ID));
|
||||||
@@ -695,6 +701,8 @@ EQEmuLogSys *EQEmuLogSys::LoadLogDatabaseSettings()
|
|||||||
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Crash].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Crash].log_to_gmsay = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Crash].log_to_gmsay = static_cast<uint8>(Logs::General);
|
||||||
log_settings[Logs::Crash].log_to_file = static_cast<uint8>(Logs::General);
|
log_settings[Logs::Crash].log_to_file = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Info].log_to_file = static_cast<uint8>(Logs::General);
|
||||||
|
log_settings[Logs::Info].log_to_console = static_cast<uint8>(Logs::General);
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,6 +139,8 @@ namespace Logs {
|
|||||||
PlayerEvents,
|
PlayerEvents,
|
||||||
DataBuckets,
|
DataBuckets,
|
||||||
Zoning,
|
Zoning,
|
||||||
|
EqTime,
|
||||||
|
Corpses,
|
||||||
MaxCategoryID /* Don't Remove this */
|
MaxCategoryID /* Don't Remove this */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -237,6 +239,8 @@ namespace Logs {
|
|||||||
"PlayerEvents",
|
"PlayerEvents",
|
||||||
"DataBuckets",
|
"DataBuckets",
|
||||||
"Zoning",
|
"Zoning",
|
||||||
|
"EqTime",
|
||||||
|
"Corpses",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -814,6 +814,26 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::Zoning, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEqTime(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::EqTime))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogEqTimeDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::EqTime))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::EqTime, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCorpses(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Corpses))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogCorpsesDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Corpses))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::Corpses, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define Log(debug_level, log_category, message, ...) do {\
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
||||||
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
|||||||
+51
-7
@@ -46,16 +46,16 @@ EQTime::EQTime()
|
|||||||
timezone = 0;
|
timezone = 0;
|
||||||
memset(&eqTime, 0, sizeof(eqTime));
|
memset(&eqTime, 0, sizeof(eqTime));
|
||||||
//Defaults for time
|
//Defaults for time
|
||||||
TimeOfDay_Struct start;
|
TimeOfDay_Struct t{};
|
||||||
start.day = 1;
|
t.day = 1;
|
||||||
start.hour = 9;
|
t.hour = 9;
|
||||||
start.minute = 0;
|
t.minute = 0;
|
||||||
start.month = 1;
|
t.month = 1;
|
||||||
start.year = 3100;
|
t.year = 3100;
|
||||||
//Set default time zone
|
//Set default time zone
|
||||||
timezone = 0;
|
timezone = 0;
|
||||||
//Start EQTimer
|
//Start EQTimer
|
||||||
SetCurrentEQTimeOfDay(start, time(0));
|
SetCurrentEQTimeOfDay(t, time(nullptr));
|
||||||
}
|
}
|
||||||
|
|
||||||
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
//getEQTimeOfDay - Reads timeConvert and writes the result to eqTimeOfDay
|
||||||
@@ -200,3 +200,47 @@ void EQTime::ToString(TimeOfDay_Struct *t, std::string &str) {
|
|||||||
buf[127] = '\0';
|
buf[127] = '\0';
|
||||||
str = buf;
|
str = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsDayTime() {
|
||||||
|
TimeOfDay_Struct tod{}; //Day time is 5am to 6:59pm (14 hours in-game)
|
||||||
|
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
||||||
|
|
||||||
|
if (tod.hour >= 5 || tod.hour < 19) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsNightTime() {
|
||||||
|
TimeOfDay_Struct tod{}; //Night time is 7pm to 4:59am (10 hours in-game)
|
||||||
|
GetCurrentEQTimeOfDay(&tod); //TODO: what if it fails and returns zero?
|
||||||
|
|
||||||
|
if (tod.hour >= 19 || tod.hour < 5) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EQTime::IsInbetweenTime(uint8 min_time, uint8 max_time) {
|
||||||
|
TimeOfDay_Struct tod{};
|
||||||
|
GetCurrentEQTimeOfDay(&tod);
|
||||||
|
|
||||||
|
if (min_time == 0 || max_time == 0 || min_time > 24 || max_time > 24) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_time < min_time) {
|
||||||
|
if ((tod.hour >= min_time && tod.hour > max_time) || (tod.hour < min_time && tod.hour <= max_time)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (tod.hour >= min_time && tod.hour <= max_time) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ public:
|
|||||||
uint32 getEQTimeZone() { return timezone; }
|
uint32 getEQTimeZone() { return timezone; }
|
||||||
uint32 getEQTimeZoneHr() { return timezone/60; }
|
uint32 getEQTimeZoneHr() { return timezone/60; }
|
||||||
uint32 getEQTimeZoneMin() { return timezone%60; }
|
uint32 getEQTimeZoneMin() { return timezone%60; }
|
||||||
|
bool IsDayTime();
|
||||||
|
bool IsNightTime();
|
||||||
|
bool IsInbetweenTime(uint8 min_time, uint8 max_time);
|
||||||
|
|
||||||
//Set functions
|
//Set functions
|
||||||
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
int SetCurrentEQTimeOfDay(TimeOfDay_Struct start_eq, time_t start_real);
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Library General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Library General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
|
||||||
License along with this library; if not, write to the Free
|
|
||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
||||||
MA 02111-1307, USA */
|
|
||||||
|
|
||||||
/* Error messages for mysql clients */
|
|
||||||
/* error messages for the demon is in share/language/errmsg.sys */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
void init_client_errs(void);
|
|
||||||
extern const char *client_errors[]; /* Error messages */
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CR_MIN_ERROR 2000 /* For easier client code */
|
|
||||||
#define CR_MAX_ERROR 2999
|
|
||||||
#if defined(OS2) && defined( MYSQL_SERVER)
|
|
||||||
#define CER(X) client_errors[(X)-CR_MIN_ERROR]
|
|
||||||
#else
|
|
||||||
#define ER(X) client_errors[(X)-CR_MIN_ERROR]
|
|
||||||
#endif
|
|
||||||
#define CLIENT_ERRMAP 2 /* Errormap used by my_error() */
|
|
||||||
|
|
||||||
#define CR_UNKNOWN_ERROR 2000
|
|
||||||
#define CR_SOCKET_CREATE_ERROR 2001
|
|
||||||
#define CR_CONNECTION_ERROR 2002
|
|
||||||
#define CR_CONN_HOST_ERROR 2003
|
|
||||||
#define CR_IPSOCK_ERROR 2004
|
|
||||||
#define CR_UNKNOWN_HOST 2005
|
|
||||||
#define CR_SERVER_GONE_ERROR 2006
|
|
||||||
#define CR_VERSION_ERROR 2007
|
|
||||||
#define CR_OUT_OF_MEMORY 2008
|
|
||||||
#define CR_WRONG_HOST_INFO 2009
|
|
||||||
#define CR_LOCALHOST_CONNECTION 2010
|
|
||||||
#define CR_TCP_CONNECTION 2011
|
|
||||||
#define CR_SERVER_HANDSHAKE_ERR 2012
|
|
||||||
#define CR_SERVER_LOST 2013
|
|
||||||
#define CR_COMMANDS_OUT_OF_SYNC 2014
|
|
||||||
#define CR_NAMEDPIPE_CONNECTION 2015
|
|
||||||
#define CR_NAMEDPIPEWAIT_ERROR 2016
|
|
||||||
#define CR_NAMEDPIPEOPEN_ERROR 2017
|
|
||||||
#define CR_NAMEDPIPESETSTATE_ERROR 2018
|
|
||||||
#define CR_CANT_READ_CHARSET 2019
|
|
||||||
#define CR_NET_PACKET_TOO_LARGE 2020
|
|
||||||
@@ -37,6 +37,8 @@ void PlayerEventLogs::Init()
|
|||||||
db.emplace_back(e.id);
|
db.emplace_back(e.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<PlayerEventLogSettingsRepository::PlayerEventLogSettings> settings_to_insert{};
|
||||||
|
|
||||||
// insert entries that don't exist in database
|
// insert entries that don't exist in database
|
||||||
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||||
bool is_in_database = std::find(db.begin(), db.end(), i) != db.end();
|
bool is_in_database = std::find(db.begin(), db.end(), i) != db.end();
|
||||||
@@ -56,21 +58,21 @@ void PlayerEventLogs::Init()
|
|||||||
|
|
||||||
bool is_missing_in_database = std::find(db.begin(), db.end(), i) == db.end();
|
bool is_missing_in_database = std::find(db.begin(), db.end(), i) == db.end();
|
||||||
if (is_missing_in_database && is_implemented && !is_deprecated) {
|
if (is_missing_in_database && is_implemented && !is_deprecated) {
|
||||||
LogInfo(
|
LogInfo("[New] PlayerEvent [{}] ({})", PlayerEvent::EventName[i], i);
|
||||||
"[New] PlayerEvent [{}] ({})",
|
|
||||||
PlayerEvent::EventName[i],
|
|
||||||
i
|
|
||||||
);
|
|
||||||
|
|
||||||
auto c = PlayerEventLogSettingsRepository::NewEntity();
|
auto c = PlayerEventLogSettingsRepository::NewEntity();
|
||||||
c.id = i;
|
c.id = i;
|
||||||
c.event_name = PlayerEvent::EventName[i];
|
c.event_name = PlayerEvent::EventName[i];
|
||||||
c.event_enabled = m_settings[i].event_enabled;
|
c.event_enabled = m_settings[i].event_enabled;
|
||||||
c.retention_days = m_settings[i].retention_days;
|
c.retention_days = m_settings[i].retention_days;
|
||||||
PlayerEventLogSettingsRepository::InsertOne(*m_database, c);
|
settings_to_insert.emplace_back(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!settings_to_insert.empty()) {
|
||||||
|
PlayerEventLogSettingsRepository::ReplaceMany(*m_database, settings_to_insert);
|
||||||
|
}
|
||||||
|
|
||||||
bool processing_in_world = !RuleB(Logging, PlayerEventsQSProcess) && IsWorld();
|
bool processing_in_world = !RuleB(Logging, PlayerEventsQSProcess) && IsWorld();
|
||||||
bool processing_in_qs = RuleB(Logging, PlayerEventsQSProcess) && IsQueryServ();
|
bool processing_in_qs = RuleB(Logging, PlayerEventsQSProcess) && IsQueryServ();
|
||||||
|
|
||||||
@@ -611,7 +613,7 @@ void PlayerEventLogs::Process()
|
|||||||
|
|
||||||
void PlayerEventLogs::ProcessRetentionTruncation()
|
void PlayerEventLogs::ProcessRetentionTruncation()
|
||||||
{
|
{
|
||||||
LogInfo("Running truncation");
|
LogPlayerEvents("Running truncation");
|
||||||
|
|
||||||
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
for (int i = PlayerEvent::GM_COMMAND; i != PlayerEvent::MAX; i++) {
|
||||||
if (m_settings[i].retention_days > 0) {
|
if (m_settings[i].retention_days > 0) {
|
||||||
@@ -695,6 +697,8 @@ void PlayerEventLogs::SetSettingsDefaults()
|
|||||||
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
|
m_settings[PlayerEvent::KILLED_NAMED_NPC].event_enabled = 1;
|
||||||
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
|
m_settings[PlayerEvent::KILLED_RAID_NPC].event_enabled = 1;
|
||||||
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_PLAT].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;
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ namespace PlayerEvent {
|
|||||||
KILLED_NAMED_NPC,
|
KILLED_NAMED_NPC,
|
||||||
KILLED_RAID_NPC,
|
KILLED_RAID_NPC,
|
||||||
ITEM_CREATION,
|
ITEM_CREATION,
|
||||||
|
GUILD_TRIBUTE_DONATE_ITEM,
|
||||||
|
GUILD_TRIBUTE_DONATE_PLAT,
|
||||||
MAX // dont remove
|
MAX // dont remove
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -112,7 +114,9 @@ namespace PlayerEvent {
|
|||||||
"Killed NPC",
|
"Killed NPC",
|
||||||
"Killed Named NPC",
|
"Killed Named NPC",
|
||||||
"Killed Raid NPC",
|
"Killed Raid NPC",
|
||||||
"Item Creation"
|
"Item Creation",
|
||||||
|
"Guild Tribute Donate Item",
|
||||||
|
"Guild Tribute Donate Platinum"
|
||||||
};
|
};
|
||||||
|
|
||||||
// Generic struct used by all events
|
// Generic struct used by all events
|
||||||
@@ -942,6 +946,36 @@ namespace PlayerEvent {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItem {
|
||||||
|
uint32 item_id;
|
||||||
|
uint32 guild_favor;
|
||||||
|
|
||||||
|
// cereal
|
||||||
|
template<class Archive>
|
||||||
|
void serialize(Archive &ar)
|
||||||
|
{
|
||||||
|
ar(
|
||||||
|
CEREAL_NVP(item_id),
|
||||||
|
CEREAL_NVP(guild_favor)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonatePlat {
|
||||||
|
uint32 plat;
|
||||||
|
uint32 guild_favor;
|
||||||
|
|
||||||
|
// cereal
|
||||||
|
template<class Archive>
|
||||||
|
void serialize(Archive &ar)
|
||||||
|
{
|
||||||
|
ar(
|
||||||
|
CEREAL_NVP(plat),
|
||||||
|
CEREAL_NVP(guild_favor)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif //EQEMU_PLAYER_EVENTS_H
|
#endif //EQEMU_PLAYER_EVENTS_H
|
||||||
|
|||||||
+2
-2
@@ -96,12 +96,12 @@ bool IsOfEqualRace(int r1, int r2)
|
|||||||
// TODO: add more values
|
// TODO: add more values
|
||||||
switch (r1) {
|
switch (r1) {
|
||||||
case DARK_ELF:
|
case DARK_ELF:
|
||||||
if (r2 == RACE_NERIAK_CITIZEN_77) {
|
if (r2 == Race::NeriakCitizen) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case BARBARIAN:
|
case BARBARIAN:
|
||||||
if (r2 == RACE_HALAS_CITIZEN_90) {
|
if (r2 == Race::HalasCitizen) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,9 +28,7 @@ enum FACTION_VALUE {
|
|||||||
FACTION_WARMLY = 2,
|
FACTION_WARMLY = 2,
|
||||||
FACTION_KINDLY = 3,
|
FACTION_KINDLY = 3,
|
||||||
FACTION_AMIABLY = 4,
|
FACTION_AMIABLY = 4,
|
||||||
|
|
||||||
FACTION_INDIFFERENTLY = 5,
|
FACTION_INDIFFERENTLY = 5,
|
||||||
|
|
||||||
FACTION_APPREHENSIVELY = 6,
|
FACTION_APPREHENSIVELY = 6,
|
||||||
FACTION_DUBIOUSLY = 7,
|
FACTION_DUBIOUSLY = 7,
|
||||||
FACTION_THREATENINGLY = 8,
|
FACTION_THREATENINGLY = 8,
|
||||||
@@ -75,23 +73,6 @@ struct NPCFaction
|
|||||||
uint8 temp;
|
uint8 temp;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Faction Associations give a much more live like faction system
|
|
||||||
// Basically the primary faction and magnitude of a faction hit will generate the rest of them
|
|
||||||
|
|
||||||
// Largest faction I could find quickly was Lord Inquisitor Seru with 9 total hits (8 associations) so 8 + 2 for max for now
|
|
||||||
#define MAX_FACTION_ASSOC 10
|
|
||||||
|
|
||||||
// this is the ID of a faction association and it's multiplier
|
|
||||||
struct FactionAssociationHit {
|
|
||||||
int id;
|
|
||||||
float multiplier;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct FactionAssociations {
|
|
||||||
// maybe there should be more data here, fine for now
|
|
||||||
FactionAssociationHit hits[MAX_FACTION_ASSOC];
|
|
||||||
};
|
|
||||||
|
|
||||||
const char *FactionValueToString(FACTION_VALUE faction_value);
|
const char *FactionValueToString(FACTION_VALUE faction_value);
|
||||||
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value);
|
FACTION_VALUE CalculateFaction(FactionMods* fm, int32 tmpCharacter_value);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -35,11 +35,6 @@ Core Zone features
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
//Uncomment this to cause a zone to basically idle
|
|
||||||
//when there are no players in it, mobs stop wandering, etc..
|
|
||||||
#define IDLE_WHEN_EMPTY
|
|
||||||
|
|
||||||
#ifdef EMBPERL
|
#ifdef EMBPERL
|
||||||
//Enable the new XS based perl parser
|
//Enable the new XS based perl parser
|
||||||
#define EMBPERL_XS
|
#define EMBPERL_XS
|
||||||
@@ -238,27 +233,6 @@ enum { //some random constants
|
|||||||
// Timer to update aggrometer
|
// Timer to update aggrometer
|
||||||
#define AGGRO_METER_UPDATE_MS 1000
|
#define AGGRO_METER_UPDATE_MS 1000
|
||||||
|
|
||||||
//Some hard coded statuses from commands and other places:
|
|
||||||
enum {
|
|
||||||
minStatusToBeGM = 40,
|
|
||||||
minStatusToUseGMCommands = 80,
|
|
||||||
minStatusToKick = 150,
|
|
||||||
minStatusToAvoidFalling = 100,
|
|
||||||
minStatusToIgnoreZoneFlags = 80,
|
|
||||||
minStatusToSeeOthersZoneFlags = 80,
|
|
||||||
minStatusToEditOtherGuilds = 80,
|
|
||||||
commandMovecharSelfOnly = 80, //below this == only self move allowed
|
|
||||||
commandMovecharToSpecials = 200, //ability to send people to cshom/load zones
|
|
||||||
commandCastSpecials = 100, //can cast special spells
|
|
||||||
commandInstacast = 100, //insta-cast all #casted spells
|
|
||||||
commandDoAnimOthers = 100, //can #doanim on others
|
|
||||||
commandLockZones = 101, //can lock or unlock zones
|
|
||||||
commandEditPlayerCorpses = 150, //can Edit Player Corpses
|
|
||||||
commandInterrogateInv = 100, //below this == only log on error state and self-only target dump
|
|
||||||
commandInvSnapshot = 150 //ability to clear/restore snapshots
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
// This is the item ID we use for say links, we use the max that fits in 5 ASCII chars
|
||||||
#define SAYLINK_ITEM_ID 0xFFFFF
|
#define SAYLINK_ITEM_ID 0xFFFFF
|
||||||
|
|
||||||
|
|||||||
+14
-8
@@ -38,25 +38,31 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
/**
|
|
||||||
* @param name
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
bool File::Exists(const std::string &name)
|
bool File::Exists(const std::string &name)
|
||||||
{
|
{
|
||||||
return fs::exists(fs::path{name});
|
struct stat sb{};
|
||||||
|
if (stat(name.c_str(), &sb) == 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param directory_name
|
|
||||||
*/
|
|
||||||
void File::Makedir(const std::string &directory_name)
|
void File::Makedir(const std::string &directory_name)
|
||||||
{
|
{
|
||||||
|
try {
|
||||||
fs::create_directory(directory_name);
|
fs::create_directory(directory_name);
|
||||||
fs::permissions(directory_name, fs::perms::owner_all);
|
fs::permissions(directory_name, fs::perms::owner_all);
|
||||||
|
}
|
||||||
|
catch (const fs::filesystem_error &ex) {
|
||||||
|
std::cout << "Failed to create directory: " << directory_name << std::endl;
|
||||||
|
std::cout << ex.what() << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string File::FindEqemuConfigPath()
|
std::string File::FindEqemuConfigPath()
|
||||||
|
|||||||
+962
-756
File diff suppressed because it is too large
Load Diff
+107
-53
@@ -5,6 +5,42 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "timer.h"
|
||||||
|
#include "../common/repositories/guild_members_repository.h"
|
||||||
|
#include "../common/repositories/guilds_repository.h"
|
||||||
|
|
||||||
|
struct DefaultPermissionStruct {
|
||||||
|
GuildAction id;
|
||||||
|
uint32 value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DefaultRankNamesStruct {
|
||||||
|
uint32 id;
|
||||||
|
std::string name;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeStruct {
|
||||||
|
Timer timer;
|
||||||
|
uint32 id_1;
|
||||||
|
uint32 id_2;
|
||||||
|
uint32 id_1_tier;
|
||||||
|
uint32 id_2_tier;
|
||||||
|
uint32 favor;
|
||||||
|
uint32 time_remaining;
|
||||||
|
uint32 enabled;
|
||||||
|
bool send_timer;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TributeData {
|
||||||
|
public:
|
||||||
|
//this level data stored in regular byte order and must be flipped before sending
|
||||||
|
TributeLevel_Struct tiers[MAX_TRIBUTE_TIERS];
|
||||||
|
uint8 tier_count;
|
||||||
|
uint32 unknown;
|
||||||
|
std::string name;
|
||||||
|
std::string description;
|
||||||
|
bool is_guild; //is a guild tribute item
|
||||||
|
};
|
||||||
|
|
||||||
class Database;
|
class Database;
|
||||||
|
|
||||||
@@ -28,6 +64,7 @@ class CharGuildInfo
|
|||||||
bool banker;
|
bool banker;
|
||||||
bool alt;
|
bool alt;
|
||||||
std::string public_note;
|
std::string public_note;
|
||||||
|
bool online;
|
||||||
};
|
};
|
||||||
|
|
||||||
//this object holds guild functionality shared between world and zone.
|
//this object holds guild functionality shared between world and zone.
|
||||||
@@ -38,21 +75,31 @@ class BaseGuildManager
|
|||||||
virtual ~BaseGuildManager();
|
virtual ~BaseGuildManager();
|
||||||
|
|
||||||
//this must be called before doing anything else with this object
|
//this must be called before doing anything else with this object
|
||||||
void SetDatabase(Database *db)
|
BaseGuildManager * SetDatabase(Database *db)
|
||||||
{
|
{
|
||||||
m_db = db;
|
m_db = db;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseGuildManager * SetContentDatabase(Database *db)
|
||||||
|
{
|
||||||
|
m_content_db = db;
|
||||||
|
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoadGuilds();
|
bool LoadGuilds();
|
||||||
bool RefreshGuild(uint32 guild_id);
|
virtual bool RefreshGuild(uint32 guild_id);
|
||||||
|
|
||||||
//guild edit actions.
|
//guild edit actions.
|
||||||
uint32 CreateGuild(const char* name, uint32 leader_char_id);
|
uint32 CreateGuild(std::string name, uint32 leader_char_id);
|
||||||
|
bool StoreGuildDB(uint32 guild_id);
|
||||||
bool DeleteGuild(uint32 guild_id);
|
bool DeleteGuild(uint32 guild_id);
|
||||||
bool RenameGuild(uint32 guild_id, const char* name);
|
bool RenameGuild(uint32 guild_id, std::string name);
|
||||||
bool SetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
bool SetGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||||
bool SetGuildURL(uint32 GuildID, const char* URL);
|
bool SetGuildURL(uint32 guild_id, std::string URL);
|
||||||
bool SetGuildChannel(uint32 GuildID, const char* Channel);
|
bool SetGuildChannel(uint32 guild_id, std::string Channel);
|
||||||
|
|
||||||
//character edit actions
|
//character edit actions
|
||||||
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool SetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
@@ -62,9 +109,16 @@ class BaseGuildManager
|
|||||||
bool ForceRankUpdate(uint32 charid);
|
bool ForceRankUpdate(uint32 charid);
|
||||||
bool GetAltFlag(uint32 CharID);
|
bool GetAltFlag(uint32 CharID);
|
||||||
bool SetAltFlag(uint32 charid, bool is_alt);
|
bool SetAltFlag(uint32 charid, bool is_alt);
|
||||||
bool GetBankerFlag(uint32 CharID);
|
bool GetBankerFlag(uint32 CharID, bool compat_mode = false);
|
||||||
|
bool GetGuildBankerStatus(uint32 guild_id, uint32 guild_rank);
|
||||||
bool SetTributeFlag(uint32 charid, bool enabled);
|
bool SetTributeFlag(uint32 charid, bool enabled);
|
||||||
bool SetPublicNote(uint32 charid, const char *note);
|
bool SetPublicNote(uint32 charid, std::string public_note);
|
||||||
|
uint32 UpdateDbGuildFavor(uint32 guild_id, uint32 enabled);
|
||||||
|
bool UpdateDbGuildTributeEnabled(uint32 guild_id, uint32 enabled);
|
||||||
|
bool UpdateDbMemberTributeEnabled(uint32 guild_id, uint32 char_id, uint32 enabled);
|
||||||
|
bool UpdateDbTributeTimeRemaining(uint32 guild_id, uint32 enabled);
|
||||||
|
uint32 UpdateDbMemberFavor(uint32 guild_id, uint32 char_id, uint32 favor);
|
||||||
|
bool UpdateDbMemberOnline(uint32 char_id, bool status);
|
||||||
|
|
||||||
//queries
|
//queries
|
||||||
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
bool GetCharInfo(const char *char_name, CharGuildInfo &into);
|
||||||
@@ -74,29 +128,24 @@ class BaseGuildManager
|
|||||||
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
bool GetGuildMOTD(uint32 guild_id, char *motd_buffer, char *setter_buffer) const;
|
||||||
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
bool GetGuildURL(uint32 GuildID, char *URLBuffer) const;
|
||||||
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
bool GetGuildChannel(uint32 GuildID, char *ChannelBuffer) const;
|
||||||
const char *GetRankName(uint32 guild_id, uint8 rank) const;
|
|
||||||
const char *GetGuildName(uint32 guild_id) const;
|
|
||||||
std::string GetGuildNameByID(uint32 guild_id) const;
|
|
||||||
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
|
||||||
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
bool IsCharacterInGuild(uint32 character_id, uint32 guild_id = 0);
|
||||||
bool GetGuildNameByID(uint32 guild_id, std::string &into) const;
|
bool GetGuildNameByID(uint32 guild_id, std::string& into) const;
|
||||||
uint32 GetGuildIDByName(const char *GuildName);
|
|
||||||
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
|
||||||
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
bool IsGuildLeader(uint32 guild_id, uint32 char_id) const;
|
||||||
uint8 GetDisplayedRank(uint32 guild_id, uint8 rank, uint32 char_id) const;
|
|
||||||
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;
|
||||||
// uint32 Getguild_id(uint32 eqid);
|
bool UpdateDbBankerFlag(uint32 charid, bool is_banker);
|
||||||
|
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;
|
||||||
|
uint32 GetGuildIDByName(const char *GuildName);
|
||||||
|
uint32 GetGuildIDByCharacterID(uint32 character_id);
|
||||||
uint32 FindGuildByLeader(uint32 leader) const;
|
uint32 FindGuildByLeader(uint32 leader) const;
|
||||||
// void GetGuildMembers(uint32 guild_id,GuildMember_Struct* gms);
|
|
||||||
uint32 NumberInGuild(uint32 guild_id);
|
uint32 NumberInGuild(uint32 guild_id);
|
||||||
// bool GetGuildRanks(uint32 guildeqid, GuildRanks_Struct* gr);
|
|
||||||
// bool EditGuild(uint32 guild_id, uint8 ranknum, GuildRankLevel_Struct* grl);
|
|
||||||
|
|
||||||
uint8 *MakeGuildList(const char *head_name, uint32 &length) const; //make a guild list packet, returns ownership of the buffer.
|
|
||||||
|
|
||||||
static const char *const GuildActionNames[_MaxGuildAction];
|
|
||||||
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
uint32 DoesAccountContainAGuildLeader(uint32 AccountID);
|
||||||
|
const char* GetRankName(uint32 guild_id, uint8 rank) const;
|
||||||
|
const char* GetGuildName(uint32 guild_id) const;
|
||||||
|
std::string GetGuildNameByID(uint32 guild_id) const;
|
||||||
|
std::string GetGuildRankName(uint32 guild_id, uint8 rank) const;
|
||||||
|
std::vector<GuildMembersRepository::GuildMembers> GetGuildMembers(uint32 guild_id);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//the methods which must be defined by base classes.
|
//the methods which must be defined by base classes.
|
||||||
@@ -105,33 +154,35 @@ class BaseGuildManager
|
|||||||
virtual void SendRankUpdate(uint32 CharID) = 0;
|
virtual void SendRankUpdate(uint32 CharID) = 0;
|
||||||
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
virtual void SendGuildDelete(uint32 guild_id) = 0;
|
||||||
|
|
||||||
uint32 DBCreateGuild(const char* name, uint32 leader_char_id);
|
uint32 UpdateDbCreateGuild(std::string name, uint32 leader_char_id);
|
||||||
bool DBDeleteGuild(uint32 guild_id);
|
bool UpdateDbDeleteGuild(uint32 guild_id, bool local_delete = true, bool db_delete = true);
|
||||||
bool DBRenameGuild(uint32 guild_id, const char* name);
|
bool UpdateDbRenameGuild(uint32 guild_id, std::string name);
|
||||||
bool DBSetGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
bool UpdateDbGuildLeader(uint32 guild_id, uint32 leader_char_id);
|
||||||
bool DBSetGuildMOTD(uint32 guild_id, const char* motd, const char *setter);
|
bool UpdateDbGuildMOTD(uint32 guild_id, std::string motd, std::string setter);
|
||||||
bool DBSetGuildURL(uint32 GuildID, const char* URL);
|
bool UpdateDbGuildURL(uint32 GuildID, std::string URL);
|
||||||
bool DBSetGuildChannel(uint32 GuildID, const char* Channel);
|
bool UpdateDbGuildChannel(uint32 GuildID, std::string Channel);
|
||||||
bool DBSetGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
bool UpdateDbGuild(uint32 charid, uint32 guild_id, uint8 rank);
|
||||||
bool DBSetGuildRank(uint32 charid, uint8 rank);
|
bool UpdateDbGuildRank(uint32 charid, uint8 rank);
|
||||||
bool DBSetBankerFlag(uint32 charid, bool is_banker);
|
bool UpdateDbAltFlag(uint32 charid, bool is_alt);
|
||||||
bool DBSetAltFlag(uint32 charid, bool is_alt);
|
bool UpdateDbTributeFlag(uint32 charid, bool enabled);
|
||||||
bool DBSetTributeFlag(uint32 charid, bool enabled);
|
bool UpdateDbPublicNote(uint32 charid, std::string public_note);
|
||||||
bool DBSetPublicNote(uint32 charid, const char *note);
|
|
||||||
bool QueryWithLogging(std::string query, const char *errmsg);
|
bool QueryWithLogging(std::string query, const char *errmsg);
|
||||||
// void DBSetPublicNote(uint32 guild_id,char* charname, char* note);
|
|
||||||
|
|
||||||
bool LocalDeleteGuild(uint32 guild_id);
|
bool LocalDeleteGuild(uint32 guild_id);
|
||||||
|
|
||||||
class RankInfo
|
struct RankInfo
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
RankInfo();
|
RankInfo();
|
||||||
std::string name;
|
std::string rank_name;
|
||||||
bool permissions[_MaxGuildAction];
|
|
||||||
};
|
};
|
||||||
class GuildInfo
|
struct Functions
|
||||||
{
|
{
|
||||||
|
uint32 id;
|
||||||
|
uint32 perm_id;
|
||||||
|
uint32 guild_id;
|
||||||
|
uint32 perm_value;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
class GuildInfo {
|
||||||
public:
|
public:
|
||||||
GuildInfo();
|
GuildInfo();
|
||||||
std::string name;
|
std::string name;
|
||||||
@@ -139,24 +190,27 @@ class BaseGuildManager
|
|||||||
std::string motd_setter;
|
std::string motd_setter;
|
||||||
std::string url;
|
std::string url;
|
||||||
std::string channel;
|
std::string channel;
|
||||||
|
uint32 leader;
|
||||||
uint32 leader_char_id;
|
|
||||||
uint8 minstatus;
|
uint8 minstatus;
|
||||||
//tribute is not in here on purpose, since it is only valid in world!
|
std::string rank_names[GUILD_MAX_RANK + 1];
|
||||||
RankInfo ranks[GUILD_MAX_RANK + 1];
|
Functions functions[GUILD_MAX_FUNCTIONS + 1];
|
||||||
|
GuildTributeStruct tribute;
|
||||||
};
|
};
|
||||||
|
virtual BaseGuildManager::GuildInfo* GetGuildByGuildID(uint32 guild_id);
|
||||||
|
uint32 GetGuildTributeTimeRemaining(uint32 guild_id);
|
||||||
|
|
||||||
|
protected:
|
||||||
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
std::map<uint32, GuildInfo *> m_guilds; //we own the pointers in this map
|
||||||
void ClearGuilds(); //clears internal structure
|
void ClearGuilds(); //clears internal structure
|
||||||
|
|
||||||
Database *m_db; //we do not own this
|
Database *m_db;
|
||||||
|
Database *m_content_db;
|
||||||
|
|
||||||
bool _StoreGuildDB(uint32 guild_id);
|
bool _StoreGuildDB(uint32 guild_id);
|
||||||
GuildInfo *_CreateGuild(uint32 guild_id, const char *guild_name, uint32 account_id, uint8 minstatus, const char *guild_motd, const char *motd_setter, const char *Channel, const char *URL);
|
GuildInfo* _CreateGuild(uint32 guild_id, std::string guild_name, uint32 leader_char_id, uint8 minstatus, std::string guild_motd, std::string motd_setter, std::string Channel, std::string URL, uint32 favour);
|
||||||
uint32 _GetFreeGuildID();
|
uint32 _GetFreeGuildID();
|
||||||
|
GuildsRepository::Guilds CreateGuildRepoFromGuildInfo(uint32 guild_id, BaseGuildManager::GuildInfo& in);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /*GUILD_BASE_H_*/
|
#endif /*GUILD_BASE_H_*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+55
-15
@@ -16,31 +16,71 @@
|
|||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUILD_H
|
#ifndef GUILDS_H
|
||||||
#define GUILD_H
|
#define GUILDS_H
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
#define GUILD_NONE 0xFFFFFFFF // user has no guild
|
||||||
|
|
||||||
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
#define GUILD_MAX_RANK 8 // 0-2 - some places in the code assume a single digit, dont go above 9
|
||||||
|
#define GUILD_MAX_FUNCTIONS 30
|
||||||
|
#define GUILD_TRIBUTES_MODIFY 1
|
||||||
|
#define GUILD_TRIBUTES_SAVE 0
|
||||||
|
#define GUILD_TRIBUTES_OFF 0
|
||||||
|
#define GUILD_TRIBUTES_ON 1
|
||||||
|
#define GUILD_INVITE_DECLINE 9
|
||||||
|
|
||||||
//defines for standard ranks
|
//defines for standard ranks
|
||||||
#define GUILD_MEMBER 0
|
#define GUILD_MEMBER_TI 0
|
||||||
#define GUILD_OFFICER 1
|
#define GUILD_OFFICER_TI 1
|
||||||
#define GUILD_LEADER 2
|
#define GUILD_LEADER_TI 2
|
||||||
#define GUILD_RANK_NONE (GUILD_MAX_RANK+1)
|
#define GUILD_RANK_NONE_TI (GUILD_MAX_RANK + 1)
|
||||||
|
|
||||||
|
//defines for standard ranks base on RoF2 definitions
|
||||||
|
#define GUILD_RANK_NONE 0
|
||||||
|
#define GUILD_LEADER 1
|
||||||
|
#define GUILD_SENIOR_OFFICER 2
|
||||||
|
#define GUILD_OFFICER 3
|
||||||
|
#define GUILD_SENIOR_MEMBER 4
|
||||||
|
#define GUILD_MEMBER 5
|
||||||
|
#define GUILD_JUNIOR_MEMBER 6
|
||||||
|
#define GUILD_INITIATE 7
|
||||||
|
#define GUILD_RECRUIT 8
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
GUILD_HEAR = 0,
|
GUILD_ACTION_BANNER_CHANGE = 1,
|
||||||
GUILD_SPEAK = 1,
|
GUILD_ACTION_BANNER_PLANT = 2,
|
||||||
GUILD_INVITE = 2,
|
GUILD_ACTION_BANNER_REMOVE = 3,
|
||||||
GUILD_REMOVE = 3,
|
GUILD_ACTION_DISPLAY_GUILD_NAME = 4,
|
||||||
GUILD_PROMOTE = 4,
|
GUILD_ACTION_RANKS_CHANGE_PERMISSIONS = 5,
|
||||||
GUILD_DEMOTE = 5,
|
GUILD_ACTION_RANKS_CHANGE_RANK_NAMES = 6,
|
||||||
GUILD_MOTD = 6,
|
GUILD_ACTION_MEMBERS_INVITE = 7,
|
||||||
GUILD_WARPEACE = 7,
|
GUILD_ACTION_MEMBERS_PROMOTE = 8,
|
||||||
_MaxGuildAction
|
GUILD_ACTION_MEMBERS_DEMOTE = 9,
|
||||||
|
GUILD_ACTION_MEMBERS_REMOVE = 10,
|
||||||
|
GUILD_ACTION_EDIT_RECRUITING_SETTINGS = 11,
|
||||||
|
GUILD_ACTION_EDIT_PUBLIC_NOTES = 12,
|
||||||
|
GUILD_ACTION_BANK_DEPOSIT_ITEMS = 13,
|
||||||
|
GUILD_ACTION_BANK_WITHDRAW_ITEMS = 14,
|
||||||
|
GUILD_ACTION_BANK_VIEW_ITEMS = 15,
|
||||||
|
GUILD_ACTION_BANK_PROMOTE_ITEMS = 16,
|
||||||
|
GUILD_ACTION_BANK_CHANGE_ITEM_PERMISSIONS = 17,
|
||||||
|
GUILD_ACTION_CHANGE_THE_MOTD = 18,
|
||||||
|
GUILD_ACTION_GUILD_CHAT_SEE = 19,
|
||||||
|
GUILD_ACTION_GUILD_CHAT_SPEAK_IN = 20,
|
||||||
|
GUILD_ACTION_SEND_THE_WHOLE_GUILD_E_MAIL = 21,
|
||||||
|
GUILD_ACTION_TRIBUTE_CHANGE_FOR_OTHERS = 22,
|
||||||
|
GUILD_ACTION_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 23,
|
||||||
|
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_FOR_OTHERS = 24,
|
||||||
|
GUILD_ACTION_TROPHY_TRIBUTE_CHANGE_ACTIVE_BENEFIT = 25,
|
||||||
|
GUILD_ACTION_MEMBERS_CHANGE_ALT_FLAG_FOR_OTHER = 26,
|
||||||
|
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_BUY = 27,
|
||||||
|
GUILD_ACTION_REAL_ESTATE_GUILD_PLOT_SELL = 28,
|
||||||
|
GUILD_ACTION_REAL_ESTATE_MODIFY_TROPHIES = 29,
|
||||||
|
GUILD_ACTION_MEMBERS_DEMOTE_SELF = 30,
|
||||||
} GuildAction;
|
} GuildAction;
|
||||||
|
|
||||||
|
constexpr int format_as(GuildAction action) { return static_cast<int>(action); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -173,7 +173,8 @@ EQ::ItemInstance* EQ::InventoryProfile::GetItem(int16 slot_id) const
|
|||||||
result = _GetItem(m_inv, slot_id);
|
result = _GetItem(m_inv, slot_id);
|
||||||
}
|
}
|
||||||
else if ((slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) ||
|
else if ((slot_id >= invslot::EQUIPMENT_BEGIN && slot_id <= invslot::EQUIPMENT_END) ||
|
||||||
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END)) {
|
(slot_id >= invslot::TRIBUTE_BEGIN && slot_id <= invslot::TRIBUTE_END) ||
|
||||||
|
(slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END)) {
|
||||||
// Equippable slots (on body)
|
// Equippable slots (on body)
|
||||||
result = _GetItem(m_worn, slot_id);
|
result = _GetItem(m_worn, slot_id);
|
||||||
}
|
}
|
||||||
@@ -465,6 +466,10 @@ EQ::ItemInstance* EQ::InventoryProfile::PopItem(int16 slot_id)
|
|||||||
p = m_worn[slot_id];
|
p = m_worn[slot_id];
|
||||||
m_worn.erase(slot_id);
|
m_worn.erase(slot_id);
|
||||||
}
|
}
|
||||||
|
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
|
||||||
|
p = m_worn[slot_id];
|
||||||
|
m_worn.erase(slot_id);
|
||||||
|
}
|
||||||
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||||
p = m_bank[slot_id];
|
p = m_bank[slot_id];
|
||||||
m_bank.erase(slot_id);
|
m_bank.erase(slot_id);
|
||||||
@@ -801,34 +806,35 @@ int16 EQ::InventoryProfile::HasItemByLoreGroup(uint32 loregroup, uint8 where)
|
|||||||
// Returns slot_id when there's one available, else SLOT_INVALID
|
// Returns slot_id when there's one available, else SLOT_INVALID
|
||||||
int16 EQ::InventoryProfile::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, bool is_arrow)
|
int16 EQ::InventoryProfile::FindFreeSlot(bool for_bag, bool try_cursor, uint8 min_size, bool is_arrow)
|
||||||
{
|
{
|
||||||
// Check basic inventory
|
const int16 last_bag_slot = (RuleI(World, ExpansionSettings) == -1 || RuleI(World, ExpansionSettings) & EQ::expansions::bitHoT) ? EQ::invslot::slotGeneral10 : EQ::invslot::slotGeneral8;
|
||||||
for (int16 i = invslot::GENERAL_BEGIN; i <= invslot::GENERAL_END; i++) {
|
|
||||||
if ((((uint64)1 << i) & m_lookup->PossessionsBitmask) == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!GetItem(i))
|
for (int16 i = invslot::GENERAL_BEGIN; i <= last_bag_slot; i++) { // Check basic inventory
|
||||||
// Found available slot in personal inventory
|
if ((((uint64) 1 << i) & m_lookup->PossessionsBitmask) == 0) {
|
||||||
return i;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!GetItem(i)) {
|
||||||
|
return i; // Found available slot in personal inventory
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!for_bag) {
|
if (!for_bag) {
|
||||||
for (int16 i = invslot::GENERAL_BEGIN; i <= invslot::GENERAL_END; i++) {
|
for (int16 i = invslot::GENERAL_BEGIN; i <= last_bag_slot; i++) {
|
||||||
if ((((uint64)1 << i) & m_lookup->PossessionsBitmask) == 0)
|
if ((((uint64) 1 << i) & m_lookup->PossessionsBitmask) == 0) {
|
||||||
continue;
|
|
||||||
|
|
||||||
const ItemInstance* inst = GetItem(i);
|
|
||||||
if (inst && inst->IsClassBag() && inst->GetItem()->BagSize >= min_size)
|
|
||||||
{
|
|
||||||
if (inst->GetItem()->BagType == item::BagTypeQuiver && inst->GetItem()->ItemType != item::ItemTypeArrow)
|
|
||||||
{
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 base_slot_id = InventoryProfile::CalcSlotId(i, invbag::SLOT_BEGIN);
|
const auto *inst = GetItem(i);
|
||||||
|
if (inst && inst->IsClassBag() && inst->GetItem()->BagSize >= min_size) {
|
||||||
|
if (inst->GetItem()->BagType == item::BagTypeQuiver &&
|
||||||
|
inst->GetItem()->ItemType != item::ItemTypeArrow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
uint8 slots = inst->GetItem()->BagSlots;
|
const int16 base_slot_id = InventoryProfile::CalcSlotId(i, invbag::SLOT_BEGIN);
|
||||||
uint8 j;
|
|
||||||
for (j = invbag::SLOT_BEGIN; j<slots; j++) {
|
const uint8 slots = inst->GetItem()->BagSlots;
|
||||||
|
for (uint8 j = invbag::SLOT_BEGIN; j < slots; j++) {
|
||||||
if (!GetItem(base_slot_id + j)) {
|
if (!GetItem(base_slot_id + j)) {
|
||||||
// Found available slot within bag
|
// Found available slot within bag
|
||||||
return (base_slot_id + j);
|
return (base_slot_id + j);
|
||||||
@@ -1418,6 +1424,10 @@ int16 EQ::InventoryProfile::_PutItem(int16 slot_id, ItemInstance* inst)
|
|||||||
m_worn[slot_id] = inst;
|
m_worn[slot_id] = inst;
|
||||||
result = slot_id;
|
result = slot_id;
|
||||||
}
|
}
|
||||||
|
else if (slot_id >= invslot::GUILD_TRIBUTE_BEGIN && slot_id <= invslot::GUILD_TRIBUTE_END) {
|
||||||
|
m_worn[slot_id] = inst;
|
||||||
|
result = slot_id;
|
||||||
|
}
|
||||||
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
else if (slot_id >= invslot::BANK_BEGIN && slot_id <= invslot::BANK_END) {
|
||||||
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
|
if (slot_id - EQ::invslot::BANK_BEGIN < m_lookup->InventoryTypeSize.Bank) {
|
||||||
m_bank[slot_id] = inst;
|
m_bank[slot_id] = inst;
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace EQ
|
|||||||
|
|
||||||
// Swap items in inventory
|
// Swap items in inventory
|
||||||
enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel };
|
enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel };
|
||||||
bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = RACE_DOUG_0, uint8 class_id = NO_CLASS, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0);
|
bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = Race::Doug, uint8 class_id = Class::None, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0);
|
||||||
|
|
||||||
// Remove item from inventory
|
// Remove item from inventory
|
||||||
bool DeleteItem(int16 slot_id, int16 quantity = 0);
|
bool DeleteItem(int16 slot_id, int16 quantity = 0);
|
||||||
|
|||||||
@@ -356,6 +356,7 @@ namespace EQ
|
|||||||
struct ItemData {
|
struct ItemData {
|
||||||
// Non packet based fields
|
// Non packet based fields
|
||||||
uint8 MinStatus {};
|
uint8 MinStatus {};
|
||||||
|
char Comment[255] {};
|
||||||
|
|
||||||
// Packet based fields
|
// Packet based fields
|
||||||
uint8 ItemClass {}; // Item Type: 0=common, 1=container, 2=book
|
uint8 ItemClass {}; // Item Type: 0=common, 1=container, 2=book
|
||||||
|
|||||||
@@ -1273,7 +1273,7 @@ int EQ::ItemInstance::GetItemBaneDamageBody(bool augments) const
|
|||||||
|
|
||||||
int EQ::ItemInstance::GetItemBaneDamageRace(bool augments) const
|
int EQ::ItemInstance::GetItemBaneDamageRace(bool augments) const
|
||||||
{
|
{
|
||||||
int race = RACE_DOUG_0;
|
int race = Race::Doug;
|
||||||
const auto item = GetItem();
|
const auto item = GetItem();
|
||||||
if (item) {
|
if (item) {
|
||||||
race = item->BaneDmgRace;
|
race = item->BaneDmgRace;
|
||||||
@@ -1791,6 +1791,27 @@ int EQ::ItemInstance::RemoveTaskDeliveredItems()
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 EQ::ItemInstance::GetItemGuildFavor() const
|
||||||
|
{
|
||||||
|
uint32 total = 0;
|
||||||
|
const auto item = GetItem();
|
||||||
|
if (item) {
|
||||||
|
return total = item->GuildFavor;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<uint32> EQ::ItemInstance::GetAugmentIDs() const
|
||||||
|
{
|
||||||
|
std::vector<uint32> augments;
|
||||||
|
|
||||||
|
for (uint8 slot_id = invaug::SOCKET_BEGIN; slot_id <= invaug::SOCKET_END; slot_id++) {
|
||||||
|
augments.push_back(GetAugment(slot_id) ? GetAugmentItemID(slot_id) : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return augments;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// class EvolveInfo
|
// class EvolveInfo
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -299,6 +299,8 @@ namespace EQ
|
|||||||
int GetItemHeroicDR(bool augments = false) const;
|
int GetItemHeroicDR(bool augments = false) const;
|
||||||
int GetItemHeroicCorrup(bool augments = false) const;
|
int GetItemHeroicCorrup(bool augments = false) const;
|
||||||
int GetItemHaste(bool augments = false) const;
|
int GetItemHaste(bool augments = false) const;
|
||||||
|
uint32 GetItemGuildFavor() const;
|
||||||
|
std::vector<uint32> GetAugmentIDs() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
//////////////////////////
|
//////////////////////////
|
||||||
|
|||||||
+24640
File diff suppressed because it is too large
Load Diff
@@ -1,54 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
Copyright (C) 2001-2002 EQEMu Development Team (http://eqemulator.org)
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
are required to give you total support for your newly bought product;
|
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
#ifndef LANGUAGES_H
|
|
||||||
#define LANGUAGES_H
|
|
||||||
#include "../common/types.h"
|
|
||||||
|
|
||||||
#define LANG_COMMON_TONGUE 0
|
|
||||||
#define LANG_BARBARIAN 1
|
|
||||||
#define LANG_ERUDIAN 2
|
|
||||||
#define LANG_ELVISH 3
|
|
||||||
#define LANG_DARK_ELVISH 4
|
|
||||||
#define LANG_DWARVISH 5
|
|
||||||
#define LANG_TROLL 6
|
|
||||||
#define LANG_OGRE 7
|
|
||||||
#define LANG_GNOMISH 8
|
|
||||||
#define LANG_HALFLING 9
|
|
||||||
#define LANG_THIEVES_CANT 10
|
|
||||||
#define LANG_OLD_ERUDIAN 11
|
|
||||||
#define LANG_ELDER_ELVISH 12
|
|
||||||
#define LANG_FROGLOK 13
|
|
||||||
#define LANG_GOBLIN 14
|
|
||||||
#define LANG_GNOLL 15
|
|
||||||
#define LANG_COMBINE_TONGUE 16
|
|
||||||
#define LANG_ELDER_TEIRDAL 17
|
|
||||||
#define LANG_LIZARDMAN 18
|
|
||||||
#define LANG_ORCISH 19
|
|
||||||
#define LANG_FAERIE 20
|
|
||||||
#define LANG_DRAGON 21
|
|
||||||
#define LANG_ELDER_DRAGON 22
|
|
||||||
#define LANG_DARK_SPEECH 23
|
|
||||||
#define LANG_VAH_SHIR 24
|
|
||||||
#define LANG_ALARAN 25
|
|
||||||
#define LANG_HADAL 26
|
|
||||||
#define LANG_UNKNOWN 27
|
|
||||||
|
|
||||||
#define MAX_LANGUAGE_SKILL 100
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef CODE_LOOT_H
|
||||||
|
#define CODE_LOOT_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include "../common/types.h"
|
||||||
|
|
||||||
|
struct LootItem {
|
||||||
|
uint32 item_id;
|
||||||
|
int16 equip_slot;
|
||||||
|
uint16 charges;
|
||||||
|
uint16 lootslot;
|
||||||
|
uint32 aug_1;
|
||||||
|
uint32 aug_2;
|
||||||
|
uint32 aug_3;
|
||||||
|
uint32 aug_4;
|
||||||
|
uint32 aug_5;
|
||||||
|
uint32 aug_6;
|
||||||
|
bool attuned;
|
||||||
|
std::string custom_data;
|
||||||
|
uint32 ornamenticon{};
|
||||||
|
uint32 ornamentidfile{};
|
||||||
|
uint32 ornament_hero_model{};
|
||||||
|
uint16 trivial_min_level;
|
||||||
|
uint16 trivial_max_level;
|
||||||
|
uint16 npc_min_level;
|
||||||
|
uint16 npc_max_level;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::list<LootItem*> LootItems;
|
||||||
|
|
||||||
|
|
||||||
|
#endif //CODE_LOOT_H
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/* EQEMu: Everquest Server Emulator
|
|
||||||
Copyright (C) 2001-2013 EQEMu Development Team (http://eqemu.org)
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; version 2 of the License.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
|
||||||
are required to give you total support for your newly bought product;
|
|
||||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _EQEMU_LOOTTABLE_H
|
|
||||||
#define _EQEMU_LOOTTABLE_H
|
|
||||||
|
|
||||||
#include "types.h"
|
|
||||||
|
|
||||||
#pragma pack(1)
|
|
||||||
struct LootTableEntries_Struct {
|
|
||||||
uint32 lootdrop_id;
|
|
||||||
uint8 droplimit;
|
|
||||||
uint8 mindrop;
|
|
||||||
uint8 multiplier;
|
|
||||||
float probability;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ContentFlags {
|
|
||||||
int16 min_expansion;
|
|
||||||
int16 max_expansion;
|
|
||||||
char content_flags[100];
|
|
||||||
char content_flags_disabled[100];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LootTable_Struct {
|
|
||||||
uint32 mincash;
|
|
||||||
uint32 maxcash;
|
|
||||||
uint32 avgcoin;
|
|
||||||
uint32 NumEntries;
|
|
||||||
ContentFlags content_flags;
|
|
||||||
LootTableEntries_Struct Entries[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LootDropEntries_Struct {
|
|
||||||
uint32 item_id;
|
|
||||||
int8 item_charges;
|
|
||||||
uint8 equip_item;
|
|
||||||
float chance;
|
|
||||||
uint16 trivial_min_level;
|
|
||||||
uint16 trivial_max_level;
|
|
||||||
uint16 npc_min_level;
|
|
||||||
uint16 npc_max_level;
|
|
||||||
uint8 multiplier;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LootDrop_Struct {
|
|
||||||
uint32 NumEntries;
|
|
||||||
ContentFlags content_flags;
|
|
||||||
LootDropEntries_Struct Entries[0];
|
|
||||||
};
|
|
||||||
#pragma pack()
|
|
||||||
|
|
||||||
#endif
|
|
||||||
+157
-105
@@ -34,6 +34,7 @@
|
|||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -201,7 +202,7 @@ namespace RoF
|
|||||||
unsigned char *emu_buffer = in->pBuffer;
|
unsigned char *emu_buffer = in->pBuffer;
|
||||||
uint32 opcode = *((uint32*)emu_buffer);
|
uint32 opcode = *((uint32*)emu_buffer);
|
||||||
|
|
||||||
if (opcode == 8) {
|
if (opcode == AlternateCurrencyMode::Populate) {
|
||||||
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(
|
auto outapp = new EQApplicationPacket(
|
||||||
@@ -1307,13 +1308,13 @@ namespace RoF
|
|||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu_e->rank) {
|
//switch (emu_e->rank) {
|
||||||
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
//case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
||||||
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
//case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
||||||
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
//case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
||||||
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
//default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
||||||
}
|
//}
|
||||||
|
PutFieldN(rank);
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
e->unknown01 = 0;
|
e->unknown01 = 0;
|
||||||
@@ -2608,88 +2609,124 @@ namespace RoF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3014,19 +3051,12 @@ namespace RoF
|
|||||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||||
|
|
||||||
eq->GuildID = emu->Unknown00;
|
eq->guild_id = emu->Unknown00;
|
||||||
|
eq->rank = emu->rank;
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
switch (emu->Rank) {
|
OUT(banker);
|
||||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
eq->unknown76 = 1;
|
||||||
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
|
|
||||||
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
|
|
||||||
default: { eq->Rank = emu->Rank; break; }
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
|
||||||
OUT(Banker);
|
|
||||||
eq->Unknown76 = 1;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -3128,7 +3158,7 @@ namespace RoF
|
|||||||
|
|
||||||
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
||||||
|
|
||||||
if (sas->type != AT_Size)
|
if (sas->type != AppearanceType::Size)
|
||||||
{
|
{
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
return;
|
return;
|
||||||
@@ -3831,8 +3861,8 @@ namespace RoF
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize += 60;
|
PacketSize += 60;
|
||||||
@@ -3936,10 +3966,22 @@ namespace RoF
|
|||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu->guildrank) {
|
switch (emu->guildrank) {
|
||||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
case 0: {
|
||||||
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5);
|
||||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
break;
|
||||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
} // GUILD_MEMBER 0
|
||||||
|
case 1: {
|
||||||
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3);
|
||||||
|
break;
|
||||||
|
} // GUILD_OFFICER 1
|
||||||
|
case 2: {
|
||||||
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1);
|
||||||
|
break;
|
||||||
|
} // GUILD_LEADER 2
|
||||||
|
default: {
|
||||||
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||||
|
break;
|
||||||
|
} //
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3965,8 +4007,8 @@ namespace RoF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown18
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown18
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown19
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // unknown19
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -4861,34 +4903,44 @@ namespace RoF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
IN(general.action);
|
||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
FINISH_DIRECT_DECODE();
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 36: { // raidPlayerNote unhandled
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
IN(action);
|
||||||
IN(parameter);
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
+209
-128
@@ -35,7 +35,7 @@
|
|||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../classes.h"
|
#include "../classes.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
#include "../../zone/raids.h"
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -274,7 +274,7 @@ namespace RoF2
|
|||||||
unsigned char *emu_buffer = in->pBuffer;
|
unsigned char *emu_buffer = in->pBuffer;
|
||||||
uint32 opcode = *((uint32*)emu_buffer);
|
uint32 opcode = *((uint32*)emu_buffer);
|
||||||
|
|
||||||
if (opcode == 8) {
|
if (opcode == AlternateCurrencyMode::Populate) {
|
||||||
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(
|
auto outapp = new EQApplicationPacket(
|
||||||
@@ -1319,6 +1319,7 @@ namespace RoF2
|
|||||||
buffer++;
|
buffer++;
|
||||||
|
|
||||||
// Guild ID
|
// Guild ID
|
||||||
|
//*((uint32*)buffer) = htonl(2);
|
||||||
buffer += sizeof(uint32);
|
buffer += sizeof(uint32);
|
||||||
|
|
||||||
//add member count.
|
//add member count.
|
||||||
@@ -1357,15 +1358,7 @@ namespace RoF2
|
|||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
|
PutFieldN(rank);
|
||||||
/* Translate older ranks to new values */
|
|
||||||
switch (emu_e->rank) {
|
|
||||||
case 0: { e->rank = htonl(5); break; } // GUILD_MEMBER 0
|
|
||||||
case 1: { e->rank = htonl(3); break; } // GUILD_OFFICER 1
|
|
||||||
case 2: { e->rank = htonl(1); break; } // GUILD_LEADER 2
|
|
||||||
default: { e->rank = htonl(emu_e->rank); break; } // GUILD_NONE
|
|
||||||
}
|
|
||||||
|
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
e->unknown01 = 0;
|
e->unknown01 = 0;
|
||||||
@@ -1395,8 +1388,10 @@ namespace RoF2
|
|||||||
|
|
||||||
OUT(GuildID);
|
OUT(GuildID);
|
||||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
||||||
OUT(ZoneID);
|
//OUT(ZoneID);
|
||||||
OUT(InstanceID);
|
//OUT(InstanceID);
|
||||||
|
eq->InstanceID = emu->InstanceID;
|
||||||
|
eq->ZoneID = emu->ZoneID;
|
||||||
OUT(LastSeen);
|
OUT(LastSeen);
|
||||||
eq->Unknown76 = 0;
|
eq->Unknown76 = 0;
|
||||||
|
|
||||||
@@ -1422,7 +1417,7 @@ namespace RoF2
|
|||||||
if (InBuffer[0])
|
if (InBuffer[0])
|
||||||
{
|
{
|
||||||
PacketSize += (5 + strlen(InBuffer));
|
PacketSize += (5 + strlen(InBuffer));
|
||||||
HighestGuildID = i - 1;
|
HighestGuildID += 1;
|
||||||
}
|
}
|
||||||
InBuffer += 64;
|
InBuffer += 64;
|
||||||
}
|
}
|
||||||
@@ -1460,6 +1455,30 @@ namespace RoF2
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "RoF2::ENCODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
OUT(type);
|
||||||
|
OUT(sub_index);
|
||||||
|
OUT(aug_index);
|
||||||
|
OUT(quantity);
|
||||||
|
OUT(unknown10);
|
||||||
|
OUT(unknown20);
|
||||||
|
OUT(favor);
|
||||||
|
|
||||||
|
structs::InventorySlot_Struct iss;
|
||||||
|
iss = ServerToRoF2Slot(emu->slot);
|
||||||
|
|
||||||
|
eq->slot = iss.Slot;
|
||||||
|
eq->sub_index = iss.SubIndex;
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ENCODE(OP_HPUpdate)
|
ENCODE(OP_HPUpdate)
|
||||||
{
|
{
|
||||||
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
|
SETUP_DIRECT_ENCODE(SpawnHPUpdate_Struct, structs::SpawnHPUpdate_Struct);
|
||||||
@@ -2466,6 +2485,8 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
outapp->WriteUInt32(0xffffffff);
|
outapp->WriteUInt32(0xffffffff);
|
||||||
outapp->WriteUInt32(0);
|
outapp->WriteUInt32(0);
|
||||||
|
// outapp->WriteUInt32(60);
|
||||||
|
// outapp->WriteUInt32(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
outapp->WriteUInt32(0); // Unknown
|
outapp->WriteUInt32(0); // Unknown
|
||||||
@@ -2678,100 +2699,124 @@ namespace RoF2
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == raidSetNote)
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
auto in_note = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(RaidGeneral_Struct));
|
|
||||||
auto note = (RaidGeneral_Struct*)outapp->pBuffer;
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
note->action = raidSetNote;
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(note->leader_name, in_note->leader_name, sizeof(note->leader_name));
|
|
||||||
strn0cpy(note->player_name, in_note->player_name, sizeof(note->leader_name));
|
OUT(action);
|
||||||
strn0cpy(note->note, in_note->note, sizeof(note->note));
|
OUT_str(player_name);
|
||||||
dest->QueuePacket(outapp);
|
OUT_str(leader_name);
|
||||||
safe_delete(outapp);
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetNote:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3080,19 +3125,12 @@ namespace RoF2
|
|||||||
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||||
|
|
||||||
eq->GuildID = emu->Unknown00;
|
eq->guild_id= emu->Unknown00;
|
||||||
|
eq->rank = emu->rank;
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
switch (emu->Rank) {
|
OUT(banker);
|
||||||
case 0: { eq->Rank = 5; break; } // GUILD_MEMBER 0
|
eq->unknown76 = 1;
|
||||||
case 1: { eq->Rank = 3; break; } // GUILD_OFFICER 1
|
|
||||||
case 2: { eq->Rank = 1; break; } // GUILD_LEADER 2
|
|
||||||
default: { eq->Rank = emu->Rank; break; }
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(eq->MemberName, emu->MemberName, sizeof(eq->MemberName));
|
|
||||||
OUT(Banker);
|
|
||||||
eq->Unknown76 = 1;
|
|
||||||
|
|
||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
@@ -3194,7 +3232,7 @@ namespace RoF2
|
|||||||
|
|
||||||
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
||||||
|
|
||||||
if (sas->type != AT_Size)
|
if (sas->type != AppearanceType::Size)
|
||||||
{
|
{
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
return;
|
return;
|
||||||
@@ -3962,7 +4000,7 @@ namespace RoF2
|
|||||||
if (strlen(emu->suffix))
|
if (strlen(emu->suffix))
|
||||||
PacketSize += strlen(emu->suffix) + 1;
|
PacketSize += strlen(emu->suffix) + 1;
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
PacketSize = PacketSize - 4; // No bodytype
|
PacketSize = PacketSize - 4; // No bodytype
|
||||||
@@ -3983,8 +4021,8 @@ namespace RoF2
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize += 60;
|
PacketSize += 60;
|
||||||
@@ -4052,7 +4090,7 @@ namespace RoF2
|
|||||||
// actually part of bitfields
|
// actually part of bitfields
|
||||||
uint8 OtherData = 0;
|
uint8 OtherData = 0;
|
||||||
|
|
||||||
if (emu->class_ == LDON_TREASURE) //LDoN Chest
|
if (emu->class_ == Class::LDoNTreasure) //LDoN Chest
|
||||||
{
|
{
|
||||||
OtherData = OtherData | 0x04;
|
OtherData = OtherData | 0x04;
|
||||||
}
|
}
|
||||||
@@ -4080,7 +4118,7 @@ namespace RoF2
|
|||||||
// int DefaultEmitterID
|
// int DefaultEmitterID
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
||||||
@@ -4154,12 +4192,13 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
||||||
|
|
||||||
/* Translate older ranks to new values */
|
/* Translate older ranks to new values */
|
||||||
switch (emu->guildrank) {
|
//switch (emu->guildrank) {
|
||||||
case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
//case 0: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 5); break; } // GUILD_MEMBER 0
|
||||||
case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
//case 1: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 3); break; } // GUILD_OFFICER 1
|
||||||
case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
//case 2: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 1); break; } // GUILD_LEADER 2
|
||||||
default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
//default: { VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank); break; } //
|
||||||
}
|
//}
|
||||||
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||||
}
|
}
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||||
@@ -4175,7 +4214,7 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->lastName);
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0); // aatitle
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->NPC ? 0 : 1); // unknown - Must be 1 for guild name to be shown abover players head.
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->guild_show);
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // TempPet
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, 0); // TempPet
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->petOwnerId);
|
||||||
@@ -4188,8 +4227,8 @@ namespace RoF2
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // These do something with OP_WeaponEquip1
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // These do something with OP_WeaponEquip1
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // ^
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0xffffffff); // ^
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -4931,7 +4970,7 @@ namespace RoF2
|
|||||||
|
|
||||||
strn0cpy(emu->target, eq->target, sizeof(emu->target));
|
strn0cpy(emu->target, eq->target, sizeof(emu->target));
|
||||||
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
strn0cpy(emu->name, eq->name, sizeof(emu->name));
|
||||||
// IN(rank);
|
IN(rank);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
@@ -4959,6 +4998,38 @@ namespace RoF2
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "RoF2::DECODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
IN(type);
|
||||||
|
IN(slot);
|
||||||
|
IN(sub_index);
|
||||||
|
IN(aug_index);
|
||||||
|
IN(unknown10);
|
||||||
|
IN(quantity);
|
||||||
|
IN(tribute_master_id);
|
||||||
|
IN(unknown20);
|
||||||
|
IN(guild_id);
|
||||||
|
IN(unknown28);
|
||||||
|
IN(unknown32);
|
||||||
|
|
||||||
|
structs::InventorySlot_Struct iss;
|
||||||
|
iss.Slot = eq->slot;
|
||||||
|
iss.SubIndex = eq->sub_index;
|
||||||
|
iss.AugIndex = eq->aug_index;
|
||||||
|
iss.Type = eq->type;
|
||||||
|
iss.Unknown01 = 0;
|
||||||
|
iss.Unknown02 = 0;
|
||||||
|
|
||||||
|
emu->slot = RoF2ToServerSlot(iss);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
/*DECODE(OP_InspectAnswer)
|
/*DECODE(OP_InspectAnswer)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||||
@@ -5091,34 +5162,44 @@ namespace RoF2
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
IN(general.action);
|
||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
FINISH_DIRECT_DECODE();
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 36: { // raidPlayerNote unhandled
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
IN(action);
|
||||||
IN(parameter);
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,6 +158,7 @@ namespace RoF2
|
|||||||
slotCursor
|
slotCursor
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr int16 format_as(InventorySlots slot) { return static_cast<int16>(slot); }
|
||||||
} // namespace enum_
|
} // namespace enum_
|
||||||
using namespace enum_;
|
using namespace enum_;
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ E(OP_GuildBank)
|
|||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
E(OP_GuildMemberUpdate)
|
E(OP_GuildMemberUpdate)
|
||||||
E(OP_GuildsList)
|
E(OP_GuildsList)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_HPUpdate)
|
E(OP_HPUpdate)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectBuffs)
|
E(OP_InspectBuffs)
|
||||||
@@ -182,6 +183,7 @@ D(OP_GuildBank)
|
|||||||
D(OP_GuildDemote)
|
D(OP_GuildDemote)
|
||||||
D(OP_GuildRemove)
|
D(OP_GuildRemove)
|
||||||
D(OP_GuildStatus)
|
D(OP_GuildStatus)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_ItemVerifyRequest)
|
D(OP_ItemVerifyRequest)
|
||||||
|
|||||||
@@ -2011,6 +2011,31 @@ struct GuildBankClear_Struct
|
|||||||
/*16*/ uint32 MainAreaCount;
|
/*16*/ uint32 MainAreaCount;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemRequest_Struct {
|
||||||
|
/*000*/ uint32 type;
|
||||||
|
/*004*/ uint16 slot;
|
||||||
|
/*006*/ uint16 sub_index;
|
||||||
|
/*008*/ uint16 aug_index;
|
||||||
|
/*010*/ uint16 unknown10;
|
||||||
|
/*012*/ uint32 quantity;
|
||||||
|
/*016*/ uint32 tribute_master_id;
|
||||||
|
/*020*/ uint32 unknown20;
|
||||||
|
/*024*/ uint32 guild_id;
|
||||||
|
/*028*/ uint32 unknown28;
|
||||||
|
/*032*/ uint32 unknown32;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemReply_Struct {
|
||||||
|
/*000*/ uint32 type;
|
||||||
|
/*004*/ uint16 slot;
|
||||||
|
/*006*/ uint16 sub_index;
|
||||||
|
/*008*/ uint16 aug_index;
|
||||||
|
/*010*/ uint16 unknown10;
|
||||||
|
/*012*/ uint32 quantity;
|
||||||
|
/*016*/ uint32 unknown20;
|
||||||
|
/*020*/ uint32 favor;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Money Loot
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@@ -3600,11 +3625,11 @@ struct GuildMakeLeader {
|
|||||||
// Update a guild members rank and banker status
|
// Update a guild members rank and banker status
|
||||||
struct GuildSetRank_Struct
|
struct GuildSetRank_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 GuildID; // Was Unknown00
|
/*00*/ uint32 guild_id; // Was Unknown00
|
||||||
/*04*/ uint32 Rank;
|
/*04*/ uint32 rank;
|
||||||
/*08*/ char MemberName[64];
|
/*08*/ char member_name[64];
|
||||||
/*72*/ uint32 Banker;
|
/*72*/ uint32 banker;
|
||||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3619,7 +3644,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -3631,8 +3656,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -4198,9 +4223,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -3537,11 +3537,11 @@ struct GuildMakeLeader {
|
|||||||
// Update a guild members rank and banker status
|
// Update a guild members rank and banker status
|
||||||
struct GuildSetRank_Struct
|
struct GuildSetRank_Struct
|
||||||
{
|
{
|
||||||
/*00*/ uint32 GuildID; // Was Unknown00
|
/*00*/ uint32 guild_id; // Was Unknown00
|
||||||
/*04*/ uint32 Rank;
|
/*04*/ uint32 rank;
|
||||||
/*08*/ char MemberName[64];
|
/*08*/ char member_name[64];
|
||||||
/*72*/ uint32 Banker;
|
/*72*/ uint32 banker;
|
||||||
/*76*/ uint32 Unknown76; // Seen 1 - Maybe Banker?
|
/*76*/ uint32 unknown76; // Seen 1 - Maybe Banker?
|
||||||
/*80*/
|
/*80*/
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3556,7 +3556,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -3568,8 +3568,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -4136,9 +4136,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
+129
-82
@@ -34,6 +34,7 @@
|
|||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -1686,88 +1687,124 @@ namespace SoD
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2470,8 +2507,8 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
||||||
@@ -2669,8 +2706,8 @@ namespace SoD
|
|||||||
|
|
||||||
Buffer += sizeof(structs::Spawn_Struct_Position);
|
Buffer += sizeof(structs::Spawn_Struct_Position);
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -2696,8 +2733,8 @@ namespace SoD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
@@ -3338,34 +3375,44 @@ namespace SoD
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
IN(general.action);
|
||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
FINISH_DIRECT_DECODE();
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 36: { // raidPlayerNote unhandled
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
IN(action);
|
||||||
IN(parameter);
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3026,7 +3026,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -3038,8 +3038,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -3592,9 +3592,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
+123
-76
@@ -33,6 +33,7 @@
|
|||||||
#include "sof_structs.h"
|
#include "sof_structs.h"
|
||||||
#include "../rulesys.h"
|
#include "../rulesys.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -1356,88 +1357,124 @@ namespace SoF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2743,34 +2780,44 @@ namespace SoF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
IN(general.action);
|
||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
FINISH_DIRECT_DECODE();
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 36: { // raidPlayerNote unhandled
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
IN(action);
|
||||||
IN(parameter);
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2951,7 +2951,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -2963,8 +2963,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -3517,9 +3517,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -128,6 +128,15 @@
|
|||||||
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
||||||
eq_struct *eq = (eq_struct *) __eq_buffer;
|
eq_struct *eq = (eq_struct *) __eq_buffer;
|
||||||
|
|
||||||
|
#define SETUP_VAR_DECODE(emu_struct, eq_struct, var_field) \
|
||||||
|
unsigned char *__eq_buffer = __packet->pBuffer; \
|
||||||
|
eq_struct* in = (eq_struct*)__packet->pBuffer; \
|
||||||
|
auto size = strlen(in->var_field); \
|
||||||
|
__packet->size = sizeof(emu_struct) + size + 1; \
|
||||||
|
__packet->pBuffer = new unsigned char[__packet->size]; \
|
||||||
|
emu_struct *emu = (emu_struct *) __packet->pBuffer; \
|
||||||
|
eq_struct *eq = (eq_struct *) __eq_buffer;
|
||||||
|
|
||||||
#define MEMSET_IN(emu_struct) \
|
#define MEMSET_IN(emu_struct) \
|
||||||
memset(__packet->pBuffer, 0, sizeof(emu_struct));
|
memset(__packet->pBuffer, 0, sizeof(emu_struct));
|
||||||
|
|
||||||
@@ -146,6 +155,9 @@
|
|||||||
delete[] __eq_buffer; \
|
delete[] __eq_buffer; \
|
||||||
p->SetOpcode(OP_Unknown);
|
p->SetOpcode(OP_Unknown);
|
||||||
|
|
||||||
|
#define FINISH_VAR_DECODE() \
|
||||||
|
delete[] __eq_buffer;
|
||||||
|
|
||||||
//call to finish an encoder using SETUP_DIRECT_DECODE
|
//call to finish an encoder using SETUP_DIRECT_DECODE
|
||||||
#define FINISH_DIRECT_DECODE() \
|
#define FINISH_DIRECT_DECODE() \
|
||||||
delete[] __eq_buffer;
|
delete[] __eq_buffer;
|
||||||
|
|||||||
+569
-5
@@ -33,6 +33,8 @@
|
|||||||
#include "../item_instance.h"
|
#include "../item_instance.h"
|
||||||
#include "titanium_structs.h"
|
#include "titanium_structs.h"
|
||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
#include "../guilds.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -663,6 +665,155 @@ namespace Titanium
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_SetGuildRank)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||||
|
|
||||||
|
eq->unknown00 = 0;
|
||||||
|
eq->unknown04 = 0;
|
||||||
|
|
||||||
|
//Translate older ranks to new values* /
|
||||||
|
switch (emu->rank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->rank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->rank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->rank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
eq->rank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
|
OUT(banker);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_SpawnAppearance)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
|
||||||
|
|
||||||
|
OUT(spawn_id);
|
||||||
|
OUT(type);
|
||||||
|
OUT(parameter);
|
||||||
|
switch (emu->type) {
|
||||||
|
case AppearanceType::GuildRank: {
|
||||||
|
//Translate new ranks to old values* /
|
||||||
|
switch (emu->parameter) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->parameter = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->parameter = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->parameter = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AppearanceType::GuildShow: {
|
||||||
|
FAIL_ENCODE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildMemberAdd)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
|
||||||
|
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
|
||||||
|
|
||||||
|
OUT(guild_id)
|
||||||
|
OUT(level)
|
||||||
|
OUT(class_)
|
||||||
|
switch (emu->rank_) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->rank_ = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->rank_ = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->rank_ = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OUT(zone_id)
|
||||||
|
OUT(last_on)
|
||||||
|
OUT_str(player_name)
|
||||||
|
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildMemberRankAltBanker)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
|
||||||
|
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
|
||||||
|
|
||||||
|
OUT(guild_id)
|
||||||
|
OUT(alt_banker)
|
||||||
|
OUT_str(player_name)
|
||||||
|
|
||||||
|
switch (emu->rank_) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->rank_ = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->rank_ = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->rank_ = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_GuildMemberList)
|
ENCODE(OP_GuildMemberList)
|
||||||
{
|
{
|
||||||
//consume the packet
|
//consume the packet
|
||||||
@@ -726,12 +877,34 @@ namespace Titanium
|
|||||||
str += sl + 1; \
|
str += sl + 1; \
|
||||||
}
|
}
|
||||||
#define PutFieldN(field) e->field = htonl(emu_e->field)
|
#define PutFieldN(field) e->field = htonl(emu_e->field)
|
||||||
|
/* Translate new ranks to older values */
|
||||||
SlideStructString(name, emu_name);
|
SlideStructString(name, emu_name);
|
||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
PutFieldN(rank);
|
switch (emu_e->rank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
e->rank = htonl(GUILD_MEMBER_TI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
e->rank = htonl(GUILD_OFFICER_TI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
e->rank = htonl(GUILD_LEADER_TI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
e->rank = htonl(GUILD_MEMBER_TI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
PutFieldN(total_tribute);
|
PutFieldN(total_tribute);
|
||||||
@@ -752,6 +925,38 @@ namespace Titanium
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_SendGuildTributes)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct);
|
||||||
|
SETUP_VAR_ENCODE(GuildTributeAbility_Struct);
|
||||||
|
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name));
|
||||||
|
|
||||||
|
eq->guild_id = emu->guild_id;;
|
||||||
|
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
|
||||||
|
eq->ability.tribute_id = emu->ability.tribute_id;
|
||||||
|
eq->ability.tier_count = emu->ability.tier_count;
|
||||||
|
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
|
||||||
|
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
|
||||||
|
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
|
||||||
|
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
|
||||||
|
}
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
OUT(quantity);
|
||||||
|
OUT(favor);
|
||||||
|
eq->unknown8 = 0;
|
||||||
|
eq->slot = ServerToTitaniumSlot(emu->slot);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_Illusion)
|
ENCODE(OP_Illusion)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||||
@@ -866,11 +1071,60 @@ namespace Titanium
|
|||||||
|
|
||||||
ENCODE(OP_LFGuild)
|
ENCODE(OP_LFGuild)
|
||||||
{
|
{
|
||||||
|
struct bit_mask_conversion {
|
||||||
|
uint32 titanium_mask;
|
||||||
|
uint32 rof2_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<bit_mask_conversion> bit_mask = {
|
||||||
|
{.titanium_mask = 2, .rof2_mask = 256},
|
||||||
|
{.titanium_mask = 4, .rof2_mask = 32768},
|
||||||
|
{.titanium_mask = 8, .rof2_mask = 65536},
|
||||||
|
{.titanium_mask = 16, .rof2_mask = 4},
|
||||||
|
{.titanium_mask = 32, .rof2_mask = 64},
|
||||||
|
{.titanium_mask = 64, .rof2_mask = 16384},
|
||||||
|
{.titanium_mask = 128, .rof2_mask = 8192},
|
||||||
|
{.titanium_mask = 256, .rof2_mask = 128},
|
||||||
|
{.titanium_mask = 512, .rof2_mask = 2048},
|
||||||
|
{.titanium_mask = 1024, .rof2_mask = 8},
|
||||||
|
{.titanium_mask = 2048, .rof2_mask = 16},
|
||||||
|
{.titanium_mask = 4096, .rof2_mask = 512},
|
||||||
|
{.titanium_mask = 8192, .rof2_mask = 32},
|
||||||
|
{.titanium_mask = 16384, .rof2_mask = 1024},
|
||||||
|
{.titanium_mask = 32768, .rof2_mask = 2},
|
||||||
|
{.titanium_mask = 65536, .rof2_mask = 4096},
|
||||||
|
};
|
||||||
|
|
||||||
EQApplicationPacket *in = *p;
|
EQApplicationPacket *in = *p;
|
||||||
*p = nullptr;
|
|
||||||
|
|
||||||
uint32 Command = in->ReadUInt32();
|
uint32 Command = in->ReadUInt32();
|
||||||
|
|
||||||
|
if (Command == 1) {
|
||||||
|
ENCODE_LENGTH_EXACT(LFGuild_GuildToggle_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
|
||||||
|
|
||||||
|
OUT(Command);
|
||||||
|
OUT_str(Comment);
|
||||||
|
OUT(FromLevel);
|
||||||
|
OUT(ToLevel);
|
||||||
|
OUT(AACount);
|
||||||
|
OUT(TimeZone);
|
||||||
|
OUT(Toggle);
|
||||||
|
OUT(TimePosted);
|
||||||
|
OUT_str(Name);
|
||||||
|
|
||||||
|
uint32 emu_bitmask = emu->Classes;
|
||||||
|
uint32 ti_bitmask = 0;
|
||||||
|
for (auto const& b : bit_mask) {
|
||||||
|
(emu_bitmask & b.rof2_mask) != 0 ? ti_bitmask |= b.titanium_mask : ti_bitmask &= ~b.titanium_mask;
|
||||||
|
}
|
||||||
|
eq->Classes = ti_bitmask;
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*p = nullptr;
|
||||||
if (Command != 0)
|
if (Command != 0)
|
||||||
{
|
{
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
@@ -1148,7 +1402,29 @@ namespace Titanium
|
|||||||
OUT(pvp);
|
OUT(pvp);
|
||||||
OUT(anon);
|
OUT(anon);
|
||||||
OUT(gm);
|
OUT(gm);
|
||||||
OUT(guildrank);
|
switch (emu->guildrank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->guildrank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->guildrank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->guildrank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
eq->guildrank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
OUT(guildbanker);
|
OUT(guildbanker);
|
||||||
// OUT(unknown13054[8]);
|
// OUT(unknown13054[8]);
|
||||||
OUT(exp);
|
OUT(exp);
|
||||||
@@ -1245,6 +1521,119 @@ namespace Titanium
|
|||||||
FINISH_ENCODE();
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_MarkRaidNPC)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(MarkNPC_Struct);
|
||||||
|
SETUP_DIRECT_ENCODE(MarkNPC_Struct, MarkNPC_Struct);
|
||||||
|
|
||||||
|
EQApplicationPacket* outapp = new EQApplicationPacket(OP_MarkNPC, sizeof(MarkNPC_Struct));
|
||||||
|
MarkNPC_Struct* mnpcs = (MarkNPC_Struct*)outapp->pBuffer;
|
||||||
|
mnpcs->TargetID = emu->TargetID;
|
||||||
|
mnpcs->Number = emu->Number;
|
||||||
|
dest->QueuePacket(outapp);
|
||||||
|
safe_delete(outapp);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_RaidUpdate)
|
||||||
|
{
|
||||||
|
EQApplicationPacket* inapp = *p;
|
||||||
|
*p = nullptr;
|
||||||
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
switch (raid_gen->action)
|
||||||
|
{
|
||||||
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(raidGen.action);
|
||||||
|
OUT(raidGen.parameter);
|
||||||
|
OUT_str(raidGen.leader_name);
|
||||||
|
OUT_str(raidGen.player_name);
|
||||||
|
OUT(_class);
|
||||||
|
OUT(level);
|
||||||
|
OUT(isGroupLeader);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
case raidSetMotd:
|
||||||
|
{
|
||||||
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
|
{
|
||||||
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
safe_delete(inapp);
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_ReadBook)
|
ENCODE(OP_ReadBook)
|
||||||
{
|
{
|
||||||
// no apparent slot translation needed
|
// no apparent slot translation needed
|
||||||
@@ -1750,7 +2139,28 @@ namespace Titanium
|
|||||||
eq->beard = emu->beard;
|
eq->beard = emu->beard;
|
||||||
strcpy(eq->suffix, emu->suffix);
|
strcpy(eq->suffix, emu->suffix);
|
||||||
eq->petOwnerId = emu->petOwnerId;
|
eq->petOwnerId = emu->petOwnerId;
|
||||||
eq->guildrank = emu->guildrank;
|
switch (emu->guildrank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->guildrank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->guildrank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->guildrank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
// eq->unknown0194[3] = emu->unknown0194[3];
|
// eq->unknown0194[3] = emu->unknown0194[3];
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; k++) {
|
||||||
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
eq->equipment.Slot[k].Material = emu->equipment.Slot[k].Material;
|
||||||
@@ -2091,6 +2501,34 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_GuildDemote)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
|
||||||
|
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
|
||||||
|
|
||||||
|
memcpy(emu->name, eq->name, sizeof(emu->name));
|
||||||
|
memcpy(emu->target, eq->target, sizeof(emu->target));
|
||||||
|
emu->rank = GUILD_MEMBER;
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
DECODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
IN(quantity);
|
||||||
|
IN(tribute_master_id);
|
||||||
|
IN(guild_id);
|
||||||
|
|
||||||
|
emu->slot = TitaniumToServerSlot(eq->slot);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_InspectAnswer)
|
DECODE(OP_InspectAnswer)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
DECODE_LENGTH_EXACT(structs::InspectResponse_Struct);
|
||||||
@@ -2146,8 +2584,77 @@ namespace Titanium
|
|||||||
|
|
||||||
DECODE(OP_LFGuild)
|
DECODE(OP_LFGuild)
|
||||||
{
|
{
|
||||||
|
struct bit_mask_conversion {
|
||||||
|
uint32 titanium_mask;
|
||||||
|
uint32 rof2_mask;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<bit_mask_conversion> bit_mask = {
|
||||||
|
{.titanium_mask = 2, .rof2_mask = 256},
|
||||||
|
{.titanium_mask = 4, .rof2_mask = 32768},
|
||||||
|
{.titanium_mask = 8, .rof2_mask = 65536},
|
||||||
|
{.titanium_mask = 16, .rof2_mask = 4},
|
||||||
|
{.titanium_mask = 32, .rof2_mask = 64},
|
||||||
|
{.titanium_mask = 64, .rof2_mask = 16384},
|
||||||
|
{.titanium_mask = 128, .rof2_mask = 8192},
|
||||||
|
{.titanium_mask = 256, .rof2_mask = 128},
|
||||||
|
{.titanium_mask = 512, .rof2_mask = 2048},
|
||||||
|
{.titanium_mask = 1024, .rof2_mask = 8},
|
||||||
|
{.titanium_mask = 2048, .rof2_mask = 16},
|
||||||
|
{.titanium_mask = 4096, .rof2_mask = 512},
|
||||||
|
{.titanium_mask = 8192, .rof2_mask = 32},
|
||||||
|
{.titanium_mask = 16384, .rof2_mask = 1024},
|
||||||
|
{.titanium_mask = 32768, .rof2_mask = 2},
|
||||||
|
{.titanium_mask = 65536, .rof2_mask = 4096},
|
||||||
|
};
|
||||||
|
|
||||||
uint32 Command = __packet->ReadUInt32();
|
uint32 Command = __packet->ReadUInt32();
|
||||||
|
|
||||||
|
if (Command == 3) {
|
||||||
|
DECODE_LENGTH_EXACT(structs::LFGuild_SearchPlayer_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(LFGuild_SearchPlayer_Struct, structs::LFGuild_SearchPlayer_Struct);
|
||||||
|
|
||||||
|
IN(Command);
|
||||||
|
IN(Unknown04);
|
||||||
|
IN(FromLevel);
|
||||||
|
IN(ToLevel);
|
||||||
|
IN(MinAA);
|
||||||
|
IN(TimeZone);
|
||||||
|
|
||||||
|
uint32 new_bitmask = 0;
|
||||||
|
uint32 ti_bitmask = eq->Classes;
|
||||||
|
for (auto const& b : bit_mask) {
|
||||||
|
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
|
||||||
|
}
|
||||||
|
emu->Classes = new_bitmask;
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Command == 1) {
|
||||||
|
DECODE_LENGTH_EXACT(structs::LFGuild_GuildToggle_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(LFGuild_GuildToggle_Struct, structs::LFGuild_GuildToggle_Struct);
|
||||||
|
|
||||||
|
IN(Command);
|
||||||
|
IN_str(Comment);
|
||||||
|
IN(FromLevel);
|
||||||
|
IN(ToLevel);
|
||||||
|
IN(AACount);
|
||||||
|
IN(TimeZone);
|
||||||
|
IN(Toggle);
|
||||||
|
IN(TimePosted);
|
||||||
|
IN_str(Name);
|
||||||
|
|
||||||
|
uint32 new_bitmask = 0;
|
||||||
|
uint32 ti_bitmask = eq->Classes;
|
||||||
|
for (auto const& b : bit_mask) {
|
||||||
|
(ti_bitmask & b.titanium_mask) != 0 ? new_bitmask |= b.rof2_mask : new_bitmask &= ~b.rof2_mask;
|
||||||
|
}
|
||||||
|
emu->Classes = new_bitmask;
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (Command != 0)
|
if (Command != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -2272,6 +2779,63 @@ namespace Titanium
|
|||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_RaidInvite)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
|
|
||||||
|
switch (rgs->action)
|
||||||
|
{
|
||||||
|
case raidSetMotd:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
|
||||||
|
auto len = 0;
|
||||||
|
if (__packet->size < sizeof(structs::RaidMOTD_Struct)) {
|
||||||
|
len = __packet->size - sizeof(structs::RaidGeneral_Struct);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
len = sizeof(eq->motd);
|
||||||
|
}
|
||||||
|
|
||||||
|
strn0cpy(emu->motd, eq->motd, len > 1024 ? 1024 : len);
|
||||||
|
emu->motd[len - 1] = '\0';
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
|
IN(action);
|
||||||
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_ReadBook)
|
DECODE(OP_ReadBook)
|
||||||
{
|
{
|
||||||
// no apparent slot translation needed
|
// no apparent slot translation needed
|
||||||
|
|||||||
@@ -44,8 +44,13 @@ E(OP_DzSetLeaderName)
|
|||||||
E(OP_Emote)
|
E(OP_Emote)
|
||||||
E(OP_FormattedMessage)
|
E(OP_FormattedMessage)
|
||||||
E(OP_GroundSpawn)
|
E(OP_GroundSpawn)
|
||||||
|
E(OP_SetGuildRank)
|
||||||
E(OP_GuildMemberLevelUpdate)
|
E(OP_GuildMemberLevelUpdate)
|
||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
|
E(OP_GuildMemberAdd)
|
||||||
|
E(OP_GuildMemberRankAltBanker)
|
||||||
|
E(OP_SendGuildTributes)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectAnswer)
|
E(OP_InspectAnswer)
|
||||||
E(OP_InspectRequest)
|
E(OP_InspectRequest)
|
||||||
@@ -61,12 +66,15 @@ E(OP_OnLevelMessage)
|
|||||||
E(OP_PetBuffWindow)
|
E(OP_PetBuffWindow)
|
||||||
E(OP_PlayerProfile)
|
E(OP_PlayerProfile)
|
||||||
E(OP_NewSpawn)
|
E(OP_NewSpawn)
|
||||||
|
E(OP_MarkRaidNPC)
|
||||||
|
E(OP_RaidUpdate)
|
||||||
E(OP_ReadBook)
|
E(OP_ReadBook)
|
||||||
E(OP_RespondAA)
|
E(OP_RespondAA)
|
||||||
E(OP_SendCharInfo)
|
E(OP_SendCharInfo)
|
||||||
E(OP_SendAATable)
|
E(OP_SendAATable)
|
||||||
E(OP_SetFace)
|
E(OP_SetFace)
|
||||||
E(OP_ShopPlayerSell)
|
E(OP_ShopPlayerSell)
|
||||||
|
E(OP_SpawnAppearance)
|
||||||
E(OP_SpecialMesg)
|
E(OP_SpecialMesg)
|
||||||
E(OP_TaskDescription)
|
E(OP_TaskDescription)
|
||||||
E(OP_Track)
|
E(OP_Track)
|
||||||
@@ -98,14 +106,17 @@ D(OP_DzRemovePlayer)
|
|||||||
D(OP_DzSwapPlayer)
|
D(OP_DzSwapPlayer)
|
||||||
D(OP_Emote)
|
D(OP_Emote)
|
||||||
D(OP_FaceChange)
|
D(OP_FaceChange)
|
||||||
|
D(OP_GuildDemote)
|
||||||
D(OP_InspectAnswer)
|
D(OP_InspectAnswer)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_LFGuild)
|
D(OP_LFGuild)
|
||||||
D(OP_LoadSpellSet)
|
D(OP_LoadSpellSet)
|
||||||
D(OP_LootItem)
|
D(OP_LootItem)
|
||||||
D(OP_MoveItem)
|
D(OP_MoveItem)
|
||||||
D(OP_PetCommands)
|
D(OP_PetCommands)
|
||||||
|
D(OP_RaidInvite)
|
||||||
D(OP_ReadBook)
|
D(OP_ReadBook)
|
||||||
D(OP_SetServerFilter)
|
D(OP_SetServerFilter)
|
||||||
D(OP_ShopPlayerSell)
|
D(OP_ShopPlayerSell)
|
||||||
|
|||||||
@@ -1423,6 +1423,23 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
GuildsListEntry_Struct entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemRequest_Struct {
|
||||||
|
/*000*/ uint32 slot;
|
||||||
|
/*004*/ uint32 quantity;
|
||||||
|
/*008*/ uint32 tribute_master_id;
|
||||||
|
/*012*/ uint32 unknown12;
|
||||||
|
/*016*/ uint32 guild_id;
|
||||||
|
/*020*/ uint32 unknown20;
|
||||||
|
/*024*/ uint32 unknown24;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemReply_Struct {
|
||||||
|
/*000*/ uint32 slot;
|
||||||
|
/*004*/ uint32 quantity;
|
||||||
|
/*008*/ uint32 unknown8;
|
||||||
|
/*012*/ uint32 favor;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Money Loot
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@@ -2604,7 +2621,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -2616,8 +2633,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -3017,23 +3034,39 @@ struct leadExpUpdateStruct {
|
|||||||
/*0028*/ uint32 unknown0028;
|
/*0028*/ uint32 unknown0028;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct RaidGeneral_Struct {
|
struct RaidGeneral_Struct {
|
||||||
/*00*/ uint32 action; //=10
|
/*000*/ uint32 action; //=10
|
||||||
/*04*/ char player_name[64]; //should both be the player's name
|
/*004*/ char player_name[64]; //should both be the player's name
|
||||||
/*04*/ char leader_name[64];
|
/*068*/ char leader_name[64];
|
||||||
/*132*/ uint32 parameter;
|
/*132*/ uint32 parameter;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidAdd_Struct {
|
struct RaidAddMember_Struct {
|
||||||
/*000*/ uint32 action; //=0
|
/*000*/ RaidGeneral_Struct raidGen;
|
||||||
/*004*/ char player_name[64]; //should both be the player's name
|
/*136*/ uint8 _class;
|
||||||
/*068*/ char leader_name[64];
|
/*137*/ uint8 level;
|
||||||
/*132*/ uint8 _class;
|
/*138*/ uint8 isGroupLeader;
|
||||||
/*133*/ uint8 level;
|
/*139*/ uint8 unknown139; //seems to be 0x42 or 0
|
||||||
/*134*/ uint8 has_group;
|
};
|
||||||
/*135*/ uint8 unknown135; //seems to be 0x42 or 0
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*136*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RaidMOTD_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
||||||
|
/*136*/ char motd[1024]; // max size is 1024, but reply is variable
|
||||||
|
};
|
||||||
|
|
||||||
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
/*000*/ uint32 action;
|
||||||
|
/*004*/ char player_name[64];
|
||||||
|
// /*068*/ uint32 Unknown068;
|
||||||
|
/*072*/ char leader_name[64];
|
||||||
|
/*136*/ GroupLeadershipAA_Struct group; //unneeded
|
||||||
|
/*200*/ RaidLeadershipAA_Struct raid;
|
||||||
|
/*264*/ char Unknown264[128];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidCreate_Struct {
|
struct RaidCreate_Struct {
|
||||||
@@ -3492,7 +3525,7 @@ struct LFGuild_GuildToggle_Struct
|
|||||||
/*540*/ uint32 TimeZone;
|
/*540*/ uint32 TimeZone;
|
||||||
/*544*/ uint8 Toggle;
|
/*544*/ uint8 Toggle;
|
||||||
/*545*/ uint8 Unknown545[3];
|
/*545*/ uint8 Unknown545[3];
|
||||||
/*548*/ uint32 Expires;
|
/*548*/ uint32 TimePosted;
|
||||||
/*552*/ char Name[64];
|
/*552*/ char Name[64];
|
||||||
/*616*/
|
/*616*/
|
||||||
};
|
};
|
||||||
@@ -3683,6 +3716,34 @@ struct SayLinkBodyFrame_Struct {
|
|||||||
/*045*/
|
/*045*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildSetRank_Struct
|
||||||
|
{
|
||||||
|
/*00*/ uint32 unknown00;
|
||||||
|
/*04*/ uint32 unknown04;
|
||||||
|
/*08*/ uint32 rank;
|
||||||
|
/*72*/ char member_name[64];
|
||||||
|
/*76*/ uint32 banker;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberAdd_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 unknown04;
|
||||||
|
/*008*/ uint32 level;
|
||||||
|
/*012*/ uint32 class_;
|
||||||
|
/*016*/ uint32 rank_;
|
||||||
|
/*020*/ uint32 zone_id;
|
||||||
|
/*024*/ uint32 last_on;
|
||||||
|
/*028*/ char player_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberRank_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 unknown_004;
|
||||||
|
/*008*/ uint32 rank_;
|
||||||
|
/*012*/ char player_name[64];
|
||||||
|
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||||
|
};
|
||||||
|
|
||||||
}; /*structs*/
|
}; /*structs*/
|
||||||
|
|
||||||
}; /*Titanium*/
|
}; /*Titanium*/
|
||||||
|
|||||||
+418
-107
@@ -35,6 +35,8 @@
|
|||||||
#include "../path_manager.h"
|
#include "../path_manager.h"
|
||||||
#include "../classes.h"
|
#include "../classes.h"
|
||||||
#include "../races.h"
|
#include "../races.h"
|
||||||
|
#include "../raid.h"
|
||||||
|
#include "../guilds.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -194,7 +196,7 @@ namespace UF
|
|||||||
unsigned char *emu_buffer = in->pBuffer;
|
unsigned char *emu_buffer = in->pBuffer;
|
||||||
uint32 opcode = *((uint32*)emu_buffer);
|
uint32 opcode = *((uint32*)emu_buffer);
|
||||||
|
|
||||||
if (opcode == 8) {
|
if (opcode == AlternateCurrencyMode::Populate) {
|
||||||
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
AltCurrencyPopulate_Struct *populate = (AltCurrencyPopulate_Struct*)emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(
|
auto outapp = new EQApplicationPacket(
|
||||||
@@ -1133,6 +1135,30 @@ namespace UF
|
|||||||
PutFieldN(level);
|
PutFieldN(level);
|
||||||
PutFieldN(banker);
|
PutFieldN(banker);
|
||||||
PutFieldN(class_);
|
PutFieldN(class_);
|
||||||
|
//Translate older ranks to new values* /
|
||||||
|
switch (emu_e->rank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
emu_e->rank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
emu_e->rank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
emu_e->rank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
emu_e->rank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
PutFieldN(rank);
|
PutFieldN(rank);
|
||||||
PutFieldN(time_last_on);
|
PutFieldN(time_last_on);
|
||||||
PutFieldN(tribute_enable);
|
PutFieldN(tribute_enable);
|
||||||
@@ -1164,14 +1190,14 @@ namespace UF
|
|||||||
|
|
||||||
unsigned char *__emu_buffer = in->pBuffer;
|
unsigned char *__emu_buffer = in->pBuffer;
|
||||||
char *InBuffer = (char *)__emu_buffer;
|
char *InBuffer = (char *)__emu_buffer;
|
||||||
uint32 HighestGuildID = 0;
|
uint32 actual_no_guilds = 0;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||||
{
|
{
|
||||||
if (InBuffer[0])
|
if (InBuffer[0])
|
||||||
{
|
{
|
||||||
PacketSize += (5 + strlen(InBuffer));
|
PacketSize += (5 + strlen(InBuffer));
|
||||||
HighestGuildID = i - 1;
|
actual_no_guilds++;
|
||||||
}
|
}
|
||||||
InBuffer += 64;
|
InBuffer += 64;
|
||||||
}
|
}
|
||||||
@@ -1187,7 +1213,7 @@ namespace UF
|
|||||||
memset(OutBuffer, 0, 64);
|
memset(OutBuffer, 0, 64);
|
||||||
OutBuffer += 64;
|
OutBuffer += 64;
|
||||||
|
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, HighestGuildID);
|
VARSTRUCT_ENCODE_TYPE(uint32, OutBuffer, actual_no_guilds);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
for (unsigned int i = 0; i < NumberOfGuilds; ++i)
|
||||||
{
|
{
|
||||||
@@ -1205,6 +1231,111 @@ namespace UF
|
|||||||
dest->FastQueuePacket(&in, ack_req);
|
dest->FastQueuePacket(&in, ack_req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildMemberAdd)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(GuildMemberAdd_Struct)
|
||||||
|
SETUP_DIRECT_ENCODE(GuildMemberAdd_Struct, structs::GuildMemberAdd_Struct)
|
||||||
|
|
||||||
|
OUT(guild_id)
|
||||||
|
OUT(level)
|
||||||
|
OUT(class_)
|
||||||
|
switch (emu->rank_) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->rank_ = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->rank_ = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->rank_ = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
eq->rank_ = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OUT(zone_id)
|
||||||
|
OUT(last_on)
|
||||||
|
OUT_str(player_name)
|
||||||
|
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildMemberRankAltBanker)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_EXACT(GuildMemberRank_Struct)
|
||||||
|
SETUP_DIRECT_ENCODE(GuildMemberRank_Struct, structs::GuildMemberRank_Struct)
|
||||||
|
|
||||||
|
OUT(guild_id)
|
||||||
|
OUT(alt_banker)
|
||||||
|
OUT_str(player_name)
|
||||||
|
|
||||||
|
switch (emu->rank_) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->rank_ = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->rank_ = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->rank_ = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
eq->rank_ = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_SendGuildTributes)
|
||||||
|
{
|
||||||
|
ENCODE_LENGTH_ATLEAST(structs::GuildTributeAbility_Struct)
|
||||||
|
SETUP_VAR_ENCODE(GuildTributeAbility_Struct)
|
||||||
|
ALLOC_VAR_ENCODE(structs::GuildTributeAbility_Struct, sizeof(GuildTributeAbility_Struct) + strlen(emu->ability.name))
|
||||||
|
|
||||||
|
eq->guild_id = emu->guild_id;
|
||||||
|
eq->ability.tribute_id = emu->ability.tribute_id;
|
||||||
|
eq->ability.tier_count = emu->ability.tier_count;
|
||||||
|
strncpy(eq->ability.name, emu->ability.name, strlen(emu->ability.name));
|
||||||
|
for (int i = 0; i < ntohl(emu->ability.tier_count); i++) {
|
||||||
|
eq->ability.tiers[i].cost = emu->ability.tiers[i].cost;
|
||||||
|
eq->ability.tiers[i].level = emu->ability.tiers[i].level;
|
||||||
|
eq->ability.tiers[i].tribute_item_id = emu->ability.tiers[i].tribute_item_id;
|
||||||
|
}
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
|
ENCODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
SETUP_DIRECT_ENCODE(GuildTributeDonateItemReply_Struct, structs::GuildTributeDonateItemReply_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "UF::ENCODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
OUT(quantity)
|
||||||
|
OUT(favor)
|
||||||
|
eq->unknown8 = 0;
|
||||||
|
eq->slot = ServerToUFSlot(emu->slot);
|
||||||
|
|
||||||
|
FINISH_ENCODE()
|
||||||
|
}
|
||||||
|
|
||||||
ENCODE(OP_Illusion)
|
ENCODE(OP_Illusion)
|
||||||
{
|
{
|
||||||
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
ENCODE_LENGTH_EXACT(Illusion_Struct);
|
||||||
@@ -1828,6 +1959,30 @@ namespace UF
|
|||||||
OUT(pvp);
|
OUT(pvp);
|
||||||
OUT(anon);
|
OUT(anon);
|
||||||
OUT(gm);
|
OUT(gm);
|
||||||
|
//Translate older ranks to new values* /
|
||||||
|
switch (emu->guildrank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
emu->guildrank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
emu->guildrank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
emu->guildrank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
emu->guildrank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
OUT(guildrank);
|
OUT(guildrank);
|
||||||
OUT(guildbanker);
|
OUT(guildbanker);
|
||||||
// OUT(unknown13054[12]);
|
// OUT(unknown13054[12]);
|
||||||
@@ -1931,88 +2086,124 @@ namespace UF
|
|||||||
|
|
||||||
ENCODE(OP_RaidJoin)
|
ENCODE(OP_RaidJoin)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
*p = nullptr;
|
||||||
RaidCreate_Struct *raid_create = (RaidCreate_Struct*)__emu_buffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
|
RaidCreate_Struct* emu = (RaidCreate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp_create = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *general = (structs::RaidGeneral_Struct*)outapp_create->pBuffer;
|
structs::RaidGeneral_Struct* general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
general->action = 8;
|
general->action = raidCreate;
|
||||||
general->parameter = 1;
|
general->parameter = RaidCommandAcceptInvite;
|
||||||
strn0cpy(general->leader_name, raid_create->leader_name, 64);
|
strn0cpy(general->leader_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
strn0cpy(general->player_name, raid_create->leader_name, 64);
|
strn0cpy(general->player_name, emu->leader_name, sizeof(emu->leader_name));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp_create);
|
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_RaidUpdate)
|
ENCODE(OP_RaidUpdate)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *inapp = *p;
|
EQApplicationPacket* inapp = *p;
|
||||||
*p = nullptr;
|
*p = nullptr;
|
||||||
unsigned char * __emu_buffer = inapp->pBuffer;
|
unsigned char* __emu_buffer = inapp->pBuffer;
|
||||||
RaidGeneral_Struct *raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
RaidGeneral_Struct* raid_gen = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
if (raid_gen->action == 0) // raid add has longer length than other raid updates
|
switch (raid_gen->action)
|
||||||
{
|
{
|
||||||
RaidAddMember_Struct* in_add_member = (RaidAddMember_Struct*)__emu_buffer;
|
case raidAdd:
|
||||||
|
{
|
||||||
|
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidAddMember_Struct));
|
||||||
structs::RaidAddMember_Struct *add_member = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
structs::RaidAddMember_Struct* eq = (structs::RaidAddMember_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
add_member->raidGen.action = in_add_member->raidGen.action;
|
OUT(raidGen.action);
|
||||||
add_member->raidGen.parameter = in_add_member->raidGen.parameter;
|
OUT(raidGen.parameter);
|
||||||
strn0cpy(add_member->raidGen.leader_name, in_add_member->raidGen.leader_name, 64);
|
OUT_str(raidGen.leader_name);
|
||||||
strn0cpy(add_member->raidGen.player_name, in_add_member->raidGen.player_name, 64);
|
OUT_str(raidGen.player_name);
|
||||||
add_member->_class = in_add_member->_class;
|
OUT(_class);
|
||||||
add_member->level = in_add_member->level;
|
OUT(level);
|
||||||
add_member->isGroupLeader = in_add_member->isGroupLeader;
|
OUT(isGroupLeader);
|
||||||
add_member->flags[0] = in_add_member->flags[0];
|
OUT(flags[0]);
|
||||||
add_member->flags[1] = in_add_member->flags[1];
|
OUT(flags[1]);
|
||||||
add_member->flags[2] = in_add_member->flags[2];
|
OUT(flags[2]);
|
||||||
add_member->flags[3] = in_add_member->flags[3];
|
OUT(flags[3]);
|
||||||
add_member->flags[4] = in_add_member->flags[4];
|
OUT(flags[4]);
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
else if (raid_gen->action == 35)
|
|
||||||
{
|
|
||||||
RaidMOTD_Struct *inmotd = (RaidMOTD_Struct *)__emu_buffer;
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct) +
|
|
||||||
strlen(inmotd->motd) + 1);
|
|
||||||
structs::RaidMOTD_Struct *outmotd = (structs::RaidMOTD_Struct *)outapp->pBuffer;
|
|
||||||
|
|
||||||
outmotd->general.action = inmotd->general.action;
|
|
||||||
strn0cpy(outmotd->general.player_name, inmotd->general.player_name, 64);
|
|
||||||
strn0cpy(outmotd->motd, inmotd->motd, strlen(inmotd->motd) + 1);
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (raid_gen->action == 14 || raid_gen->action == 30)
|
case raidSetMotd:
|
||||||
{
|
{
|
||||||
RaidLeadershipUpdate_Struct *inlaa = (RaidLeadershipUpdate_Struct *)__emu_buffer;
|
RaidMOTD_Struct* emu = (RaidMOTD_Struct*)__emu_buffer;
|
||||||
auto outapp =
|
|
||||||
new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidMOTD_Struct));
|
||||||
structs::RaidLeadershipUpdate_Struct *outlaa = (structs::RaidLeadershipUpdate_Struct *)outapp->pBuffer;
|
structs::RaidMOTD_Struct* eq = (structs::RaidMOTD_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(motd);
|
||||||
|
|
||||||
outlaa->action = inlaa->action;
|
|
||||||
strn0cpy(outlaa->player_name, inlaa->player_name, 64);
|
|
||||||
strn0cpy(outlaa->leader_name, inlaa->leader_name, 64);
|
|
||||||
memcpy(&outlaa->raid, &inlaa->raid, sizeof(RaidLeadershipAA_Struct));
|
|
||||||
dest->FastQueuePacket(&outapp);
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
case raidSetLeaderAbilities:
|
||||||
|
case raidMakeLeader:
|
||||||
{
|
{
|
||||||
RaidGeneral_Struct* in_raid_general = (RaidGeneral_Struct*)__emu_buffer;
|
RaidLeadershipUpdate_Struct* emu = (RaidLeadershipUpdate_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidLeadershipUpdate_Struct));
|
||||||
|
structs::RaidLeadershipUpdate_Struct* eq = (structs::RaidLeadershipUpdate_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT_str(player_name);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
memcpy(&eq->raid, &emu->raid, sizeof(RaidLeadershipAA_Struct));
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
auto emu = (RaidNote_Struct*)__emu_buffer;
|
||||||
|
|
||||||
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidNote_Struct));
|
||||||
|
auto eq = (structs::RaidNote_Struct*)outapp->pBuffer;
|
||||||
|
|
||||||
|
OUT(general.action);
|
||||||
|
OUT_str(general.leader_name);
|
||||||
|
OUT_str(general.player_name);
|
||||||
|
OUT_str(note);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case raidNoRaid:
|
||||||
|
{
|
||||||
|
dest->QueuePacket(inapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
RaidGeneral_Struct* emu = (RaidGeneral_Struct*)__emu_buffer;
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
auto outapp = new EQApplicationPacket(OP_RaidUpdate, sizeof(structs::RaidGeneral_Struct));
|
||||||
structs::RaidGeneral_Struct *raid_general = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
structs::RaidGeneral_Struct* eq = (structs::RaidGeneral_Struct*)outapp->pBuffer;
|
||||||
strn0cpy(raid_general->leader_name, in_raid_general->leader_name, 64);
|
|
||||||
strn0cpy(raid_general->player_name, in_raid_general->player_name, 64);
|
|
||||||
raid_general->action = in_raid_general->action;
|
|
||||||
raid_general->parameter = in_raid_general->parameter;
|
|
||||||
dest->FastQueuePacket(&outapp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
OUT(action);
|
||||||
|
OUT(parameter);
|
||||||
|
OUT_str(leader_name);
|
||||||
|
OUT_str(player_name);
|
||||||
|
|
||||||
|
dest->FastQueuePacket(&outapp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
safe_delete(inapp);
|
safe_delete(inapp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2295,29 +2486,88 @@ namespace UF
|
|||||||
|
|
||||||
ENCODE(OP_SpawnAppearance)
|
ENCODE(OP_SpawnAppearance)
|
||||||
{
|
{
|
||||||
EQApplicationPacket *in = *p;
|
ENCODE_LENGTH_EXACT(SpawnAppearance_Struct);
|
||||||
*p = nullptr;
|
SETUP_DIRECT_ENCODE(SpawnAppearance_Struct, structs::SpawnAppearance_Struct);
|
||||||
|
|
||||||
unsigned char *emu_buffer = in->pBuffer;
|
OUT(spawn_id);
|
||||||
|
OUT(type);
|
||||||
SpawnAppearance_Struct *sas = (SpawnAppearance_Struct *)emu_buffer;
|
OUT(parameter);
|
||||||
|
switch (emu->type) {
|
||||||
if (sas->type != AT_Size)
|
case AppearanceType::GuildRank: {
|
||||||
{
|
//Translate new ranks to old values* /
|
||||||
dest->FastQueuePacket(&in, ack_req);
|
switch (emu->parameter) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
eq->parameter = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
eq->parameter = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
eq->parameter = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
eq->parameter = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AppearanceType::GuildShow: {
|
||||||
|
FAIL_ENCODE();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
default: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto outapp = new EQApplicationPacket(OP_ChangeSize, sizeof(ChangeSize_Struct));
|
FINISH_ENCODE();
|
||||||
ChangeSize_Struct *css = (ChangeSize_Struct *)outapp->pBuffer;
|
}
|
||||||
|
|
||||||
css->EntityID = sas->spawn_id;
|
ENCODE(OP_SetGuildRank)
|
||||||
css->Size = (float)sas->parameter;
|
{
|
||||||
css->Unknown08 = 0;
|
ENCODE_LENGTH_EXACT(GuildSetRank_Struct);
|
||||||
css->Unknown12 = 1.0f;
|
SETUP_DIRECT_ENCODE(GuildSetRank_Struct, structs::GuildSetRank_Struct);
|
||||||
|
|
||||||
dest->FastQueuePacket(&outapp, ack_req);
|
eq->unknown00 = 0;
|
||||||
delete in;
|
eq->unknown04 = 0;
|
||||||
|
|
||||||
|
switch (emu->rank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
emu->rank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
emu->rank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
emu->rank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
emu->rank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(eq->member_name, emu->member_name, sizeof(eq->member_name));
|
||||||
|
OUT(banker);
|
||||||
|
|
||||||
|
FINISH_ENCODE();
|
||||||
}
|
}
|
||||||
|
|
||||||
ENCODE(OP_SpawnDoor)
|
ENCODE(OP_SpawnDoor)
|
||||||
@@ -2721,7 +2971,7 @@ namespace UF
|
|||||||
if (strlen(emu->suffix))
|
if (strlen(emu->suffix))
|
||||||
PacketSize += strlen(emu->suffix) + 1;
|
PacketSize += strlen(emu->suffix) + 1;
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
if (emu->DestructibleObject)
|
if (emu->DestructibleObject)
|
||||||
PacketSize = PacketSize - 4; // No bodytype
|
PacketSize = PacketSize - 4; // No bodytype
|
||||||
@@ -2742,8 +2992,8 @@ namespace UF
|
|||||||
}
|
}
|
||||||
|
|
||||||
float SpawnSize = emu->size;
|
float SpawnSize = emu->size;
|
||||||
if (!((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if (!((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522))
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
PacketSize -= (sizeof(structs::Texture_Struct) * EQ::textures::materialCount);
|
||||||
@@ -2810,7 +3060,7 @@ namespace UF
|
|||||||
|
|
||||||
uint8 OtherData = 0;
|
uint8 OtherData = 0;
|
||||||
|
|
||||||
if (emu->class_ == LDON_TREASURE) //Ldon chest
|
if (emu->class_ == Class::LDoNTreasure) //Ldon chest
|
||||||
{
|
{
|
||||||
OtherData = OtherData | 0x01;
|
OtherData = OtherData | 0x01;
|
||||||
}
|
}
|
||||||
@@ -2836,7 +3086,7 @@ namespace UF
|
|||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
|
||||||
|
|
||||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
|
||||||
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);
|
||||||
@@ -2908,6 +3158,30 @@ namespace UF
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildID);
|
||||||
|
//Translate older ranks to new values* /
|
||||||
|
switch (emu->guildrank) {
|
||||||
|
case GUILD_SENIOR_MEMBER:
|
||||||
|
case GUILD_MEMBER:
|
||||||
|
case GUILD_JUNIOR_MEMBER:
|
||||||
|
case GUILD_INITIATE:
|
||||||
|
case GUILD_RECRUIT: {
|
||||||
|
emu->guildrank = GUILD_MEMBER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_OFFICER:
|
||||||
|
case GUILD_SENIOR_OFFICER: {
|
||||||
|
emu->guildrank = GUILD_OFFICER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GUILD_LEADER: {
|
||||||
|
emu->guildrank = GUILD_LEADER_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
emu->guildrank = GUILD_RANK_NONE_TI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, emu->guildrank);
|
||||||
}
|
}
|
||||||
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
VARSTRUCT_ENCODE_TYPE(uint8, Buffer, emu->class_);
|
||||||
@@ -2945,8 +3219,8 @@ namespace UF
|
|||||||
|
|
||||||
Buffer += sizeof(structs::Spawn_Struct_Position);
|
Buffer += sizeof(structs::Spawn_Struct_Position);
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
for (k = EQ::textures::textureBegin; k < EQ::textures::materialCount; ++k)
|
||||||
@@ -2981,8 +3255,8 @@ namespace UF
|
|||||||
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
VARSTRUCT_ENCODE_TYPE(uint32, Buffer, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((emu->NPC == 0) || (emu->race <= RACE_GNOME_12) || (emu->race == RACE_IKSAR_128) ||
|
if ((emu->NPC == 0) || (emu->race <= Race::Gnome) || (emu->race == Race::Iksar) ||
|
||||||
(emu->race == RACE_VAH_SHIR_130) || (emu->race == RACE_FROGLOK_330) || (emu->race == RACE_DRAKKIN_522)
|
(emu->race == Race::VahShir) || (emu->race == Race::Froglok2) || (emu->race == Race::Drakkin)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
structs::Texture_Struct *Equipment = (structs::Texture_Struct *)Buffer;
|
||||||
@@ -3540,6 +3814,34 @@ namespace UF
|
|||||||
DECODE_FORWARD(OP_GroupInvite);
|
DECODE_FORWARD(OP_GroupInvite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DECODE(OP_GuildDemote)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::GuildDemoteStruct);
|
||||||
|
SETUP_DIRECT_DECODE(GuildDemoteStruct, structs::GuildDemoteStruct);
|
||||||
|
|
||||||
|
memcpy(emu->name, eq->name, sizeof(emu->name));
|
||||||
|
memcpy(emu->target, eq->target, sizeof(emu->target));
|
||||||
|
emu->rank = GUILD_MEMBER;
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
|
DECODE(OP_GuildTributeDonateItem)
|
||||||
|
{
|
||||||
|
DECODE_LENGTH_EXACT(structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
SETUP_DIRECT_DECODE(GuildTributeDonateItemRequest_Struct, structs::GuildTributeDonateItemRequest_Struct);
|
||||||
|
|
||||||
|
Log(Logs::Detail, Logs::Netcode, "UF::DECODE(OP_GuildTributeDonateItem)");
|
||||||
|
|
||||||
|
IN(quantity);
|
||||||
|
IN(tribute_master_id);
|
||||||
|
IN(guild_id);
|
||||||
|
|
||||||
|
emu->slot = UFToServerSlot(eq->slot);
|
||||||
|
|
||||||
|
FINISH_DIRECT_DECODE();
|
||||||
|
}
|
||||||
|
|
||||||
DECODE(OP_InspectRequest)
|
DECODE(OP_InspectRequest)
|
||||||
{
|
{
|
||||||
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
|
DECODE_LENGTH_EXACT(structs::Inspect_Struct);
|
||||||
@@ -3637,39 +3939,48 @@ namespace UF
|
|||||||
{
|
{
|
||||||
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
DECODE_LENGTH_ATLEAST(structs::RaidGeneral_Struct);
|
||||||
|
|
||||||
// This is a switch on the RaidGeneral action
|
RaidGeneral_Struct* rgs = (RaidGeneral_Struct*)__packet->pBuffer;
|
||||||
switch (*(uint32 *)__packet->pBuffer) {
|
|
||||||
case 35: { // raidMOTD
|
switch (rgs->action)
|
||||||
// we don't have a nice macro for this
|
{
|
||||||
structs::RaidMOTD_Struct *__eq_buffer = (structs::RaidMOTD_Struct *)__packet->pBuffer;
|
case raidSetMotd:
|
||||||
__eq_buffer->motd[1023] = '\0';
|
{
|
||||||
size_t motd_size = strlen(__eq_buffer->motd) + 1;
|
SETUP_VAR_DECODE(RaidMOTD_Struct, structs::RaidMOTD_Struct, motd);
|
||||||
__packet->size = sizeof(RaidMOTD_Struct) + motd_size;
|
|
||||||
__packet->pBuffer = new unsigned char[__packet->size];
|
|
||||||
RaidMOTD_Struct *emu = (RaidMOTD_Struct *)__packet->pBuffer;
|
|
||||||
structs::RaidMOTD_Struct *eq = (structs::RaidMOTD_Struct *)__eq_buffer;
|
|
||||||
strn0cpy(emu->general.player_name, eq->general.player_name, 64);
|
|
||||||
strn0cpy(emu->motd, eq->motd, motd_size);
|
|
||||||
IN(general.action);
|
IN(general.action);
|
||||||
IN(general.parameter);
|
IN(general.parameter);
|
||||||
FINISH_DIRECT_DECODE();
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(motd);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 36: { // raidPlayerNote unhandled
|
case raidSetNote:
|
||||||
|
{
|
||||||
|
SETUP_VAR_DECODE(RaidNote_Struct, structs::RaidNote_Struct, note);
|
||||||
|
|
||||||
|
IN(general.action);
|
||||||
|
IN(general.parameter);
|
||||||
|
IN_str(general.leader_name);
|
||||||
|
IN_str(general.player_name);
|
||||||
|
IN_str(note);
|
||||||
|
|
||||||
|
FINISH_VAR_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default:
|
||||||
DECODE_LENGTH_EXACT(structs::RaidGeneral_Struct);
|
{
|
||||||
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
SETUP_DIRECT_DECODE(RaidGeneral_Struct, structs::RaidGeneral_Struct);
|
||||||
strn0cpy(emu->leader_name, eq->leader_name, 64);
|
|
||||||
strn0cpy(emu->player_name, eq->player_name, 64);
|
|
||||||
IN(action);
|
IN(action);
|
||||||
IN(parameter);
|
IN(parameter);
|
||||||
|
IN_str(leader_name);
|
||||||
|
IN_str(player_name);
|
||||||
|
|
||||||
FINISH_DIRECT_DECODE();
|
FINISH_DIRECT_DECODE();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DECODE(OP_ReadBook)
|
DECODE(OP_ReadBook)
|
||||||
|
|||||||
@@ -58,6 +58,10 @@ E(OP_GroupInvite)
|
|||||||
E(OP_GroupUpdate)
|
E(OP_GroupUpdate)
|
||||||
E(OP_GuildMemberList)
|
E(OP_GuildMemberList)
|
||||||
E(OP_GuildsList)
|
E(OP_GuildsList)
|
||||||
|
E(OP_GuildMemberAdd)
|
||||||
|
E(OP_SendGuildTributes)
|
||||||
|
E(OP_GuildMemberRankAltBanker)
|
||||||
|
E(OP_GuildTributeDonateItem)
|
||||||
E(OP_Illusion)
|
E(OP_Illusion)
|
||||||
E(OP_InspectBuffs)
|
E(OP_InspectBuffs)
|
||||||
E(OP_InspectRequest)
|
E(OP_InspectRequest)
|
||||||
@@ -82,6 +86,7 @@ E(OP_RespondAA)
|
|||||||
E(OP_SendAATable)
|
E(OP_SendAATable)
|
||||||
E(OP_SendCharInfo)
|
E(OP_SendCharInfo)
|
||||||
E(OP_SendZonepoints)
|
E(OP_SendZonepoints)
|
||||||
|
E(OP_SetGuildRank)
|
||||||
E(OP_ShopPlayerBuy)
|
E(OP_ShopPlayerBuy)
|
||||||
E(OP_ShopPlayerSell)
|
E(OP_ShopPlayerSell)
|
||||||
E(OP_SomeItemPacketMaybe)
|
E(OP_SomeItemPacketMaybe)
|
||||||
@@ -138,6 +143,8 @@ D(OP_GroupFollow)
|
|||||||
D(OP_GroupFollow2)
|
D(OP_GroupFollow2)
|
||||||
D(OP_GroupInvite)
|
D(OP_GroupInvite)
|
||||||
D(OP_GroupInvite2)
|
D(OP_GroupInvite2)
|
||||||
|
D(OP_GuildDemote)
|
||||||
|
D(OP_GuildTributeDonateItem)
|
||||||
D(OP_InspectRequest)
|
D(OP_InspectRequest)
|
||||||
D(OP_ItemLinkClick)
|
D(OP_ItemLinkClick)
|
||||||
D(OP_ItemVerifyRequest)
|
D(OP_ItemVerifyRequest)
|
||||||
|
|||||||
@@ -1670,6 +1670,15 @@ struct Surname_Struct
|
|||||||
/*0100*/
|
/*0100*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildSetRank_Struct
|
||||||
|
{
|
||||||
|
/*00*/ uint32 unknown00;
|
||||||
|
/*04*/ uint32 unknown04;
|
||||||
|
/*08*/ uint32 rank;
|
||||||
|
/*72*/ char member_name[64];
|
||||||
|
/*76*/ uint32 banker;
|
||||||
|
};
|
||||||
|
|
||||||
struct GuildsListEntry_Struct {
|
struct GuildsListEntry_Struct {
|
||||||
char name[64];
|
char name[64];
|
||||||
};
|
};
|
||||||
@@ -1685,6 +1694,27 @@ struct GuildUpdate_Struct {
|
|||||||
GuildsListEntry_Struct entry;
|
GuildsListEntry_Struct entry;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildMemberAdd_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 unknown04;
|
||||||
|
/*008*/ uint32 unknown08;
|
||||||
|
/*012*/ uint32 unknown12;
|
||||||
|
/*016*/ uint32 level;
|
||||||
|
/*020*/ uint32 class_;
|
||||||
|
/*024*/ uint32 rank_;
|
||||||
|
/*028*/ uint32 zone_id;
|
||||||
|
/*032*/ uint32 last_on;
|
||||||
|
/*036*/ char player_name[64];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildMemberRank_Struct {
|
||||||
|
/*000*/ uint32 guild_id;
|
||||||
|
/*004*/ uint32 unknown_004;
|
||||||
|
/*008*/ uint32 rank_;
|
||||||
|
/*012*/ char player_name[64];
|
||||||
|
/*076*/ uint32 alt_banker; //Banker/Alt bit 00 - none 10 - Alt 11 - Alt and Banker 01 - Banker. Banker not functional for RoF2+
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Money Loot
|
** Money Loot
|
||||||
** Length: 22 Bytes
|
** Length: 22 Bytes
|
||||||
@@ -3067,6 +3097,23 @@ struct GuildMakeLeader{
|
|||||||
char target[64];
|
char target[64];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemRequest_Struct {
|
||||||
|
/*000*/ uint32 slot;
|
||||||
|
/*004*/ uint32 quantity;
|
||||||
|
/*008*/ uint32 tribute_master_id;
|
||||||
|
/*012*/ uint32 unknown12;
|
||||||
|
/*016*/ uint32 guild_id;
|
||||||
|
/*020*/ uint32 unknown20;
|
||||||
|
/*024*/ uint32 unknown24;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct GuildTributeDonateItemReply_Struct {
|
||||||
|
/*000*/ uint32 slot;
|
||||||
|
/*004*/ uint32 quantity;
|
||||||
|
/*008*/ uint32 unknown8;
|
||||||
|
/*012*/ uint32 favor;
|
||||||
|
};
|
||||||
|
|
||||||
struct Make_Pet_Struct { //Simple struct for getting pet info
|
struct Make_Pet_Struct { //Simple struct for getting pet info
|
||||||
uint8 level;
|
uint8 level;
|
||||||
uint8 class_;
|
uint8 class_;
|
||||||
@@ -3078,7 +3125,7 @@ struct Make_Pet_Struct { //Simple struct for getting pet info
|
|||||||
uint32 min_dmg;
|
uint32 min_dmg;
|
||||||
uint32 max_dmg;
|
uint32 max_dmg;
|
||||||
};
|
};
|
||||||
struct Ground_Spawn{
|
struct GroundSpawn{
|
||||||
float max_x;
|
float max_x;
|
||||||
float max_y;
|
float max_y;
|
||||||
float min_x;
|
float min_x;
|
||||||
@@ -3090,8 +3137,8 @@ struct Ground_Spawn{
|
|||||||
uint32 max_allowed;
|
uint32 max_allowed;
|
||||||
uint32 respawntimer;
|
uint32 respawntimer;
|
||||||
};
|
};
|
||||||
struct Ground_Spawns {
|
struct GroundSpawns {
|
||||||
struct Ground_Spawn spawn[50]; //Assigned max number to allow
|
struct GroundSpawn spawn[50]; //Assigned max number to allow
|
||||||
};
|
};
|
||||||
|
|
||||||
//struct PetitionBug_Struct{
|
//struct PetitionBug_Struct{
|
||||||
@@ -3647,9 +3694,14 @@ struct RaidAddMember_Struct {
|
|||||||
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
/*139*/ uint8 flags[5]; //no idea if these are needed...
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RaidNote_Struct {
|
||||||
|
/*000*/ RaidGeneral_Struct general;
|
||||||
|
/*140*/ char note[64];
|
||||||
|
};
|
||||||
|
|
||||||
struct RaidMOTD_Struct {
|
struct RaidMOTD_Struct {
|
||||||
/*000*/ RaidGeneral_Struct general; // leader_name and action only used
|
/*000*/ RaidGeneral_Struct general;
|
||||||
/*140*/ char motd[0]; // max size 1024, but reply is variable
|
/*140*/ char motd[1024];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct RaidLeadershipUpdate_Struct {
|
struct RaidLeadershipUpdate_Struct {
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
// types
|
||||||
|
#include <limits>
|
||||||
|
#include <string>
|
||||||
|
#include <cctype>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
// containers
|
||||||
|
#include <iterator>
|
||||||
|
#include <set>
|
||||||
|
#include <unordered_set>
|
||||||
|
#include <map>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// utilities
|
||||||
|
#include <iostream>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cmath>
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <utility>
|
||||||
|
#include <tuple>
|
||||||
|
#include <fstream>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
// fmt
|
||||||
|
#include <fmt/format.h>
|
||||||
|
|
||||||
|
// lua
|
||||||
|
#include "lua.hpp"
|
||||||
|
#include <luabind/luabind.hpp>
|
||||||
|
#include <luabind/object.hpp>
|
||||||
@@ -72,6 +72,8 @@ std::string GetPlatformName()
|
|||||||
return "HC";
|
return "HC";
|
||||||
case EQEmuExePlatform::ExePlatformTests:
|
case EQEmuExePlatform::ExePlatformTests:
|
||||||
return "Tests";
|
return "Tests";
|
||||||
|
case EQEmuExePlatform::ExePlatformZoneSidecar:
|
||||||
|
return "ZoneSidecar";
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -37,7 +37,8 @@ enum EQEmuExePlatform
|
|||||||
ExePlatformClientImport,
|
ExePlatformClientImport,
|
||||||
ExePlatformClientExport,
|
ExePlatformClientExport,
|
||||||
ExePlatformHC,
|
ExePlatformHC,
|
||||||
ExePlatformTests
|
ExePlatformTests,
|
||||||
|
ExePlatformZoneSidecar
|
||||||
};
|
};
|
||||||
|
|
||||||
void RegisterExecutablePlatform(EQEmuExePlatform p);
|
void RegisterExecutablePlatform(EQEmuExePlatform p);
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
#include <algorithm>
|
||||||
|
#include "process.h"
|
||||||
|
|
||||||
|
inline std::string random_string(size_t length)
|
||||||
|
{
|
||||||
|
auto randchar = []() -> char {
|
||||||
|
const char charset[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
const size_t max_index = (sizeof(charset) - 1);
|
||||||
|
return charset[static_cast<size_t>(std::rand()) % max_index];
|
||||||
|
};
|
||||||
|
std::string str(length, 0);
|
||||||
|
std::generate_n(str.begin(), length, randchar);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Process::execute(const std::string &cmd, bool return_result)
|
||||||
|
{
|
||||||
|
std::string random = "/tmp/" + random_string(25);
|
||||||
|
const char *file_name = random.c_str();
|
||||||
|
|
||||||
|
if (return_result) {
|
||||||
|
#ifdef _WINDOWS
|
||||||
|
std::system((cmd + " > " + file_name + " 2>&1").c_str());
|
||||||
|
#else
|
||||||
|
std::system((cmd + " > " + file_name + " 2>&1").c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::system((cmd).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string result;
|
||||||
|
|
||||||
|
if (return_result) {
|
||||||
|
std::ifstream file(file_name);
|
||||||
|
result = {std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()};
|
||||||
|
std::remove(file_name);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef EQEMU_PROCESS_H
|
||||||
|
#define EQEMU_PROCESS_H
|
||||||
|
|
||||||
|
class Process {
|
||||||
|
public:
|
||||||
|
static std::string execute(const std::string &cmd, bool return_result = true);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //EQEMU_PROCESS_H
|
||||||
@@ -44,6 +44,7 @@ enum : int { //values for pTimerType
|
|||||||
pTimerBeggingPickPocket = 27,
|
pTimerBeggingPickPocket = 27,
|
||||||
pTimerLinkedSpellReuseStart = 28,
|
pTimerLinkedSpellReuseStart = 28,
|
||||||
pTimerLinkedSpellReuseEnd = 48,
|
pTimerLinkedSpellReuseEnd = 48,
|
||||||
|
pTimerClearXTarget = 50,
|
||||||
|
|
||||||
pTimerShieldAbility = 86,
|
pTimerShieldAbility = 86,
|
||||||
|
|
||||||
|
|||||||
+791
-791
File diff suppressed because it is too large
Load Diff
+744
-1474
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,72 @@
|
|||||||
|
/* EQEMu: Everquest Server Emulator
|
||||||
|
Copyright (C) 2001-2016 EQEMu Development Team (http://eqemu.org)
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY except by those people which sell it, which
|
||||||
|
are required to give you total support for your newly bought product;
|
||||||
|
without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RAID_H
|
||||||
|
#define RAID_H
|
||||||
|
|
||||||
|
enum { //raid packet types:
|
||||||
|
raidAdd = 0,
|
||||||
|
raidRemove2 = 1, //parameter=0
|
||||||
|
raidMemberNameChange = 2,
|
||||||
|
raidRemove1 = 3, //parameter=0xFFFFFFFF
|
||||||
|
raidNoLongerLeader = 4,
|
||||||
|
raidDisband = 5,
|
||||||
|
raidMembers = 6, //len 395+, details + members list
|
||||||
|
raidNoAssignLeadership = 7,
|
||||||
|
raidCreate = 8, //len 72
|
||||||
|
raidUnknown = 9, // unused?
|
||||||
|
raidNoRaid = 10, //parameter=0
|
||||||
|
raidChangeLootType = 11,
|
||||||
|
raidStringID = 12,
|
||||||
|
raidChangeGroupLeader = 13, //136 raid leader, new group leader, group_id?
|
||||||
|
raidSetLeaderAbilities = 14, //472
|
||||||
|
raidSetLeaderData = 15, // 14,15 SoE names, not sure on difference, 14 packet has 0x100 bytes 15 0x214 in addition to raid general
|
||||||
|
raidChangeGroup = 16, //?? len 136 old leader, new leader, 0 (preceeded with a remove2)
|
||||||
|
raidLock = 17, //len 136 leader?, leader, 0
|
||||||
|
raidUnlock = 18, //len 136 leader?, leader, 0
|
||||||
|
raidRedStringID = 19,
|
||||||
|
raidSetLeader = 20, //len 388, contains 'details' struct without members; also used for "invite to raid"
|
||||||
|
raidMakeLeader = 30,
|
||||||
|
raidSetMotd = 35,
|
||||||
|
raidSetNote = 36,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum { //raid command types
|
||||||
|
RaidCommandInviteIntoExisting = 0, //in use
|
||||||
|
RaidCommandAcceptInvite = 1, //in use
|
||||||
|
RaidCommandInvite = 3, //in use
|
||||||
|
RaidCommandDisband = 5, //in use
|
||||||
|
RaidCommandMoveGroup = 6, //in use
|
||||||
|
RaidCommandRemoveGroupLeader = 7,
|
||||||
|
RaidCommandRaidLock = 8, //in use
|
||||||
|
RaidCommandRaidUnlock = 9, //in use
|
||||||
|
RaidCommandLootType = 20, //in use
|
||||||
|
RaidCommandAddLooter = 21, //in use
|
||||||
|
RaidCommandRemoveLooter = 22, //in use
|
||||||
|
RaidCommandMakeLeader = 30,
|
||||||
|
RaidCommandInviteFail = 31, //already in raid, waiting on invite from other raid, etc
|
||||||
|
RaidCommandLootType2 = 32, //in use
|
||||||
|
RaidCommandAddLooter2 = 33, //in use
|
||||||
|
RaidCommandRemoveLooter2 = 34, //in use
|
||||||
|
RaidCommandSetMotd = 35,
|
||||||
|
RaidCommandSetNote = 36,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_AA_ABILITY_REPOSITORY_H
|
#ifndef EQEMU_BASE_AA_ABILITY_REPOSITORY_H
|
||||||
@@ -33,6 +33,7 @@ public:
|
|||||||
int32_t first_rank_id;
|
int32_t first_rank_id;
|
||||||
uint8_t enabled;
|
uint8_t enabled;
|
||||||
int8_t reset_on_death;
|
int8_t reset_on_death;
|
||||||
|
int8_t auto_grant_enabled;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string PrimaryKey()
|
static std::string PrimaryKey()
|
||||||
@@ -57,6 +58,7 @@ public:
|
|||||||
"first_rank_id",
|
"first_rank_id",
|
||||||
"enabled",
|
"enabled",
|
||||||
"reset_on_death",
|
"reset_on_death",
|
||||||
|
"auto_grant_enabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,6 +79,7 @@ public:
|
|||||||
"first_rank_id",
|
"first_rank_id",
|
||||||
"enabled",
|
"enabled",
|
||||||
"reset_on_death",
|
"reset_on_death",
|
||||||
|
"auto_grant_enabled",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,6 +134,7 @@ public:
|
|||||||
e.first_rank_id = -1;
|
e.first_rank_id = -1;
|
||||||
e.enabled = 1;
|
e.enabled = 1;
|
||||||
e.reset_on_death = 0;
|
e.reset_on_death = 0;
|
||||||
|
e.auto_grant_enabled = 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -156,8 +160,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
aa_ability_id
|
aa_ability_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -166,20 +171,21 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AaAbility e{};
|
AaAbility e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.name = row[1] ? row[1] : "";
|
e.name = row[1] ? row[1] : "";
|
||||||
e.category = static_cast<int32_t>(atoi(row[2]));
|
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.classes = static_cast<int32_t>(atoi(row[3]));
|
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
|
||||||
e.races = static_cast<int32_t>(atoi(row[4]));
|
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
|
||||||
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
|
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
|
||||||
e.deities = static_cast<int32_t>(atoi(row[6]));
|
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
|
||||||
e.status = static_cast<int32_t>(atoi(row[7]));
|
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
|
||||||
e.type = static_cast<int32_t>(atoi(row[8]));
|
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.charges = static_cast<int32_t>(atoi(row[9]));
|
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.grant_only = static_cast<int8_t>(atoi(row[10]));
|
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
|
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
|
||||||
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
|
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
|
||||||
|
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -227,6 +233,7 @@ public:
|
|||||||
v.push_back(columns[11] + " = " + std::to_string(e.first_rank_id));
|
v.push_back(columns[11] + " = " + std::to_string(e.first_rank_id));
|
||||||
v.push_back(columns[12] + " = " + std::to_string(e.enabled));
|
v.push_back(columns[12] + " = " + std::to_string(e.enabled));
|
||||||
v.push_back(columns[13] + " = " + std::to_string(e.reset_on_death));
|
v.push_back(columns[13] + " = " + std::to_string(e.reset_on_death));
|
||||||
|
v.push_back(columns[14] + " = " + std::to_string(e.auto_grant_enabled));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -262,6 +269,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.first_rank_id));
|
v.push_back(std::to_string(e.first_rank_id));
|
||||||
v.push_back(std::to_string(e.enabled));
|
v.push_back(std::to_string(e.enabled));
|
||||||
v.push_back(std::to_string(e.reset_on_death));
|
v.push_back(std::to_string(e.reset_on_death));
|
||||||
|
v.push_back(std::to_string(e.auto_grant_enabled));
|
||||||
|
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
@@ -305,6 +313,7 @@ public:
|
|||||||
v.push_back(std::to_string(e.first_rank_id));
|
v.push_back(std::to_string(e.first_rank_id));
|
||||||
v.push_back(std::to_string(e.enabled));
|
v.push_back(std::to_string(e.enabled));
|
||||||
v.push_back(std::to_string(e.reset_on_death));
|
v.push_back(std::to_string(e.reset_on_death));
|
||||||
|
v.push_back(std::to_string(e.auto_grant_enabled));
|
||||||
|
|
||||||
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
insert_chunks.push_back("(" + Strings::Implode(",", v) + ")");
|
||||||
}
|
}
|
||||||
@@ -338,20 +347,21 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaAbility e{};
|
AaAbility e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.name = row[1] ? row[1] : "";
|
e.name = row[1] ? row[1] : "";
|
||||||
e.category = static_cast<int32_t>(atoi(row[2]));
|
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.classes = static_cast<int32_t>(atoi(row[3]));
|
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
|
||||||
e.races = static_cast<int32_t>(atoi(row[4]));
|
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
|
||||||
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
|
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
|
||||||
e.deities = static_cast<int32_t>(atoi(row[6]));
|
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
|
||||||
e.status = static_cast<int32_t>(atoi(row[7]));
|
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
|
||||||
e.type = static_cast<int32_t>(atoi(row[8]));
|
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.charges = static_cast<int32_t>(atoi(row[9]));
|
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.grant_only = static_cast<int8_t>(atoi(row[10]));
|
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
|
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
|
||||||
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
|
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
|
||||||
|
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -376,20 +386,21 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaAbility e{};
|
AaAbility e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.name = row[1] ? row[1] : "";
|
e.name = row[1] ? row[1] : "";
|
||||||
e.category = static_cast<int32_t>(atoi(row[2]));
|
e.category = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.classes = static_cast<int32_t>(atoi(row[3]));
|
e.classes = row[3] ? static_cast<int32_t>(atoi(row[3])) : 131070;
|
||||||
e.races = static_cast<int32_t>(atoi(row[4]));
|
e.races = row[4] ? static_cast<int32_t>(atoi(row[4])) : 65535;
|
||||||
e.drakkin_heritage = static_cast<int32_t>(atoi(row[5]));
|
e.drakkin_heritage = row[5] ? static_cast<int32_t>(atoi(row[5])) : 127;
|
||||||
e.deities = static_cast<int32_t>(atoi(row[6]));
|
e.deities = row[6] ? static_cast<int32_t>(atoi(row[6])) : 131071;
|
||||||
e.status = static_cast<int32_t>(atoi(row[7]));
|
e.status = row[7] ? static_cast<int32_t>(atoi(row[7])) : 0;
|
||||||
e.type = static_cast<int32_t>(atoi(row[8]));
|
e.type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.charges = static_cast<int32_t>(atoi(row[9]));
|
e.charges = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.grant_only = static_cast<int8_t>(atoi(row[10]));
|
e.grant_only = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.first_rank_id = static_cast<int32_t>(atoi(row[11]));
|
e.first_rank_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.enabled = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.enabled = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 1;
|
||||||
e.reset_on_death = static_cast<int8_t>(atoi(row[13]));
|
e.reset_on_death = row[13] ? static_cast<int8_t>(atoi(row[13])) : 0;
|
||||||
|
e.auto_grant_enabled = row[14] ? static_cast<int8_t>(atoi(row[14])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -448,6 +459,90 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AaAbility &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.name) + "'");
|
||||||
|
v.push_back(std::to_string(e.category));
|
||||||
|
v.push_back(std::to_string(e.classes));
|
||||||
|
v.push_back(std::to_string(e.races));
|
||||||
|
v.push_back(std::to_string(e.drakkin_heritage));
|
||||||
|
v.push_back(std::to_string(e.deities));
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.charges));
|
||||||
|
v.push_back(std::to_string(e.grant_only));
|
||||||
|
v.push_back(std::to_string(e.first_rank_id));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
v.push_back(std::to_string(e.reset_on_death));
|
||||||
|
v.push_back(std::to_string(e.auto_grant_enabled));
|
||||||
|
|
||||||
|
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<AaAbility> &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("'" + Strings::Escape(e.name) + "'");
|
||||||
|
v.push_back(std::to_string(e.category));
|
||||||
|
v.push_back(std::to_string(e.classes));
|
||||||
|
v.push_back(std::to_string(e.races));
|
||||||
|
v.push_back(std::to_string(e.drakkin_heritage));
|
||||||
|
v.push_back(std::to_string(e.deities));
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.charges));
|
||||||
|
v.push_back(std::to_string(e.grant_only));
|
||||||
|
v.push_back(std::to_string(e.first_rank_id));
|
||||||
|
v.push_back(std::to_string(e.enabled));
|
||||||
|
v.push_back(std::to_string(e.reset_on_death));
|
||||||
|
v.push_back(std::to_string(e.auto_grant_enabled));
|
||||||
|
|
||||||
|
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_AA_ABILITY_REPOSITORY_H
|
#endif //EQEMU_BASE_AA_ABILITY_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H
|
#ifndef EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H
|
||||||
@@ -120,8 +120,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
aa_rank_effects_id
|
aa_rank_effects_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -130,11 +131,11 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AaRankEffects e{};
|
AaRankEffects e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
|
||||||
e.effect_id = static_cast<int32_t>(atoi(row[2]));
|
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
e.base1 = static_cast<int32_t>(atoi(row[3]));
|
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
|
||||||
e.base2 = static_cast<int32_t>(atoi(row[4]));
|
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -266,11 +267,11 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRankEffects e{};
|
AaRankEffects e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
|
||||||
e.effect_id = static_cast<int32_t>(atoi(row[2]));
|
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
e.base1 = static_cast<int32_t>(atoi(row[3]));
|
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
|
||||||
e.base2 = static_cast<int32_t>(atoi(row[4]));
|
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -295,11 +296,11 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRankEffects e{};
|
AaRankEffects e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.slot = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.slot = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 1;
|
||||||
e.effect_id = static_cast<int32_t>(atoi(row[2]));
|
e.effect_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
e.base1 = static_cast<int32_t>(atoi(row[3]));
|
e.base1 = row[3] ? static_cast<int32_t>(atoi(row[3])) : 0;
|
||||||
e.base2 = static_cast<int32_t>(atoi(row[4]));
|
e.base2 = row[4] ? static_cast<int32_t>(atoi(row[4])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -358,6 +359,70 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AaRankEffects &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.rank_id));
|
||||||
|
v.push_back(std::to_string(e.slot));
|
||||||
|
v.push_back(std::to_string(e.effect_id));
|
||||||
|
v.push_back(std::to_string(e.base1));
|
||||||
|
v.push_back(std::to_string(e.base2));
|
||||||
|
|
||||||
|
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<AaRankEffects> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.rank_id));
|
||||||
|
v.push_back(std::to_string(e.slot));
|
||||||
|
v.push_back(std::to_string(e.effect_id));
|
||||||
|
v.push_back(std::to_string(e.base1));
|
||||||
|
v.push_back(std::to_string(e.base2));
|
||||||
|
|
||||||
|
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_AA_RANK_EFFECTS_REPOSITORY_H
|
#endif //EQEMU_BASE_AA_RANK_EFFECTS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H
|
#ifndef EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H
|
||||||
@@ -112,8 +112,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
aa_rank_prereqs_id
|
aa_rank_prereqs_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -122,9 +123,9 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AaRankPrereqs e{};
|
AaRankPrereqs e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.aa_id = static_cast<int32_t>(atoi(row[1]));
|
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
e.points = static_cast<int32_t>(atoi(row[2]));
|
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -250,9 +251,9 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRankPrereqs e{};
|
AaRankPrereqs e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.aa_id = static_cast<int32_t>(atoi(row[1]));
|
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
e.points = static_cast<int32_t>(atoi(row[2]));
|
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -277,9 +278,9 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRankPrereqs e{};
|
AaRankPrereqs e{};
|
||||||
|
|
||||||
e.rank_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.rank_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.aa_id = static_cast<int32_t>(atoi(row[1]));
|
e.aa_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
e.points = static_cast<int32_t>(atoi(row[2]));
|
e.points = row[2] ? static_cast<int32_t>(atoi(row[2])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -338,6 +339,66 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AaRankPrereqs &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.rank_id));
|
||||||
|
v.push_back(std::to_string(e.aa_id));
|
||||||
|
v.push_back(std::to_string(e.points));
|
||||||
|
|
||||||
|
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<AaRankPrereqs> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.rank_id));
|
||||||
|
v.push_back(std::to_string(e.aa_id));
|
||||||
|
v.push_back(std::to_string(e.points));
|
||||||
|
|
||||||
|
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_AA_RANK_PREREQS_REPOSITORY_H
|
#endif //EQEMU_BASE_AA_RANK_PREREQS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_AA_RANKS_REPOSITORY_H
|
#ifndef EQEMU_BASE_AA_RANKS_REPOSITORY_H
|
||||||
@@ -152,8 +152,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
aa_ranks_id
|
aa_ranks_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -162,19 +163,19 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AaRanks e{};
|
AaRanks e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
|
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
|
||||||
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
|
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.title_sid = static_cast<int32_t>(atoi(row[3]));
|
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
|
||||||
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
|
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
|
||||||
e.cost = static_cast<int32_t>(atoi(row[5]));
|
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
|
||||||
e.level_req = static_cast<int32_t>(atoi(row[6]));
|
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
|
||||||
e.spell = static_cast<int32_t>(atoi(row[7]));
|
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
|
||||||
e.spell_type = static_cast<int32_t>(atoi(row[8]));
|
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.recast_time = static_cast<int32_t>(atoi(row[9]));
|
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.expansion = static_cast<int32_t>(atoi(row[10]));
|
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
|
||||||
e.prev_id = static_cast<int32_t>(atoi(row[11]));
|
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.next_id = static_cast<int32_t>(atoi(row[12]));
|
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -330,19 +331,19 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRanks e{};
|
AaRanks e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
|
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
|
||||||
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
|
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.title_sid = static_cast<int32_t>(atoi(row[3]));
|
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
|
||||||
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
|
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
|
||||||
e.cost = static_cast<int32_t>(atoi(row[5]));
|
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
|
||||||
e.level_req = static_cast<int32_t>(atoi(row[6]));
|
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
|
||||||
e.spell = static_cast<int32_t>(atoi(row[7]));
|
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
|
||||||
e.spell_type = static_cast<int32_t>(atoi(row[8]));
|
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.recast_time = static_cast<int32_t>(atoi(row[9]));
|
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.expansion = static_cast<int32_t>(atoi(row[10]));
|
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
|
||||||
e.prev_id = static_cast<int32_t>(atoi(row[11]));
|
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.next_id = static_cast<int32_t>(atoi(row[12]));
|
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -367,19 +368,19 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AaRanks e{};
|
AaRanks e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.upper_hotkey_sid = static_cast<int32_t>(atoi(row[1]));
|
e.upper_hotkey_sid = row[1] ? static_cast<int32_t>(atoi(row[1])) : -1;
|
||||||
e.lower_hotkey_sid = static_cast<int32_t>(atoi(row[2]));
|
e.lower_hotkey_sid = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.title_sid = static_cast<int32_t>(atoi(row[3]));
|
e.title_sid = row[3] ? static_cast<int32_t>(atoi(row[3])) : -1;
|
||||||
e.desc_sid = static_cast<int32_t>(atoi(row[4]));
|
e.desc_sid = row[4] ? static_cast<int32_t>(atoi(row[4])) : -1;
|
||||||
e.cost = static_cast<int32_t>(atoi(row[5]));
|
e.cost = row[5] ? static_cast<int32_t>(atoi(row[5])) : 1;
|
||||||
e.level_req = static_cast<int32_t>(atoi(row[6]));
|
e.level_req = row[6] ? static_cast<int32_t>(atoi(row[6])) : 51;
|
||||||
e.spell = static_cast<int32_t>(atoi(row[7]));
|
e.spell = row[7] ? static_cast<int32_t>(atoi(row[7])) : -1;
|
||||||
e.spell_type = static_cast<int32_t>(atoi(row[8]));
|
e.spell_type = row[8] ? static_cast<int32_t>(atoi(row[8])) : 0;
|
||||||
e.recast_time = static_cast<int32_t>(atoi(row[9]));
|
e.recast_time = row[9] ? static_cast<int32_t>(atoi(row[9])) : 0;
|
||||||
e.expansion = static_cast<int32_t>(atoi(row[10]));
|
e.expansion = row[10] ? static_cast<int32_t>(atoi(row[10])) : 0;
|
||||||
e.prev_id = static_cast<int32_t>(atoi(row[11]));
|
e.prev_id = row[11] ? static_cast<int32_t>(atoi(row[11])) : -1;
|
||||||
e.next_id = static_cast<int32_t>(atoi(row[12]));
|
e.next_id = row[12] ? static_cast<int32_t>(atoi(row[12])) : -1;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -438,6 +439,86 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AaRanks &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.upper_hotkey_sid));
|
||||||
|
v.push_back(std::to_string(e.lower_hotkey_sid));
|
||||||
|
v.push_back(std::to_string(e.title_sid));
|
||||||
|
v.push_back(std::to_string(e.desc_sid));
|
||||||
|
v.push_back(std::to_string(e.cost));
|
||||||
|
v.push_back(std::to_string(e.level_req));
|
||||||
|
v.push_back(std::to_string(e.spell));
|
||||||
|
v.push_back(std::to_string(e.spell_type));
|
||||||
|
v.push_back(std::to_string(e.recast_time));
|
||||||
|
v.push_back(std::to_string(e.expansion));
|
||||||
|
v.push_back(std::to_string(e.prev_id));
|
||||||
|
v.push_back(std::to_string(e.next_id));
|
||||||
|
|
||||||
|
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<AaRanks> &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.upper_hotkey_sid));
|
||||||
|
v.push_back(std::to_string(e.lower_hotkey_sid));
|
||||||
|
v.push_back(std::to_string(e.title_sid));
|
||||||
|
v.push_back(std::to_string(e.desc_sid));
|
||||||
|
v.push_back(std::to_string(e.cost));
|
||||||
|
v.push_back(std::to_string(e.level_req));
|
||||||
|
v.push_back(std::to_string(e.spell));
|
||||||
|
v.push_back(std::to_string(e.spell_type));
|
||||||
|
v.push_back(std::to_string(e.recast_time));
|
||||||
|
v.push_back(std::to_string(e.expansion));
|
||||||
|
v.push_back(std::to_string(e.prev_id));
|
||||||
|
v.push_back(std::to_string(e.next_id));
|
||||||
|
|
||||||
|
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_AA_RANKS_REPOSITORY_H
|
#endif //EQEMU_BASE_AA_RANKS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H
|
#ifndef EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H
|
||||||
@@ -112,8 +112,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
account_flags_id
|
account_flags_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -122,7 +123,7 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AccountFlags e{};
|
AccountFlags e{};
|
||||||
|
|
||||||
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.p_flag = row[1] ? row[1] : "";
|
e.p_flag = row[1] ? row[1] : "";
|
||||||
e.p_value = row[2] ? row[2] : "";
|
e.p_value = row[2] ? row[2] : "";
|
||||||
|
|
||||||
@@ -250,7 +251,7 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountFlags e{};
|
AccountFlags e{};
|
||||||
|
|
||||||
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.p_flag = row[1] ? row[1] : "";
|
e.p_flag = row[1] ? row[1] : "";
|
||||||
e.p_value = row[2] ? row[2] : "";
|
e.p_value = row[2] ? row[2] : "";
|
||||||
|
|
||||||
@@ -277,7 +278,7 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountFlags e{};
|
AccountFlags e{};
|
||||||
|
|
||||||
e.p_accid = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.p_accid = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.p_flag = row[1] ? row[1] : "";
|
e.p_flag = row[1] ? row[1] : "";
|
||||||
e.p_value = row[2] ? row[2] : "";
|
e.p_value = row[2] ? row[2] : "";
|
||||||
|
|
||||||
@@ -338,6 +339,66 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AccountFlags &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.p_accid));
|
||||||
|
v.push_back("'" + Strings::Escape(e.p_flag) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.p_value) + "'");
|
||||||
|
|
||||||
|
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<AccountFlags> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.p_accid));
|
||||||
|
v.push_back("'" + Strings::Escape(e.p_flag) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.p_value) + "'");
|
||||||
|
|
||||||
|
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_ACCOUNT_FLAGS_REPOSITORY_H
|
#endif //EQEMU_BASE_ACCOUNT_FLAGS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H
|
#ifndef EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H
|
||||||
@@ -116,8 +116,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
account_ip_id
|
account_ip_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -126,10 +127,10 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AccountIp e{};
|
AccountIp e{};
|
||||||
|
|
||||||
e.accid = static_cast<int32_t>(atoi(row[0]));
|
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.ip = row[1] ? row[1] : "";
|
e.ip = row[1] ? row[1] : "";
|
||||||
e.count = static_cast<int32_t>(atoi(row[2]));
|
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
|
||||||
e.lastused = row[3] ? row[3] : "";
|
e.lastused = row[3] ? row[3] : std::time(nullptr);
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -258,10 +259,10 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountIp e{};
|
AccountIp e{};
|
||||||
|
|
||||||
e.accid = static_cast<int32_t>(atoi(row[0]));
|
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.ip = row[1] ? row[1] : "";
|
e.ip = row[1] ? row[1] : "";
|
||||||
e.count = static_cast<int32_t>(atoi(row[2]));
|
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
|
||||||
e.lastused = row[3] ? row[3] : "";
|
e.lastused = row[3] ? row[3] : std::time(nullptr);
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -286,10 +287,10 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountIp e{};
|
AccountIp e{};
|
||||||
|
|
||||||
e.accid = static_cast<int32_t>(atoi(row[0]));
|
e.accid = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.ip = row[1] ? row[1] : "";
|
e.ip = row[1] ? row[1] : "";
|
||||||
e.count = static_cast<int32_t>(atoi(row[2]));
|
e.count = row[2] ? static_cast<int32_t>(atoi(row[2])) : 1;
|
||||||
e.lastused = row[3] ? row[3] : "";
|
e.lastused = row[3] ? row[3] : std::time(nullptr);
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -348,6 +349,68 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AccountIp &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.accid));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ip) + "'");
|
||||||
|
v.push_back(std::to_string(e.count));
|
||||||
|
v.push_back("'" + Strings::Escape(e.lastused) + "'");
|
||||||
|
|
||||||
|
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<AccountIp> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.accid));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ip) + "'");
|
||||||
|
v.push_back(std::to_string(e.count));
|
||||||
|
v.push_back("'" + Strings::Escape(e.lastused) + "'");
|
||||||
|
|
||||||
|
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_ACCOUNT_IP_REPOSITORY_H
|
#endif //EQEMU_BASE_ACCOUNT_IP_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ACCOUNT_REPOSITORY_H
|
#ifndef EQEMU_BASE_ACCOUNT_REPOSITORY_H
|
||||||
@@ -196,8 +196,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
account_id
|
account_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -206,25 +207,25 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
Account e{};
|
Account e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[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.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.password = row[4] ? row[4] : "";
|
e.password = row[4] ? row[4] : "";
|
||||||
e.status = static_cast<int32_t>(atoi(row[5]));
|
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
|
||||||
e.ls_id = row[6] ? row[6] : "";
|
e.ls_id = row[6] ? row[6] : "eqemu";
|
||||||
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
|
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
|
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
|
||||||
e.flymode = static_cast<int8_t>(atoi(row[10]));
|
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
|
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
|
||||||
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||||
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
|
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||||
e.minilogin_ip = row[14] ? row[14] : "";
|
e.minilogin_ip = row[14] ? row[14] : "";
|
||||||
e.hideme = static_cast<int8_t>(atoi(row[15]));
|
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
|
||||||
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
|
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||||
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
||||||
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
|
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.ban_reason = row[19] ? row[19] : "";
|
e.ban_reason = row[19] ? row[19] : "";
|
||||||
e.suspend_reason = row[20] ? row[20] : "";
|
e.suspend_reason = row[20] ? row[20] : "";
|
||||||
e.crc_eqgame = row[21] ? row[21] : "";
|
e.crc_eqgame = row[21] ? row[21] : "";
|
||||||
@@ -417,25 +418,25 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
Account e{};
|
Account e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[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.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.password = row[4] ? row[4] : "";
|
e.password = row[4] ? row[4] : "";
|
||||||
e.status = static_cast<int32_t>(atoi(row[5]));
|
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
|
||||||
e.ls_id = row[6] ? row[6] : "";
|
e.ls_id = row[6] ? row[6] : "eqemu";
|
||||||
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
|
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
|
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
|
||||||
e.flymode = static_cast<int8_t>(atoi(row[10]));
|
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
|
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
|
||||||
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||||
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
|
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||||
e.minilogin_ip = row[14] ? row[14] : "";
|
e.minilogin_ip = row[14] ? row[14] : "";
|
||||||
e.hideme = static_cast<int8_t>(atoi(row[15]));
|
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
|
||||||
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
|
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||||
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
||||||
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
|
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.ban_reason = row[19] ? row[19] : "";
|
e.ban_reason = row[19] ? row[19] : "";
|
||||||
e.suspend_reason = row[20] ? row[20] : "";
|
e.suspend_reason = row[20] ? row[20] : "";
|
||||||
e.crc_eqgame = row[21] ? row[21] : "";
|
e.crc_eqgame = row[21] ? row[21] : "";
|
||||||
@@ -465,25 +466,25 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
Account e{};
|
Account e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[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.sharedplat = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.sharedplat = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.password = row[4] ? row[4] : "";
|
e.password = row[4] ? row[4] : "";
|
||||||
e.status = static_cast<int32_t>(atoi(row[5]));
|
e.status = row[5] ? static_cast<int32_t>(atoi(row[5])) : 0;
|
||||||
e.ls_id = row[6] ? row[6] : "";
|
e.ls_id = row[6] ? row[6] : "eqemu";
|
||||||
e.lsaccount_id = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.lsaccount_id = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.gmspeed = static_cast<uint8_t>(strtoul(row[8], nullptr, 10));
|
e.gmspeed = row[8] ? static_cast<uint8_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.invulnerable = static_cast<int8_t>(atoi(row[9]));
|
e.invulnerable = row[9] ? static_cast<int8_t>(atoi(row[9])) : 0;
|
||||||
e.flymode = static_cast<int8_t>(atoi(row[10]));
|
e.flymode = row[10] ? static_cast<int8_t>(atoi(row[10])) : 0;
|
||||||
e.ignore_tells = static_cast<int8_t>(atoi(row[11]));
|
e.ignore_tells = row[11] ? static_cast<int8_t>(atoi(row[11])) : 0;
|
||||||
e.revoked = static_cast<uint8_t>(strtoul(row[12], nullptr, 10));
|
e.revoked = row[12] ? static_cast<uint8_t>(strtoul(row[12], nullptr, 10)) : 0;
|
||||||
e.karma = static_cast<uint32_t>(strtoul(row[13], nullptr, 10));
|
e.karma = row[13] ? static_cast<uint32_t>(strtoul(row[13], nullptr, 10)) : 0;
|
||||||
e.minilogin_ip = row[14] ? row[14] : "";
|
e.minilogin_ip = row[14] ? row[14] : "";
|
||||||
e.hideme = static_cast<int8_t>(atoi(row[15]));
|
e.hideme = row[15] ? static_cast<int8_t>(atoi(row[15])) : 0;
|
||||||
e.rulesflag = static_cast<uint8_t>(strtoul(row[16], nullptr, 10));
|
e.rulesflag = row[16] ? static_cast<uint8_t>(strtoul(row[16], nullptr, 10)) : 0;
|
||||||
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
e.suspendeduntil = strtoll(row[17] ? row[17] : "-1", nullptr, 10);
|
||||||
e.time_creation = static_cast<uint32_t>(strtoul(row[18], nullptr, 10));
|
e.time_creation = row[18] ? static_cast<uint32_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.ban_reason = row[19] ? row[19] : "";
|
e.ban_reason = row[19] ? row[19] : "";
|
||||||
e.suspend_reason = row[20] ? row[20] : "";
|
e.suspend_reason = row[20] ? row[20] : "";
|
||||||
e.crc_eqgame = row[21] ? row[21] : "";
|
e.crc_eqgame = row[21] ? row[21] : "";
|
||||||
@@ -547,6 +548,108 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 Account &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.name) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.charname) + "'");
|
||||||
|
v.push_back(std::to_string(e.sharedplat));
|
||||||
|
v.push_back("'" + Strings::Escape(e.password) + "'");
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ls_id) + "'");
|
||||||
|
v.push_back(std::to_string(e.lsaccount_id));
|
||||||
|
v.push_back(std::to_string(e.gmspeed));
|
||||||
|
v.push_back(std::to_string(e.invulnerable));
|
||||||
|
v.push_back(std::to_string(e.flymode));
|
||||||
|
v.push_back(std::to_string(e.ignore_tells));
|
||||||
|
v.push_back(std::to_string(e.revoked));
|
||||||
|
v.push_back(std::to_string(e.karma));
|
||||||
|
v.push_back("'" + Strings::Escape(e.minilogin_ip) + "'");
|
||||||
|
v.push_back(std::to_string(e.hideme));
|
||||||
|
v.push_back(std::to_string(e.rulesflag));
|
||||||
|
v.push_back("FROM_UNIXTIME(" + (e.suspendeduntil > 0 ? std::to_string(e.suspendeduntil) : "null") + ")");
|
||||||
|
v.push_back(std::to_string(e.time_creation));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ban_reason) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.suspend_reason) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_eqgame) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_skillcaps) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_basedata) + "'");
|
||||||
|
|
||||||
|
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<Account> &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("'" + Strings::Escape(e.name) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.charname) + "'");
|
||||||
|
v.push_back(std::to_string(e.sharedplat));
|
||||||
|
v.push_back("'" + Strings::Escape(e.password) + "'");
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ls_id) + "'");
|
||||||
|
v.push_back(std::to_string(e.lsaccount_id));
|
||||||
|
v.push_back(std::to_string(e.gmspeed));
|
||||||
|
v.push_back(std::to_string(e.invulnerable));
|
||||||
|
v.push_back(std::to_string(e.flymode));
|
||||||
|
v.push_back(std::to_string(e.ignore_tells));
|
||||||
|
v.push_back(std::to_string(e.revoked));
|
||||||
|
v.push_back(std::to_string(e.karma));
|
||||||
|
v.push_back("'" + Strings::Escape(e.minilogin_ip) + "'");
|
||||||
|
v.push_back(std::to_string(e.hideme));
|
||||||
|
v.push_back(std::to_string(e.rulesflag));
|
||||||
|
v.push_back("FROM_UNIXTIME(" + (e.suspendeduntil > 0 ? std::to_string(e.suspendeduntil) : "null") + ")");
|
||||||
|
v.push_back(std::to_string(e.time_creation));
|
||||||
|
v.push_back("'" + Strings::Escape(e.ban_reason) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.suspend_reason) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_eqgame) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_skillcaps) + "'");
|
||||||
|
v.push_back("'" + Strings::Escape(e.crc_basedata) + "'");
|
||||||
|
|
||||||
|
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_ACCOUNT_REPOSITORY_H
|
#endif //EQEMU_BASE_ACCOUNT_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H
|
#ifndef EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H
|
||||||
@@ -112,8 +112,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
account_rewards_id
|
account_rewards_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -122,9 +123,9 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AccountRewards e{};
|
AccountRewards e{};
|
||||||
|
|
||||||
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -250,9 +251,9 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountRewards e{};
|
AccountRewards e{};
|
||||||
|
|
||||||
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -277,9 +278,9 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AccountRewards e{};
|
AccountRewards e{};
|
||||||
|
|
||||||
e.account_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.account_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.reward_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.reward_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.amount = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.amount = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -338,6 +339,66 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AccountRewards &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.account_id));
|
||||||
|
v.push_back(std::to_string(e.reward_id));
|
||||||
|
v.push_back(std::to_string(e.amount));
|
||||||
|
|
||||||
|
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<AccountRewards> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.account_id));
|
||||||
|
v.push_back(std::to_string(e.reward_id));
|
||||||
|
v.push_back(std::to_string(e.amount));
|
||||||
|
|
||||||
|
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_ACCOUNT_REWARDS_REPOSITORY_H
|
#endif //EQEMU_BASE_ACCOUNT_REWARDS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H
|
||||||
@@ -136,8 +136,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_details_id
|
adventure_details_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -146,15 +147,15 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureDetails e{};
|
AdventureDetails e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
|
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
|
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
|
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -297,15 +298,15 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureDetails e{};
|
AdventureDetails e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
|
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
|
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
|
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -330,15 +331,15 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureDetails e{};
|
AdventureDetails e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.adventure_id = static_cast<uint16_t>(strtoul(row[1], nullptr, 10));
|
e.adventure_id = row[1] ? static_cast<uint16_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.instance_id = static_cast<int32_t>(atoi(row[2]));
|
e.instance_id = row[2] ? static_cast<int32_t>(atoi(row[2])) : -1;
|
||||||
e.count = static_cast<uint16_t>(strtoul(row[3], nullptr, 10));
|
e.count = row[3] ? static_cast<uint16_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.assassinate_count = static_cast<uint16_t>(strtoul(row[4], nullptr, 10));
|
e.assassinate_count = row[4] ? static_cast<uint16_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.status = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.status = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.time_created = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.time_created = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.time_zoned = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.time_zoned = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.time_completed = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.time_completed = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -397,6 +398,78 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureDetails &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.adventure_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.count));
|
||||||
|
v.push_back(std::to_string(e.assassinate_count));
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back(std::to_string(e.time_created));
|
||||||
|
v.push_back(std::to_string(e.time_zoned));
|
||||||
|
v.push_back(std::to_string(e.time_completed));
|
||||||
|
|
||||||
|
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<AdventureDetails> &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.adventure_id));
|
||||||
|
v.push_back(std::to_string(e.instance_id));
|
||||||
|
v.push_back(std::to_string(e.count));
|
||||||
|
v.push_back(std::to_string(e.assassinate_count));
|
||||||
|
v.push_back(std::to_string(e.status));
|
||||||
|
v.push_back(std::to_string(e.time_created));
|
||||||
|
v.push_back(std::to_string(e.time_zoned));
|
||||||
|
v.push_back(std::to_string(e.time_completed));
|
||||||
|
|
||||||
|
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_ADVENTURE_DETAILS_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_DETAILS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H
|
||||||
@@ -108,8 +108,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_members_id
|
adventure_members_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -118,8 +119,8 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureMembers e{};
|
AdventureMembers e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -242,8 +243,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureMembers e{};
|
AdventureMembers e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -268,8 +269,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureMembers e{};
|
AdventureMembers e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.charid = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.charid = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -328,6 +329,64 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureMembers &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.charid));
|
||||||
|
|
||||||
|
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<AdventureMembers> &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.charid));
|
||||||
|
|
||||||
|
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_ADVENTURE_MEMBERS_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_MEMBERS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H
|
||||||
@@ -144,8 +144,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_stats_id
|
adventure_stats_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -154,17 +155,17 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureStats e{};
|
AdventureStats e{};
|
||||||
|
|
||||||
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -314,17 +315,17 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureStats e{};
|
AdventureStats e{};
|
||||||
|
|
||||||
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -349,17 +350,17 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureStats e{};
|
AdventureStats e{};
|
||||||
|
|
||||||
e.player_id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.player_id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.guk_wins = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.guk_wins = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
e.mir_wins = static_cast<uint32_t>(strtoul(row[2], nullptr, 10));
|
e.mir_wins = row[2] ? static_cast<uint32_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.mmc_wins = static_cast<uint32_t>(strtoul(row[3], nullptr, 10));
|
e.mmc_wins = row[3] ? static_cast<uint32_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.ruj_wins = static_cast<uint32_t>(strtoul(row[4], nullptr, 10));
|
e.ruj_wins = row[4] ? static_cast<uint32_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.tak_wins = static_cast<uint32_t>(strtoul(row[5], nullptr, 10));
|
e.tak_wins = row[5] ? static_cast<uint32_t>(strtoul(row[5], nullptr, 10)) : 0;
|
||||||
e.guk_losses = static_cast<uint32_t>(strtoul(row[6], nullptr, 10));
|
e.guk_losses = row[6] ? static_cast<uint32_t>(strtoul(row[6], nullptr, 10)) : 0;
|
||||||
e.mir_losses = static_cast<uint32_t>(strtoul(row[7], nullptr, 10));
|
e.mir_losses = row[7] ? static_cast<uint32_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.mmc_losses = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.mmc_losses = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.ruj_losses = static_cast<uint32_t>(strtoul(row[9], nullptr, 10));
|
e.ruj_losses = row[9] ? static_cast<uint32_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.tak_losses = static_cast<uint32_t>(strtoul(row[10], nullptr, 10));
|
e.tak_losses = row[10] ? static_cast<uint32_t>(strtoul(row[10], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -418,6 +419,82 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureStats &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.player_id));
|
||||||
|
v.push_back(std::to_string(e.guk_wins));
|
||||||
|
v.push_back(std::to_string(e.mir_wins));
|
||||||
|
v.push_back(std::to_string(e.mmc_wins));
|
||||||
|
v.push_back(std::to_string(e.ruj_wins));
|
||||||
|
v.push_back(std::to_string(e.tak_wins));
|
||||||
|
v.push_back(std::to_string(e.guk_losses));
|
||||||
|
v.push_back(std::to_string(e.mir_losses));
|
||||||
|
v.push_back(std::to_string(e.mmc_losses));
|
||||||
|
v.push_back(std::to_string(e.ruj_losses));
|
||||||
|
v.push_back(std::to_string(e.tak_losses));
|
||||||
|
|
||||||
|
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<AdventureStats> &entries
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> insert_chunks;
|
||||||
|
|
||||||
|
for (auto &e: entries) {
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.player_id));
|
||||||
|
v.push_back(std::to_string(e.guk_wins));
|
||||||
|
v.push_back(std::to_string(e.mir_wins));
|
||||||
|
v.push_back(std::to_string(e.mmc_wins));
|
||||||
|
v.push_back(std::to_string(e.ruj_wins));
|
||||||
|
v.push_back(std::to_string(e.tak_wins));
|
||||||
|
v.push_back(std::to_string(e.guk_losses));
|
||||||
|
v.push_back(std::to_string(e.mir_losses));
|
||||||
|
v.push_back(std::to_string(e.mmc_losses));
|
||||||
|
v.push_back(std::to_string(e.ruj_losses));
|
||||||
|
v.push_back(std::to_string(e.tak_losses));
|
||||||
|
|
||||||
|
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_ADVENTURE_STATS_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_STATS_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
|
||||||
@@ -108,8 +108,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_template_entry_flavor_id
|
adventure_template_entry_flavor_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -118,7 +119,7 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureTemplateEntryFlavor e{};
|
AdventureTemplateEntryFlavor e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.text = row[1] ? row[1] : "";
|
e.text = row[1] ? row[1] : "";
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
@@ -242,7 +243,7 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplateEntryFlavor e{};
|
AdventureTemplateEntryFlavor e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.text = row[1] ? row[1] : "";
|
e.text = row[1] ? row[1] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
@@ -268,7 +269,7 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplateEntryFlavor e{};
|
AdventureTemplateEntryFlavor e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.text = row[1] ? row[1] : "";
|
e.text = row[1] ? row[1] : "";
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
@@ -328,6 +329,64 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureTemplateEntryFlavor &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.text) + "'");
|
||||||
|
|
||||||
|
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<AdventureTemplateEntryFlavor> &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("'" + Strings::Escape(e.text) + "'");
|
||||||
|
|
||||||
|
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_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_FLAVOR_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
|
||||||
@@ -108,8 +108,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_template_entry_id
|
adventure_template_entry_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -118,8 +119,8 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureTemplateEntry e{};
|
AdventureTemplateEntry e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -242,8 +243,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplateEntry e{};
|
AdventureTemplateEntry e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -268,8 +269,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplateEntry e{};
|
AdventureTemplateEntry e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.template_id = static_cast<uint32_t>(strtoul(row[1], nullptr, 10));
|
e.template_id = row[1] ? static_cast<uint32_t>(strtoul(row[1], nullptr, 10)) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -328,6 +329,64 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureTemplateEntry &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.template_id));
|
||||||
|
|
||||||
|
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<AdventureTemplateEntry> &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.template_id));
|
||||||
|
|
||||||
|
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_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_ENTRY_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H
|
#ifndef EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H
|
||||||
@@ -232,8 +232,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
adventure_template_id
|
adventure_template_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -242,38 +243,38 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AdventureTemplate e{};
|
AdventureTemplate e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.zone = row[1] ? row[1] : "";
|
e.zone = row[1] ? row[1] : "";
|
||||||
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
|
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
|
||||||
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
|
||||||
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
|
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.assa_x = strtof(row[10], nullptr);
|
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
|
||||||
e.assa_y = strtof(row[11], nullptr);
|
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
|
||||||
e.assa_z = strtof(row[12], nullptr);
|
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
|
||||||
e.assa_h = strtof(row[13], nullptr);
|
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
|
||||||
e.text = row[14] ? row[14] : "";
|
e.text = row[14] ? row[14] : "";
|
||||||
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
|
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
|
||||||
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
|
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
|
||||||
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
|
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||||
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
|
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
|
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
|
||||||
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
|
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||||
e.zone_in_x = strtof(row[21], nullptr);
|
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
|
||||||
e.zone_in_y = strtof(row[22], nullptr);
|
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
|
||||||
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
|
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
|
||||||
e.dest_x = strtof(row[24], nullptr);
|
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
|
||||||
e.dest_y = strtof(row[25], nullptr);
|
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
|
||||||
e.dest_z = strtof(row[26], nullptr);
|
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
|
||||||
e.dest_h = strtof(row[27], nullptr);
|
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
|
||||||
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
|
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
|
||||||
e.graveyard_x = strtof(row[29], nullptr);
|
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
|
||||||
e.graveyard_y = strtof(row[30], nullptr);
|
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
|
||||||
e.graveyard_z = strtof(row[31], nullptr);
|
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -489,38 +490,38 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplate e{};
|
AdventureTemplate e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.zone = row[1] ? row[1] : "";
|
e.zone = row[1] ? row[1] : "";
|
||||||
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
|
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
|
||||||
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
|
||||||
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
|
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.assa_x = strtof(row[10], nullptr);
|
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
|
||||||
e.assa_y = strtof(row[11], nullptr);
|
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
|
||||||
e.assa_z = strtof(row[12], nullptr);
|
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
|
||||||
e.assa_h = strtof(row[13], nullptr);
|
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
|
||||||
e.text = row[14] ? row[14] : "";
|
e.text = row[14] ? row[14] : "";
|
||||||
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
|
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
|
||||||
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
|
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
|
||||||
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
|
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||||
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
|
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
|
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
|
||||||
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
|
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||||
e.zone_in_x = strtof(row[21], nullptr);
|
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
|
||||||
e.zone_in_y = strtof(row[22], nullptr);
|
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
|
||||||
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
|
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
|
||||||
e.dest_x = strtof(row[24], nullptr);
|
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
|
||||||
e.dest_y = strtof(row[25], nullptr);
|
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
|
||||||
e.dest_z = strtof(row[26], nullptr);
|
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
|
||||||
e.dest_h = strtof(row[27], nullptr);
|
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
|
||||||
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
|
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
|
||||||
e.graveyard_x = strtof(row[29], nullptr);
|
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
|
||||||
e.graveyard_y = strtof(row[30], nullptr);
|
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
|
||||||
e.graveyard_z = strtof(row[31], nullptr);
|
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -545,38 +546,38 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AdventureTemplate e{};
|
AdventureTemplate e{};
|
||||||
|
|
||||||
e.id = static_cast<uint32_t>(strtoul(row[0], nullptr, 10));
|
e.id = row[0] ? static_cast<uint32_t>(strtoul(row[0], nullptr, 10)) : 0;
|
||||||
e.zone = row[1] ? row[1] : "";
|
e.zone = row[1] ? row[1] : "";
|
||||||
e.zone_version = static_cast<uint8_t>(strtoul(row[2], nullptr, 10));
|
e.zone_version = row[2] ? static_cast<uint8_t>(strtoul(row[2], nullptr, 10)) : 0;
|
||||||
e.is_hard = static_cast<uint8_t>(strtoul(row[3], nullptr, 10));
|
e.is_hard = row[3] ? static_cast<uint8_t>(strtoul(row[3], nullptr, 10)) : 0;
|
||||||
e.is_raid = static_cast<uint8_t>(strtoul(row[4], nullptr, 10));
|
e.is_raid = row[4] ? static_cast<uint8_t>(strtoul(row[4], nullptr, 10)) : 0;
|
||||||
e.min_level = static_cast<uint8_t>(strtoul(row[5], nullptr, 10));
|
e.min_level = row[5] ? static_cast<uint8_t>(strtoul(row[5], nullptr, 10)) : 1;
|
||||||
e.max_level = static_cast<uint8_t>(strtoul(row[6], nullptr, 10));
|
e.max_level = row[6] ? static_cast<uint8_t>(strtoul(row[6], nullptr, 10)) : 65;
|
||||||
e.type = static_cast<uint8_t>(strtoul(row[7], nullptr, 10));
|
e.type = row[7] ? static_cast<uint8_t>(strtoul(row[7], nullptr, 10)) : 0;
|
||||||
e.type_data = static_cast<uint32_t>(strtoul(row[8], nullptr, 10));
|
e.type_data = row[8] ? static_cast<uint32_t>(strtoul(row[8], nullptr, 10)) : 0;
|
||||||
e.type_count = static_cast<uint16_t>(strtoul(row[9], nullptr, 10));
|
e.type_count = row[9] ? static_cast<uint16_t>(strtoul(row[9], nullptr, 10)) : 0;
|
||||||
e.assa_x = strtof(row[10], nullptr);
|
e.assa_x = row[10] ? strtof(row[10], nullptr) : 0;
|
||||||
e.assa_y = strtof(row[11], nullptr);
|
e.assa_y = row[11] ? strtof(row[11], nullptr) : 0;
|
||||||
e.assa_z = strtof(row[12], nullptr);
|
e.assa_z = row[12] ? strtof(row[12], nullptr) : 0;
|
||||||
e.assa_h = strtof(row[13], nullptr);
|
e.assa_h = row[13] ? strtof(row[13], nullptr) : 0;
|
||||||
e.text = row[14] ? row[14] : "";
|
e.text = row[14] ? row[14] : "";
|
||||||
e.duration = static_cast<uint32_t>(strtoul(row[15], nullptr, 10));
|
e.duration = row[15] ? static_cast<uint32_t>(strtoul(row[15], nullptr, 10)) : 7200;
|
||||||
e.zone_in_time = static_cast<uint32_t>(strtoul(row[16], nullptr, 10));
|
e.zone_in_time = row[16] ? static_cast<uint32_t>(strtoul(row[16], nullptr, 10)) : 1800;
|
||||||
e.win_points = static_cast<uint16_t>(strtoul(row[17], nullptr, 10));
|
e.win_points = row[17] ? static_cast<uint16_t>(strtoul(row[17], nullptr, 10)) : 0;
|
||||||
e.lose_points = static_cast<uint16_t>(strtoul(row[18], nullptr, 10));
|
e.lose_points = row[18] ? static_cast<uint16_t>(strtoul(row[18], nullptr, 10)) : 0;
|
||||||
e.theme = static_cast<uint8_t>(strtoul(row[19], nullptr, 10));
|
e.theme = row[19] ? static_cast<uint8_t>(strtoul(row[19], nullptr, 10)) : 1;
|
||||||
e.zone_in_zone_id = static_cast<uint16_t>(strtoul(row[20], nullptr, 10));
|
e.zone_in_zone_id = row[20] ? static_cast<uint16_t>(strtoul(row[20], nullptr, 10)) : 0;
|
||||||
e.zone_in_x = strtof(row[21], nullptr);
|
e.zone_in_x = row[21] ? strtof(row[21], nullptr) : 0;
|
||||||
e.zone_in_y = strtof(row[22], nullptr);
|
e.zone_in_y = row[22] ? strtof(row[22], nullptr) : 0;
|
||||||
e.zone_in_object_id = static_cast<int16_t>(atoi(row[23]));
|
e.zone_in_object_id = row[23] ? static_cast<int16_t>(atoi(row[23])) : 0;
|
||||||
e.dest_x = strtof(row[24], nullptr);
|
e.dest_x = row[24] ? strtof(row[24], nullptr) : 0;
|
||||||
e.dest_y = strtof(row[25], nullptr);
|
e.dest_y = row[25] ? strtof(row[25], nullptr) : 0;
|
||||||
e.dest_z = strtof(row[26], nullptr);
|
e.dest_z = row[26] ? strtof(row[26], nullptr) : 0;
|
||||||
e.dest_h = strtof(row[27], nullptr);
|
e.dest_h = row[27] ? strtof(row[27], nullptr) : 0;
|
||||||
e.graveyard_zone_id = static_cast<uint32_t>(strtoul(row[28], nullptr, 10));
|
e.graveyard_zone_id = row[28] ? static_cast<uint32_t>(strtoul(row[28], nullptr, 10)) : 0;
|
||||||
e.graveyard_x = strtof(row[29], nullptr);
|
e.graveyard_x = row[29] ? strtof(row[29], nullptr) : 0;
|
||||||
e.graveyard_y = strtof(row[30], nullptr);
|
e.graveyard_y = row[30] ? strtof(row[30], nullptr) : 0;
|
||||||
e.graveyard_z = strtof(row[31], nullptr);
|
e.graveyard_z = row[31] ? strtof(row[31], nullptr) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -635,6 +636,126 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AdventureTemplate &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back("'" + Strings::Escape(e.zone) + "'");
|
||||||
|
v.push_back(std::to_string(e.zone_version));
|
||||||
|
v.push_back(std::to_string(e.is_hard));
|
||||||
|
v.push_back(std::to_string(e.is_raid));
|
||||||
|
v.push_back(std::to_string(e.min_level));
|
||||||
|
v.push_back(std::to_string(e.max_level));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.type_data));
|
||||||
|
v.push_back(std::to_string(e.type_count));
|
||||||
|
v.push_back(std::to_string(e.assa_x));
|
||||||
|
v.push_back(std::to_string(e.assa_y));
|
||||||
|
v.push_back(std::to_string(e.assa_z));
|
||||||
|
v.push_back(std::to_string(e.assa_h));
|
||||||
|
v.push_back("'" + Strings::Escape(e.text) + "'");
|
||||||
|
v.push_back(std::to_string(e.duration));
|
||||||
|
v.push_back(std::to_string(e.zone_in_time));
|
||||||
|
v.push_back(std::to_string(e.win_points));
|
||||||
|
v.push_back(std::to_string(e.lose_points));
|
||||||
|
v.push_back(std::to_string(e.theme));
|
||||||
|
v.push_back(std::to_string(e.zone_in_zone_id));
|
||||||
|
v.push_back(std::to_string(e.zone_in_x));
|
||||||
|
v.push_back(std::to_string(e.zone_in_y));
|
||||||
|
v.push_back(std::to_string(e.zone_in_object_id));
|
||||||
|
v.push_back(std::to_string(e.dest_x));
|
||||||
|
v.push_back(std::to_string(e.dest_y));
|
||||||
|
v.push_back(std::to_string(e.dest_z));
|
||||||
|
v.push_back(std::to_string(e.dest_h));
|
||||||
|
v.push_back(std::to_string(e.graveyard_zone_id));
|
||||||
|
v.push_back(std::to_string(e.graveyard_x));
|
||||||
|
v.push_back(std::to_string(e.graveyard_y));
|
||||||
|
v.push_back(std::to_string(e.graveyard_z));
|
||||||
|
v.push_back(std::to_string(e.graveyard_radius));
|
||||||
|
|
||||||
|
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<AdventureTemplate> &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("'" + Strings::Escape(e.zone) + "'");
|
||||||
|
v.push_back(std::to_string(e.zone_version));
|
||||||
|
v.push_back(std::to_string(e.is_hard));
|
||||||
|
v.push_back(std::to_string(e.is_raid));
|
||||||
|
v.push_back(std::to_string(e.min_level));
|
||||||
|
v.push_back(std::to_string(e.max_level));
|
||||||
|
v.push_back(std::to_string(e.type));
|
||||||
|
v.push_back(std::to_string(e.type_data));
|
||||||
|
v.push_back(std::to_string(e.type_count));
|
||||||
|
v.push_back(std::to_string(e.assa_x));
|
||||||
|
v.push_back(std::to_string(e.assa_y));
|
||||||
|
v.push_back(std::to_string(e.assa_z));
|
||||||
|
v.push_back(std::to_string(e.assa_h));
|
||||||
|
v.push_back("'" + Strings::Escape(e.text) + "'");
|
||||||
|
v.push_back(std::to_string(e.duration));
|
||||||
|
v.push_back(std::to_string(e.zone_in_time));
|
||||||
|
v.push_back(std::to_string(e.win_points));
|
||||||
|
v.push_back(std::to_string(e.lose_points));
|
||||||
|
v.push_back(std::to_string(e.theme));
|
||||||
|
v.push_back(std::to_string(e.zone_in_zone_id));
|
||||||
|
v.push_back(std::to_string(e.zone_in_x));
|
||||||
|
v.push_back(std::to_string(e.zone_in_y));
|
||||||
|
v.push_back(std::to_string(e.zone_in_object_id));
|
||||||
|
v.push_back(std::to_string(e.dest_x));
|
||||||
|
v.push_back(std::to_string(e.dest_y));
|
||||||
|
v.push_back(std::to_string(e.dest_z));
|
||||||
|
v.push_back(std::to_string(e.dest_h));
|
||||||
|
v.push_back(std::to_string(e.graveyard_zone_id));
|
||||||
|
v.push_back(std::to_string(e.graveyard_x));
|
||||||
|
v.push_back(std::to_string(e.graveyard_y));
|
||||||
|
v.push_back(std::to_string(e.graveyard_z));
|
||||||
|
v.push_back(std::to_string(e.graveyard_radius));
|
||||||
|
|
||||||
|
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_ADVENTURE_TEMPLATE_REPOSITORY_H
|
#endif //EQEMU_BASE_ADVENTURE_TEMPLATE_REPOSITORY_H
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
* Any modifications to base repositories are to be made by the generator only
|
* Any modifications to base repositories are to be made by the generator only
|
||||||
*
|
*
|
||||||
* @generator ./utils/scripts/generators/repository-generator.pl
|
* @generator ./utils/scripts/generators/repository-generator.pl
|
||||||
* @docs https://eqemu.gitbook.io/server/in-development/developer-area/repositories
|
* @docs https://docs.eqemu.io/developer/repositories
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H
|
#ifndef EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H
|
||||||
@@ -108,8 +108,9 @@ public:
|
|||||||
{
|
{
|
||||||
auto results = db.QueryDatabase(
|
auto results = db.QueryDatabase(
|
||||||
fmt::format(
|
fmt::format(
|
||||||
"{} WHERE id = {} LIMIT 1",
|
"{} WHERE {} = {} LIMIT 1",
|
||||||
BaseSelect(),
|
BaseSelect(),
|
||||||
|
PrimaryKey(),
|
||||||
alternate_currency_id
|
alternate_currency_id
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@@ -118,8 +119,8 @@ public:
|
|||||||
if (results.RowCount() == 1) {
|
if (results.RowCount() == 1) {
|
||||||
AlternateCurrency e{};
|
AlternateCurrency e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.item_id = static_cast<int32_t>(atoi(row[1]));
|
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
@@ -242,8 +243,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AlternateCurrency e{};
|
AlternateCurrency e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.item_id = static_cast<int32_t>(atoi(row[1]));
|
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -268,8 +269,8 @@ public:
|
|||||||
for (auto row = results.begin(); row != results.end(); ++row) {
|
for (auto row = results.begin(); row != results.end(); ++row) {
|
||||||
AlternateCurrency e{};
|
AlternateCurrency e{};
|
||||||
|
|
||||||
e.id = static_cast<int32_t>(atoi(row[0]));
|
e.id = row[0] ? static_cast<int32_t>(atoi(row[0])) : 0;
|
||||||
e.item_id = static_cast<int32_t>(atoi(row[1]));
|
e.item_id = row[1] ? static_cast<int32_t>(atoi(row[1])) : 0;
|
||||||
|
|
||||||
all_entries.push_back(e);
|
all_entries.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -328,6 +329,64 @@ public:
|
|||||||
return (results.Success() && results.begin()[0] ? strtoll(results.begin()[0], nullptr, 10) : 0);
|
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 AlternateCurrency &e
|
||||||
|
)
|
||||||
|
{
|
||||||
|
std::vector<std::string> v;
|
||||||
|
|
||||||
|
v.push_back(std::to_string(e.id));
|
||||||
|
v.push_back(std::to_string(e.item_id));
|
||||||
|
|
||||||
|
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<AlternateCurrency> &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.item_id));
|
||||||
|
|
||||||
|
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_ALTERNATE_CURRENCY_REPOSITORY_H
|
#endif //EQEMU_BASE_ALTERNATE_CURRENCY_REPOSITORY_H
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user